操作系统实验报告_实验三
操作系统实验实验报告

操作系统实验实验报告一、实验目的操作系统是计算机系统中最为关键的核心软件,它管理着计算机的硬件资源和软件资源,为用户提供了一个方便、高效、稳定的工作环境。
本次操作系统实验的目的在于通过实际操作和实践,深入理解操作系统的基本原理和核心概念,掌握操作系统的基本功能和操作方法,提高对操作系统的认识和应用能力。
二、实验环境本次实验使用的操作系统为 Windows 10 专业版,开发工具为Visual Studio 2019,编程语言为 C 和 C++。
实验硬件环境为一台配备Intel Core i7 处理器、16GB 内存、512GB SSD 硬盘的个人计算机。
三、实验内容(一)进程管理实验1、进程创建与终止通过编程实现创建新的进程,并在完成任务后终止进程。
在实验中,我们使用了 Windows API 函数 CreateProcess 和 TerminateProcess 来完成进程的创建和终止操作。
通过观察进程的创建和终止过程,深入理解了进程的生命周期和状态转换。
2、进程同步与互斥为了实现进程之间的同步与互斥,我们使用了信号量、互斥量等同步对象。
通过编写多线程程序,模拟了多个进程对共享资源的访问,实现了对共享资源的互斥访问和同步操作。
在实验中,我们深刻体会到了进程同步与互斥的重要性,以及不正确的同步操作可能导致的死锁等问题。
(二)内存管理实验1、内存分配与释放使用 Windows API 函数 VirtualAlloc 和 VirtualFree 进行内存的分配和释放操作。
通过实验,了解了内存分配的不同方式(如堆分配、栈分配等)以及内存释放的时机和方法,掌握了内存管理的基本原理和操作技巧。
2、内存分页与分段通过编程模拟内存的分页和分段管理机制,了解了内存分页和分段的基本原理和实现方法。
在实验中,我们实现了简单的内存分页和分段算法,对内存的地址转换和页面置换等过程有了更深入的理解。
(三)文件系统实验1、文件操作使用 Windows API 函数 CreateFile、ReadFile、WriteFile 等进行文件的创建、读取和写入操作。
操作系统 实验三 进程同步

集美大学计算机工程学院实验报告课程名称:操作系统指导教师:王丰实验成绩:实验编号:实验三实验名称:进程同步班级:计算12姓名:学号:上机实践日期:2015.5上机实践时间:2学时一、实验目的1、掌握用Linux信号灯集机制实现两个进程间的同步问题。
2、共享函数库的创建二、实验环境Ubuntu-VMware、Linux三、实验内容⏹需要的信号灯: System V信号灯实现☐用于控制司机是否可以启动车辆的的信号灯 S1=0☐用于控制售票员是否可以开门的信号灯 S2=0System V信号灯实现说明□ System V的信号灯机制属于信号灯集的形式, 一次可以申请多个信号灯.□同样利用ftok()生成一个key: semkey=ftok(path,45);□利用key申请一个包含有两个信号灯的信号灯集, 获得该集的idsemid=semget(semkey,2,IPC_CREAT | 0666);□定义一个联合的数据类型union semun{int val;struct semid_ds *buf;ushort *array;};□利用semctl()函数对信号灯初始化,参数有:信号灯集的id: semid要初始化的信号灯的编号:sn要设定的初始值:valvoid seminit(int semid, int val,int sn){union semun arg;arg.val=val;semctl(semid,sn,SETVAL,arg);}利用初始化函数,初始化信号灯:seminit(semid,0,0);//用来司机启动汽车的同步seminit(semid,0,1);//用来售票员开门的同步控制□利用semop()函数, 对信号灯实现V操作:sembuf是一个在头部文件中的预定义结构、semid—信号灯集id, sn—要操作的信号灯编号void semdown(int semid,int sn){/* define P operating*/struct sembuf op;op.sem_num=sn;op.sem_op=-1;//P操作为-1op.sem_flg=0;semop(semid,&op,1);}2、Linux的静态和共享函数库·Linux生成目标代码: gcc -c 源程序文件名(将生成一个与源程序同名的.o目标代码文件。
电大操作系统实验报告3_ 进程管理实验

