写优先”策略的“读者

上传人:jin****ng 文档编号:123507096 上传时间:2022-07-22 格式:DOC 页数:35 大小:669KB
收藏 版权申诉 举报 下载
写优先”策略的“读者_第1页
第1页 / 共35页
写优先”策略的“读者_第2页
第2页 / 共35页
写优先”策略的“读者_第3页
第3页 / 共35页
资源描述:

《写优先”策略的“读者》由会员分享,可在线阅读,更多相关《写优先”策略的“读者(35页珍藏版)》请在装配图网上搜索。

1、采用“写优先”策略的“读者-写者”问题学院 计算机科学与技术专业 计算机科学与技术学号学生姓名指导教师姓名2014-3-11一、设计目的与内容错误!未定义书签。(1 )、课程设计的目的-1(2 )、课程设计的内容.-1(3 )、课程设计的要求.-1-二、算法的基本思想错误!未定义书签。三、模块流程图四、测试结果五、结论六、源程序,错误!未定义书签,错误!未定义书签错误!未定义书签,错误!未定义书签一、设计目的与内容(1) 课程设计的目的:操作系统课程设计是计算机专业重要的教学环节,它为学生提供了一个既 动手又动脑,将课本上的理论知识和实际有机的结合起来,独立分析和解决问题 的机会。进一步巩固和

2、复习操作系统的基础知识。培养学生结构化程序、模块化程序设计的方法和能力。提高学生调试程序的技巧和软件设计的能力。 提高学生分析问题、解决问题以及综合利用C语言进行程序设计的能 力。(2) 课程设计的内容:用高级语言编写和调试一个采用“写优先”策略的“读者一写者”问题的模拟 程序。(3) 课程设计的要求:1. 读者与写者至少包括ID、进入内存时间、读写时间三项内容,可在界 面上进行输入。2. 读者与写者均有两个以上,可在程序运行期间进行动态增加读者与写者。3. 可读取样例数据(要求存放在外部文件中),进行读者/写者、进入内 存时间、读写时间的初始化。4. 要求将运行过程用可视化界面动态显示,可随

3、时暂停,查看阅览室中 读者/写者数目、读者等待队列、读写时间、等待时间。5. 读写策略:读写互斥、写写互斥、写优先(只要写者到达,就阻塞后续的所有读者,一旦阅览室无人,写者能最快进入阅览室;在写者 未出阅读室之前,又有新的读者与写者到达,仍然是写者排在前面)二、算法的基本思想进程结构体:struet processint name;/进程 ID 号char type;/进程类别(判断是读者还是写者线程)int starttime; /进程开始时间int needtime; /进程读写需要的时间int runtime;/进程在内存中已运行的时间struet process *next;创建三个链

4、表,分别为processl、process2、process3。processl 存储各 个进程的信息,process2存储就绪队列的进程信息,process3存储正在执行的 进程的信息。系统有两个功能,一个是手动输入进程,另一个是文件输入进程。文件读入功能,是从文件“123. txt”中读入进程。用整形数I模拟时间片,每次时间片开始时先将需要进入就绪队列的进程 用ready()函数拉入就绪队列。接着用sort()函数进行排序,将写者排在读者前 面。然后判断就绪队列的开头是读者还是写者,然后调用相应的函数Reader()或 Writer。时间片结束时,对各个进程的 runtime+, 并判断进

5、程是否执行完毕,如果 完毕就其离开process3链表。最后将时间片i+,反复循环,直到所有进程执行 完毕。三、模块流程图四、测试结果程序运行实例如下:1、进入主界面 x|2i口g:i=:01 择禍序 选人/程 flu2、选择1,运行界面如下:|::,1- 写优先的读者-写者问题*手动揃入进程* 2-x4b入进辱#3-退出*JCmCJCKJCXM JCMJtJCM: JC JCJCD: Progra FilesBicrosoft Visual StudioIyPro jectssDebugs. exe开始时I可读写时间:3除写:ww *D:Progra FilesBicrosoft Visua

6、l StudioIyProjectssDebugs.exe时间4 :#include vstdlib.h#include windows.h#include vconio.hint mutex=l;互斥读写的信号量int readcount=0;用readcount变量来记录读者数struct processint num;进程序号char type;进程类别(判断是读者还是写者)int starttime;进程开始时间int needtime;进程读写需要的时间int runtime;进程在内存中已运行的时间struct process *next;process *processl=NUL

