考虑一下我们有很多人共享文件的情况。
null
- 如果其中一个人试图编辑文件,其他人不应同时阅读或写作,否则他/她将看不到更改。
- 但是,如果有人正在阅读文件,那么其他人可能会同时阅读。
正是在操作系统中,我们称这种情况为 读者作家问题
问题参数:
- 一组数据在多个进程之间共享
- 作家一旦准备好了,就开始写作。一次只能写一位作家
- 如果一个进程正在写入,其他进程都无法读取它
- 如果至少有一个读卡器正在读取,则其他进程无法写入
- 读者不可写作,只可阅读
读者优先于作者时的解决方案
这里的优先级意味着,如果共享当前已打开以供阅读,则任何读者都不应等待。
使用了三个变量: 互斥,wrt,readcnt 实施解决方案
- 信号灯 互斥,wrt;//信号灯 互斥 用于确保在以下情况下相互排斥: 阅读 更新,即当任何读卡器进入或退出关键部分和信号灯时 wrt 读者和作者都使用
- 智力 readcnt; // 阅读 告诉在关键部分执行读取的进程数,最初为0
信号量的函数:
–wait():减少信号量值。
–signal():增加信号量值。
编写程序:
- 作者要求进入关键部分。
- 如果允许,即wait()给出一个真值,它将输入并执行写操作。如果不允许,它将继续等待。
- 它退出了临界区。
do { // writer requests for critical section wait(wrt); // performs the write // leaves the critical section signal(wrt);} while(true);
读者流程:
- 读者要求进入关键部分。
- 如果允许:
- 它增加了临界区内的读卡器数量。如果此读卡器是第一个进入的读卡器,它会锁定 wrt 如果有读卡器在里面,限制写卡器进入的信号灯。
- 然后,当其他读者已经在阅读时,它发出信号,允许其他读者进入互斥。
- 执行读取后,它退出临界区。当退出时,它检查是否没有更多的读卡器在里面,它发出信号“wrt”,就像现在一样,写卡器可以进入关键部分。
- 如果不允许,它将继续等待。
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