电大操作系统实验报告3_ 进程管理实验电大操作系统实验报告 3 进程管理实验一、实验目的进程管理是操作系统的核心功能之一,本次实验的目的是通过实际操作和观察,深入理解进程的概念、状态转换、进程调度以及进程间的通信机制,掌握操作系统中进程管理的基本原理和方法,提高对操作系统的整体认识和实践能力。
二、实验环境本次实验使用的操作系统为 Windows 10,编程语言为 C 语言,开发工具为 Visual Studio 2019。
三、实验内容及步骤(一)进程的创建与终止1、编写一个 C 程序,使用系统调用创建一个子进程。
2、在父进程和子进程中分别输出各自的进程 ID 和父进程 ID。
3、子进程执行一段简单的计算任务,父进程等待子进程结束后输出结束信息。
以下是实现上述功能的 C 程序代码:```cinclude <stdioh>include <stdlibh>include <unistdh>int main(){pid_t pid;pid = fork();if (pid < 0) {printf("创建子进程失败\n");return 1;} else if (pid == 0) {printf("子进程:我的进程 ID 是%d,父进程 ID 是%d\n",getpid(), getppid());int result = 2 + 3;printf("子进程计算结果:2 + 3 =%d\n", result);exit(0);} else {printf("父进程:我的进程 ID 是%d,子进程 ID 是%d\n",getpid(), pid);wait(NULL);printf("子进程已结束\n");}return 0;}```编译并运行上述程序,可以观察到父进程和子进程的输出信息,验证了进程的创建和终止过程。
(二)进程的状态转换1、编写一个 C 程序,创建一个子进程,子进程进入睡眠状态一段时间,然后被唤醒并输出状态转换信息。
《操作系统》课内实验报告

《操作系统》课内实验报告一、实验目的本次《操作系统》课内实验的主要目的是通过实际操作和观察,深入理解操作系统的基本原理和功能,掌握常见操作系统命令的使用,提高对操作系统的实际应用能力和问题解决能力。
二、实验环境本次实验在计算机实验室进行,使用的操作系统为 Windows 10 和Linux(Ubuntu 发行版)。
实验所使用的计算机配置为:Intel Core i5 处理器,8GB 内存,500GB 硬盘。
三、实验内容1、进程管理在 Windows 系统中,通过任务管理器观察进程的状态、优先级、CPU 使用率等信息,并进行进程的结束和优先级调整操作。
在 Linux 系统中,使用命令行工具(如 ps、kill 等)实现相同的功能。
2、内存管理使用 Windows 系统的性能监视器和资源监视器,查看内存的使用情况,包括物理内存、虚拟内存的占用和分配情况。
在 Linux 系统中,通过命令(如 free、vmstat 等)获取类似的内存信息,并分析内存的使用效率。
3、文件系统管理在 Windows 系统中,对文件和文件夹进行创建、复制、移动、删除等操作,了解文件的属性设置和权限管理。
在 Linux 系统中,使用命令(如 mkdir、cp、mv、rm 等)完成相同的任务,并熟悉文件的所有者、所属组和权限设置。
4、设备管理在 Windows 系统中,查看设备管理器中的硬件设备信息,安装和卸载设备驱动程序。
在 Linux 系统中,使用命令(如 lspci、lsusb 等)查看硬件设备,并通过安装内核模块来支持特定设备。
四、实验步骤1、进程管理实验(1)打开 Windows 系统的任务管理器,切换到“进程”选项卡,可以看到当前系统中正在运行的进程列表。
(2)选择一个进程,右键点击可以查看其属性,包括进程 ID、CPU 使用率、内存使用情况等。
(3)通过“结束任务”按钮可以结束指定的进程,但要注意不要随意结束系统关键进程,以免导致系统不稳定。
系统业务操作实验报告(3篇)

