题目3-读者与写者问题

合集下载

读者-写者问题的实现

读者-写者问题的实现

目录摘要 (1)1.设计思想 (2)2.各模块的伪码算法 (3)3. 函数关系调用图 (5)4.程序测试结果 (6)设计总结 (9)参考文献 (10)致谢 (11)摘要本设计的读者写者问题,是指一些进程共享一个数据区。

数据区可以使一个文件、一块内存空间或者一组寄存器。

Reader进程只能读数据区中的数据,而writer进程必须与其他进程互斥地访问共享对象的同步问题。

读者写者问题可以这样的描述, 有一群写者和一群读者, 写者在写同一本书, 读者也在读这本书, 多个读者可以同时读这本书。

但是,只能有一个写者在写书, 并且,读者必写者优先,也就是说,读者和写者同时提出请求时,读者优先。

当读者提出请求时需要有一个互斥操作, 另外, 需要有一个信号量S来确定当前是否可操作。

本设计方案就是通过利用记录型信号量对读者写者问题的解决过程进行模拟演示,形象地阐述记录型信号量机制的工作原理。

关键词:共享对象,互斥,同步,信号量1.设计思想本设计借助C语言实现进程同步和互斥的经典问题--读者写者问题,用高级语言编写和调试一个进程同步程序,以加深对进程同步机制的理解。

通过用C 语言模拟进程同步实现,加深理解有关进程同步和互斥机制的概念及P、V操作的应用。

学生通过该题目的设计过程,掌握读者、写者问题的原理、软件开发方法并提高解决实际问题的能力。

在 Windows环境下,创建一个包含n个线程的控制台进程。

用这n个线每个线程按相应测试数据文件的要求,进行读写操作。

程来表示 n 个读者或写者。

请用信号量机制分别实现读者优先和写者优先的读者-写者问题。

将所有的读者和所有的写者分别放进两个等待队列中,当读允许时就让读者队列释放一个或多个读者,当写允许时,释放第一个写者操作。

读者-写者的读写限制(包括读者优先和写者优先)1)写-写互斥,即不能有两个写者同时进行写操作;2)读-写互斥,即不能同时有一个读者在读,同时却有一个写者在写;3)读读允许,即可以有 2 个以上的读者同时读;4)读者优先附加条件:如果一个读者申请进行读操作,同时又有一个读操作正在进行读操作,则该读者可以直接开始读操作;5)写者优先附加条件:如果一个读者申请进行读操作时已经有一个写者在等待访问共享资源,则该读者必须等到没有写者处于等待状态后才能开始读操作。

进程同步模拟设计——读者和写者问题

进程同步模拟设计——读者和写者问题

学号:课程设计题目进程同步模拟设计——读者和写者问题学院计算机科学与技术学院专业、班级、姓名、指导教师吴利军2013 年01 月17 日课程设计任务书学生:指导教师:吴利军工作单位:计算机科学与技术学院题目: 进程同步模拟设计——读者和写者问题初始条件:1.预备容:阅读操作系统的进程管理章节容,对进程的同步和互斥,以及信号量机制度有深入的理解。

2.实践准备:掌握一种计算机高级语言的使用。

要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1.模拟用信号量机制实现读者和写者问题。

2.设计报告容应说明:⑴需求分析;⑵功能设计(数据结构及模块说明);⑶开发平台及源程序的主要部分;⑷测试用例,运行结果与运行情况分析;⑸自我评价与总结:i)你认为你完成的设计哪些地方做得比较好或比较出色;ii)什么地方做得不太好,以后如何改正;iii)从本设计得到的收获(在编写,调试,执行过程中的经验和教训);iv)完成本题是否有其他方法(如果有,简要说明该方法);时间安排:设计安排一周:周1、周2:完成程序分析及设计。

周2、周3:完成程序调试及测试。

周4、周5:验收、撰写课程设计报告。

