操作系统课程设计-采用“写优先”的策略演示“读者-写者”问题.doc_第1页
操作系统课程设计-采用“写优先”的策略演示“读者-写者”问题.doc_第2页
操作系统课程设计-采用“写优先”的策略演示“读者-写者”问题.doc_第3页
操作系统课程设计-采用“写优先”的策略演示“读者-写者”问题.doc_第4页
操作系统课程设计-采用“写优先”的策略演示“读者-写者”问题.doc_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

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

文档简介

东莞理工学院城市学院计算机操作系统课程设计题目:采用“写优先”的策略演示“读者-写者”专业: 软件工程 年级: 2012级 小组成员: 指导教师: 时间: 2014.12.24 2014.12.26 地点: 东莞理工学院城市学院计算机与信息科学系制2014年 12 月摘要一个数据文件或记录可被多个进程共享,把只要求读该文件的进程称为“Reader进程”,其他进程则称为“Writer进程”。允许多个进程同时读一个共享对象,因为读操作不会使数据文件混乱。但不允许一个Writer进程和其他Reader进程或Writer进程同时访问共享对象。因为这种访问会引起混乱。所谓“读者-写者问题”指保证一个Writer进程必须与其他进程互斥地访问共享对象的同步问题。目录1. 概述42.课程设计任务及要求42.1 设计任务42.2 设计要求43. 算法及数据结构43.1 算法的总体思想43.2 键入读者/写者进程模块53.3 读取读者/写者样例模块63.4 查看读者写者信息模块74. 程序设计与实现74.1 程序流程图.74.2 主要程序代码84.3 实验结果135. 结论156. 收获、体会和建议。156.1谢海钊的收获体会156.2叶诗敏的收获体会157. 参考文献。151. 概述 所谓读者写者问题,是指保证一个Writer进程必须与其他进程互斥地访问共享对象的同步问题。写优先的读者写者问题可以这样的描述,有一群写者和一群读者,写者在写同一本书,读者也在读这本书,多个读者可以同时读这本书,但是,只能有一个写者在写书,并且,写者的优先级必须比读者的大,也就是说,读者和写者同时提出请求时,写者优先执行。2. 课程设计任务及要求2.1 设计任务成员姓名周三下午周四上午周四下午周五上午周五下午谢海钊查找相关资料了解算法,调试代码分析、修改代码完善代码,测试完善课程设计报告叶诗敏查找相关资料了解算法,调试代码写报告,画程序流程图测试完善课程设计报告2.2 设计要求1) 读者与写者至少包括ID、进入内存时间、读写时间三项内容,可在界面上进行输入2) 读者与写者均有二个以上,可在程序运行期间动态增加读者与写者3) 可读取样例数据(要求存放在外部文件中),进行读者/写者、进入内存时间、读写时间的初始化4) 要求将运行过程用可视化界面动态显示,可随时暂停,查看阅览室中读者/写者数目、读者等待队列、写者等待队列、读写时间、等待时间5) 读写策略为:读写互斥、写写互斥、写优先(只要写者到达,就阻塞后续的所有读者,一旦阅览室无人,写者能最快进入阅览室;在写者未出阅读室之前,又有新的读者与写者到达,仍然是写者排在前面)3. 算法及数据结构1.2.1233.1 算法的总体思想本算法主要使用互斥信号量机制,解决读者写者同步问题。本算法通过创建三个链表process1,process2和process3,process1用于存储各个进程的信息,process2用于存储就绪队列的进程信息,process3用于存储正在执行的进程的信息。通过使用整形变量来模拟时间片,每次时间片一开始,通过ready()函数将进程拉入就绪队列。然后根据判断就绪队列的开头是读者还是写者,来调用相应的进程Reader()或Writer()。如果调用的是Writer(),就得调用sort()函数对就绪队列进程进行排序,将写者排在读者前面。当时间片结束时,对各个进程的执行时间加1,并判断进程是否执行完毕,如果完毕就将其退出运行进程链表process3。最后将时间片加一,反复循环,直到所有进程执行完毕。本系统主要有三个模块,键入读者写者进程模块、读取读者写者样例模块、查看读者写者信息模块。定义进程结构体:struct Process int name; /进程序号 char type; /进程类别(判断是读者进程还是写者进程) int starttime; /进程开始执行时间 int needtime; /进程读写需要的时间 int runtime;/进程已在内存中运行的时间 struct Process *next; /指向下一个进程的指针; 3.2 键入读者/写者进程模块3.11233.13.23.2.1 功能通过键盘录入读者写者进程数和读者写者信息,系统根据写优先的策略来调度相应的读者写者进程,并输出相应的执行序列。3.2.2 数据结构Process *process1=NULL,*process2=NULL,*process3=NULL; /定义三个指针变量,分别用于存储各个进程的信息,存储就绪队列的进程信息,存储可执行的进程的信息3.2.3 算法 3.3 读取读者/写者样例模块3.23.33.3.1 功能该模块主要通过读取外部样例数据,进行读者/写者、进入内存时间、读写时间的初始化,并输出读者写者进程执行情况。3.3.2 数据结构Process *process1=NULL,*process2=NULL,*process3=NULL; /定义三个指针变量,分别用于存储各个进程的信息,存储就绪队列的进程信息,存储可执行的进程的信息FILE *fp; /声明fp是指针,用来指向FILE类型的对象,存取外部文件信息3.3.3 算法3.4 查看读者写者信息模块3.43.4.1 功能查看当前系统中读者写者进程的数量及信息。3.4.2 数据结构 Process *p,*q; /定义进程变量指针,用于存储读者写者信息 3.4.3 算法4. 程序设计与实现4.1 程序流程图.4.2 主要程序代码struct Process /定义结构体 int name; /进程序号 char type; /进程类别(判断是读者还是写者) int starttime; /进程开始时间 int needtime; /进程读写需要的时间 int runtime; /进程在内存中已运行的时间 struct Process *next; /指向下一个进程的指针 ; Process *process1=NULL,*process2=NULL,*process3=NULL; /定义三个进程变量指针,分别用于存储各个进程的信息,存储就绪队列的进程信息,存储可执行的进程的信息int wait(int &a) /请求信号量 if(anext=NULL; t=1; else /进程执行链表不为空,进程执行 while(p-next!=NULL) p=p-next; if(readcount0) /判断存在读者, 把读者进程插入就绪链表 p-next=process2; process2=process2-next; p=p-next; p-next=NULL; readcount+;/读者数量加1 if(readcount=0)&(wait(mutex)=1)/没有读者,并且获得阅读的权限,将其拉入就绪队列 p-next=process2; process2=process2-next; p=p-next; p-next=NULL; readcount+;/读者数目加1 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; int main() /主函数 printf(tt*=*n); printf(tt* 写优先的读者写者问题 *n); printf(tt*=*n); printf(tt# #n); int i=0; Process *p,*q; input(); /程序主模块 printf(n以下输出各进程执行状态n); printf(n); sleep(1); /暂停一秒 while(process1!=NULL)|(process2!=NULL)|(process3!=NULL) i+; if(process1!=NULL) /存在进程信息,拉入就绪队列 ready(i); /调用就绪函数 if(process3!=NULL) /存在可执行进程 if(process3-type=w)|(process3-type=W) sort(); /判断为写者进程,执行排序 sort(); if(process2!=NULL) /就绪链表不为空 while(process2-type=r)|(process2-type=R) /为读操作 Reader(); 调入读者进程 if(process3!=NULL) /存在可执行进程if(process3-type=w)|(process3-type=W) /判断是否为写者 break; if(process2=NULL) /就绪链表为空 break; if(process2!=NULL) /就绪链表不为空 if(process2-type=w)|(process2-type=W) Writer(); /调用写着进程 sort(); /排序 p=process3; while(p!=NULL) p-runtime+; /执行时间加1 p=p-next; printf(n时间 %d :n,i); printf(t正执行进程: ); p=process3; /将运行进程链表赋给指针变量p if(p=NULL) printf(); else while(p!=NULL) printf(%d ,p-name); p=p-next; printf(nt就绪队列: ); p=process2; /将就绪链表赋给指针变量p if(p=NULL) /就绪链表为空 printf(); else while(p!=NULL) /就绪链表不为空 printf(%d ,p-name);/输出就绪进程信息 p=p-next; printf(n); p=q=(Process *)malloc(sizeof(Process); p-next=NULL; while(process3!=NULL) /可执行进程链表不为空 if(process3-needtime!=process3-runtime)/运行时间不等于需要的时间,继续执行 p-next=process3; p=p-next; else /运行完成 if(process3-type=r)|(process3-type=R) readcount-; 读者读完,读者数目减1 if(readcount=0) /不存在读者 signal(mutex);/唤醒互斥信号量 else signal(mutex); /唤醒互斥信号量 process3=process3-next; /指向执行链表的下一个进程 p-next=NULL; process3=q-next; q-next=NULL; free(q); sleep(2); if(kbhit()=1)/检查当前是否有键盘输入,若有则返回一个非0值,否则返回0 char ch; ch=getchar(); if(ch=p)|(ch=P) printf(n已暂停,继续请按Pn); printf(如需添加进程请按An); aa: fflush(stdin); ch=getchar(); if(ch=A)|(ch=a) add(i); /添加读者写者 printf(添加完成!n); fflush(stdin); while(1) if(ch=P)|(ch=p) /判断是否暂停操作 break; else goto aa; printf(nn所有进程执行完毕n); printf(按回车键继续。n); getchar(); system(reset); /pause();/暂停 main(); /调用主函数 while(1); return 0; 4.3 实验结果程序运行结果如下:键入读者/写者进程模块效果图:读取读者/写者样例模块效果图:查看读者写者信息模块效果图:5. 结论通过使用互斥信号量机制,用PV操作,可以解决读者写者共享临界资源问题。在读者写者同时在队列中等待申请资源时,写者优先调用资源。而且如果一个读者申请进行读操作时已有另一读者正在进行读操作,则该读者可直接开始读操作,即读读允许,如果既有读者又有写者,则写者先于读者执行,一个写者与其他读者或写者互斥执行。6. 收获、体会和建议。6.1 谢海钊的收获体会这次课程设计让我对进程之间访问共享对象的同步问题有了更加深刻的理解,同时更加熟练的使用PV操作来解决进程之间的同步问题。更加灵活的在Linux下编辑、运行C语言程序,对程序设计思想也有了比较清晰的印象。总的感觉,学到了很多知识,对于linux有了进一步的了解,当然在课程设计过程中也遇到好多问题,因为这学期刚接触Linux,特别在Linux下编写C程序,Linux下有些库函数跟在Windows上的不一样,导致在Windows上能运行的程序在Linux上运行不了,通过分析错误,查找相关资料,最终解决了。这次课程设计让我更加明白只要细心耐心的去处理每个问题,问题就会迎刃而解。6.2 叶诗敏的收获体会这一次课程设计,让我体会很深刻。通过查找资料,了解了采用写优先读者写者问题,我对并发进程应用有了深入的了解。了解支持多道程序的并发操作系统设计中解决资源共享

温馨提示

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

评论

0/150

提交评论