操作系统读者写者问题

上传人:壹****1 文档编号:505460075 上传时间:2022-11-04 格式:DOCX 页数:32 大小:232.88KB
返回 下载 相关 举报
操作系统读者写者问题_第1页
第1页 / 共32页
操作系统读者写者问题_第2页
第2页 / 共32页
操作系统读者写者问题_第3页
第3页 / 共32页
操作系统读者写者问题_第4页
第4页 / 共32页
操作系统读者写者问题_第5页
第5页 / 共32页
点击查看更多>>
资源描述

《操作系统读者写者问题》由会员分享,可在线阅读,更多相关《操作系统读者写者问题(32页珍藏版)》请在金锄头文库上搜索。

1、操作系统课程设计报告目录第 1 章 实验目的和实验要求 11.1 实验目的 11.2 实验要求 11.3 课程设计题目 1第 2 章 实验内容 22.1 题目分析 22.1.1 问题的描述 22.1.2 问题的解决方法 22.2 算法分析 32.2.1 读者优先算法分析 32.2.2 写者优先算法分析 82.2.3 无优先算法分析 112.3 函数设计 13第 3 章 程序实现 153.1 程序功能及界面设计 153.2 实现程序流程 153.2.1 读者优先算法实现 153.2.2 写者优先算法实现 163.2.3 无优先算法实现 173.3 程序流程图 183.3.1 读者优先算法流程图

2、183.3.2 写者优先算法流程图 183.3.3 无优先算法流程图 19心得体会 21参考文献 22附录 1 源代码 23第 1 章 实验目的和实验要求1.1 实验目的理解临界区和进程互斥的概念,掌握用信号量和 PV 操作实现进程互斥的方 法。1.2 实验要求在 windows 或者 linux 环境下编写一个控制台应用程序,该程序运行时能创 建 N 个线程,其中既有读者线程又有写者线程,它们按照事先设计好的测试数 据进行读写操作。请用信号量和 PV 操作实现读者/写者问题。1.3 课程设计题目本课程设计共包括 3 个题目,内容覆盖了操作系统原理的关键知识点,包 括进程调度、内存管理、进程同

3、步、死锁、进程通讯、文件系统及嵌入式操作 系统。题目 1:进程调度算法。模拟在单处理器情况下的进程调度,目的是加深对 进程调度工作的理解,掌握不同调度算法的优缺点题目 2:动态异长分区的存储分配与回收算法。编写一个程序,模拟操作系 统对动态异长分区的存储分配与回收算法。题目 3:读者/写者问题与进程同步。理解临界区和进程互斥的概念,掌握 用信号量和 PV 操作实现进程互斥的方法。要求学生用信号量和 PV 操作实现读 者/写者问题的读者优先算法、写者优先算法和无优先算法。我们小组选择题目 3,即读者/写者问题与进程同步。以下是该题目的实验 报告。第 2 章 实验内容2.1题目分析2.1.1 问题

4、的描述有一个被许多进程共享的数据区,这个数据区可以是一个文件,或者主存 的一块空间,甚至可以是一组处理器寄存器。有一些只读取这个数据区的进程(reader)和一些只往数据区中写数据的进程(writer)。以下假设共享数据区是 文件。这些读者和写者对数据区的操作必须满足以下条件:读读允许;读 写互斥;写写互斥。这些条件具体来说就是:(1) 任意多的读进程可以同时读这个文件;(2) 一次只允许一个写进程往文件中写;(3) 如果一个写进程正在往文件中写,禁止任何读进程或写进程访问文件;(4) 写进程执行写操作前,应让已有的写者或读者全部退出。这说明当有 读者在读文件时不允许写者写文件。2.1.2 问

5、题的解决方法( 1 )读者优先 除了上述四个规则外,还增加读者优先的规定,当有读者在读文件时,对 随后到达的读者和写者,要首先满足读者,阻塞写者。这说明只要有一个读者 活跃,那么随后而来的读者都将被允许访问文件,从而导致写者长时间等待, 甚至有可能出现写者被饿死的情况。(2)写者优先 除了上述四个规则外,还增加写者优先的规定,即当有读者和写者同时等 待时,首先满足写者。当一个写者声明想写文件时,不允许新的读者再访问文 件。( 3 )无优先 除了上述四个规则外,不再规定读写的优先权,谁先等待谁就先使用文件。2.2算法分析2.2.1 读者优先算法分析对于相继到达的一批读者,并不是每个读者都需要执行

6、P(r_w_w) 和V(r_w_w)。在这批读者中,只有最先到达的读者才需要执行P(r_w_w),与写者 竞争对文件的访问权,若执行P(r_w_w)成功则获得了文件的访问权,其他的读 者可直接访问文件;同理,只有最后退出临界区的读者需要执行V(r_w_w)来归 还文件访问权。为了记录正在读文件的一批读者的数量, 需要设置一个整型变量 read_count,每一个读者到达时都要将read_count加1,退出时都要将read_count 减1。由于只要 有一个读者在读文件, 便不允许写者写 文件,所以 , 仅当 read_count=0时,即尚无读者在读文件时,读者才需要执行P(r_w_w)操作

7、。若 P(r_w_w)操作成功,读者便可去读文件,相应地,read_count+l。同理,仅当在 执行了 read_count减1操作后其值为0时,才需要执行V(r_w_w)操作,以便让 写者写文件。又因为read_count是一个可被多个读者访问的临界资源,所以应 该为它设置一个互斥信号量h_mutex_read_count。每个读者在访问read_count 之前执行 P(h_mutex_read_count),之后执行 V(h_mutex_read_count)。通过上述分析得到图 2-1 所示的算法描述,其中的数字表示语句对应的行 号。01semaphore r_w_w=1;02sem

