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

考虑一下我们有很多人共享文件的情况。

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

正是在操作系统中,我们称这种情况为 读者作家问题

问题参数:

  • 一组数据在多个进程之间共享
  • 作家一旦准备好了,就开始写作。一次只能写一位作家
  • 如果一个进程正在写入,其他进程都无法读取它
  • 如果至少有一个读卡器正在读取,则其他进程无法写入
  • 读者不可写作,只可阅读

读者优先于作者时的解决方案

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

使用了三个变量: 互斥,wrt,readcnt 实施解决方案

  1. 信号灯 互斥,wrt;//信号灯 互斥 用于确保在以下情况下相互排斥: 阅读 更新,即当任何读卡器进入或退出关键部分和信号灯时 wrt 读者和作者都使用
  2. 智力 readcnt; // 阅读 告诉在关键部分执行读取的进程数,最初为0

信号量的函数:

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

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

编写程序:

  1. 作者要求进入关键部分。
  2. 如果允许,即wait()给出一个真值,它将输入并执行写操作。如果不允许,它将继续等待。
  3. 它退出了临界区。
do {    // writer requests for critical section    wait(wrt);         // performs the write    // leaves the critical section    signal(wrt);} while(true);

读者流程:

  1. 读者要求进入关键部分。
  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 “在读者和作者身上排队的方式是,如果作者也在场,读者会优先选择。因此,没有读者仅仅因为作者要求进入关键部分而等待。

文章作者 埃克塔·戈尔 。如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请发表评论

© 版权声明
THE END
喜欢就支持一下吧
点赞15 分享