操作系统课程设计(采用读写平等策略的读者写者问题)完整版--内含代码_第1页
操作系统课程设计(采用读写平等策略的读者写者问题)完整版--内含代码_第2页
操作系统课程设计(采用读写平等策略的读者写者问题)完整版--内含代码_第3页
操作系统课程设计(采用读写平等策略的读者写者问题)完整版--内含代码_第4页
操作系统课程设计(采用读写平等策略的读者写者问题)完整版--内含代码_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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

2、能力。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)一次只允许一个写进程往文件中写;3)如果一个写进程正在

4、往文件中写,禁止任何读进程或写进程访问文件;4)写进程执行写操作前,应让已有的写者或读者全部退出。这说明当有读者在读文件时不允许写者写文件。2.2算法思想 三个线性链表,分别为h1、h2、h3。h1为写入序列,h2为就绪序列,h3为执行序列。其中h1用来存放输入进去的读者和写者的信息,h2根据读入内存的时间将h1中的读者写者的信息进行排序,并将排完序的读者与写者信息存在h2中,把h2的内容调入到执行序列h3中,从而执行要求的内容。 2.3主要功能模块流程图开始ready(int i)typereader()rwriter ()wruntime+runtime=needtime离开h3h1=Nu

5、ll&h2=Null&h3=NullYN i+Y结束第3部分 主要的功能模块 3.1 数据结构 主要的数据结构及数据:int Wmutex=1;/互斥读写的信号量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;/三个链表函数成员

6、:void input()/输入信息函数void 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()/离开执行队列3.2 测试用例及运行结果运行程序进入界面后,选择1,运行界面如图1-1;选择2,运行完后查看文件显示如图1-2;选择3查看信息,运行界面如图1-3;在执行过程中按下

7、s可以暂停进程的执行,在进程暂停的情况下,按下a可以增加进程,运行结果如图1-4所示。 图 1-1图1-2图1-3图1-4第4部分 源代码#include #include #include #include windows.hint Wmutex=1;/互斥读写的信号量int readcount=0; /读者数目void input();void main();struct processint ID; /进程序号char type; /进程类别(判断是读者还是写者)int starttime; /进程开始时间int needtime; /进程读写需要的时间int runtime; /进程在

8、内存中已运行的时间struct process *next;process *h1=NULL,*h2=NULL,*h3=NULL;void 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 *)ma

9、lloc(sizeof(process);q-next=p;printf(tt第%d个进程:n,j);printf(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;c

10、ase 2: /文件读入if(fp=fopen(file.txt,r)=NULL)printf(文件打开失败!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-n

11、ext=NULL;free(p); break; case 3: 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-needtim

12、e);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); 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(

13、0); default :printf(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(

14、h2=NULL)q=h2=(process *)malloc(sizeof(process);q-next=NULL;t=1;elsewhile(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(k-next!=p)k=k-

15、next;k-next=p-next;q-next=p;q=q-next;p=p-next;q-next=NULL;elsep=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;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)&(wa

16、it(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) /动态增加process *p,*q;int a;p=head1;q=(process *)malloc(sizeof(pro

17、cess);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!=NULL)p=p-next;p-next=q;elseh1=q;void print(int i) /输出函数process *p;p=h3;while(p!=

18、NULL)p-runtime+;p=p-next;printf(ntt执行 %d :n,i);printf(tt执行队列: );p=h3;if(p=NULL)printf();elsewhile(p!=NULL)printf(%d ,p-ID);p=p-next;printf(ntt等待队列: );p=h2;if(p=NULL)printf();elsewhile(p!=NULL)printf(%d,p-ID);p=p-next;printf(n);void leave() /离开执行队列process *p,*q;p=q=(process *)malloc(sizeof(process);p

19、-next=NULL;while(h3!=NULL)if(h3-needtime!=h3-runtime)p-next=h3;p=p-next;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); 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

温馨提示

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

评论

0/150

提交评论