进程同步模拟实验_第1页
进程同步模拟实验_第2页
进程同步模拟实验_第3页
进程同步模拟实验_第4页
进程同步模拟实验_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 1 2022-3-24进程调度及进程同步模拟实验要求编程完成进程调度及同步模拟。可定义若干进程并发执行,进程数可定义以上进程。进程同步与互斥问题可选n用生产者消费者问题n哲学家就餐问题n读者写者问题l进程调度可任选一种调度算法l每进程完成的工作最好写在磁盘文件中。进程调度及进程同步模拟实验l下列程序是完成进程同步与互斥的信号量操作,有三个进程pcb1.3共享变量s1,s2,三进程s1作加运算,pcb2,pcb3对s2作加运算。主要数据结构进程控制块structint id; /*进程标识*/char status /*进程状态*/;int nextwr; /*指向进程控制块后继的指针*/in

2、t priority; /*进程优先级*/ pcb3; /*进程控制块*/struct int value; int firstwr; /指向信号量等待队列 sem2;/信号量主要数据结构lchar savearea34;/上下文切换区,存放三个进程在切换时的上下文lchar addr;/地址变量lint i,s1,s2,seed,exe=NIL;/s1,s2是共享变量寄存器i地址主要模块l初始化模块init() /初始化程序l int j;l for (j=0;j3;j+)l pcbj.id=j;l pcbj.status=r;/进程控制块初始化,进程状态是就绪态l pcbj.nextwr=

3、NIL;l printf(n process %d priority? ,j+1);l scanf(%d,&i);l pcbj.priority=i;l l sem0.value=1; /信号量初始化l sem0.firstwr=NIL;l sem1.value=1;l sem1.firstwr=NIL;l for(i=0;i3;i+)l for(j=0;j4;j+)l saveareaij=0;/上下文切换区初始化为空l主要模块lfloat random()lint m;l if(seed0) m=-seed;l else m=seed;l seed=(25173*seed+1384

4、9)%65535;l return(m/32767.0);l/产生随机数程序主要模块ltimeint(char ad) /* The time slice interrupt*/l /子调度程序l float x;l x=random();l if(x0.33 & exe=0) return(FALSE);l if(x0.66 & exe=1) return(FALSE);l if(x1 & exe=2) return(FALSE);l saveareaexe0=i;/用变量I模仿寄存器,作为保存上下文内容之一。l saveareaexe1=ad;/被调度程序的地址l

5、pcbexe.status=t;/进程状态为高就绪态l printf(Times silce interrupt process%d enter into ready.n,exe+1);l exe=NIL; exe指向正在执行(运行)的进程l return TRUE;llscheduler()进程调度程序lint pd;l if(pd=find()=NIL & exe=NIL)l return(NIL);/此时无进程可调度,系统为空闲l if(pd!=NIL)l if(exe=NIL)l pcbpd.status=e;l exe=pd;l printf(process%d is exe

6、cuting.n,exe+1);l l else if(pcbpd.prioritypcbexe.priority)l pcbexe.status=r;l printf(process %d enter into readyn,exe+1);l pcbpd.status=e;l exe=pd;l printf(process %d is executingn,exe+1);l l l i=saveareaexe0;l addr=saveareaexe1;l return(exe);l1.find()先查找高就绪态进程队列中找一进程,若没有低再到就绪态进程队列中找一进程。2. int j,pd=

7、NIL,w=MAXPRI;3. for(j=0;j3;j+)4. if(pcbj.status=r)5. if(pcbj.priorityw)6. w=pcbj.priority;7.pd=j;8. 9. if(pd=NIL)10. for(j=0;j3;j+)11. if(pcbj.status=t)12.if(pcbj.priority=0) return(FALSE);4. block(se);5. saveareaexe0=i;6. saveareaexe1=ad;7. exe=NIL;8. return(TRUE);9.进程阻塞操作lblock(se)lint se;lint w;l

8、printf(process %d is blockedn,exe+1);lpcbexe.status=w;lpcbexe.nextwr=NIL;lif(w=semse.firstwr)=NIL)lsemse.firstwr=exe;lelsel while(pcbw.nextwr!=NIL)lw=pcbw.nextwr;l pcbw.nextwr=exe;l l信号量的signal()操作1.signal(int se,char ad)2. if(+semse.value0) return(FALSE);3. wakeup(se);4. saveareaexe1=ad;5. savearea

9、exe0=i;6. return(TRUE);7.进程唤醒操作1.wakeup(int se)2. int w;3. w=semse.firstwr;4. if(w!=NIL)5. semse.firstwr=pcbw.nextwr;6. pcbw.status=r;7. printf(process %d is waken upn,w+1);8. 9.process1() if(addr=a) goto a1; if(addr=b) goto b1; if(addr=c) goto c1; if(addr=d) goto d1; if(addr=e) goto e1; if(addr=f)

10、goto f1; Process()。for(i=1;i6;i+) printf(process1 calls wait on the semaphore 1n); if(wait(0,a) break;a1: printf(process1 is call wait on the semphore 1n); if(timeint(b) break;b1: printf(“s1=%dn”,+s1); printf(process1 call signal on semphore1 and quit cretical section 1.n); if(signal(0,c) break;c1:

11、printf(process1 call wait on semphore 2.n); if(wait(1,d) break;d1: printf(process1 is execting cretical section 2.n); if(timeint(e) break;e1: printf(“s2=%dn”,+s2); printf(process1 call signal on semaphore2 and quit cretical section2n); if(signal(1,f) break;f1: printf(process1 cycle count =%dn,i); if

12、(i6) return ; eexit(0);Process()。 for(i=1;i6;i+) printf(process2 calls wait on the semaphore 2.n); if(wait(1,a) break;a2: printf(process2 is call wait on the semphore 2.n); if(timeint(b) break;b2: printf(“s2=%dn”,+s2); printf(process2 call signal on semphore1 and quit cretical section 2.n); if(signa

13、l(1,c) break;c2: printf(process2 call wait on semphore 1.n); if(wait(0,d) break;d2: printf(process2 is execting cretical section 1.n); if(timeint(e) break;e2: printf(“s1=%dn”,+s1); printf(process2 call signal on semaphore2 and quit cretical section1n); if(signal(0,f) break;f2: printf(process2 cycle

14、count =%dn,i); if(i6) return ; eexit(0);process3() if(addr=a) goto a3; if(addr=b) goto b3; if(addr=c) goto c3; for(i=1;i6;i+) printf(process3 calls wait on the semaphore 2.n); if(wait(1,a) break;a3: printf(process3 is execting cretical section 2.n); if(timeint(b) break;b3: printf(s2=%dn,+s2); printf(process3 call signal on semphore2 and quit cretical section 2.n); if(signal(1,c) break;c3: printf(process3 cycle count =%dn,i); if(i6) return ; eexit(2);main()int k; printf(*process management*nn); init(); printf(s1=%d, s2=%dn,s1,s2); printf(process1,process2,process3 are all in rea

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论