收藏 分享(赏)

操作系统课上作业.ppt

上传人:hwpkd79526 文档编号:10057096 上传时间:2019-10-02 格式:PPT 页数:10 大小:486.50KB
下载 相关 举报
操作系统课上作业.ppt_第1页
第1页 / 共10页
操作系统课上作业.ppt_第2页
第2页 / 共10页
操作系统课上作业.ppt_第3页
第3页 / 共10页
操作系统课上作业.ppt_第4页
第4页 / 共10页
操作系统课上作业.ppt_第5页
第5页 / 共10页
点击查看更多>>
资源描述

1、读者写者问题 线程机制和信号量实现读者写者(Reader-Writer)问题并发控制。,张国栋 董乐乐 马瑞 潘术森 陈世飞 熊志标,问题分析,读者写者问题 (1)保证一个writer进程必须与其他进程互斥地访问共享对象的同步问题。包括1、写者和写者2、读者和写者 (2)有一群写者和一群读者,写者在写同一本书,读者也在读这本书,多个读者可以同时读这本书,但是,只能有一个写者在写书。 (3)读者必写者优先,也就是说,读者和写者同时提出请求时,读者优先。当读者提出请求时需要有一个互斥操作,另外,需要有一个信号量S来当前是否可操作。,BOOK,读者,写者,基本要求: 读读允许;读写互斥;写写互斥(1

2、)任意多的读进程可以同时读这个文件; (2)一次只允许一个写进程往文件中写; (3)如果一个写进程正在往文件中写,禁止任何读进程或写进程访问文件; (4)写进程执行写操作前,应让已有的写者或读者全部退出。这说明当有读者在读文件时不允许写者写文件。,解决办法: (1)除了上述四个规则外,还增加读者优先的规定,当有读者在读文件时,对随后到达的读者和写者,要首先满足读者,阻塞写者。这说明只要有一个读者活跃,那么随后而来的读者都将被允许访问文件,从而导致写者长时间等待,甚至有可能出现写者被饿死的情况。如果读者来: 无读者、写者,新读者可以读 有写者等待,但有其他读者正在读,新读者可以读 有写者写,新读

3、者等 如果写者来: 无读者,新写者可以写 有读者,新写者等待 有其他写者,新写者等待,最多允许RN个读者同时读。为此,又引入了一个信号量L,并赋予初值为RN,通过执行wait(L,1,1)操作,来控制读者的数目,每当有一个读者进入时,就要执行wait(L,1,1)操作,使L的值减1。当有RN个读者进入读后,L便减为0,第RN+1 个读者要进入读时,必然会因wait(L,1,1)操作失败而堵塞。,如果没有写者正在操作,则读者不需要等待,用一个整型变量readcount记录当前的读者数目,用于确定是否释放写者线程,(当readcout=0 时,说明所有的读者都已经读完,释放一个写者线程),每个读者

4、开始读之前都要修改readcount,为了互斥的实现对readcount 的修改,需要一个互斥对象Mutex来实现互斥。另外,为了实现写-写互斥,需要一个临界区对象 write,当写者发出写的请求时,必须先得到临界区对象的所有权。通过这种方法,可以实现读写互斥,当readcount=1 时,(即第一个读者的到来时,),读者线程也必须申请临界区对象的所有权。当读者拥有临界区的所有权,写者都阻塞在临界区对象write上。当写者拥有临界区对象所有权时,第一个判断完readcount=1 后,其余的读者由于等待对readcount的判断,阻塞在Mutex上!,临界 资源,Reader,Writer,r

5、eadcount,Mutex,临界区write,当新的读者到来的时候,若当前正有读者在进行读操作,则该读者无需等待前面的写操作完成,直接进行读操作。 设置两个互斥信号量:rwmutex 用于写者与其他读者/写者互斥的访问共享数据 rmutex 用于读者互斥的访问读者计数器readcount var rwmutex, rmutex : semaphore := 1,1 ; int readcount = 0; cobegin readeri begin / i=1,2,.P(rmutex);Readcount+;If (readcount = 1) P(rwmutex);V(rmutex); 读

6、数据; P(rmutex);Readcount-;If (readcount = 0) V(rwmutex);V(rmutex);End Writerj begin / j = 1,2,. P(rwmutex);写更新;V(rwmutex); EndCoend,写者优先与读者优先相类似。不同之处在于一旦一个写者到来,它应该尽快对文件进行写操作,如果有一个写者在等待,则新到来的读者不允许进行读操作。为此应当填加一个整形变量Write_count,用于记录正在等待的写者的数目,当Write_count=0时,才可以释放等待的读者线程队列。为了对全局变量Write_count实现互斥,必须增加一个互

7、斥对象mutex。为了实现写者优先,应当填加一个临界区对象read,当有写者在写文件或等待时,读者必须阻塞在read上。 读者线程除了要对全局变量Read_count实现操作上的互斥外,还必须有一个互斥对象对阻塞read这一过程实现互斥。这两个互斥对象分别命名为mutex1,mutex2,写者优先: 1)多个读者可以同时进行读 2)写者必须互斥(只允许一个写者写,也不能读者写者同时进行) 3)写者优先于读者(一旦有写者,则后续读者必须等待,唤醒时优先考虑写者) 设置三个互斥信号量: rwmutex 用于写者与其他读者/写者互斥的访问共享数据 rmutex 用于读者互斥的访问读者计数器readc

8、ount nrmutex 用于写者等待已进入读者退出,所有读者退出前互斥写操作 var rwmutex, rmutex,nrmutex : semaphore := 1,1,1 ; int readcount = 0; cobegin reader begin / i=1,2,. P(rwmutex);P(rmutex); Readcount+;If (readcount = 1) P(nrmutex); /有读者进入,互斥写操作V(rmutex); V(rwmutex); / 及时释放读写互斥信号量,允许其它读、写进程申请资源读数据;,P(rmutex); Readcount- -; If (readcount = 0) V(nrmutex); /所有读者退出,允许写更新V(rmutex);End cowriter writer begin / i=1,2,.P(nrmutex);write-count+;V(nrmutex); 更新数据; P(nrmutex);write-count-;If (write-count = 0) V(rmutex);V(nrmutex);End,谢谢观赏,Make Presentation much more fun,WPS官方微博kingsoftwps,

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

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报