读者-作者问题| Set 1(介绍和读者偏好解决方案)
考虑一种情况,我们有一个文件在多人之间共享。
- 如果其中一个人尝试编辑文件,则其他人不应同时阅读或写入,否则他/她将看不到更改。
- 但是,如果有人正在阅读该文件,则其他人可能会同时阅读该文件。
确切地说,在操作系统中,我们将这种情况称为读写器问题
问题参数:
- 一组数据在多个进程之间共享
- 一旦编写器准备好,它就会执行它的写操作。一次只能写一位作家
- 如果一个进程正在写入,则没有其他进程可以读取它
- 如果至少有一个读者正在阅读,则没有其他进程可以写
- 读者不能写,只能读
Reader 优先于 Writer 时的解决方案
这里的优先级意味着,如果共享当前已打开以供阅读,则没有读者应该等待。
使用三个变量: mutex、wrt、readcnt来实现解
- 信号量互斥锁,wrt; // 信号量互斥用于确保在readcnt更新时互斥,即当任何读取器进入或退出临界区时,读取器和写入器都使用信号量 wrt
- int readcnt; // readcnt告诉在临界区执行读取的进程数,初始为 0
信号量的功能:
– wait() :递减信号量值。
– signal() :增加信号量值。
写手流程:
- Writer 请求进入临界区。
- 如果允许,即 wait() 给出一个真值,它进入并执行写入。如果不允许,它将继续等待。
- 它退出临界区。
do {
// writer requests for critical section
wait(wrt);
// performs the write
// leaves the critical section
signal(wrt);
} while(true);
读者流程:
- Reader 请求进入临界区。
- 如果允许的话:
- 它增加了关键部分内的读者数量。如果这个读者是第一个进入的读者,它会锁定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 '以这样一种方式在读取器和写入器上排队,如果写入器也在那里,则优先给读取器。因此,没有读者仅仅因为作者请求进入临界区而等待。