(注意事项:严禁抄袭,一旦发现,一律按0分记)指导教师签名:年月日系主任(或责任教师)签名:年月日1 需求分析所谓读者写者问题,是指保证一个 writer 进程必须与其他进程互斥地访问共享资源的同步问题.读者写者问题可以这样的描述,有一群写者和一群读者, 写者在写同一本书,读者也在读这本书,多个读者可以同时读这本书,但是只能有一个写者在写书,并且读者优先,也就是说,读者和写者同时提出请求时,读者优先.当读者提出请求时需要有一个互斥操作, 另外需要有一个信号量 mutex来当前是否可操作.信号量机制是支持多道程序的并发操作系统设计中解决资源共享时进程间的同步与互斥的重要机制,而读者写者问题则是这一机制的一个经典例. 与记录型信号量解决读者—写者问题不同,信号量机制它增加了一个限制,即最多允许n个读者同时读.为此引入了一个信号量Rcount,并赋予初值为 0,通过执行Rcount++操作,来控制读者的数目,每当有一个读者进入时,就要执行Rcount++操作,使 Rcount 的值加1.读者离开时Rcount--;当且仅当Rcount==0时,V (Wmutex),才能进行写操作。

读者-写者问题说明书

读者-写者问题说明书

《操作系统原理》课程设计任务书题目:读者-写者问题的实现学生姓名:李志旭学号:13740113 班级:_13级软件工程_题目类型:软件工程(R)指导教师:陈文娟、马生菊一、设计目的学生通过该题目的设计过程,掌握读者、写者问题的原理、软件开发方法并提高解决实际问题的能力。

二、设计任务编写程序实现读者优先和写者优先问题:读者-写者问题的读写操作限制(包括读者优先和写者优先)写-写互斥:不能有两个写者同时进行写操作读-写互斥:不能同时有一个线程在读,而另一个线程在写。

读-读允许:可以有一个或多个读者在读。

三、设计要求1.分析设计要求,给出解决方案(要说明设计实现所用的原理、采用的数据结构)。

2.设计合适的测试用例,对得到的运行结果要有分析。

3.设计中遇到的问题,设计的心得体会。

4.文档:课程设计打印文档每个学生一份,并装在统一的资料袋中,资料袋前面要贴有学校统一的资料袋封面。

四、提交的成果1. 课程设计说明书内容包括(1) 封面(学院统一印制);(2) 课程设计任务书;(3) 中文摘要150字;关键词3-5个;(4) 目录;(5) 正文;(设计思想;各模块的伪码算法;函数的调用关系图;测试结果等)(6) 设计总结;(7) 参考文献;(8) 致谢等。

注:每一部分是单独的一章,要另起一页写。

2. 排版要求(1) 所有一级标题为宋体三号加粗(即上面写的2~8部分,单独一行,居中)(2) 所有二级标题为宋体四号加粗(左对齐)(3) 所有三级标题为宋体小四加粗(左对齐)(4) 除标题外所有正文为宋体小四,行间距为固定值22磅,每个段落首行缩进2字符(5) 目录只显示3级标题,目录的最后一项是无序号的“参考文献资料”。

3. 其他要求(班长负责,务必按照以下方式建文件夹)(1) 以班级为单位刻录光盘一张,光盘以班级命名,例如:“10级计算机科学与技术1班”;(2) 光盘内每人一个文件夹,以学号姓名命名——如“10730101 陈映霞”,内容包括任务书、设计文档。

操作系统复习题答案

操作系统复习题答案

1、在设备管理中,数据传送控制方式有哪几种?试比较它们各自的优缺点。

1、程序控制输入/输出方式。

控制相对简单,不需要硬件支持,CPU和I/O设备串行工作,适用于CPU执行速度较慢且外设较少的设备。

2、中断输人/输出方式。

能实现CPU和I/O设备及I/O设备间的并行,中断次数过多,数据容易丢失,适用于中断次数少且外设较少的设备。

3、直接存储器方式DMA方式。

能实现CPU和I/O设备间的并行,设备和主存之间可以直接成批传送数据,大大减少了CPU干预,需要存储器硬件支持。

4、通道控制方式。

CPU权利下放,干预更少,提高了系统资源利用率,需要硬件支持。

2、文件的物理组织结构常见的有几种?它们与文件的存取方式有什么关系?⑴、顺序结构(又称连续结构):是顺序存取时速度较快;当文件是定长记录文件时,还可根据文件起始地址及记录长度进行随机访问。

⑵、链接(又称串联)结构:链接文件只能按照文件的指针链顺序访问,因而查找效率较低。

⑶、索引结构:是可以进行随机访问,也易于进行文件的增删。

3、文件存储空间管理的方法有哪些?它们的优缺点?①、空闲文件目录:⑴、如果文件太大,那么在空白文件目录中将没有合适的空白文件能分配给它,尽管这些空白文件的总和能满足需求。