第1篇一、实验目的1. 熟悉系统业务操作流程;2. 掌握系统业务操作的基本方法;3. 提高实际操作能力,为今后的工作打下基础。
二、实验环境1. 操作系统:Windows 102. 浏览器:Chrome3. 实验系统:XX企业资源计划系统(ERP)三、实验内容1. 系统登录与退出2. 基础信息管理3. 财务管理4. 供应链管理5. 人力资源管理6. 实验总结与反思四、实验步骤1. 系统登录与退出(1)打开浏览器,输入实验系统网址,进入登录页面。
(2)输入用户名、密码,点击“登录”按钮。
(3)登录成功后,系统进入主界面。
(4)点击右上角“退出”按钮,退出系统。
2. 基础信息管理(1)点击主界面左侧菜单中的“基础信息管理”模块。
(2)查看基础信息列表,包括部门、岗位、人员等信息。
(3)新增部门信息:点击“新增”按钮,填写部门名称、负责人等基本信息,保存。
(4)修改部门信息:选中要修改的部门,点击“修改”按钮,修改相关信息,保存。
(5)删除部门信息:选中要删除的部门,点击“删除”按钮,确认删除。
3. 财务管理(1)点击主界面左侧菜单中的“财务管理”模块。
(2)查看财务报表,包括资产负债表、利润表、现金流量表等。
(3)新增报销单:点击“新增”按钮,填写报销单信息,提交审批。
(4)查看报销单:查看已提交的报销单,包括报销金额、报销日期、审批状态等信息。
(5)审批报销单:对报销单进行审批,同意或拒绝报销。
4. 供应链管理(1)点击主界面左侧菜单中的“供应链管理”模块。
(2)查看采购订单列表,包括采购订单号、供应商、采购金额等信息。
(3)新增采购订单:点击“新增”按钮,填写采购订单信息,提交审批。
(4)查看采购订单:查看已提交的采购订单,包括采购订单号、供应商、采购金额等信息。
(5)审批采购订单:对采购订单进行审批,同意或拒绝采购。
5. 人力资源管理(1)点击主界面左侧菜单中的“人力资源管理”模块。
(2)查看员工信息列表,包括姓名、部门、岗位、入职日期等信息。
操作系统实验三报告预防进程死锁的银行家算法.doc

操作系统实验三报告预防进程死锁的银行家算法操作系统实验报告实验三预防进程死锁的银行家算法学号班级姓名【实验目的】通过这次实验,加深对进程死锁的理解,进一步掌握进程资源的分配、死锁的检测和安全序列的生成方法。
【实验内容】问题描述设计程序模拟预防进程死锁的银行家算法的工作过程。
假设有系统中有n个进程P1, ,Pn,有m类可分配的资源R1, ,Rm,在T0时刻,进程Pi分配到的j类资源为Allocationij个,它还需要j类资源Need ij个,系统目前剩余j类资源Workj个,现采用银行家算法进行进程资源分配预防死锁的发生。
程序要求如下1)判断当前状态是否安全,如果安全,给出安全序列;如果不安全给出理由。
2)对于下一个时刻T1,某个进程Pk会提出请求RequestR1, ,Rm,判断分配给P k进程请求的资源之后。
3)输入进程个数n,资源种类m,T0时刻各个进程的资源分配情况(可以运行输入,也可以在程序中设置);4)输出如果安全输出安全的进程序列,不安全提示信息。
实现提示用C语言实现提示1)程序中进程调度时间变量描述如下int Available[MaxNumber]; intMax[MaxNumber][MaxNumber]; int Allocation[MaxNumber][MaxNumber]; int Need[MaxNumber][MaxNumber]; int Request[MaxNumber]; int SafeOrder[MaxNumber]; 2)进程调度的实现过程如下Ø 变量初始化;Ø 接收用户输入n,m,(输入或者默认的)Allocationij,Need ij;Ø 按照银行家算法判断当前状态安全与否,安全给出安全序列,不安全给出提示;Ø 如果安全,提示用户输入下一时刻进程Pk的资源请求RequestR1, ,Rm;Ø 如果不安全或者无新请求则退出。
操作系统实验三(页面置换算法)实验报告

