写优先”策略的“读者-写者”问题.doc

上传人:牧羊曲112 文档编号:2791328 上传时间:2023-02-25 格式:DOC 页数:31 大小:221KB
返回 下载 相关 举报
写优先”策略的“读者-写者”问题.doc_第1页
第1页 / 共31页
写优先”策略的“读者-写者”问题.doc_第2页
第2页 / 共31页
写优先”策略的“读者-写者”问题.doc_第3页
第3页 / 共31页
写优先”策略的“读者-写者”问题.doc_第4页
第4页 / 共31页
写优先”策略的“读者-写者”问题.doc_第5页
第5页 / 共31页
点击查看更多>>
资源描述

《写优先”策略的“读者-写者”问题.doc》由会员分享,可在线阅读,更多相关《写优先”策略的“读者-写者”问题.doc(31页珍藏版)》请在三一办公上搜索。

1、精选优质文档-倾情为你奉上 采用“写优先”策略的“读者-写者”问题学 院 计算机科学与技术 专 业 计算机科学与技术 学 号 学 生 姓 名 指导教师姓名 2014-3-11专心-专注-专业目 录 (1 ) 、课程设计的目的.-1-(2 ) 、课程设计的内容-1-(3 ) 、课程设计的要求-1-一、设计目的与内容(1)课程设计的目的:操作系统课程设计是计算机专业重要的教学环节,它为学生提供了一个既动手又动脑,将课本上的理论知识和实际有机的结合起来,独立分析和解决问题的机会。l 进一步巩固和复习操作系统的基础知识。l 培养学生结构化程序、模块化程序设计的方法和能力。l 提高学生调试程序的技巧和软

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

3、写优先 (只要写者到达,就阻塞后续的所有读者,一旦阅览室无人,写者能最快进入阅览室;在写者未出阅读室之前,又有新的读者与写者到达,仍然是写者排在前面)二、算法的基本思想 进程结构体:struct processint name; /进程ID 号char type; /进程类别(判断是读者还是写者线程)int starttime; /进程开始时间int needtime; /进程读写需要的时间int runtime; /进程在内存中已运行的时间struct process *next; 创建三个链表,分别为process1 、process2 、process3 。process1 存储各个进程

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

5、执行完毕。 三、模块流程图开始ready(int i)typereader()rwriter ()wruntime+runtime=needtime离开process3process1,process2,process3均为空Y NY结束Sort()i+N四、测试结果程序运行实例如下:1、 进入主界面2、 选择1,运行界面如下:3、选择2,运行界面如下:4.在执行过程中动态暂停。5 、在进程暂停的情况下,按A 可以增加进程。6 、退出五、结论这次课设成功采用了“写优先”策略通过输入、排序、就绪等函数实现“读者写者”问题,在这两周时间里我重新翻阅了C 语言程序设计、操作系统等书,也参考了很多网络

6、资源,对“读者- 写者”问题有了更深的理解,对C 语言和数据结构也有了更好的掌握,使我体会到了理论与实践结合的效果。这次课程设计对我有很大的帮助,在这过程中还掌握了很多编程的小技巧。六、源程序#include #include #include windows.h#include int mutex=1; /互斥读写的信号量int readcount=0; /用readcount变量来记录读者数struct processint num; /进程序号char type; /进程类别(判断是读者还是写者)int starttime; /进程开始时间int needtime; /进程读写需要的时间

7、int runtime; /进程在内存中已运行的时间struct process *next;process *process1=NULL,*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);prin