8、aphore h_mutex_read_count=1;03int read_count=0;04reader()16writer()05P(h_mutex_read_count);17P(r_w_w);06if(read_count=0) P(r_w_w);18写文件;07read_count+;19V(r_w_w);08V(h mutex read count);2009读文件;10P(h_mutex_read_count);11read_count-;12if(read_count=0) V(r_w_w);13V(h_mutex_read_count);1415图 2-1 读者优先算法下

9、面对该算法的调度效果进行分析。 假设最初没有进程在访问文件。过了一会,就会有很多读者和写者到达。 对它们可能有两种调度情形。情形 1 最先调度写者写者执行P(r_w_w)操作成功,将r_w_w的值变为0获得文件的访问权; 其它的写者执行P(r_w_w)将r_w_w的值变为负数,从而阻塞在信号量r_w_w 上;第一个读者执行 P(h_mutex_read_count)成功,将信号量 h_mutex_read_count 的值变为0然后判断read_count是0所以执行P(r_w_w),将r_w_w的值减 1 后 仍然为负 数从而阻塞 在信 号 量 r_w_w 上, 其它 的 读者执行 P(h_

10、mutex_read_count)将信号量h_mutex_read_count的值变为负数,从而阻塞在 信号量 h_mutex_read_count 上。例如,对于请求序列wl,w2,rl,w3,r2,r3,我们用图表形象地刻画进程的活动, 图表中包括读者计数器的值、信号量h_mutex_read_count和r_w_w的值和队列 以及访问文件的进程。 初始状态。没有进程使用文件,计数器read_count的值是0,信号量 h_mutex_read_count和r_w_w的值都是1,队列都是空,参见图2-2; wl请求写文件,所以执行语句17,将信号量r_w_w的值减1后变成0, w1 获得文

11、件使用权,执行语句 18,开始写文件,参见图 2-3; 在 w1 尚未写完时, w2 提出写请求,所以执行语句 17,将信号量 r_w_w 的值减1后变成负1,w2被阻塞在信号量r_w_w上,参见图2-4; 同时 r1 提出读请求,所以执行语句 5,将信号量 h_mutex_read_count 的 值减1后变成0,接着执行语句6,判断read_count的值是0,所以执行P(r_w_w),将信号量r_w_w的值减1后变成-2, r1被阻塞在信号量r_w_w上,参见图2-5;初始状态 read_count=0 h_mutex_read_cou ntw1请求read_count=0 h_mute

12、x_read_cou ntw2请求read_count=0 h_mutex_read_cou nt图2-4访问文件者:w1图2-5同时w3提出写请求,所以执行语句17,将信号量r_w_w的值减1后变 成-3, w3 被阻塞在信号量 r_w_w 上,参见图 2-6;同时 r2 提出读请求,所以执行语句 5,将信号量 h_mutex_read_count 的 值减 1 后变成-1, r2 被阻塞在信号量 h_mutex_read_count 上,参见图 2-7;r1请求read_count=0h_mutex_read_count0NULLr_w_w-2 同时 r3 提出读请求,所以执行语句 5,将

13、信号量 h_mutex_read_count 的 值减 1 后变成-2, r3 被阻塞在信号量 h_mutex_read_count 上,参见图 2-8; w1写完文件,执行语句19,将信号量r_w_w的值加1后变成-2,并唤醒 w2, w2 接着执行语句 18,开始写文件,参见图 2-9; w2写完文件,执行语句19,将信号量r_w_w的值加1后变成-1,并唤醒 r1, r1 接着执行语句 7,将 read_count 的值加 1 后变成 1,执行语句 8,将信号量h_mutex_read_count的值加1后变成-1,并唤醒r2, r1执行语句9,开始读w3请求read_count=0 h

14、_mutex_read_cou ntr2请求read_count=0 h_mutex_read_cou ntw1图2-7w1图2-6文件;被唤醒的r2执行语句6,判断read_count的值不是0,所以执行语句 7,将 read_count 的值加 1 后变成 2,执行语句 8,将信号量 h_mutex_read_count 的值加 1 后变成 0,并唤醒 r3, r2 执行语句 9,开始读文件;被唤醒的 r3 执行 语句 6,判断 read_count 的值不是 0,所以执行语句 7,将 read_count 的值加 1 后变成3,执行语句8,将信号量h_mutex_read_count的值

15、加1后变成1,r3执 行语句 9,开始读文件。这样三个读者同时读文件,参见图 2-10; 当 r1、r2 和 r3 读完文件时,都执行语句 1014,并由最后一个执行语句 1014的读者执行V(r_w_w),将信号量r_w_w的值加1后变成0,并唤醒w3, w3 接着执行语句 18,开始写文件,参见图 2-11;当 w3 写完文件时,执行语句 19,将信号量 r_w_w 的值加 1 后变成 1,回 到初始状态。可见, 对于请求序列 w1,w2,r1,w3,r2,r3 , 实际访问文件 的 顺序是 w1,w2,r1,r2,r3,w3。虽然w3比r2、r3先提出请求,但是由于在此之前已经有r1 在读文件,所以优先响应读者r2、r3,阻塞写者w3。如果在w3之后不断有新 的读者到达,则w3将一直被阻塞,直至被饿死。r3请求read_count=0 h_mutex_read_cou nt图2-8read_count=0h_mutex_r

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号