进程同步模实验.pptVIP

  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文档。上传文档
查看更多
进程调度及进程同步模拟实验要求 编程完成进程调度及同步模拟。 可定义若干进程并发执行,进程数可定义5以上进程。 进程同步与互斥问题可选 用生产者消费者问题 哲学家就餐问题 读者写者问题 进程调度可任选一种调度算法 每进程完成的工作最好写在磁盘文件中。 进程调度及进程同步模拟实验 下列程序是完成进程同步与互斥的信号量操作,有三个进程pcb[1..3]共享变量s1,s2,三进程s1作加1运算,pcb[2],pcb[3]对s2作加1运算。 主要数据结构 主要数据结构 char savearea[3][4];//上下文切换区,存放三个进程在切换时的上下文 char addr;//地址变量 int i,s1,s2,seed,exe=NIL;//s1,s2是共享变量 主要模块 初始化模块init() //初始化程序 { int j; for (j=0;j3;j++) { pcb[j].id=j; pcb[j].status=r;//进程控制块初始化,进程状态是就绪态 pcb[j].nextwr=NIL; printf(\n process %d priority? ,j+1); scanf(%d,i); pcb[j].priority=i; } sem[0].value=1; //信号量初始化 sem[0].firstwr=NIL; sem[1].value=1; sem[1].firstwr=NIL; for(i=0;i3;i++) for(j=0;j4;j++) savearea[i][j]=0;//上下文切换区初始化为空 } 主要模块 float random() {int m; if(seed0) m=-seed; else m=seed; seed=(25173*seed+13849)%65535; return(m/32767.0); }//产生随机数程序 主要模块 timeint(char ad) /* The time slice interrupt*/ { //子调度程序 float x; x=random(); if(x0.33 exe==0) return(FALSE); if(x0.66 exe==1) return(FALSE); if(x1 exe==2) return(FALSE); savearea[exe][0]=i;//用变量I模仿寄存器,作为保存上下文内容之一。 savearea[exe][1]=ad;//被调度程序的地址 pcb[exe].status=t;//进程状态为高就绪态 printf(Times silce interrupt process%d enter into ready.\n,exe+1); exe=NIL; exe指向正在执行(运行)的进程 return TRUE; } 信号量wait()操作 wait(int se,char ad) //ad为调用进程程序地址 { if(--sem[se].value=0) return(FALSE); block(se); savearea[exe][0]=i; savearea[exe][1]=ad; exe=NIL; return(TRUE); } 进程阻塞操作 block(se) int se; {int w; printf(process %d is blocked\n,exe+1); pcb[exe].status=w; pcb[exe].nextwr=NIL; if((w=sem[se].firstwr)==NIL) sem[se].firstwr=exe; else { while(pcb[w].nextwr!=NIL) w=pcb[w].nextwr; pcb[w].nextwr=exe; } } 信号量的signal()操作 signal(int se,char ad) { if(++sem[se].value0) return(FALSE); wakeup(se); savearea[exe][1]=ad; savearea[exe][0]=i; return(TRUE); } 进程唤醒操作 wakeup(int se) { int w; w=sem[se].firstwr; if(w!=NIL) { sem[se].firstwr=pcb[w].nextwr; pcb[w].status=r; printf(process %d is

文档评论(0)

gk892289 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档