进程管理实验报告.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多

实验名称:进程管理

实验要求:阅读后面的C语言实例,修改程序,使其优先数在运行期间可以变化(动态优先数)。例如,当某进程被时间片中断次数增加到一定数目时,提高其优先权。

关键问题:读懂源程序代码,了解进程管理的方式,并设计一个算法使程序能在运行过程中修改进程优先级。

设计思路:在进程控制块中定义一个记录进程中断次数的变量,在block函数中设置跟踪并记录进程中断次数,在调度函数schedule中设置算法,在进程中断3次后将该进程的优先级提升至最高。

改动后的代码:

#includestdio.h

#defineTRUE1

#defineFALSE0

#defineMAXPRI100

#defineNIL-1

//进程控制块

struct{

intid;//进程号

charstatus;//进程状态,e-执行态r-高就绪态t-低就绪态w-等待态c-完成态

intnextwr;//等待链指针,指示在同一信号量上等待的下一个等待进程的进程号。

intpriority;//进程优先数,值越小,优先级越高。

intc;//进程中断次数

}pcb[3];//共3个进程

//s1、s2为三个进程共享的变量;seed为随机值;registeri模拟寄存器值,存放计算的重复次数。

intregisteri,s1,s2,seed,exe=NIL;//exe为当前运行(占有cpu)的进程号

//2个信号量sem[0]、sem[1],分别与共享变量s1、s2相联系。

//对应信号量sem[0]、sem[1]分别有两个阻塞队列,队列首由sem[].firstwr指定,队列链指针是pcb[].nextwr

struct{

intvalue;//信号量值

intfirstwr;//等待该信号量的阻塞队列的首个进程号

}sem[2];

//三个进程的现场保留区,其中savearea[][0]为寄存器内容,savearea[][1]为下一条指令地址。

charsavearea[3][4];

charaddr;//当前执行程序的当前指针

voidmain();

voidinit();

floatrandom();

inttimeint(charad);

intscheduler();

intfind();

intp(intse,charad);

voidblock(intse);

intv(intse,charad);

voidwakeup(intse);

voidprocess1();

voidprocess2();

voidprocess3();

voideexit(intn);

//--------------------------------------------------------------------

//主程序

voidmain()

{

intcurrentProcess;

printf(进程管理器\n);

init();

printf(s1=%d,s2=%d\n,s1,s2);

printf(进程1、进程2、进程3已经准备好!\n);

for(;;)

{

currentProcess=scheduler();//进程调度,选择优先级别最高的就绪进程运行。

if(currentProcess==NIL)

break;//所有进程已经运行完毕,结束。

switch(currentProcess)//运行当前进程代码

{

case0:

process1();

break;

case1:

process2();

break;

case2:

process3();

break;

default:

printf(进程号出错!\n);

break;

}

}

printf(最后结果:s1=%d,s2=%d\n,s1,s2);

}

//------------------------------------------------------------------------

//初始化

voidinit()

{

inti,j;

s1=0;s2=0;

//生成进程控制块

for(j=0;j3;j++)

{

pcb[j].id=j;//进程号

pcb[j].status=r;//进程初始状态为高就绪状态

pcb[j].

文档评论(0)

151****1215 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档