ImageVerifierCode 换一换
格式:DOCX , 页数:20 ,大小:87.77KB ,
资源ID:7638713      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/7638713.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(操作系统课程设计采用读写平等策略的读者写者问题完整版内含代码.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

操作系统课程设计采用读写平等策略的读者写者问题完整版内含代码.docx

1、操作系统课程设计采用读写平等策略的读者写者问题完整版 内含代码淮北师范大学课 程 设 计 采用读写平等策略的读者写者问题 学 号: 姓 名: 专 业: 指导教师: 日 期: 1.5 时间安排. 4 第1部分 课设简介1.1 课程设计题目采用读写平等策略的读者写者问题1.2 课程设计目的操作系统课程设计是计算机专业重要的教学环节,它为学生提供了一个既动手又动脑,将课本上的理论知识和实际有机的结合起来,独立分析和解决实际问题的机会。1)进一步巩固和复习操作系统的基础知识。2)培养学生结构化程序、模块化程序设计的方法和能力。3)提高学生调试程序的技巧和软件设计的能力。4)提高学生分析问题、解决问题以

2、及综合利用C语言进行课程设计的能力。1.3 课程设计内容用高级语言编写和调试一个采用“读写平等”策略的“读者-写者”问题的模拟程序。1.4 课程设计要求1)读者与写者至少包括ID、进入内存时间、读写时间三项内容,可在界面上进行输入。2) 读者与写者均有两个以上,可在程序运行期间进行动态增加读者与写者。3) 可读取样例数据(要求存放在外部文件中),进行读者/写者、进入内存时间、读写时间的初始化。4) 要求将运行过程用可视化界面动态显示,可随时暂停,查看阅览室中读者/写者数目、读者等待队列、读写时间、等待时间。5) 读写策略:读写互斥、写写互斥、读写平等(严格按照读者与写者到达的顺序进入阅览室,有

3、写着到达,则阻塞后续到达的读者;有读者到达,则阻塞后续到达的写者)。1.5 时间安排 1)分析设计贮备阶段 (1 天) 2)编程调试阶段 (7 天) 3)写课程设计报告、考核(2 天) 第2部分 实验原理分析2.1问题描述 有一个被许多进程共享的数据区,这个数据区可以是一个文件,或者主存的一块空间,甚至可以是一组处理器寄存器。有一些只读取这个数据区的进程reader和一些只往数据区中写数据的进程writer以下假设共享数据区是文件。这些读者和写者对数据区的操作必须满足以下条件:读读允许;读写互斥;写写互斥。这些条件具体来说就是:1)任意多的读进程可以同时读这个文件;2)一次只允许一个写进程往文

4、件中写;3)如果一个写进程正在往文件中写,禁止任何读进程或写进程访问文件;4)写进程执行写操作前,应让已有的写者或读者全部退出。这说明当有读者在读文件时不允许写者写文件。2.2算法思想 三个线性链表,分别为h1、h2、h3。h1为写入序列,h2为就绪序列,h3为执行序列。其中h1用来存放输入进去的读者和写者的信息,h2根据读入内存的时间将h1中的读者写者的信息进行排序,并将排完序的读者与写者信息存在h2中,把h2的内容调入到执行序列h3中,从而执行要求的内容。 2.3主要功能模块流程图第3部分 主要的功能模块 3.1 数据结构 主要的数据结构及数据:int Wmutex=1;/互斥读写的信号量

5、int readcount=0; /读者数目struct process/进程结构体 int ID; /进程序号 char type; /进程类别(判断是读者还是写者) int starttime; /进程开始时间 int needtime; /进程读写需要的时间 int runtime; /进程在内存中已运行的时间 struct process *next;process *h1=NULL,*h2=NULL,*h3=NULL;/三个链表函数成员:void input()/输入信息函数void main()/主函数void choose()/选择函数void ready(int i)/进入就绪

