- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 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
您可能关注的文档
最近下载
- 企业吸收合并协议.doc VIP
- 板框压滤机操作规程.doc VIP
- 义务教育版七年级全一册信息科技 第9课 数据传输有新意 教案(表格式).pdf VIP
- 爬山虎的脚PPT课件.pptx
- 康复辅助技术咨询师.pdf VIP
- 北京工业大学822信号与系统2022年真题及答案.pdf VIP
- 全国黄金交易从业水平考试《黄金市场基础知识与交易实务》复习全书【核心讲义+章节练习】.docx VIP
- 电饭煲UL认证零部件检验要求.pdf VIP
- 浙江省桐乡市2025年上半年公开招聘辅警试题含答案分析.docx VIP
- GB30871危险化学品企业位特殊作业安全规范知识考试复习题库(含答案).docx VIP
文档评论(0)