⑵、经过多次分配和回收,空白文件目录中的小空白文件越来越多,很难分配出去,形成碎片。

②、空闲块链:⑴、可实现不连续分配。

⑵、由于每个空闲块的指针信息都是存放在上一空闲块中的,这样就不用占用额外的存储空间,与空白文件目录管理方法相比节省了存储开销。

⑶、因为链接信息是存放在每个空闲块中的,每当在链上增加或删除空白块时需要很多输入/输出操作,系统开销大。

⑷、对于大型文件系统,空闲链将会太长。

③、位示图:采用位示图的方法管理辅存空间较为简单,并且由于位示图很小,可放在内存中,访问速度较快。

4、系统中调度的层次分为几级,它们的主要任务各是什么?一般地,处理机的调度分为3级:⑴、作业调度:又称宏观调度,或高级调度。

读者写者问题描述

读者写者问题描述

读者写者问题描述嘿,你问读者写者问题啊?那我给你讲讲哈。

咱就说啊,这读者写者问题呢,就好比一个图书馆。

有很多人想去看书,这就是读者。

还有人想去写书,那就是写者。

有一回啊,我去图书馆。

那里面好多人都在安静地看书呢。

这时候就相当于有很多读者在享受知识。

突然,有个作家模样的人来了,他想找个地方坐下来写书。

这就是写者出现了。

这时候问题就来了。

如果读者和写者同时在图书馆里,会咋样呢?如果读者一直在看书,写者就没办法好好写书,因为他会觉得被打扰了。

反过来,如果写者一直在写书,读者也没办法好好看书,因为他们不知道啥时候能看到新的内容。

就像我在图书馆里,我正看得入迷呢,突然那个作家开始大声地思考他的情节,哎呀,那可把我烦死了。

我就想,你能不能安静点啊,让我好好看书嘛。

这就像读者希望写者不要打扰他们一样。

那怎么办呢?就得有个规则。

比如说,让写者先等读者都看完书走了,他再开始写书。

或者让读者在写者写书的时候,稍微安静一点,不要弄出太大动静。

我记得有一次,我在图书馆里,有个写者特别有礼貌。

他进来的时候,看到很多读者,就悄悄地找了个角落坐下,等大家都看得差不多了,他才开始动笔。

这样大家都能和谐共处了。

读者写者问题就是要找到一个平衡,让读者能愉快地看书,写者也能安心地写书。

不能让一方太强势,影响了另一方。

就像在生活中,我们也会遇到类似的情况。

比如说,一个办公室里,有人在安静地工作,有人在讨论问题。

这时候就得互相体谅,不能太吵了,影响别人工作。

总之啊,读者写者问题就是要解决大家在共享资源的时候,如何和谐相处的问题。

嘿嘿,你明白了不?。

读者与写者问题

读者与写者问题

2012--2013学年第一学期______________________学院综合设计《读者与写者问题》学号:姓名:: 成绩:IIi 评语:I _____________________________________________________________________________________________________________________________________ I* 设计要求:I: 用P、V操作实现读者写者问题,写者不多于5个,读者不多于20个。

Ii 所有读者和写者访问同一个文件all.txt ,每个写者向文件添加一行,内容;是“I'm the writer number X. It is TIME. ”,其中X是pid,TIME是订访问文件的时间,格式为hh-mm-ss.ddd;每个读者读出最后一个写者的pid 和写的时间,并在屏幕上输出。

每个读者或写者的访问次数为32-100之间的随机数,同一个写者相邻两次的访问间隔不得短于0.1秒,同一个读者相邻两次的访问间隔不得短于0.05秒。

线I目录1、概述 (2)1.1 设计题目 (2)1.2 设计目的 (2)1.3 开发环境 (2)1.4 设计要求 (2)2、设计思想 (2)3、具体程序实现 (2)4、运行结果 (6)5、总结 (8)6、参考文献 (9)读者写者问题的实现1、概述1.1 设计题目读者写者问题的实现1.2 设计目的通过对操作系统内核实现代码的阅读、修改、设计,理解和掌握复杂的操作系统的工作原理。

通过研究Linux 的线程机制和信号量实现读者写者(Reader-Writer) 问题并发控制。

1.3 开发环境使用的操作系统:Linux 系统使用的编程语言:C语言1.4 设计要求用P、V操作实现读者写者问题,写者不多于5个,读者不多于20个。

