操作系统(四)

3.读者-写者问题
(1)问题描述
在这里插入图片描述
(2)问题分析

这个问题的改进方法意思是说,写进程,是用pv操作去互斥其他写操作的,就如比开始写的时候就直接上锁,写完就解锁,而读进程不用pv操作去限制,而是用count,对count上锁,防止对count两个进程同时访问,让第一个进程来上锁,先判断一下读进程的时候是否上锁,如果是第一个就上锁,如果是第二个那么count ==2了,所以不用你上锁了,你直接来读把,就用if跳过p操作,就不会被卡住了,而其中一个进程读完之后count–,当最后一个读进程完事的时候count=0,则此时判定这是最后一个操作,就会进行V操作,释放锁。所以这个pv操作只会限制读和写操作和写和写操作,准确的来说是会限制写和第一次读。但是这里面有个问题就是会导致饥饿,因为如果一开始就读,并且一直读,那么所有写操作都会被卡在那

3)实现方法
① 给count加mutex互斥访问
这里说一下为什么要加mutex。
比如:当count=0时,第一个读者进程执行到p(rw),rw=0,假设此时时间片到了,切换到第二个读者进程,第二个进程发现count=0,则执行p(rw),但是此时rw=0,于是第二个进程被堵在p(rw)这里,同理,后面的可能会有多个进程堵在p(rw),只有当第一个进程再次获得时间片,执行count++,让count不为0,然后其他进程就可以直接绕过if直接进行count++来访问文件,但是第三个读者进程和后面的几个可能堵在p(rw)的多个读者进程则必须得等count–为0后才可以再次和写进程竞争来访问文件,对count的访问没有做到一气呵成,会导致本来一些进程一直堵在p(rw)。

② 加一个w实现“读写公平法”
在上面的算法中,读进程是优先的,即当存在读进程时,写操作将被延迟,且只要有 一个读进程活跃,随后而来的读进程都将被允许访问文件。这样的方式会导致写进程可能长时间等待,且存在写进程“饿死”的情况。
若希望写进程优先,即当有读进程正在读共享文件时,有写进程请求访问,这时应禁止后续读进程的请求,等到已在共享文件的读进程执行完毕,立即让写进程执行,只有在无写进程执行的情况下才允许读进程再次运行。为此,增加一个信号量并在上面程序的writer()和 reader()函数中各增加一对PV操作,就可以得到写进程优先的解决程序。

在这里插入图片描述

解决的办法就是:
如下图 设定一个新的互斥访问变量w,
然后当读和读并发的时候,p(w)加锁,然后第一次读,并对count加锁,然后count++后,释放count的锁以及v(w)锁,并读取文件,下一次读文件重复上面所说的,写和写也几乎没有区别,主要是读和写,当读的时候,p(w)加锁,然后第一次读,并对count加锁,然后count++后,释放count的锁以及v(w)锁,并读取文件,在读文件之前,开始写,则p(w)检查并加锁,然而p(rw),在没有读取完文件之前,没有解锁,所以仍然要等待,读完之后,再想文件会因为写操作进行了p(w),读操作被卡在p(w),而写操作可以执行了。这就防止一直读而导致写操作一直无法执行的饥饿现象

(4)知识回顾与重要考点

5.哲学家进餐问题
(1)问题描述
在这里插入图片描述
(2)问题分析

(3)如何实现

在这里插入图片描述

  • 怎么可能不死锁,问题待解决

(4)知识回顾与重要考点

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值