原文链接:http://blog.sina.com.cn/s/blog_65127e430100h41d.html
1.创建进程原语Create()
参数说明:被创建进程的外部标识符n、初始CPU状态S0(包括CPU的工作方式、进程起始地址以及屏蔽码等)、进程优先数K0、初始内存M0以及所需资源的清单R0等、某进程运行的中间结果acc
创建过程如下:
首先,从PCB集合种索取一个空白PCB,并获得该PCB的内部标识符i ;
然后,把调用者提供的参数,以及从执行过程EP中获得的调用者内部标识j ,填入该PCB,设置记帐数据,置新进程为“静止就绪”状态;
最后,把此PCB分别插入就绪队列RQ和进程家族中。描述如下:
Procedure Create(n,S0,k0,M0,R0,acc)
begin
i:=get Internal Name(n);//获得内部名
i.id:=n; //填外部名
i.Priority:=k0; //填优先表
i.cpu state:=S0; //填cpu初始状态
i.mainstore:=M0; //填写主存区域
i.resource:=R0; //填写资源清单
i.status:=‘Readys’; //填写进程状态
j:=EP; //获取调用者内部标识
i.Parent:=j; //填入i进程的父进程j
i.progeny:=null; //i的家庭指针为空
j.progeny:=i; //把i填入其父进程pcb中的家庭指针处
i.state:=RQ; //i所在状态队列首指针
Insert(RQ,i); //把i进程插入RQ队尾
continue;
end
2. 撤销原语destroy( )
引起进程终止事件可分三类:正常结束、异常结束、外界干预。
撤销原语在撤销指定进程的同时也应该撤销所指示的子孙进程, 所以用kill()递归算法撤销子孙进程
描述如下:
Procedure destroy(n)
Begin
Sched:=false;
i:=getinternal name(n);//获取n进程的内部名
kill(i);
if sched then scheduler else continue;//假如Schde为真,则转调度程序,否则继续
end
procedure kill(i)
begin
if i.stata(i)=”executing” then
begin stop(i);
sched:=true end;
remove (i.stata,i); //将被撤消进程从i.state所指示的队列中除去
for all S∈i.progeny do kill(s);
for all r∈(i.main store ∪i.resources) do
if owned® then insert (r.semaphore,r.date);//属于父进程的资源归还且插入父进程资源清单
for all ∈created resources(i) do remove descriptor ®;//撤消自己的资源清单归还系统
remove process control block (i);
end
3、挂起原语suspend( )
任务:让某些进程暂时不参与资源竞争
挂起的方式有三类:一、把挂起原语调用者本身挂起,即自己挂起自己。二、挂起某个标识符的进程。三、将某个指定的标志符及其全部或部分子孙挂起用的保存n进程的pcb副本的内存区。
Procedure suspend(n,a)
Begin
i:=getinternal name(n);
s:=i.status;
if s=”executing” then stop(i);
a:=copy PCB(i);
i.status:=if s=”blockeda” then “blockeds” else readys;
if s=”executing” then scheduler else continue;
end
4、激活原语active( )
激活方式:激活指定标志符的进程或激活某进程及其子孙进程
Procedure active(n)
Begin
i:=getinternal name(n)
i.status:=if i.status=”readys” then “readya” else blockeda;
if i.status=”readys” then scheduler;//当激活后的进程处于“readys”状态针,将引起重新调度
else continue
end
5、阻塞原语 block
引起阻塞和唤醒的事件可分四类:一、请求系统服务。二、启动某种操作(同步由int将该进程唤醒)三、新数据尚未到达时。四、无新工作可做
Procedure block
Begin
i:=EP; //从执行进程EP获得调用者内部标识符
stop(i);
i.status:=”blockda”; i.stata=WQ®;//填写阻塞队列指针
insert(WQ®,i); //把i插入WQ队尾
scheduler //转调度程序
end
6、唤醒原语 wakeup()
任务:由于自己释放资源带来的释放因资源而阻塞它的进程
Procedure wakeup(n)
Begin
i :=getinternal name(n);
remove (WQ®,i); //把i进程从等待r而受阻塞队列中摘除
i.status:=”ready”; //置i进程为“就绪”状态
i.sdata:=RQ; //把i进程插入到就绪队列
insert(RQ,i);
continue
end