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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

本文(写优先读写者问题Word格式.docx)为本站会员(b****1)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

写优先读写者问题Word格式.docx

1、 用高级语言编写和调试一个采用写优先策略的读者写者问题的模拟程序。1.4 时间安排 1)分析设计贮备阶段 (1 天) 2)编程调试阶段 (7 天) 3)写课程设计报告、考核(2 天) 第2部分 实验要求1. 读者与写者至少包括ID、进入内存时间、读写时间三项内容,可在界面上进行输入。2. 读者与写者均有两个以上,可在程序运行期间进行动态增加读者与写者。3. 可读取样例数据(要求存放在外部文件中),进行读者/写者、进入内存时间、读写时间的初始化。4. 要求将运行过程用可视化界面动态显示,可随时暂停,查看阅览室中读者/写者数目、读者等待队列、读写时间、等待时间。5. 读写策略:读写互斥、写写互斥、

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

3、的信息,process2存储就绪队列的进程信息,process3存储正在执行的进程的信息。用整形数i模拟时间片,每次时间片开始时先将需要进入就绪队列的进程用ready()函数拉入就绪队列。判断就绪队列的开头是读者还是写者,然后调用相应的函数Reader()或Writer()。如若调用的是Writer(),还要调用sort()函数对就绪队列进程排序,将写者排在写者前面。时间片结束时,对各个进程的runtime+,并判断进程是否执行完毕,如果完毕就其离开process3链表。最后将时间片i+,反复循环,直到所有进程执行完毕。3.2.主要功能模块流程图 采用“写优先“策略的”“读者写者”问题 3.3

4、 测试用例及运行结果程序运行实例如下:1. 选择1,运行界面如下:2选择2,运行界面如下:3.在执行过程中动态暂停。4在进程暂停的情况下,按下A可以增加进程。5.选择3,退出界面如下第4部分 源代码#include stdlib.h#include windows.hconio.hint mutex=1; /互斥读写的信号量int readcount=0; /用readcount变量来记录读者数struct process int name; char type; /进程类别(判断是读者还是写者) int starttime; int needtime; int runtime; /进程在内存

5、中已运行的时间 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(ttt1.键盘输入进程n);ttt2.文件读取进程nttt3.退出nn请选择:bb: fflush(stdin); scanf(%d,&a); s

6、witch(a) case 1: printf(输入进程数: int i; scanf( for(i=1;inext=p; printf(第%d个进程的ID: ,i); scanf(p-name);读写: getchar();%ctype);n进入内存时间:starttime);读 写 时 间:needtime); p-runtime=0; q=q-next;next=NULL; p=process1; process1=process1- p- free(p);/功 能: 与malloc()函数配对使用,释放malloc函数申请的动态内存 break; case 2: if(fp=fopen

7、(123.txt,r)=NULL) 文件打开失败! exit(0); while(!(feof(fp) fscanf(fp,%d %c %d %dname,&type,&starttime,& case 3: exit(0); default :tt您输入的有错误,请重新输入: goto bb; void ready(int i) /每次时间片开始时先将需要进入就绪队列的进程用ready()函数拉入就绪队列,准备 process *p,*q,*j,*k; p=process1; q=process2; int t=0; if(process2=NULL) q=process2=(process

8、 *)malloc(sizeof(process); q- t=1; else while(q-next!=NULL) q=q- j=(process *)malloc(sizeof(process); j-next=process1; while(p! if(p-starttime=i) k=j; while(k-=p) k=k- k-next=p- q- p=p- else process1=j- free(j); if(t=1) p=process2; process2=process2- p- free(p);int wait(int &a) if(a if(readcount0)ne

9、xt=process2; p=p- readcount+; if(readcount=0)&(wait(mutex)=1) p=process3; process3=process3-void Writer() if(wait(mutex)=1)&(process3=NULL) process3=process2; process3-void sort()/排序 j=p=(process *)malloc(sizeof(process); p- k=q=(process *)malloc(sizeof(process); q- while(process2! if(process2-type=

10、w)|(process2-W) p- process2=process2- process2=j- q=k- k- free(k); if(process2!next=q; process2=q;void add(int i)/添加 q=(process *)malloc(sizeof(process);进程序号:q- getchar();/清空输入缓冲区延迟时间:starttime=a+i;读写时间: if(process1!=NULL) process1=q;void main()ttt*=*nttt#写优先的读者写者问题#nttt*=*nn int i=0; input();n以下输出各

11、时间片进程状态n Sleep(1000); while(process1!=NULL)|(process2!=NULL)|(process3!=NULL) i+; if(process1! ready(i); if(process3! if(process3-)|(process3- sort(); sort(); if(process2! while(process2-rR Reader(); if(process3! if(process3-) break; if(process2=NULL) if(process2- Writer(); while(p!runtime+; printf(

12、n时间 %d :t正执行进程: if(p=NULL) printf(空 while(p!%d ,p- p=p-nt就绪队列: p=q=(process *)malloc(sizeof(process); while(process3! if(process3-needtime!=process3-runtime)next=process3; else readcount-; if(readcount=0) signal(mutex); else signal(mutex); process3=process3- process3=q- free(q); Sleep(2000); if(kbhi

13、t()=1)/检查当前是否有键盘输入,若有则返回一个非0值,否则返回0 char ch; ch=getch(); if(ch=p)|(ch=Pn已暂停,继续请按Pn如需添加进程请按Anaa: fflush(stdin); ch=getchar(); if(ch=Aa add(i);添加完成! while(1) if(ch= break; else goto aa;nn所有进程执行完毕n system(pause/暂停 main(); while(1);第5部分 总结及参考文献5.1 总结程序可实现键盘输入,读取样例数据,文件初始化,动态暂停和添加等功能,能够正确利用写优先策略是想读者写者问题的模拟,基本实现任务书的要求。5.2 参考文献【1】操作系统(第三版).汤小丹,梁红兵.西安电子科技大学出版社.2007【2】C程序设计语言.(第三版)谭浩强.清华大学出版社.2004【3】数据结构 (C语言版).严蔚敏 ,吴伟民.清华大学出版社.2007

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2