内容正文:
操作系统原理(第2版)
2.3 进程控制
2.进程切换的时机
进程切换是中断驱动的,引起进程切换的中断可分为以下三种:
(1)中断。中断发生时,操作系统保存当前运行进程(称为旧进程)的现场信息,调度新进程运行。
(2)异常。CPU在一条指令执行时,检查到有一个或多个预定义的条件或错误产生时就会产生异常,这时,终止当前运行进程的执行,CPU转去执行异常处理程序。
(3)系统调用。系统调用是对操作系统服务的一种显式请求。阻塞型系统调用发生时,则当前运行进程被阻塞,此时CPU转去执行进程调度程序。
进程切换
3. 进程上下文切换
(1)当前运行进程(旧进程)被中断时保存其CPU现场信息。
(2)对被中断的当前运行进程进行PCB更新,包括改变进程状态和其他 相关信息。
(3)将被中断的当前运行进程的PCB移入适当的队列(时间片到则移入就绪队列,因某事件阻塞则移入相应的阻塞队列)。
(4)由进程调度程序调度选中另一个就绪进程(新进程),为其设置执行的上下文环境并对其PCB进行更新。
(5)修改新进程的地址空间,更新新进程的内存管理信息。
(6)恢复被选中的新进程最后一次进程上下文切换(上次中断运行)时所保存的CPU现场信息。
进程切换
2.3.2 进程控制原语
1. 原语
一个操作可以依次分成几个具体实施的动作,如果这几个动作的执行不会被分割或中断,且这些动作要么全部执行,要么一个都不执行,则称这个操作具有原子性。
一个特殊的程序段称为原语,意味着这段程序的执行具有原子性,即这段程序的所有指令要么全部执行,要么一个都不执行。
注意:如果原语中某一条指令的执行没有成功,那么该原语中之前已经执行的指令操作要全部废除,并恢复到未执行该原语前的状态。原语的主要作用是保证系统运行的一致性。
2.3 进程控制
2.进程创建原语
int Creat(int n,int k, List *s,List *r) //创建原语
{
lock out interrups; //关中断
Get(NewPCB,FreeQueue); //从空闲FreeQueue队列申请一个空闲PCB
NewPCB->id=n; //为新进程分配唯一的进程标识符n
NewPCB->priority=k; //置新进程的优先级为k
GetMemory(NewPCB); //为新进程申请分配内存资源
GetResouce(NewPCB,r); //按资源清单r为新进程分配其他资源
Init_PCB(NewPCB,s); //按初始化清单s初始化新进程的PCB
NewPCB->status="ready"; //新进程的状态置为“就绪”
NewPCB->parents=EP(); //新进程的父进程为当前执行进程
NewPCB->children=NULL; //新进程的子进程初始为空
Insert(ReadyQueue,NewPCB); //新进程PCB插入ReadyQueue队列
unlock interrupts; //开中断
return(n); //新进程的标识符n返回给当前执行进程
}
3. 进程撤销原语
void Destroy(string name) //撤销原语
{ lock out interrups; //关中断
int i=0,dispatch=0; //置重新调度标志dispatch的初值为假
i=Search(PCB_List,name); //根据进程名name在PCB链查找进程标识符
if(i==0) Unusual_Stop(); // i等于0则未找到要撤销进程转异常处理
else //找到要撤销进程的PCB
if(i.status=="excute") //被撤销的进程i是运行进程
{ dispatch=1; stop(i); } //置重新调度标志为真,终止进程i的执行
else
{ Destroy(Progeny(i)); //撤销进程i的所有子孙进程
free(i.