所有读者和写者访问同一个文件all.txt ,每个写者向文件添加一行,内容是“ I'm the writer numberX. It is TIME. ”,其中X是pid ,TIME是访问文件的时间,格式为hh-mm-ss.ddd ;每个读者读出最后一个写者的pid 和写的时间,并在屏幕上输出。

读者写者问题

读者写者问题
2)读-写互斥,即不能同时有一个读者在读,同时却有一个写者在写
3)读读允许,即可以有2个以上的读者同时读
将所有的读者与所有的写者分别放进两个等待队列中,当读允许时就让读者队列释放一个或多个读者,当写允许时,释放第一个写者操作。读者写者问题的定义如下:有一个许多进程共享的数据区,这个数据区可以就是一个文件或者主存的一块空间;有一些只读取这个数据区的进程(Reader)与一些只往数据区写数据的进程(Writer),此外还需要满足以下条件:1)任意多个读进程可以同时读这个文件;2)一次只有一个写进程可以往文件中写;3)如果一个写进程正在进行操作,禁止任何读进程度文件。我们需要分两种情况实现该问题:
一设计概述
所谓读者写者问题,就是指保证一个writer进程必须与其她进程互斥地访问共享对象的同步问题。
读者写者问题可以这样的描述,有一群写者与一群读者,写者在写同一本书,读者也在读这本书,多个读者可以同时读这本书,但就是,只能有一个写者在写书,并且,读者必写者优先,也就就是说,读者与写者同时提出请求时,读者优先。当读者提出请求时需要有一个互斥操作,另外,需要有一个信号量S来当前就是否可操作。
信号量机制就是支持多道程序的并发操作系统设计中解决资源共享时进程间的同步与互斥的重要机制,而读者写者问题则就是这一机制的一个经典范例。
与记录型信号量解决读者—写者问题不同,信号量机制它增加了一个限制,即最多允许RN个读者同时读。为此,又引入了一个信号量L,并赋予初值为RN,通过执行wait(L,1,1)操作,来控制读者的数目,每当有一个读者进入时,就要执行wait(L,1,1)操作,使L的值减1。当有RN个读者进入读后,L便减为0,第RN+1个读者要进入读时,必然会因wait(L,1,1)操作失败而堵塞。对利用信号量来解决读者—写者问题的描述如下:

读者-写者问题解答

读者-写者问题解答

2.读者—写者问题读者—写者问题(Readers-Writers problem)也是一个经典的并发程序设计问题,是经常出现的一种同步问题。

计算机系统中的数据(文件、记录)常被多个进程共享,但其中某些进程可能只要求读数据(称为读者Reader);另一些进程则要求修改数据(称为写者Writer)。

就共享数据而言,Reader和Writer是两组并发进程共享一组数据区,要求:(1)允许多个读者同时执行读操作;(2)不允许读者、写者同时操作;(3)不允许多个写者同时操作。

Reader和Writer的同步问题分为读者优先、弱写者优先(公平竞争)和强写者优先三种情况,它们的处理方式不同。

(1)读者优先。

对于读者优先,应满足下列条件:如果新读者到:①无读者、写者,新读者可以读;②有写者等待,但有其它读者正在读,则新读者也可以读;③有写者写,新读者等待。

如果新写者到:①无读者,新写者可以写;②有读者,新写者等待;③有其它写者,新写者等待。

单纯使用信号量不能解决读者与写者问题,必须引入计数器rc 对读进程计数;rc_mutex 是用于对计数器rc 操作的互斥信号量;write表示是否允许写的信号量;于是读者优先的程序设计如下:int rc=0; //用于记录当前的读者数量semaphore rc_mutex=1; //用于对共享变量rc 操作的互斥信号量semaphore write=1; //用于保证读者和写者互斥地访问的信号量void reader() /*读者进程*/do{P(rc_mutex); //开始对rc共享变量进行互斥访问rc ++; //来了一个读进程,读进程数加1if (rc==1) P(write);//如是第一个读进程,判断是否有写进程在临界区,//若有,读进程等待,若无,阻塞写进程V(rc_mutex); //结束对rc共享变量的互斥访问读文件;P(rc_mutex); //开始对rc共享变量的互斥访问r c--; //一个读进程读完,读进程数减1if (rc == 0) V(write);//最后一个离开临界区的读进程需要判断是否有写进程//需要进入临界区,若有,唤醒一个写进程进临界区V(rc_mutex); //结束对rc共享变量的互斥访问} while(1)void writer() /*写者进程*/do{P(write); //无读进程,进入写进程;若有读进程,写进程等待写文件;V(write); //写进程完成;判断是否有读进程需要进入临界区,//若有,唤醒一个读进程进临界区} while(1)读者优先的设计思想是读进程只要看到有其它读进程正在读,就可以继续进行读;写进程必须等待所有读进程都不读时才能写,即使写进程可能比一些读进程更早提出申请。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验3 读者/写者问题与进程同步3.1 实验目的理解临界区和进程互斥的概念,掌握用信号量和PV操作实现进程互斥的方法。

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

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

