Linux多进程读者和写者问题,操作系统之读者与写者问题

e1852e9e15e3

一个数据文件或记录可被多个进程共享。

只要求读文件的进程称为“Reader进程”,其它进程则称为“Writer进程”。

允许多个进程同时读一个共享对象,但不允许一个Writer进程和其他Reader进程或Writer进程同时访问共享对象

“读者--写者问题”是保证一个Writer进程必须与其他进程互斥地访问共享对象的同步问题。

读、读共享; 写、写互斥; 写、读互斥

1.利用记录型信号量解决读者--写者问题

互斥信号量wmutex: 实现Reader与Writer进程间在读或写时的互斥,整型变量Readcount: 表示正在读的进程数目;

由于只要有一个Reader进程在读,便不允许Writer进程写。所以,仅当Readcount=0,即无Reader进程在读时,Reader才需要执行Wait(wmutex)操作。若Wait(wmutex)操作成功,Reader进程便可去读,相应地,做Readcount+1操作。

同理,仅当Reader进程在执行了Readcount减1操作后其值为0时,才需执行signal(wmutex)操作,以便让Write进程写

互斥信号量rmutex: Reader进程间互斥访问Readcount

总结:

wmutex:是读写的互斥信号量

rmutex: 是读进程互斥访问Readcount的信号量

Wmutex: 读、写互斥;写、写互斥 Rmutex: 读间访问Readcount互斥 Readcount: 记录读者进程数

Var wmutex, rmutex :semaphore :=1, 1;

Readcount :integer :=0;

begin

parbegin

Reader : begin

repeat

wait(rmutex);

if Readcount=0 then wait(wmutex);

Readcount :=Readcount +1;

signal(rmutex);

读;

wait(rmutex);

Readcount :=Readcount -1;

if Readcount=0 then signal(wmutex);

signal(rmutex);

until false;

end

parend

end

Writer : begin

repeat

wait(wmutex);

写;

signal(wmutex);

until false;

end

评价:能实现读者—写者问题 但读优先,对写者不公平

2 :利用信号量集解决读者--写者问题

e1852e9e15e3

增加一个限制:最多只允许RN个读者同时读

引入信号量L,并赋予其初值RN,通过执行Swait(L, 1, 1)操作,来控制读者的数目。

解释:

每当有一个读者进入时,就要先执行Swait(L, 1, 1)操作,使L的值减1。当有RN个读者进入读后,L便减为0,第RN +1个读者要进入读时,必然会因Swait(L, 1, 1)操作失败而阻塞。

一般信号量集的几种特殊情况:

Swait(S, d, d),只有一个信号量S,允许每次申请d个资源,若现有资源数少于d,不予分配。

Swait(S, 1, 1),蜕化为一般的记录型信号量(S>1时)或互斥信号量(S=1时)。

Swait(S, 1, 0),当S>=1时,允许多个进程进入某特定区,当S变为0后,阻止任何进程进入特定区,相当于可控开关。

//L: 控制读进程的数目≤RN

//Mx: 实现读、写互斥;写、写互斥

Var RN integer;

L, mx: semaphore :=RN, 1;

begin

parbegin

reader : begin

repeat

Swait(L, 1, 1); //控制Rn个读进程可以读,前Rn个读者都可以进去

Swait(mx, 1, 0);// 打开,读者都可以进来读

读;

Ssignal(L, 1);

until false;

end

parend

end

writer : begin

repeat

Swait(mx, 1, 1; L, RN, 0);// 将读进程关闭,且没有读进程,写进程才能写操作

写;

Ssignal(mx, 1); // 读进程都可以读了

until false;

end

解释:

Swait(mx, 1, 1; L, RN, 0)语句表示仅当既无writer进程在写(mx=1),又无reader进程在读(L=RN),writer进程才能进入临界区写。

Swait(mx, 1, 0)语句起着开关的作用。只要无writer进程进入写,mx=1,reader进程就都可以进入读。但只要一旦有writer进程进入写时,mx=0,则任何reader进程就都无法进入读。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值