Ubuntu环境下实现读者写者问题的操作系统课设

需积分: 16 27 下载量 193 浏览量 更新于2024-10-27 1 收藏 552KB DOC 举报
本文档是关于操作系统课程设计的实践报告,主要探讨了如何在Ubuntu操作系统环境下实现读者写者问题的解决方案。报告详细介绍了设计思路、要求、详细设计过程以及调试运行的结果,同时还提供了源代码供参考。 在操作系统中,读者写者问题是多线程并发控制的一个经典问题,它涉及到资源共享和并发访问的同步问题。在这个问题中,读者和写者共享一个数据区域,但读写操作有特定的限制: 1. 写-写互斥:不允许两个或更多的写者同时进行写操作,以防止数据冲突。 2. 读-写互斥:不允许一个读者和一个写者同时进行操作,因为写操作可能改变数据,影响读者读取。 3. 读-读允许:允许多个读者同时读取数据,因为读操作不会改变数据。 设计要求包括: 1. 使用线程实现读者和写者的并发操作,并实现正确的同步算法。 2. 在操作完成后显示存储区的内容、当前指针位置和线程的标识符。 3. 至少有3个读者和2个写者参与。 4. 共享对存储区操作的函数代码,确保多线程间的协作。 设计思路遵循读者写者问题的经典解决方案,考虑了读者优先和写者优先的策略,以确保读写操作的正确顺序。在详细设计部分,报告分别讨论了以下几个关键步骤: 4.1 创建互斥对象:通过定义整型变量如`mutex`, `rcount`, `wcount`, `rwq`, 和 `wwq`,来实现互斥锁和计数器,用于跟踪读者和写者的数量及状态。 4.2 读者进入线程:设计`rcome()`函数,当读者尝试访问数据时,会检查缓冲区是否被写者占用,若无写者,计数器增加,允许读者继续。 4.3 读者离开线程:读者完成读操作后,通过`rleave()`函数减少读者计数。 4.4 写者进入线程:`wcome()`函数确保没有其他写者或读者正在访问,才允许写者开始写操作。 4.5 写者离开线程:写者完成写操作后,通过`wleave()`函数释放资源,可能允许其他读者或写者进入。 4.6 主函数的设计:主函数协调各个线程的创建与销毁,监控整个系统的运行状态。 5. 设计环境:在Ubuntu操作系统下进行,这可能意味着使用Linux系统提供的线程API,如pthread库。 6. 调试运行结果:这部分展示了程序运行时的输出,验证了设计的正确性。 7. 设计小结:对整个设计过程进行总结,可能包括遇到的问题、解决方案和改进的建议。 8. 附录(源程序):提供了完整的源代码供参考。 9. 参考文献:列出相关研究和参考资料,有助于深入理解读者写者问题和并发控制。 这个课程设计不仅涵盖了读者写者问题的基本概念,还涉及到了实际的编程实现,对于理解和掌握操作系统中的同步机制具有重要意义。通过这个项目,学生可以学习到如何在实际环境中解决并发控制问题,提升其在操作系统领域的技能。
809 浏览量
初始条件: 1操作系统:Linux 或者 windows 2程序设计语言:C,java语言 3设有20个连续的存储单元,写入/读出的数据项按增序设定为1-20这20个字符。 要求完成的主要任务: (包括课程设计工作量及其技术要求,以及说明书撰写等具体要求) 1.技术要求: 1)为每个读者/写者产生一个线程,设计正确的同步算法 2)每个读者/写者对该存储区进行操作后,即时显示该存储区的全部内容、当前指针位置和读者/写者线程的自定义标识符。。 3)读者应有3个以上,写者应有有两个以上。 4)多个读者/写者之间须共享对存储区进行操作的函数代码。 2. 设计说明书内容要求: 1)设计题目与要求 2)总的设计思想及系统平台、语言、工具等。 3)数据结构与模块说明(功能与流程图) 4)给出用户名、源程序名、目标程序名和源程序及其运行结果。(要注明存储各个程序及其运行结果的主机IP地址和目录。) 5)运行结果与运行情况 (提示: (1)连续存储区可用数组实现。 (2)编译命令可用:     cc -lpthread -o  目标文件名  源文件名 (3)多线程编程方法参见附件。) 3. 调试报告: 1) 调试记录 2) 自我评析和总结 上机时间安排: 19周一 ~ 五 下午14:00 - 18:00 (6月27日开始) 指导教师签名: 年 月 日 系主任(或责任教师)签名: 年 月 日 五、源代码 #include #include #include "fstream.h" int readcount=0; //读者数目 int writecount=0; //写者数目 CRITICAL_SECTION RP_Write; //临界区 CRITICAL_SECTION cs_Write; CRITICAL_SECTION cs_Read; struct ThreadInfo //线程信息 { int Threadhao; //线程序号 char ThreadClass; //线程类别 double ThreadStartTime; //线程开始时间 double ThreadRunTime; //线程读写持续时间 }; void ReaderFun(char* file);//读者优先函数 void R_ReaderThread(void *p);//处理读者优先读者线程 void R_WriterThread(void *p);//处理读者优先写者线程 void WriterFun(char* file); void W_ReaderThread(void *p); void W_WriterThread(void *p); int main()//主函数 { char select; while (true) { cout<<"***************本程序实现读者-写者问题*******\n"<<endl; cout<<" 1:读者优先"<<endl; cout<<" 2:写者优先"<<endl; cout<<" 3:退出"<<endl; cout<<"\n*********************************************"<<endl; cout<<"请选择要进行的操作:"<>select; if(select!='1' && select!='2' && select!='3') cout<<"你操作有误,请重试!"<<endl; }while (select!='1' && select!='2' && select!='3'); system("cls"); if (select=='3') return 0;//退出 else if (select=='1')//调用读者优先 ReaderFun("peizhi.txt"); else if(select=='2')//调用写者优先 WriterFun("peizhi.txt"); cout<<"\n是否还有继续? 1. 继续 2.退出"<>select; if(select!='1' && select!='2' ) cout<<"你操作有误,请重试!"<<endl; }while (select!='1' && select!='2'); if(select=='2') return 0;// 退出 system("cls"); } return 0; }