版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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 <stdio.h>#include <stdlib.h>#include "windows.h"#include <conio.h>int mutex=1; /互斥读写的信号量int readcount=0; /用readcount变量来记录读者数struct processint num; /进程序号char type; /进程类
7、别(判断是读者还是写者)int starttime; /进程开始时间int needtime; /进程读写需要的时间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(&q
8、uot;ttt *n");printf("ttt *1.手动输入进程*n");printf("ttt *2.文件输入进程*n");printf("ttt *3.退出 *n");printf("ttt *n");printf("n请选择序号:");QK:fflush(stdin); /清空输入缓冲区scanf("%d",&a);switch(a)case 1:CS:printf("输入进程数:");int i,j;scanf("%
9、d",&i);if(i=0)printf("无进程,重新输入!n");goto CS;for(j=1;i>0;i-,j+)p=(process *)malloc(sizeof(process);q->next=p;printf("第%d个进程:n",j);printf("进程序号:");scanf("%d",&p->num);printf("n"); printf("读写:");getchar();scanf("%c&qu
10、ot;,&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-&g
11、t;next;p->next=NULL;free(p);break;case 2:if(fp=fopen("d:123.txt","r")=NULL)printf("文件打开失败!n");exit(0);while(!(feof(fp)p=(process *)malloc(sizeof(process);q->next=p;fscanf(fp,"%d %c %d %d",&p->num,&p->type,&p->starttime,&p->nee
12、dtime);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) /每次时间片开始时先将需要进入就绪队列的进程用ready()函数拉入就绪队列process *p,*q,*j,*k;p=process1;q=process2;int t=0;
13、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->next=p->next;q->next=p;q=q->next;p=p->next;q-
14、>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(a<=0)return 0;a-;return 1;void signal(int &a)a+;void Reader() process *p;int t=0;p=process3;if(process3=NULL)p=proces
15、s3=(process *)malloc(sizeof(process);p->next=NULL;t=1;if(readcount>0)p->next=process2;process2=process2->next;p=p->next;p->next=NULL;readcount+;/读者就开始读if(readcount=0)&&(wait(mutex)=1)p->next=process2;process2=process2->next;p=p->next;p->next=NULL;readcount+;/写者开
16、始写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,*k;j=p=(process *)malloc(sizeof(process);p->next=NULL;k=q=(process *)malloc
17、(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;j->
18、;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(
19、"读写:");fflush(stdin);scanf("%c",&q->type);printf("n");printf("开始时间:");scanf("%d",&a);q->starttime=a+i;printf("n");printf("读写时间:");scanf("%d",&q->needtime);q->runtime=0;q->next=NULL;if(process1!
20、=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,*q;/定义两个指向process的指针变量input();printf("n以下输出各时间片进程状态n
21、");printf("<运行时如需暂停请输入P>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')|
22、(process3->type='W')break;if(process2=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!=NULL)printf("%d ",p->num);p=p->next;printf("n");p=q=(process *)malloc(sizeof(process);p-
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 信息技术(信创版)(微课版)课件全套 徐丽 项目1-6 计算机基础 - 其他常用软件的应用-1
- 十八项医疗核心制度解读
- 2026年剧本杀运营公司员工晋升与调岗管理制度
- 2026年及未来5年中国金融软件行业市场竞争格局及投资前景展望报告
- 2025年社区智慧健康管理服务平台技术创新与市场前景研究报告
- 体检科各检查室制度
- 产科护理与跨学科合作
- 人事四项制度
- 机动车检测站培训内容课件
- 中国科学院空间应用工程与技术中心2025年校园招聘备考题库及1套完整答案详解
- 医疗器械胰岛素泵市场可行性分析报告
- 地铁施工现场防台风措施
- 种植业合作社账务处理
- 【丽江玉龙旅游薪酬制度的创新研究6100字】
- 公司两权分离管理制度
- 车辆叉车日常检查记录表
- 广东高校毕业生“三支一扶”计划招募考试真题2024
- 胶带机硫化工艺.课件
- 种鸡免疫工作总结
- 河南省商丘市柘城县2024-2025学年八年级上学期期末数学试题(含答案)
- 河南省信阳市2024-2025学年高二上学期1月期末英语试题(含答案无听力原文及音频)
评论
0/150
提交评论