实验三实验报告实验源码:#include "stdio.h"#include <iostream.h>#include <stdlib.h>#define DataMax 100 // 常量DataMax#define BlockNum 10 // 常量BlockNumint DataShow[BlockNum][DataMax]; // 用于存储要显示的数组bool DataShowEnable[BlockNum][DataMax]; // 用于存储数组中的数据是否需要显示int Data[DataMax]; // 保存数据int Block[BlockNum]; // 物理块int count[BlockNum]; // 计数器int N; // 页面个数int M; // 最小物理块数int ChangeTimes; // 缺页次数void DataInput(); // 输入数据的函数void DataOutput(); // 输出数据的函数void FIFO(); // FIFO 函数void Optimal(); // Optimal函数void LRU(); // LRU函数int main(int argc, char* argv[]){DataInput();int menu;while(true){printf("\n* 菜单选择*\n");printf("*******************************************************\n");printf("* 1-Optimal *\n");printf("* 2-FIFO *\n");printf("* 3-LRU *\n");printf("* 4-返回上一级*\n");printf("* 0-EXIT *\n");printf("*******************************************************\n");scanf("%d",&menu);switch(menu){case 1:Optimal();break;case 2:FIFO();break;case 3:LRU();break;case 0:exit(0);break;case 4:system("cls");DataInput();break;}if(menu != 1 && menu != 2 && menu != 3 && menu != 0 && menu !=4) { system("cls");printf("\n请输入0 - 4之间的整数!\n");continue;}}return 0;}void DataInput(){int i,choice;printf("请输入最小物理块数:");scanf("%d",&M);// 输入最小物理块数大于数据个数while(M > BlockNum){printf("物理块数超过预定值,请重新输入:");scanf("%d",&M);}printf("请输入页面的个数:");scanf("%d",&N);// 输入页面的个数大于数据个数while(N > DataMax){printf("页面个数超过预定值,请重新输入:");scanf("%d",&N);}printf("请选择产生页面访问序列的方式(1.随机2.输入):");scanf("%d",&choice);switch(choice){case 1:// 产生随机访问序列for(i = 0;i < N;i++){Data[i] = (int)(((float) rand() / 32767) * 10); // 随机数大小在0 - 9之间}system("cls");// 显示随机产生的访问序列printf("\n随机产生的访问序列为:");for(i = 0;i < N;i++){printf("%d ",Data[i]);}printf("\n");break;case 2:// 输入访问序列printf("请输入页面访问序列:\n");for(i = 0;i < N;i++)scanf("%d",&Data[i]);system("cls");// 显示输入的访问序列printf("\n输入的访问序列为:");for(i = 0;i < N;i++){printf("%d ",Data[i]);}printf("\n");break;default:while(choice != 1 && choice != 2){printf("请输入1或2选择相应方式:");scanf("%d",&choice);}break;}}void DataOutput(){int i,j;// 对所有数据操作for(i = 0;i < N;i++){printf("%d ",Data[i]);}printf("\n");for(j = 0;j < M;j++){// 对所有数据操作for(i = 0;i < N;i++){if( DataShowEnable[j][i] )printf("%d ",DataShow[j][i]);elseprintf(" ");}printf("\n");}printf("缺页次数: %d\n",ChangeTimes);printf("缺页率: %d %%\n",ChangeTimes * 100 / N); }// 最佳置换算法void Optimal(){int i,j,k;bool find;int point;int temp; // 临时变量,比较离的最远的时候用int m = 1,n;ChangeTimes = 0;for(j = 0;j < M;j++){for(i=0;i < N;i++){DataShowEnable[j][i] = false; // 初始化为false,表示没有要显示的数据}}for(i = 0;i < M;i++){count[i] = 0 ; // 初始化计数器}// 确定当前页面是否在物理块中,在继续,不在置换/////////////////////////////////////////////////////////////////////////////////// Block[0] = Data[0];for(i = 1;m < M;i++){int flag = 1;for(n = 0; n < m;n++){if(Data[i] == Block[n]) flag = 0;}if(flag == 0) continue;Block[m] = Data[i];m++;}//////////////////////////////////////////////////////////////////////////////////// 对所有数据进行操作for(i=0;i < N;i++){// 表示块中有没有该数据find = false;for(j = 0;j < M;j++){if( Block[j] == Data[i] ){find = true;}}if( find ) continue; // 块中有该数据,判断下一个数据// 块中没有该数据,最优算法ChangeTimes++; // 缺页次数++for(j = 0;j < M;j++){// 找到下一个值的位置find = false;for( k = i;k < N;k++){if( Block[j] == Data[k] ){find = true;count[j] = k;break;}}if( !find ) count[j] = N;}// 因为i是从0开始记,而BlockNum指的是个数,从1开始,所以i+1if( (i + 1) > M ){//获得要替换的块指针temp = 0;for(j = 0;j < M;j++){if( temp < count[j] ){temp = count[j];point = j; // 获得离的最远的指针}}}else point = i;// 替换Block[point] = Data[i];// 保存要显示的数据for(j = 0;j < M;j++){DataShow[j][i] = Block[j];DataShowEnable[i < M ? (j <= i ? j : i) : j][i] = true; // 设置显示数据}}// 输出信息printf("\nOptimal => \n");DataOutput();}// 先进先出置换算法void FIFO(){bool find;int point;int temp; // 临时变量int m = 1,n;ChangeTimes = 0;for(j = 0;j < M;j++){for(i = 0;i < N;i++){DataShowEnable[j][i] = false; // 初始化为false,表示没有要显示的数据}}for(i = 0;i < M;i++){count[i] = 0; // 大于等于BlockNum,表示块中没有数据,或需被替换掉// 所以经这样初始化(3 2 1),每次替换>=3的块,替换后计数值置1,// 同时其它的块计数值加1 ,成了(1 3 2 ),见下面先进先出程序段}// 确定当前页面是否在物理块中,在继续,不在置换/////////////////////////////////////////////////////////////////////////////////// Block[0] = Data[0];for(i = 1;m < M;i++){int flag = 1;for(n = 0; n < m;n++){if(Data[i] == Block[n]) flag = 0;}if(flag == 0) continue;Block[m] = Data[i];m++;}//////////////////////////////////////////////////////////////////////////////////// 对有所数据操作for(i = 0;i < N;i++){// 增加countfor(j = 0;j < M;j++){count[j]++;find = false; // 表示块中有没有该数据for(j = 0;j < M;j++){if( Block[j] == Data[i] ){find = true;}}// 块中有该数据,判断下一个数据if( find ) continue;// 块中没有该数据ChangeTimes++; // 缺页次数++// 因为i是从0开始记,而M指的是个数,从1开始,所以i+1if( (i + 1) > M ){//获得要替换的块指针temp = 0;for(j = 0;j < M;j++){if( temp < count[j] ){temp = count[j];point = j; // 获得离的最远的指针}}}else point = i;// 替换Block[point] = Data[i];count[point] = 0; // 更新计数值// 保存要显示的数据for(j = 0;j < M;j++){DataShow[j][i] = Block[j];DataShowEnable[i < M ? (j <= i ? j : i) : j][i] = true; // 设置显示数据}}// 输出信息printf("\nFIFO => \n");DataOutput();}// 最近最久未使用置换算法void LRU(){int i,j;bool find;int point;int temp; // 临时变量int m = 1,n;ChangeTimes = 0;for(j = 0;j < M;j++){for(i = 0;i < N;i++){DataShowEnable[j][i] = false; // 初始化为false,表示没有要显示的数据}}for(i = 0;i < M;i++){count[i] = 0 ; // 初始化计数器}// 确定当前页面是否在物理块中,在继续,不在置换///////////////////////////////////////////////////////////////////////////////////Block[0] = Data[0];for(i = 1;m < M;i++){int flag = 1;for(n = 0; n < m;n++){if(Data[i] == Block[n]) flag = 0;}if(flag == 0) continue;Block[m] = Data[i];m++;}//////////////////////////////////////////////////////////////////////////////////// 对有所数据操作for(i = 0;i < N;i++){// 增加countfor(j = 0;j < M;j++){count[j]++;}find = false; // 表示块中有没有该数据for(j = 0;j < M;j++){if( Block[j] == Data[i] ){count[j] = 0;find = true;}}// 块中有该数据,判断下一个数据if( find ) continue;// 块中没有该数据ChangeTimes++;// 因为i是从0开始记,而BlockNum指的是个数,从1开始,所以i+1 if( (i + 1) > M ){//获得要替换的块指针temp = 0;for(j = 0;j < M;j++){if( temp < count[j] ){temp = count[j];point = j; // 获得离的最远的指针}}}else point = i;// 替换Block[point] = Data[i];count[point] = 0;// 保存要显示的数据for(j=0;j<M;j++){DataShow[j][i] = Block[j];DataShowEnable[i < M ?(j <= i ? j : i) : j][i] = true; // 设置显示数据}}// 输出信息printf("\nLRU => \n");DataOutput();}实验结果截图:程序运行:输入相应数据:选择相应算法:最佳置换算法:先进先出算法:最近最久未使用算法:。
操作系统实验报告_实验三

