加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

进程原语

(2010-02-17 14:47:00)
标签:

原语

pcb

procedure

if

name

分类: 操作系统

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 Si.progeny do kill(s);

for all r(i.main storei.resources) do

if owned(r) then insert (r.semaphore,r.date);//属于父进程的资源归还且插入父进程资源清单

for all created resources(i) do remove descriptor (R);//撤消自己的资源清单归还系统

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(r);//填写阻塞队列指针

insert(WQ(r),i); //把i插入WQ队尾

scheduler        //转调度程序

end

 

 

6、唤醒原语 wakeup()

任务:由于自己释放资源带来的释放因资源而阻塞它的进程 

Procedure wakeup(n)

Begin

i :=getinternal name(n);

remove (WQ(r),i);    //把i进程从等待r而受阻塞队列中摘除

i.status:=”ready”; //置i进程为“就绪”状态

i.sdata:=RQ;         //把i进程插入到就绪队列

insert(RQ,i);

continue

end

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有