




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、摘要 一个数据文件或记录可被多个进程共享,我们把只要求读该文件的进程称为“Reader进程,其他进程那么称为“Writer进程。允许多个进程同时读一个共享文件,因为读操作不会使数据文件混乱。但不允许一个Writer进程和其他Reader进程或Writer进程同时访问共享对象,因为这种访问会引起混乱。所谓“读者写者问题是指保证一个Writer进程必须与其他进程互斥的访问共享对象的同步问题。目录 TOC o 1-3 h z u HYPERLINK l _Toc413356819 1. 概述 PAGEREF _Toc413356819 h 4 HYPERLINK l _Toc413356820 2.
2、 课程设计任务及要求 PAGEREF _Toc413356820 h 5 HYPERLINK l _Toc413356821 2.1 设计任务 PAGEREF _Toc413356821 h 5 HYPERLINK l _Toc413356822 2.2 设计要求 PAGEREF _Toc413356822 h 5 HYPERLINK l _Toc413356823 2.3 任务分工 PAGEREF _Toc413356823 h 5 HYPERLINK l _Toc413356824 3. 算法及数据结构 PAGEREF _Toc413356824 h 6 HYPERLINK l _Toc4
3、13356825 算法的总体思想 PAGEREF _Toc413356825 h 6 HYPERLINK l _Toc413356826 输入读/写者模块 PAGEREF _Toc413356826 h 6 HYPERLINK l _Toc413356827 查看读/写者模块 PAGEREF _Toc413356827 h 6 HYPERLINK l _Toc413356828 3.4 主要的数据结构及数据 PAGEREF _Toc413356828 h 7 HYPERLINK l _Toc413356829 4.1 程序流程图 PAGEREF _Toc413356829 h 9 HYPERL
4、INK l _Toc413356830 4.2 程序代码 PAGEREF _Toc413356830 h 10 HYPERLINK l _Toc413356831 4.3 实验结果 PAGEREF _Toc413356831 h 15 HYPERLINK l _Toc413356832 5. 结论 PAGEREF _Toc413356832 h 17 HYPERLINK l _Toc413356833 6. 收获、体会和建议 PAGEREF _Toc413356833 h 18 HYPERLINK l _Toc413356834 6.1 黄宏亮心得体会 PAGEREF _Toc41335683
5、4 h 18 HYPERLINK l _Toc413356835 6.2 林派腾心得体会 PAGEREF _Toc413356835 h 18 HYPERLINK l _Toc413356836 7. 参考文献 PAGEREF _Toc413356836 h 19概述 读写者问题,就是指读进程跟写进程同时访问共享一个对象的问题,将所有读者和所有写者分别存于一个读者等待队列和一个写者等待队列中,每当读允许时,就从读者队列中释放一个或多个读者线程进行读操作;每当写允许时,就从写者队列中释放一个写者进行写操作。读写平等策略,就是读进程跟写进程的优先级一样,当同时有读进程和写进程请求操作时,按链表的顺
6、序让进程对该对象进行操作,读进程可多个同时进行,写进程只能有一个进行。课程设计任务及要求2.1 设计任务用高级语言编写和调试一个采用“读写平等策略的“读者-写者问题的模拟程序。2.2 设计要求1读者与写者至少包括ID、进入内存时间、读写时间三项内容,可在界面上进行输入。2) 读者与写者均有两个以上,可在程序运行期间进行动态增加读者与写者。3) 可读取样例数据要求存放在外部文件中,进行读者/写者、进入内存时间、读写时间的初始化。4) 要求将运行过程用可视化界面动态显示,可随时暂停,查看阅览室中读者/写者数目、读者等待队列、读写时间、等待时间。5) 读写策略:读写互斥、写写互斥、读写平等严格按照读
7、者与写者到达的顺序进入阅览室,有写者到达,那么阻塞后续到达的读者;有读者到达,那么阻塞后续到达的写者。2.3 任务分工时间成员姓名任务完成情况第1天上午黄宏亮功能分析,查找资料完成林派腾查找资料第1天下午黄宏亮参考资料,分析算法完成林派腾参考资料,分析算法第2天上午黄宏亮编写代码,调试代码完成林派腾调试代码,查找问题第2天下午黄宏亮测试功能,编写课程设计报告完成林派腾测试功能,编写并修改课程设计报告第3天上午黄宏亮完善课程设计报告完成林派腾完善课程设计报告算法及数据结构三个线性链表,分别为h1、h2、h3。h1为写入序列,h2为就绪序列,h3为执行序列。其中h1用来存放输入进去的读者和写者的信
8、息,h2根据读入内存的时间将h1中的读者写者的信息进行排序,并将排完序的读者与写者信息存在h2中,把h2的内容调入到执行序列h3中,从而执行要求的内容。3.2输入读/写者模块 通过手动输入读写者的信息、包括读写者的进入内存时间、进程序号、读或写(r or w) 类型、开始时间、执行时间。数据结构 process *h1=NULL,*h2=NULL,*h3=NULL;/三个链表,分别用于存储各个进程的信息,存储就绪队列的进程信息,存储可执行的进程的信息3.2.3 算法 process *h1=NULL,*h2=NULL,*h3=NULL; int i,j; printf(tt输入进程数:); f
9、p=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(tt(按空格或回车隔开)n); printf(tt进程序号 读或写(r or w) 开始时间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-st
10、arttime,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;3.3查看读/写者模块 查询已输入的读写者信息数据结构Process *p,*q; /定义进程变量指针,用于存储读者写者信息 3.3.3 算法 int k; if(fp=fopen(file.txt,r)=NULL)printf(文件翻开失败!n); main(); printf(tt进程序号 读或写(r or w) 开始时间t 执行时间n); fscanf(fp,
11、%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+; 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); p
12、rintf(tt写者数目:); printf(t%dn,j);fclose(fp);p=h1;h1=h1-next;p-next=NULL;free(p); main();break;3.4 主要的数据结构及数据int Wmutex=1;/互斥读写的信号量int readcount=0; /读者数目struct process/进程结构体int ID; /进程序号char type; /进程类别(判断是读者还是写者)int starttime; /进程开始时间int needtime; /进程读写需要的时间int runtime; /进程在内存中已运行的时间struct process *ne
13、xt;process *h1=NULL,*h2=NULL,*h3=NULL;/三个链表函数成员:void input()/输入信息函数int main()/主函数void choose()/选择函数void ready(int i)/进入就绪队列函数int wait(int &a)/等待队列函数void reader()/读写平等下的读者信息函数void writer()/读写平等下的写者信息函数void add(int i)/动态增加函数void print(int i)/输出函数void leave()/离开执行队列程序设计与实现4.1 程序流程图4.2 程序代码struct proces
14、s /数据结构int ID; /进程序号char type; /进程类别(判断是读者还是写者)int starttime; /进程开始时间int needtime; /进程读写需要的时间int runtime; /进程在内存中已运行的时间struct process *next;process *h1=NULL,*h2=NULL,*h3=NULL;void ready(int i) /进入就绪队列process *p,*q,*j,*k;p=h1;q=h2;int t=0;if(h2=NULL)q=h2=(process *)malloc(sizeof(process);q-next=NULL;
15、t=1;elsewhile(q-next!=NULL)q=q-next;j=(process *)malloc(sizeof(process);j-next=h1;while(h1-starttime=i)q-next=h1;h1=h1-next;q=q-next;q-next=NULL;j-next=h1;if(h1=NULL)break;p=h1;while(p!=NULL)if(p-starttime=i)k=j;while(k-next!=p)k=k-next;k-next=p-next;q-next=p;q=q-next;p=p-next;q-next=NULL;elsep=p-ne
16、xt;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;elsewhile(p-next!=NULL)p=p-next;if(readcount0)p-next=h2;h2=h2-next;p=p-next;p-next=NULL;readcount+;if(readcount=0)&(wait(Wmutex)=1)p-next=h2;h2=h2-next;p=p-next;p-next=NULL;readcount+;el
17、se Wmutex+;if(t=1)p=h3;h3=h3-next;p-next=NULL;free(p);void writer() /读写平等下的写者信息if(wait(Wmutex)=1)&(h3=NULL)h3=h2;h2=h2-next;h3-next=NULL;else Wmutex+;void add(int i) /动态增加process *p,*q;int a;p=h1;q=(process *)malloc(sizeof(process);printf(tt进程序号:);scanf(%d,&q-ID);printf(ttt读或写:);fflush(stdin);scanf(
18、%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!=NULL)p=p-next;p-next=q;elseh1=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=N
19、ULL)printf();elsewhile(p!=NULL)printf(%d ,p-ID);p=p-next;printf(ntt等待队列: );p=h2;if(p=NULL)printf();else while(p!=NULL) printf(%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;
20、elseif(h3-type=r)|(h3-type=R)readcount-; if(readcount=0)Wmutex=1; else signal(Wmutex);h3=h3-next;p-next=NULL;h3=q-next;q-next=NULL;free(q); int 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
21、=NULL)break;if(h2!=NULL)if(h2-type=w)writer();print(i); leave(); sleep(1); /交出线程占用CPU时间一秒钟fflush(stdin);/清空缓冲区char ch= ;if (kbhit()=1)/检查当前是否有键盘输入,假设有那么返回一个非0值,否那么返回0 ch=getchar();if(ch=S)|(ch=s) printf(tt已暂停,任意键继续.n添加新的进程输入an);ch=getchar();if(ch=a)add(i);printf(nntt执行完毕n); Wmutex=1; readcount=0;main();while(1);return 0;4.3 实验结果 5. 结论平等策略下的读者写者问题,执行读者与写者在公平竞争下的同步进程问题,另外可以实现进程的可视化显示、暂停和动态增加最后退出, 实现了读读相容,读写互斥,当读写同时请求时,按顺序进行请求响应操作。6. 收获、体会和建议 黄宏亮心得体会这次的课程设计虽然时间
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 电子元器件在智能电网变流器中的应用考核试卷
- 汽车充电系统检测与维修考核试卷
- 禽类屠宰加工工艺优化与实践考核试卷
- 氨纶纤维在运动护腕产品中的应用考核试卷
- 电容器类型与匹配考核试卷
- 电子真空器件的模拟与仿真技术考核试卷
- 外籍员工离职交接与保密责任协议
- 志愿者社区建设服务免责合同
- 网络直播数字调音台音效库租赁及配套设备维护合同
- 高速列车用玻璃盖板定制生产与销售协议
- 2024年生态环境执法大练兵比武竞赛理论考试题库-下(多选、判断题)
- 医院创建服务基层行创建资料(3.5.2医院感染相关监测C)
- 2024年山东省东营市中考道德与法治试卷真题(含答案)
- 河南省安阳市林州市2023-2024学年八年级下学期6月期末历史试题(解析版)
- 辽宁省沈阳市2023-2024学年高一下学期期中考试数学试卷(解析版)
- 四年级语文国测模拟试题 (1)附有答案
- 输变电工程施工质量验收统一表式附件1:线路工程填写示例
- 物业进场服务方案
- 快速入门穿越机-让你迅速懂穿越机
- 水利安全生产风险防控“六项机制”右江模式经验分享
- MOOC 知识创新与学术规范-南京大学 中国大学慕课答案
评论
0/150
提交评论