操作系统实验报告——实验三:进程管理(一)实验内容:1.分别从至少三个虚拟终端登录,以树状形式列出你的系统中当前运行的所有进程及其PID。
找出你当前运行进程的所有祖先进程,并说明其各自的作用。
分析Linux系统中的进程的家族关系。
●实验室里:当前运行进程的所有祖先进程是init进程,init是Linux系统操作中不可缺少的程序之一,是内核启动的用户级进程。
内核自行启动(已经被载入内存,开始运行,并已初始化所有的设备驱动程序和数据结构等)之后,就通过启动一个用户级程序init的方式,完成引导进程。
所以,init始终是第一个进程(其进程编号始终为1)。
init有许多很重要的任务,比如像启动getty(用于用户登录)、实现运行级别、以及处理孤立进程,用pstree 命令就看到进程之间的关系了,所有进程都是由最开始的init创建的,父进程逐个创建子进程。
●个人电脑:所有进程的祖先进程为systemd,其是linux下的一种init软件。
Systemd(系统管理守护进程),最开始以GNU GPL协议授权开发,现在已转为使用GNU LGPL协议,它是如今讨论最热烈的引导和服务管理程序。
Linux系统配置使用Systemd引导程序,取替了传统的SysV init,启动过程将交给systemd处理。
Systemd的一个核心功能是它同时支持SysV init的后开机启动脚本。
Systemd引入了并行启动的概念,它会为每个需要启动的守护进程建立一个套接字,这些套接字对于使用它们的进程来说是抽象的,这样它们可以允许不同守护进程之间进行交互。
Systemd会创建新进程并为每个进程分配一个控制组(cgroup)。
处于不同控制组的进程之间可以通过内核来互相通信。
systemd处理开机启动进程的方式非常漂亮,和传统基于init的系统比起来优化了太多。
终端一:tty3///在实验室的电脑上操作终端二:tty5///在实验室的电脑上操作终端三:tty1///在实验室的电脑上操作实验室三个终端:tty3 tty5 tty1终端四:tty4///在个人电脑上操作终端五:tty3 ///在个人电脑上操作个人电脑两个终端:tty3 tty5 tty12.执行下列命令和操作:解释命令的作用:$sleep180 //执行挂起(睡眠)180秒^Z(ctrl+Z)//强制当前进程转为后台,使之挂起(暂停)$jobs //查看后台运行的程序及运行状态$sleep 240& //以后台方式启动挂起(睡眠)240秒$sleep 300& //以后台方式启动挂起(睡眠)300秒$sleep 330& //以后台方式启动挂起(睡眠)330秒$sleep 630& //以后台方式启动挂起(睡眠)630秒$jobs //查看后台运行的程序及运行状态$fg 4 //将第四个任务切换到前台^C(ctrl+C)//强制结束当前进程$bg 1 //将第一个任务切换到后台运行$kill 5 //结束后台任务5执行结果截图:3.利用/proc文件系统,选择一个进程,如-bash,列出并解释/proc/$PID/cmdline, /proc/$PID/stat, /proc/$PID/status文件的内容。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
操作系统实验报告——实验三:进程管理(一)
实验内容:
1.分别从至少三个虚拟终端登录,以树状形式列出你的系统中当前运行的所有进程及其PID。
找出你当前运行进程的所有祖先进程,并说明其各自的作用。
分析Linux系统中的进程的家族关系。
●实验室里:
当前运行进程的所有祖先进程是init进程,init是Linux系统操作中不可缺少的程序之一,是内核启动的用户级进程。
内核自行启动(已经被载入内存,开始运行,并已初始化所有的设备驱动程序和数据结构等)之后,就通过启动一个用户级程序init的方式,完成引导进程。
所以,init始终是第一个进程(其进程编号始终为1)。
init有许多很重要的任务,比如像启动getty(用于用户登录)、实现运行级别、以及处理孤立进程,用pstree 命令就看到进程之间的关系了,所有进程都是由最开始的init创建的,父进程逐个创建子进程。
●个人电脑:
所有进程的祖先进程为systemd,其是linux下的一种init软件。
Systemd(系统管理守护进程),最开始以GNU GPL协议授权开发,现在已转为使用GNU LGPL协议,它是如今讨论最热烈的引导和服务管理程序。
Linux系统配置使用Systemd引导程序,取替了传统的SysV init,启动过程将交给systemd处理。
Systemd的一个核心功能是它同时支持SysV init的后开机启动脚本。
Systemd引入了并行启动的概念,它会为每个需要启动的守护进程建立一个套接字,这些套接字对于使用它们的进程来说是抽象的,这样它们可以允许不同守护进程之间进行交互。
Systemd会创建新进程并为每个进程分配一个控制组(cgroup)。
处于不同控制组的进程之间可以通过内核来互相通信。
systemd处理开机启动进程的方式非常漂亮,和传统基于init的系统比起来优化了太多。
终端一:tty3
///在实验室的电脑上操作
终端二:tty5
///在实验室的电脑上操作
终端三:tty1
///在实验室的电脑上操作
实验室三个终端:tty3 tty5 tty1
终端四:tty4
///在个人电脑上操作
终端五:tty3 ///在个人电脑上操作
个人电脑两个终端:tty3 tty5 tty1
2.执行下列命令和操作:
解释命令的作用:
$sleep180 //执行挂起(睡眠)180秒
^Z(ctrl+Z)//强制当前进程转为后台,使之挂起(暂停)$jobs //查看后台运行的程序及运行状态
$sleep 240& //以后台方式启动挂起(睡眠)240秒
$sleep 300& //以后台方式启动挂起(睡眠)300秒
$sleep 330& //以后台方式启动挂起(睡眠)330秒
$sleep 630& //以后台方式启动挂起(睡眠)630秒
$jobs //查看后台运行的程序及运行状态
$fg 4 //将第四个任务切换到前台
^C(ctrl+C)//强制结束当前进程
$bg 1 //将第一个任务切换到后台运行
$kill 5 //结束后台任务5
执行结果截图:
3.利用/proc文件系统,选择一个进程,如-bash,列出并解释/proc/$PID/cmdline, /proc/$PID/stat, /proc/$PID/status文件的内容。
/proc/$3166/cmdline结果截图:
进程的命令行参数:bash^@
/proc/$PID/stat结果截图:
包含了进程的状态信息,例如:进程PID=3166,应用进程或命令的名字=bash,任务的状态:S(sleep),父进程:3158,线程组号:3166等等。
/proc/$PID/status结果截图:
进程的状态信息:包括进程名name、状态state、线程组内第一个线程id :tgid、父进程:ppid、跟踪调试进程id :Tracerpid、进程对应的程序的Uid、进程对应程序的Gid 、FDSize进程使用文件句柄大小、Groups 组信息、以及进程所使用的虚拟内存以及实际内存、信号机制方面的信息:VmPeak、kBVmSize、kBVmLck、kBVmpin……
4.分别以root和普通用户身份运行一个进程,使用nice、renice和top设置或者改变其优先级,并验证是否成功。
普通用户下:
●nice:
●renice:
●top:
root用户下:●nice:
●renice:
top:。