8、tf(ttt *3.退出 *n);printf(ttt *n);printf(n请选择序号:);QK:fflush(stdin); /清空输入缓冲区scanf(%d,&a);switch(a)case 1:CS:printf(输入进程数:);int i,j;scanf(%d,&i);if(i=0)printf(无进程,重新输入!n);goto CS;for(j=1;i0;i-,j+)p=(process *)malloc(sizeof(process);q-next=p;printf(第%d个进程:n,j);printf(进程序号:);scanf(%d,&p-num);printf(n); p

9、rintf(读写:);getchar();scanf(%c,&p-type);printf(n);printf(开始时间:);scanf(%d,&p-starttime);printf(n);printf(读写时间:);scanf(%d,&p-needtime);printf(n);p-runtime=0;q=q-next;p-next=NULL;p=process1;process1=process1-next;p-next=NULL;free(p);break;case 2:if(fp=fopen(d:123.txt,r)=NULL)printf(文件打开失败!n);exit(0);whi

10、le(!(feof(fp)p=(process *)malloc(sizeof(process);q-next=p;fscanf(fp,%d %c %d %d,&p-num,&p-type,&p-starttime,&p-needtime);p-runtime=0;q=q-next;p-next=NULL;fclose(fp);p=process1;process1=process1-next;p-next=NULL;free(p);break;case 3:exit(0);default :printf(输入错误,重新输入:);goto QK;void ready(int i) /每次时间片

11、开始时先将需要进入就绪队列的进程用ready()函数拉入就绪队列process *p,*q,*j,*k;p=process1;q=process2;int t=0;if(process2=NULL)q=process2=(process *)malloc(sizeof(process);q-next=NULL;t=1;j=(process *)malloc(sizeof(process);j-next=process1;while(p!=NULL)if(p-starttime=i)k=j;while(k-next!=p)k=k-next;/比如i=1,这个作用就是寻找所有开始时间等于1的进程k

12、-next=p-next;q-next=p;q=q-next;p=p-next;q-next=NULL;/找到之后插入链表elsep=p-next;process1=j-next;j-next=NULL;free(j);if(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(

13、readcount=0)&(wait(mutex)=1)p-next=process2;process2=process2-next;p=p-next;p-next=NULL;readcount+;/写者开始写if(t=1)p=process3;process3=process3-next;p-next=NULL;free(p);void Writer()if(wait(mutex)=1)&(process3=NULL)process3=process2;process2=process2-next;process3-next=NULL;void sort()process *p,*q,*j,

14、*k;j=p=(process *)malloc(sizeof(process);p-next=NULL;k=q=(process *)malloc(sizeof(process);q-next=NULL;while(process2!=NULL)if(process2-type=w)|(process2-type=W)p-next=process2;process2=process2-next;p=p-next;p-next=NULL;elseq-next=process2;process2=process2-next;q=q-next;q-next=NULL;process2=j-next

15、;j-next=NULL;free(j);q=k-next;k-next=NULL;free(k);if(process2!=NULL)p-next=q;/如果写者不为空,就让写者先进行elseprocess2=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(

16、开始时间:);scanf(%d,&a);q-starttime=a+i;printf(n);printf(读写时间:);scanf(%d,&q-needtime);q-runtime=0;q-next=NULL;if(process1!=NULL)while(p-next!=NULL)p=p-next;p-next=q;/q是尾结点elseprocess1=q;/把q中的信息赋值给process1void main() system(color 1a);printf(tt-n);printf(ttt*写优先的读者-写者问题*n);printf(tt-nn);int i=0;process *p

17、,*q;/定义两个指向process的指针变量input();printf(n以下输出各时间片进程状态n);printf(n);Sleep(1000);while(process1!=NULL)|(process2!=NULL)|(process3!=NULL)i+;if(process1!=NULL)ready(i);sort();if(process2!=NULL)while(process2-type=r)|(process2-type=R)Reader();if(process3!=NULL)if(process3-type=w)|(process3-type=W)break;if(p

18、rocess2=NULL)break;if(process2!=NULL)if(process2-type=w)|(process2-type=W)Writer();p=process3;while(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!=

19、NULL)printf(%d ,p-num);p=p-next;printf(n);p=q=(process *)malloc(sizeof(process);p-next=NULL;while(process3!=NULL)if(process3-needtime!=process3-runtime)p-next=process3;p=p-next;elseif(process3-type=r)|(process3-type=R)readcount-;if(readcount=0)signal(mutex);elsesignal(mutex);process3=process3-next;p

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号