📜  读者-作者问题| Set 1(介绍和读者偏好解决方案)

📅  最后修改于: 2022-05-13 01:56:11.796000             🧑  作者: Mango

读者-作者问题| Set 1(介绍和读者偏好解决方案)

考虑一种情况,我们有一个文件在多人之间共享。

  • 如果其中一个人尝试编辑文件,则其他人不应同时阅读或写入,否则他/她将看不到更改。
  • 但是,如果有人正在阅读该文件,则其他人可能会同时阅读该文件。

确切地说,在操作系统中,我们将这种情况称为读写器问题

问题参数:

  • 一组数据在多个进程之间共享
  • 一旦编写器准备好,它就会执行它的写操作。一次只能写一位作家
  • 如果一个进程正在写入,则没有其他进程可以读取它
  • 如果至少有一个读者正在阅读,则没有其他进程可以写
  • 读者不能写,只能读

Reader 优先于 Writer 时的解决方案

这里的优先级意味着,如果共享当前已打开以供阅读,则没有读者应该等待。



使用三个变量: mutex、wrt、readcnt来实现解

  1. 信号量互斥锁,wrt; // 信号量互斥用于确保在readcnt更新时互斥,即当任何读取器进入或退出临界区时,读取器和写入器都使用信号量 wrt
  2. int readcnt; // readcnt告诉在临界区执行读取的进程数,初始为 0

信号量的功能:

– wait() :递减信号量值。

– signal() :增加信号量值。

写手流程:

  1. Writer 请求进入临界区。
  2. 如果允许,即 wait() 给出一个真值,它进入并执行写入。如果不允许,它将继续等待。
  3. 它退出临界区。
do {
    // writer requests for critical section
    wait(wrt);  
   
    // performs the write

    // leaves the critical section
    signal(wrt);

} while(true);

读者流程:

  1. Reader 请求进入临界区。
  2. 如果允许的话:
    • 它增加了关键部分内的读者数量。如果这个读者是第一个进入的读者,它会锁定wrt信号量以限制作者的进入,如果有读者在里面的话。
    • 然后,当其他人已经在阅读时,它会发出互斥信号,因为任何其他阅读器都可以进入。
    • 执行读取后,退出临界区。退出时,它检查是否没有更多的读者在里面,它发出信号量“wrt”,因为现在,作者可以进入临界区。
  3. 如果不允许,它将继续等待。
do {
    
   // Reader wants to enter the critical section
   wait(mutex);

   // The number of readers has now increased by 1
   readcnt++;                          

   // there is atleast one reader in the critical section
   // this ensure no writer can enter if there is even one reader
   // thus we give preference to readers here
   if (readcnt==1)     
      wait(wrt);                    

   // other readers can enter while this current reader is inside 
   // the critical section
   signal(mutex);                   

   // current reader performs reading here
   wait(mutex);   // a reader wants to leave

   readcnt--;

   // that is, no reader is left in the critical section,
   if (readcnt == 0) 
       signal(wrt);         // writers can enter

   signal(mutex); // reader leaves

} while(true);

因此,信号量' wrt '以这样一种方式在读取器和写入器上排队,如果写入器也在那里,则优先给读取器。因此,没有读者仅仅因为作者请求进入临界区而等待。