7、L,*process2=NULL,*process3=NULL;void input()process *p,*q;q=process1=(process *)malloc(sizeof(process); 在内存中给q分配了 一动态的存储空间int a;FILE *fp;是声明,声明fp是指针,用来指向FILE类型的对象printf(ttt*n)printf(ttt*1.手动输入进程*n);printf(ttt*2.文件输入进程*n);printf(ttt*3.退出*n);printf(ttt* n);printf(n请选择序号:”);QK:fflush(stdin);清空输入缓冲区scan

8、f(%d,&a);switch(a)case 1:CS:printf(输入进程数:);int i,j;scanf(%d,&i);if(i=0)printf(无进程,重新输入!n);goto CS;for(j=l;i0;i-,j+)p=(process *)malloc(sizeof(process);q_next=p;printf(第4 个进程:n,j);printf(进程序号:);scanf(%d,&p-num);printf(n);printf(读 写:);getchar();scanf(%c, &p-type);printf(n);printf(开始时间:);scanf(%d,&p-st

9、arttime);printf(n);printf(“读写时间:);scanf(%d,&p-needtime);printf(n);p-runtime=0;q=q-next;p-next=NULL;processl=processl-next;p-next=NULL;free(p);break;case 2:if(fp=fopen(d:123.txt,r)=NULL)printf(文件打开失败!n);exit(0);while(!(feof(fp)p=(process *)malloc(sizeof(process);q-next=p;fscanf(fp,%d %c %d %d,&p-n um

10、,& p-type,& p-starttime,& p-needtime);p-runtime=0;q=q-next;p-next=NULL;fclose(fp);processl=processl-next; p-next=NULL;free(p);break;case 3:exit(O);default :printf(输入错误,重新输入:); goto QK;void ready(int i)每次时间片开始时先将需要进入就绪队列的进程用ready()函数拉入就绪队列process *p,*q,*j,*k;p=process1;q=process2;int t=0;q=process2=(

11、process *)malloc(sizeof(process);q-next=NULL;t=1;j=(process *)malloc(sizeof(process);j-next=processl;while(p!=NULL)if(p-starttime=i)k=j;while(k-next!=p)k=k-next;比如i=1,这个作用就是寻找所有开始时间等于1的进程k-next=p-next;q-next=p;q=q-next;p=p-next;q-next=NULL;找到之后插入链表elsep=p-next;processl=j-next;j-next=NULL;free(j);if(

12、t=1)p=process2;process2=process2-next;p-next=NULL;free(p);int wait(int &a)if(anext=NULL;t=1;if(readcount0)p-next=process2; process2=process2-next; p=p-next;p-next=NULL;readcount+;/读者就开始读if(readcount=0)&( wait(mutex)=l) p-next=process2; process2=process2-next; p=p-next;p-next=NULL;readcount+;/写者开始写if

13、(t=1)p=process3;process3=process3-next;p-next=NULL;free(p);void Writer。if(wait(mutex)=l)&(process3=NULL) process3=process2;process2=process2-next; process3-next=NULL;void sort()process *p,*q,*j,*k;j=p=(process *)malloc(sizeof(process);p-next=NULL;k=q=(process *)malloc(sizeof(process);q-next=NULL;whi

14、le(process2!=NULL)if(process2-type=w)ll(process2-type=W)p-next=process2;process2=process2-next;p=p-next;p-next=NULL;else q-next=process2;process2=process2-next;q=q-next; q-next=NULL;process2=j-next;j-next=NULL;free(j);q=k-next;k-next=NULL;free(k);if(process2!=NULL)p_next=q;/如果写者不为空,就让写者先进行 elseproce

15、ss2=q;/不然读者进行void add(int i)process *p,*q;int a;p=process1;q=(process *)malloc(sizeof(process); printf(进程序号:); scanf(%d,&q-num);printf(n);printf(读 写:);fflush(stdin);scanf(%c,&q-type);printf(n);printf(开始时间:);scanf(%d,&a);q-starttime=a+i;printf(n);printf(“读写时间:);scanf(%d,&q-needtime);q-runtime=0;q-nex

16、t=NULL;if(processl!=NULL)while(p-next!=NULL) p=p-next;p-next=q;/q 是尾结点elseprocess1=q;把q中的信息赋值给process1void main()system(color 1a);printf(ttn);printf(ttt*写优先的读者-写者问题*n);printf(ttnn);int i=0;process *p,*q;定义两个指向 process 的指针变量input();printf(n以下输出各时间片进程状态n);printf(n);Sleep(lOOO);while(processl!=NULL)ll(

17、process2!=NULL)ll(process3!=NULL) i+;if(process1!=NULL)ready(i);sort();if(process2!=NULL)while(process2-type=r)ll(process2-type=R)Reader。;if(process3!=NULL)if(process3-type=w)ll(process3-type=W)break;if(process2=NULL)break;if(process2!=NULL)if(process2-type=w)ll(process2-type=W)Writer。;p=process3;wh

18、ile(p!=NULL)p-runtime+;p=p-next;printf(n 时间 %d :n,i);printf(t正执行进程:);p=process3;if(p=NULL)printf();elsewhile(p!=NULL)printf(%d ,p-num); p=p_next;printf(nt 就绪队列:);p=process2;if(p=NULL)printf();elsewhile(p!=NULL)printf(%d ,p-num); p=p-next;printf(n);p=q=(process *)malloc(sizeof(process); p-next=NULL;w

19、hile(process3!=NULL)if(process3-needtime!=process3-runtime)p-next=process3;p=p-next;elseif(process3-type=r)ll(process3-type=R)readcount-;if(readcount=0)signal(mutex);elsesignal(mutex);process3=process3-next; p-next=NULL;process3=q-next;q-next=NULL;free(q);Sleep(2000);if(kbhit()=l) 检查当前是否有键盘输入,若有则返回一个非0值,否则返回0char ch;ch=getch();if(ch=p)ll(ch= P)printf(n已暂停,继续请按Pn);printf(如需添加进程请按An);QK:fflush(stdin);ch=getchar(); if(ch=A)|(ch=a) add(i);printf(添加完成!n);fflush(stdin);while(l)if(ch=P)ll(ch=p) break;elsegoto QK;printf(nn所有进程执行完毕n);system(pause);system(cls);main();

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!