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

2018-06-03  本文已影响0人  Weastsea

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

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

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

总结:
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)操作失败而阻塞。

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

//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

解释:

上一篇 下一篇

猜你喜欢

热点阅读