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