读者/写者问题的描述如下:有一个被许多进程共享的数据区,这个数据区可以是一个文件,或者主存的一块空间,甚至可以是一组处理器寄存器。

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

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

这些读者和写者对数据区的操作必须满足以下条件:读—读允许;读—写互斥;写—写互斥。

这些条件具体来说就是:(1)任意多的读进程可以同时读这个文件;(2)一次只允许一个写进程往文件中写;(3)如果一个写进程正在往文件中写,禁止任何读进程或写进程访问文件;(4)写进程执行写操作前,应让已有的写者或读者全部退出。

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

对于读者-写者问题,有三种解决方法:1、读者优先除了上述四个规则外,还增加读者优先的规定,当有读者在读文件时,对随后到达的读者和写者,要首先满足读者,阻塞写者。

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

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

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

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

3.3算法分析3.3.1读者优先对于相继到达的一批读者,并不是每个读者都需要执行P(r_w_w)和V(r_w_w)。

在这批读者中,只有最先到达的读者才需要执行P(r_w_w),与写者竞争对文件的访问权,若执行P(r_w_w)成功则获得了文件的访问权,其他的读者可直接访问文件;同理,只有最后退出临界区的读者需要执行V(r_w_w)来归还文件访问权。

为了记录正在读文件的一批读者的数量,需要设置一个整型变量readercount,每一个读者到达时都要将readercount加1,退出时都要将readercount减1。

由于只要有一个读者在读文件,便不允许写者写文件,所以,仅当readercount=0时,即尚无读者在读文件时,读者才需要执行P(r_w_w)操作。

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

同理,仅当在执行了readercount减1操作后其值为0时,才需要执行V(r_w_w)操作,以便让写者写文件。

又因为readercount是一个可被多个读者访问的临界资源,所以应该为它设置一个互斥信号量readercount_mutex.。

每个读者在访问readercount 之前执行P(readercount_mutex),之后执行V(readercount_mutex)。

通过上述分析得到图3-2所示的算法描述,其中的数字表示语句对应的行号。

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

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

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

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

情形1 最先调度写者写者执行P(r_w_w)操作成功,将r_w_w 的值变为0,获得文件的访问权;其它的写者执行P(r_w_w)将r_w_w 的值变为负数,从而阻塞在信号量r_w_w 上;第一个读者执行P(readercount_mutex)成功,将信号量readercount_mutex 的值变为0,然后判断readercount 是0,所以执行P(r_w_w),将r_w_w 的值减1后仍然为负数从而阻塞在信号量r_w_w 上,其它的读者执行P(readercount_mutex)将信号量readercount_mutex 的值变为负数,从而阻塞在信号量readercount_mutex 上。

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

①初始状态。

