操作系统读者写者问题Word下载.doc

上传人:b****1 文档编号:13168716 上传时间:2022-10-07 格式:DOC 页数:31 大小:329KB
下载 相关 举报
操作系统读者写者问题Word下载.doc_第1页
第1页 / 共31页
操作系统读者写者问题Word下载.doc_第2页
第2页 / 共31页
操作系统读者写者问题Word下载.doc_第3页
第3页 / 共31页
操作系统读者写者问题Word下载.doc_第4页
第4页 / 共31页
操作系统读者写者问题Word下载.doc_第5页
第5页 / 共31页
点击查看更多>>
下载资源
资源描述

操作系统读者写者问题Word下载.doc

《操作系统读者写者问题Word下载.doc》由会员分享,可在线阅读,更多相关《操作系统读者写者问题Word下载.doc(31页珍藏版)》请在冰豆网上搜索。

操作系统读者写者问题Word下载.doc

2.3函数设计 13

第3章程序实现 15

3.1程序功能及界面设计 15

3.2实现程序流程 15

3.2.1读者优先算法实现 15

3.2.2写者优先算法实现 16

3.2.3无优先算法实现 17

3.3程序流程图 18

3.3.1读者优先算法流程图 18

3.3.2写者优先算法流程图 18

3.3.3无优先算法流程图 19

心得体会 21

参考文献 22

附录1源代码 23

第1章实验目的和实验要求

1.1实验目的

理解临界区和进程互斥的概念,掌握用信号量和PV操作实现进程互斥的方法。

1.2实验要求

在windows或者linux环境下编写一个控制台应用程序,该程序运行时能创建N个线程,其中既有读者线程又有写者线程,它们按照事先设计好的测试数据进行读写操作。

请用信号量和PV操作实现读者/写者问题。

1.3课程设计题目

本课程设计共包括3个题目,内容覆盖了操作系统原理的关键知识点,包括进程调度、内存管理、进程同步、死锁、进程通讯、文件系统及嵌入式操作系统。

题目1:

进程调度算法。

模拟在单处理器情况下的进程调度,目的是加深对进程调度工作的理解,掌握不同调度算法的优缺点

题目2:

动态异长分区的存储分配与回收算法。

编写一个程序,模拟操作系统对动态异长分区的存储分配与回收算法。

题目3:

读者/写者问题与进程同步。

要求学生用信号量和PV操作实现读者/写者问题的读者优先算法、写者优先算法和无优先算法。

我们小组选择题目3,即读者/写者问题与进程同步。

以下是该题目的实验报告。

28

第2章实验内容

2.1题目分析

2.1.1问题的描述

有一个被许多进程共享的数据区,这个数据区可以是一个文件,或者主存的一块空间,甚至可以是一组处理器寄存器。

有一些只读取这个数据区的进程(reader)和一些只往数据区中写数据的进程(writer)。

以下假设共享数据区是文件。

这些读者和写者对数据区的操作必须满足以下条件:

读—读允许;

读—写互斥;

写—写互斥。

这些条件具体来说就是:

(1)任意多的读进程可以同时读这个文件;

(2)一次只允许一个写进程往文件中写;

(3)如果一个写进程正在往文件中写,禁止任何读进程或写进程访问文件;

(4)写进程执行写操作前,应让已有的写者或读者全部退出。

这说明当有读者在读文件时不允许写者写文件。

2.1.2问题的解决方法

(1)读者优先

除了上述四个规则外,还增加读者优先的规定,当有读者在读文件时,对随后到达的读者和写者,要首先满足读者,阻塞写者。

这说明只要有一个读者活跃,那么随后而来的读者都将被允许访问文件,从而导致写者长时间等待,甚至有可能出现写者被饿死的情况。

(2)写者优先

除了上述四个规则外,还增加写者优先的规定,即当有读者和写者同时等待时,首先满足写者。

当一个写者声明想写文件时,不允许新的读者再访问文件。

(3)无优先

除了上述四个规则外,不再规定读写的优先权,谁先等待谁就先使用文件。

2.2算法分析

2.2.1读者优先算法分析

对于相继到达的一批读者,并不是每个读者都需要执行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)操作。

若P(r_w_w)操作成功,读者便可去读文件,相应地,read_count+1。

同理,仅当在执行了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所示的算法描述,其中的数字表示语句对应的行号。

01semaphorer_w_w=1;

02semaphoreh_mutex_read_count=1;

03intread_count=0;

04reader(){

05P(h_mutex_read_count);

06if(read_count==0)P(r_w_w);

07read_count++;

08V(h_mutex_read_count);

09读文件;

10P(h_mutex_read_count);

11read_count--;

12if(read_count==0)V(r_w_w);

13V(h_mutex_read_count);

14}

15

16writer(){

17P(r_w_w);

18写文件;

19V(r_w_w);

20}

图2-1读者优先算法

下面对该算法的调度效果进行分析。

假设最初没有进程在访问文件。

过了一会,就会有很多读者和写者到达。

对它们可能有两种调度情形。

l情形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_mutex_read_count)将信号量h_mutex_read_count的值变为负数,从而阻塞在信号量h_mutex_read_count上。

例如,对于请求序列w1,w2,r1,w3,r2,r3,我们用图表形象地刻画进程的活动,图表中包括读者计数器的值、信号量h_mutex_read_count和r_w_w的值和队列以及访问文件的进程。

①初始状态。

没有进程使用文件,计数器read_count的值是0,信号量h_mutex_read_count和r_w_w的值都是1,队列都是空,参见图2-2;

②w1请求写文件,所以执行语句17,将信号量r_w_w的值减1后变成0,w1获得文件使用权,执行语句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_count

1

NULL

r_w_w

访问文件者:

图2-2

②w1请求

w1

图2-3

⑤同时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;

③w2请求

-1

w2

图2-4

④r1请求

-2

w2,r1

图2-5

⑦同时r3提出读请求,所以执行语句5,将信号量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,开始读

⑥r2请求

r2

-3

w2,r1,w3

图2-7

⑤w3请求

图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的值加1后变成1,r3执行语句9,开始读文件。

这样三个读者同时读文件,参见图2-10;

⑩当r1、r2和r3读完文件时,都执行语句10~14,并由最后一个执行语句10~14的读者执行V(r_w_w),将信号量r_w_w的值加1后变成0,并唤醒w3,w3接着执行语句18,开始写文件,参见图2-11;

当w3写

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 党团工作 > 党团建设

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1