欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    “读写平等”策略的“读者写者”问题实验报告.doc

    • 资源ID:88144246       资源大小:152KB        全文页数:20页
    • 资源格式: DOC        下载积分:18金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要18金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    “读写平等”策略的“读者写者”问题实验报告.doc

    淮北师范大学程序设计课程设计采用“读写平等”策略的“读者-写者”问题学 院 计算机科学与技术 专 业 计算机科学与技术(师范) 学 号 * 学 生 姓 名 * 指导教师姓名 * 2012年6月 16 日一、设计目的与内容课程设计的目的:操作系统课程设计是计算机专业重要的教学环节,它为学生提供了一个既动手又动脑,将课本上的理论知识和实际有机的结合起来,独立分析和解决问题的机会。l 进一步巩固和复习操作系统的基础知识。l 培养学生结构化程序、模块化程序设计的方法和能力。l 提高学生调试程序的技巧和软件设计的能力。l 提高学生分析问题、解决问题以及综合利用C语言进行程序设计的能力。设计内容:用高级语言编写和调试一个采用“读写平等”策略的“读者写者”问题的模拟程序。设计的要求:1. 读者与写者至少包括ID、进入内存时间、读写时间三项内容,可在界面上进行输入。2. 读者与写者均有两个以上,可在程序运行期间进行动态增加读者与写者。3. 可读取样例数据(要求存放在外部文件中),进行读者/写者、进入内存时间、读写时间的初始化。4. 要求将运行过程用可视化界面动态显示,可随时暂停,查看阅览室中读者/写者数目、读者等待队列、读写时间、等待时间。5. 读写策略:读写互斥、写写互斥、读写平等(严格按照读者与写者到达的顺序进入阅览室,有写着到达,则阻塞后续到达的读者;有读者到达,则阻塞后续到达的写者)。 有一个被许多进程共享的数据区,这个数据区可以是一个文件,或者主存的一块空间,甚至可以是一组处理器寄存器。有一些只读取这个数据区的进程(reader)和一些只往数据区中写数据的进程(writer)。以下假设共享数据区是文件。这些读者和写者对数据区的操作必须满足以下条件:读读允许;读写互斥;写写互斥。这些条件具体来说就是:(1)任意多的读进程可以同时读这个文件;(2)一次只允许一个写进程往文件中写;(3)如果一个写进程正在往文件中写,禁止任何读进程或写进程访问文件;(4)写进程执行写操作前,应让已有的写者或读者全部退出。这说明当有读者在读文件时不允许写者写文件。二、算法的基本思想 创建三个线性链表,分别为head1、head2、head3。head1写入序列,head2为就绪序列,head3为执行序列。其中head1用来存放输入进去的读者和写者的信息,head2根据读入内存的时间将head1中的读者写者的信息进行排序,并将排完序的读者与写者信息存在head2中,把head2的内容调入到执行序列head3中,从而执行要求的内容。三、主要功能模块流程图开始Jiuxu(int i)typereader()rwriter ()wruntime+runtime=needtime离开head3head1=Null&head2=Null&head3=NullYNi+Y结束四、系统测试(列出对于给定的输入所产生的输出结果。只写出自己所做功能测试结果)文件为文本文件。文件内容为:5(表示进程数)1 r 7 2(表示进程名,进程类型,进程开始时间,进程运行时间)2 w 2 3(表示进程名,进程类型,进程开始时间,进程运行时间)3 r 3 4(表示进程名,进程类型,进程开始时间,进程运行时间)4 r 5 3(表示进程名,进程类型,进程开始时间,进程运行时间)5 w 6 4(表示进程名,进程类型,进程开始时间,进程运行时间)程序运行实例如下:1选择2,运行界面如下:2选择3,运行界面如下:3.在执行过程中按下s可以暂停进程的执行。4在进程暂停的情况下,按下a可以增加进程。五、结论程序运行后,可以通过手动输入进程和文件读取进程,并执行读者与写者在公平竞争下的同步进程问题,另外可以实现进程的可视化显示、暂停和动态增加最后退出。完成任务书的要求。六、源程序及系统文件使用说明#include <stdio.h>#include <stdlib.h>#include <conio.h>#include "windows.h"int Wmutex=1;/互斥读写的信号量int readcount=0; /读者数目void input();void main();struct processint ID; /进程序号char type; /进程类别(判断是读者还是写者)int starttime; /进程开始时间int needtime; /进程读写需要的时间int runtime; /进程在内存中已运行的时间struct process *next;process *head1=NULL,*head2=NULL,*head3=NULL;void choose()/选择 int a;process *p,*q;q=head1=(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;i>0;i-,j+)p=(process *)malloc(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=head1;head1=head1->next;p->next=NULL;free(p);break;case 2: /文件读入if(fp=fopen("file.txt","r")=NULL)printf("文件打开失败!n"); system("pause"); system("cls"); main();fscanf(fp,"%d",&i); for(j=1;i>0;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=head1;head1=head1->next;p->next=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;i>0;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); printf("tt写者数目:"); printf("t%dn",j);fclose(fp); p=head1;head1=head1->next;p->next=NULL;free(p); system("pause"); system("cls"); main();break; case 4: exit(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=head1;q=head2;int t=0;if(head2=NULL)q=head2=(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(head1->starttime=i)q->next=head1;head1=head1->next;q=q->next;q->next=NULL;j->next=head1;if(head1=NULL)break;p=head1;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->next;head1=j->next;j->next=NULL;free(j);if(t=1)p=head2;head2=head2->next;p->next=NULL;free(p);int wait(int &a) a-;if(a<0)return 0;return 1;void signal(int &a)a+;void reader() /读写平等下的读者信息process *p;int t=0;p=head3;if(head3=NULL)p=head3=(process *)malloc(sizeof(process);p->next=NULL;t=1;elsewhile(p->next!=NULL)p=p->next;if(readcount>0)p->next=head2;head2=head2->next;p=p->next;p->next=NULL;readcount+;if(readcount=0)&&(wait(Wmutex)=1)p->next=head2;head2=head2->next;p=p->next;p->next=NULL;readcount+;else Wmutex+;if(t=1)p=head3;head3=head3->next;p->next=NULL;free(p);void writer() /读写平等下的写者信息if(wait(Wmutex)=1)&&(head3=NULL)head3=head2;head2=head2->next;head3->next=NULL;else Wmutex+;void add(int i) /动态增加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(head1!=NULL)while(p->next!=NULL)p=p->next;p->next=q;elsehead1=q;void print(int i) /输出函数process *p;p=head3;while(p!=NULL)p->runtime+;p=p->next;printf("ntt执行 %d :n",i);printf("tt执行队列: ");p=head3;if(p=NULL)printf("<空>");elsewhile(p!=NULL)printf("%d ",p->ID);p=p->next;printf("ntt等待队列: ");p=head2;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->next=NULL;while(head3!=NULL)if(head3->needtime!=head3->runtime)p->next=head3;p=p->next;elseif(head3->type='r')|(head3->type='R')readcount-;if(readcount=0)signal(Wmutex);elsesignal(Wmutex);head3=head3->next;p->next=NULL;head3=q->next;q->next=NULL;free(q); void main()int i=0;input();while(head1!=NULL)|(head2!=NULL)|(head3!=NULL)i+;if(head1!=NULL)ready(i);if(head2!=NULL)while(head2->type='r')|(head2->type='R')reader();if(head3!=NULL)if(head3->type='w')|(head3->type='W')break;if(head2=NULL)break;if(head2!=NULL)if(head2->type='w')|(head2->type='W')writer();print(i); leave(); Sleep(1000); /交出线程占用CPU时间一秒钟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')|(ch='a')add(i);printf("nntt执行完毕n");system("pause");system("cls");main();while(1);

    注意事项

    本文(“读写平等”策略的“读者写者”问题实验报告.doc)为本站会员(e****s)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开