进程的原语

原文链接: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

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值