美文网首页
操作系统之读者与写者问题

操作系统之读者与写者问题

作者: Weastsea | 来源:发表于2018-06-03 12:54 被阅读0次

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

  • 只要求读文件的进程称为“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 :利用信号量集解决读者--写者问题


增加一个限制:最多只允许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进程就都无法进入读。

相关文章

  • 操作系统之读者与写者问题

    一个数据文件或记录可被多个进程共享。 只要求读文件的进程称为“Reader进程”,其它进程则称为“Writer进程...

  • 二.进程(5)信号量习题

    1. 读者与写者(写者优先方式) 2. 黑白棋问题 3. 嗜睡的理发师问题 4. 生产与销售问题 读者与写者问题 ...

  • 冷月手撕408之操作系统(10)-经典同步互斥问题

    操作系统的经典同步互斥问题主要是介绍了 几个经典的同步互斥问题,其中搞懂生产者消费者问题、读者写者问题;其他的问题...

  • 读者写者问题

    读者写者问题的小总结。。。实际上就是抄书写者优先的情况 读进程优先的情况 二者公平竞争的情况

  • 读者-写者问题

    问题描述 使用信号量进行解决 优先策略选择 读者优先 上述方案为读者优先。因为当读者进行读取的时候,如果后面一直有...

  • 读者写者问题

    读者写者问题是IPC问题的一种典型的代表。 我写了一个实现,这是一个写者优先的实现。一个写者,多个读者的模型。 读...

  • 多线程并发之生产者消费者问题与读者写者问题

    多线程并发之生产者消费者问题与读者写者问题 引言 在程序界,有句流行语:我有一个问题,使用线程后,现在有了两个问题...

  • 第2章 2-5信号量习题

    1.读者与写者问题(写者优先方式) 读者优先的关键: 若读者先占有互斥信号量,只有最后一个读者离开,计数降为0时...

  • 读写锁CSpinRwLock

    写者模型与生产者消费者模型大致一样,也满足3,2,1规则。 3种关系:读者与读者(没有关系),写者与写者(竞争关系...

  • 操作系统

    同步互斥 生产者与消费者(既有同步又有互斥) 读者-写者问题(同步) 哲学家进餐问题(同步) 信号量 初始值和当前...

网友评论

      本文标题:操作系统之读者与写者问题

      本文链接:https://www.haomeiwen.com/subject/qsrjsftx.html