2.3 进程控制(创建,终止,状态转换)一般由OS内核的原语实现
一、操作系统内核
1.OS内核包含与硬件紧密相关的模块(如中断处理程序),常用设备驱动、运行频率高的模块(如时钟管理、进程调度)。安排在紧靠硬件的软件层次,常驻内存。
2.OS内核两大功能
①支撑功能(中断处理,时钟管理,原语操作)
②资源管理功能(进程管理,存储器管理,设备管理)
二、进程的创建
1.进程的层次结构(Linux):父进程,子进程
2.引起创建进程的事件
①用户登录。在分时系统中,用户在终端键入登录命令后,如果是合法用户,系统将为该终端建立一个进程,并把它插入就绪队列中。
②作业调度。在批处理系统中,当作业调度程序按一定的算法调度到某作业时,便将该作业装入内存,为它分配必要的资源,并立即为它创建进程,再插入就绪队列中。
③ 提供服务。当运行中的用户程序提出某种请求后,系统将专门创建一个进程来提供用户所需要的服务。
④应用请求。在上述三种情况下,都是由系统内核为它创建一个新进程;而第4类事件则是基于应用进程的需求,由它自己创建一个新进程,以便使新进程以并发运行方式完成特定任务。
3.进程创建creat()
①申请空白PCB,申请pid
②为新进程分配资源,从OS或从父进程获得
③初始化进程控制块,包括标识信息,处理机状态信息,处理机控制信息
④将新进程插入就绪队列
三、进程的终止
1. 引起终止进程的事件
①正常结束
②异常结束
③外界干预
2.终止过程
①根据被终止进程的标识符ID,从PCB集合中检索出该进程的PCB,从中读出该进程的状态
②若被终止进程正处于执行状态,应立即终止该进程的执行,并置调度标志为真,用于指示该进程被终止后应重新进行调度
③若该进程还有子孙进程,还应先将其所有子孙进程予以终止,以防他们成为不可控的进程
④将被终止进程所拥有的全部资源,或者归还给其父进程,或者归还给系统
⑤将被终止进程(它的PCB)从所在队列(或链表)中移出,等待其他程序来搜集信息
四、进程的阻塞与唤醒
1.引起进程阻塞的事件
①请求系统服务:提出I/O服务时,并不立即满足该进程的要求时,转变为阻塞状态来等待
②启动某种操作:当进程启动某种操作后,在该操作完成之后才能继续执行
③新数据尚未到达:对于相互合作的进程而言,交互时
④无新工作可做。如发送进程
2.阻塞过程block()
①进程便通过调用阻塞原语block( )把自己阻塞
②阻塞程序把进程控制块中的现行状态由“执行”改为“阻塞”,并将PCB插入阻塞队列
③转调度程序进行重新调度,将处理机分配给另一就绪进程,并进行切换
3.唤醒过程wakeup()
相关进程调用wakeup(),把被阻塞的进程从等待该事件的阻塞队列中移出,将其PCB中的现行状态由阻塞改为就绪 (2)然后再将该PCB插入到就绪队列中
*block()和wakeup()必须成对使用
五、进程的挂起与激活
1.suspend():检查被挂起进程的状态,若处于活动就绪状态,便将其改为静止就绪;对于活动阻塞状态的进程,则将之改为静止阻塞
2.active():将进程从外存调入内存,检查该进程的现行状态。 若是静止就绪,便将之改为活动就绪;若为静止阻塞,便将之改为活动阻塞
六、Linux进程控制
1.进程的创建
int main(void){
pid_t pid;
pid=fork();
if(pid==-1)
printf(“fork error\n”);
//在子进程中返回值为0(不合法的PID,提示当前运行在子进程中)
else if(pid==0){
printf(“the returned value is %d\n”,pid);
printf(“In child process!!\n”);
printf(“My PID is %d\n”,getpid());
}
//在父进程中返回值为子进程ID(让父进程掌握所创建子进程的ID号)
else{
printf(“the returned value is %d\n”,pid);
printf(“In father process!!\n”);
printf(“My PID is %d\n”,getpid());
}
return 0;
}
2.进程的退出
①exit 是一个函数,执行完后把控制权交给系统
②return 是函数执行完后的返回。return 执行完后把控制权交给调用函数
③exit 是正常终止进程;abort 是异常终止进程
④_exit 执行后立即将控制权返回给内核;exit 执行后要先执行一些清除操作,然后才将控制权交给内核
3.进程的等待与睡眠
①孤儿进程
②僵尸进程:已经终止但父进程尚未对其调用wait或waitpid函数的进程
③wait():父进程一旦调用了wait就立即阻塞自己。如果让它找到了这样一个已经变成僵尸的子进程,wait就会收集这个子进程的信息,并把它彻底销毁后返回;如果没有找到这样一个子进程,wait就会一直阻塞在这里,直到有一个子进程出现为止。
4.进程的执行:exec函数簇
标签:半期,复习,pid,阻塞,进程,printf,2.3,就绪,终止 From: https://www.cnblogs.com/05-ReFrain-19/p/17323104.html