没有进程使用文件,计数器readercount 的值是0,信号量readercount_mutex 和r_w_w 的值都是1,队列都是空,参见图3-3;②w1请求写文件,所以执行语句17,将信号量r_w_w 的值减1后变成0,w1获得文件使用权,执行语句18,开始写文件,参见图3-4;③在w1尚未写完时,w2提出写请求,所以执行语句17,将信号量r_w_w 的值减1后变成负1,w2被阻塞在信号量r_w_w 上,参见图3-5;④同时r1提出读请求,所以执行语句5,将信号量readercount_mutex 的值减1后变成0,接着执行语句6,判断readercount 的值是0,所以执行P(r_w_w),将信号量r_w_w 的值减1后变成-2,r1被阻塞在信号量r_w_w 上,参见图3-6;⑤同时w3提出写请求,所以执行语句17,将信号量r_w_w 的值减1后变成-3,w3被阻塞在信号量r_w_w 上,参见图3-7;⑥同时r2提出读请求,所以执行语句5,将信号量readercount_mutex 的值减1后变成-1,r2被阻塞在信号量readercount_mutex 上,参见图3-8;⑦同时r3提出读请求,所以执行语句5,将信号量readercount_mutex 的值减1后变成-2,r3被阻塞在信号量readercount_mutex 上,参见图3-9;⑧w1写完文件,执行语句19,将信号量r_w_w 的值加1后变成-2,并唤醒w2,w2接着执行语句18,开始写文件,参见图3-10;⑨w2写完文件,执行语句19,将信号量r_w_w 的值加1后变成-1,并唤醒r1,r1接着执行语句7,将readercount 的值加1后变成1,执行语句8,将信号量readercount_mutex 的值加1后变成-1,并唤醒r2,r1执行语句9,开始读文件;被唤醒的r2执行语句6,判断readercount 的值不是0,所以执行语句7,将readercount 的值加1后变成2,执行语句8,将信号量readercount_mutex 的值加1后变成0,并唤醒r3,r2执行语句9,开始读文件;被唤醒的r3执行语句6,判断readercount 的值不是0,所以执行语句7,将readercount 的值加1后变成3,执行语句8,将信号量readercount_mutex 的值加1后变成1,r3执行语句9,开始读文件。

这样三个读者同时读文件,参见图3-11;⑩当r1、r2和r3读完文件时,都执行语句10~14,并由最后一个执行语句10~14的读者执行V(r_w_w),将信号量r_w_w 的值加1后变成0,并唤醒w3,w3接着执行语句18,开始写文件,参见图3-12;当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将一直被阻塞,直至被饿死。

情形2 最先调度读者第一个读者执行P(readercount_mutex)成功,将信号量readercount_mutex 的值变为0,接着该读者判断readercount 是0,所以执行P(r_w_w)操作成功,获得文件的访问权,将r_w_w 的值变为0,然后将readercount 变成1,执行V(readercount_mutex),之后开始读文件;随后的写者执行P(r_w_w)将r_w_w 的值变为负数,从而阻塞在信号量r_w_w 上;其它的读者执行P(readercount_mutex)成功,判断readercount 不是0,所以直接将readercount 的值再加1,执行V(readercount_mutex),之后开始读文件。

可见多个读者可以同时读文件,并在读文件时阻塞写者。

---------------------------------------------------------------------------------------------------------------- 3.3.2、写者优先通过增加信号量并修改上述程序可以得到写者优先算法。

为了实现写者优先算法,需要将写者和读者分开排队,并且第一个读者和其它读者也要分开排队。

这样就需要三个队列,一个是写者排队的地方,另一个是第一个读者排队的地方,第三个是其它读者排队的地方。

相应地需要设置三个信号量,r_w_w、first_reader_wait和reader_wait。

当一个写者声明想写文件时,可以让新的读者中的第一个到first_reader_wait上排队等待;当有读者阻塞在first_reader_wait上时,让其它读者阻塞在reader_wait上;当有一个写者在写文件时,其它写者到r_w_w上排队。

只要有活跃的写者或者写者队列不为空,则阻塞新到达的读者。

为了记录已经发出声明的写者数量,需要设置一个整数writercount,以表示声明要写文件的写者数目。

由于只要有一个写者到达,就不允许读者去读,因此仅当writercount=0,表示无写者声明写时,写者才需要执行P(first_reader_wait)操作,若操作成功,写者便可以执行P(r_w_w)去竞争写文件权利。

其它写者不需要再向读者声明,可以直接执行P(r_w_w)去竞争写文件权利。

同理仅当写者在执行writercount减1操作后其值为0时,才需要执行V(first_reader_wait)操作,以便唤醒第一个被阻塞的读者去读文件。

又因为writercount是一个可被多个写者访问的临界资源,所以,应该为它设置一个互斥信号量writer_mutex。

通过上述分析得到图3-13的算法描述。

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

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

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

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

情形1 最先调度写者写者执行P(writercount_mutex),将writercount_mutex的值变为0,并判断writercount 是0,从而执行P(first_reader_wait),将first_reader_wait的值变为0,成功地向读者声明了写访问意图,接着将writercount变为1,执行V(writercount_mutex),将writercount_mutex 的值变为1。

相关文档
最新文档