6、队列函数int wait(int &a)/等待队列函数void reader()/读写平等下的读者信息函数void writer()/读写平等下的写者信息函数void add(int i)/动态增加函数void print(int i)/输出函数void leave()/离开执行队列3.2 测试用例及运行结果运行程序进入界面后,选择1,运行界面如图1-1;选择2,运行完后查看文件显示如图1-2;选择3查看信息,运行界面如图1-3;在执行过程中按下s可以暂停进程的执行,在进程暂停的情况下,按下a可以增加进程,运行结果如图1-4所示。 图 1-1图1-2图1-3图1-4第4部分 源代码#inclu

7、de #include #include #include windows.hint Wmutex=1;/互斥读写的信号量int readcount=0; /读者数目void input();void main();struct process int ID; /进程序号 char type; /进程类别(判断是读者还是写者) int starttime; /进程开始时间 int needtime; /进程读写需要的时间 int runtime; /进程在内存中已运行的时间 struct process *next;process *h1=NULL,*h2=NULL,*h3=NULL;void

8、 choose()/选择 int a; process *p,*q; q=h1=(process *)malloc(sizeof(process); FILE *fp; scanf(%d,&a); switch(a) case 1: /手动输入 int i,j; printf(tt输入进程数:); fp=fopen(file.txt,w+); scanf(%d,&i); fprintf(fp,%dn,i); for(j=1;i0;i-,j+) p=(process *)malloc(sizeof(process); q-next=p; printf(tt第%d个进程:n,j); printf(

9、tt进程序号t读或写tt开始时间t执行时间ntt); scanf(%d %c %d %d,&p-ID,&p-type,&p-starttime,&p-needtime); fprintf(fp,%d %c %d %dn,p-ID,p-type,p-starttime,p-needtime); printf(n); p-runtime=0; q=q-next; p-next=NULL; fclose(fp); p=h1; h1=h1-next; p-next=NULL; free(p); break; case 2: /文件读入 if(fp=fopen(file.txt,r)=NULL) pri

10、ntf(文件打开失败!n); system(pause); system(cls); main(); fscanf(fp,%d,&i); for(j=1;i0;i-,j+) p=(process *)malloc(sizeof(process); q-next=p; fscanf(fp,%d %c %d %d,&p-ID,&p-type,&p-starttime,&p-needtime); p-runtime=0; q=q-next; p-next=NULL; fclose(fp); p=h1; h1=h1-next; p-next=NULL; free(p); break; case 3:

11、int k; if(fp=fopen(file.txt,r)=NULL) printf(文件打开失败!n); system(pause); system(cls); main(); printf(tt进程序号t读或写tt开始时间t执行时间n); fscanf(fp,%d,&i); k=0; for(j=0;i0;i-,j+) p=(process *)malloc(sizeof(process); q-next=p; fscanf(fp,%d %c %d %d,&p-ID,&p-type,&p-starttime,&p-needtime); if(p-type=r|p-type=R) k+;

12、printf(tt%dtt%ctt%dtt%dn,p-ID,p-type,p-starttime,p-needtime); p-runtime=0; q=q-next; p-next=NULL; j=j-k; printf(tt读者数目:); printf(t%dn,k); printf(tt写者数目:); printf(t%dn,j); fclose(fp); p=h1; h1=h1-next; p-next=NULL; free(p); system(pause); system(cls); main(); break; case 4: exit(0); default : printf(

13、tt您输入的有错误,请重新输入:n); system(pause); system(cls); main(); void input() /输入函数 printf(tt*读写平等策略*n); printf(ttt1.请输入进程信息n); printf(ttt2.文件载入进程信息n); printf(ttt3.查看进程信息n); printf(ttt4.退出n); printf(tt*n); printf(tt请选择:); choose();void ready(int i) /进入就绪队列 process *p,*q,*j,*k; p=h1; q=h2; int t=0; if(h2=NULL

14、) q=h2=(process *)malloc(sizeof(process); q-next=NULL; t=1; else while(q-next!=NULL) q=q-next; j=(process *)malloc(sizeof(process); j-next=head1; while(h1-starttime=i) q-next=head1; h1=h1-next; q=q-next; q-next=NULL; j-next=head1; if(h1=NULL) break; p=h1; while(p!=NULL) if(p-starttime=i) k=j; while(

15、k-next!=p) k=k-next; k-next=p-next; q-next=p; q=q-next; p=p-next; q-next=NULL; else p=p-next; h1=j-next; j-next=NULL; free(j); if(t=1) p=h2; h2=h2-next; p-next=NULL; free(p); int wait(int &a) a-; if(anext=NULL; t=1; else while(p-next!=NULL) p=p-next; if(readcount0) p-next=h2; h2=h2-next; p=p-next; p

16、-next=NULL; readcount+; if(readcount=0)&(wait(Wmutex)=1) p-next=h2; h2=h2-next; p=p-next; p-next=NULL; readcount+; else Wmutex+; if(t=1) p=h3; h3=h3-next; p-next=NULL; free(p); void writer() /读写平等下的写者信息 if(wait(Wmutex)=1)&(head3=NULL) h3=h2; h2=h2-next; h3-next=NULL; else Wmutex+;void add(int i) /动态

17、增加 process *p,*q; int a; p=head1; q=(process *)malloc(sizeof(process); printf(tt进程序号:); scanf(%d,&q-ID); printf(ttt读或写:); fflush(stdin); scanf(%c,&q-type); printf(tt开始时间:); scanf(%d,&a); q-starttime=a+i; printf(tt执行时间:); scanf(%d,&q-needtime); q-runtime=0; q-next=NULL; if(h1!=NULL) while(p-next!=NUL

18、L) p=p-next; p-next=q; else h1=q;void print(int i) /输出函数 process *p; p=h3; while(p!=NULL) p-runtime+; p=p-next; printf(ntt执行 %d :n,i); printf(tt执行队列: ); p=h3; if(p=NULL) printf(); else while(p!=NULL) printf(%d ,p-ID); p=p-next; printf(ntt等待队列: ); p=h2; if(p=NULL) printf(); else while(p!=NULL) printf

19、(%d,p-ID); p=p-next; printf(n);void leave() /离开执行队列 process *p,*q; p=q=(process *)malloc(sizeof(process); p-next=NULL; while(h3!=NULL) if(h3-needtime!=h3-runtime) p-next=h3; p=p-next; else if(h3-type=r)|(h3-type=R) readcount-; if(readcount=0) Wmutex=1; else signal(Wmutex); h3=h3-next; p-next=NULL; h

20、3=q-next; q-next=NULL; free(q); void main() int i=0; input(); while(h1!=NULL)|(h2!=NULL)|(h3!=NULL) i+; if(h1!=NULL) ready(i); if(h2!=NULL) while(h2-type=r) reader(); if(h3!=NULL) if(h3-type=w) break; if(h2=NULL) break; if(h2!=NULL) if(h2-type=w) writer(); print(i); leave(); Sleep(1000); /交出线程占用CPU时

21、间一秒钟 fflush(stdin);/清空缓冲区 char ch= ; if (kbhit()=1)/检查当前是否有键盘输入,若有则返回一个非0值,否则返回0 ch=getch(); if(ch=S)|(ch=s) printf(tt已暂停,任意键继续.n添加新的进程输入an); ch=getchar(); if(ch=a) add(i); printf(nntt执行完毕n); system(pause); system(cls); Wmutex=1; readcount=0; main(); while(1); 第5部分 总结及参考文献5.1 总结通过这次课设,我学到了很多课堂上学不到的知识,这次我做的是平等策略下的读者写者问题,执行读者与写者在公平竞争下的同步进程问题,另外可以实现进程的可视化显示、暂停和动态增加最后退出,实现了报告的要求,同时非常感谢老师的帮助,我会在这次课设之后,继续完善这个程序,提高自己的动手能力和实践能力。5.2 参考文献 1)汤小丹著 计算机操作系统第三版 西安电子科技大学出版社 2)谭浩强著 C语言程序设计 清华大学出版社 3)严蔚敏著 数据结构视频教程 清华大学出版社 4)张丽芬 刘利雄 王金玉编著 操作系统实验教程 清华大学出版社

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1