当前位置: 首页 > 知识库问答 >
问题:

操作系统:第一个读写器同步问题解决方案中的混乱

年风华
2023-03-14

我正在研究《操作系统概念》(第9版)一书中的第一读者-作者问题的解决方案,它描述了:

第一个读者-作者问题,要求没有读者等待,除非作者已经获得使用共享对象的权限。换句话说,任何读者都不应该仅仅因为作者在等待而等待其他读者完成。

我由此理解的是,如果有任何读者在运行,而一个作家来了;那么那个作家将被阻止,直到读者完成。但是在第一个读者完成期间,如果有另一个读者(或多个读者),那么那个(那些)读者将优先于作者。

首先,如果我错了,请纠正我。但是如果我是对的,那么我所理解的是,Reader的代码不能保证这一点。

读写器代码如下:

//data structures
semaphore rw_mutex = 1;
semaphore mutex = 1;
int read_count = 0;

//Code for writer
do {
   wait(rw_mutex);
   . . .
   /* writing is performed */
   . . .
   signal(rw_mutex);
} while (true);

//Code for reader
do {
   wait(mutex);            //Line 01
   read_count++;

   if (read_count == 1)
      wait(rw_mutex);      //Line 02

   signal(mutex);
   . . .
   /* reading is performed */
   . . .

   wait(mutex);            //Line 03
   read_count--;

   if (read_count == 0)
      signal(rw_mutex);    //Line 04

   signal(mutex);
} while (true);

现在假设发生以下事件序列:

  • 假设第一个读者来了,它阻止了注释中提到的行02上的作者
  • 然后一个作家来了,正在等待rw_mutex
  • 然后第一个阅读器执行代码中注释中提到的Line 03代码行,并锁定了互斥锁信号量
  • 与此同时,第二个阅读器来了,它开始等待代码中注释中的第01行
  • 现在,当第一个读取器执行第04行时;它释放了对rw_mutex的锁,并且在其同时循环中等待的写入器现在被解锁并开始执行
  • 当第一个读取器执行Line 04之后的行时,第二个读取器将被解锁,该行发出信号互斥锁信号量

现在,如果我们看到整个流程,那么编写器在第二个读卡器之前运行。那么,代码逻辑的工作原理是否与上述相同?

如果我错了,请纠正我。


共有1个答案

金嘉
2023-03-14

是的,代码的工作原理与您所理解的相同。您可以在这里参考wiki页面,该页面具有您在讨论中包含的类似伪代码。

Reader-Thread1释放rw_互斥锁后,Writer线程将立即获得该互斥锁。但正如您在用例中所解释的,这不会有什么问题。

在第一个读写器问题中,如果进行了太多的读操作,写写器可能会饿死。

 类似资料:
  • 当我们基本完成程序的设计,我们就可以编写代码了,它是对我们的解决方案的实施。 版本一 例10.1 备份脚本——版本一 #!/usr/bin/python # Filename: backup_ver1.py importos importtime # 1. The files and directories to be backed up are specified in a list. sour

  • 更多面试题总结请看:【面试题】技术面试题汇总 基本概念 临界资源:一次仅允许一个进程使用的共享资源,也就是互斥资源 临界区:程序中访问临界资源的那段代码,也称危险区、敏感区 互斥:多个程序片段,同一时刻仅有一个能进入临界区 同步:若干程序片断运行必须严格按照规定的某种先后次序来运行。同步是一种更复杂的互斥:互斥不会限制程序对资源的访问顺序,即访问是无序的;而同步必须要按照某种次序来运行 临界区管理

  • 本文向大家介绍Rails应用程序中同时修改操作冲突问题的解决方案,包括了Rails应用程序中同时修改操作冲突问题的解决方案的使用技巧和注意事项,需要的朋友参考一下 Rails 应用程序中操作冲突是一个常见问题,Rails 提供了简单有效的解决方法。 举一个实际的例子:我们的系统里有一个商店模块,商店中重要的一块是对产品信息的管理,比如运营人员常常会编辑产品的信息,包括产品标题,营销口号和价格等等。

  • 从进程调度谈起 现代操作系统(如 Windows、Linux 等)都是分时系统。分时系统允许同时允许多个任务,但实际上,由于一台计算机通常只有一个 CPU,所以不可能真正地同时运行多个任务。这些进程实际上是轮番运行,每个进程运行一个时间片。由于时间片通常很短,用户不会感觉到,所以这些进程看起来就像是同时运行。 每个进程的时间片由操作系统完成初始化,所有进程轮番地执行相应的时间。具体下一个时间片轮到

  • 本文向大家介绍python线程中的同步问题及解决方法,包括了python线程中的同步问题及解决方法的使用技巧和注意事项,需要的朋友参考一下 多线程开发可能遇到的问题 假设两个线程t1和t2都要对num=0进行增1运算,t1和t2都各对num修改1000000次,num的最终的结果应该为2000000。但是由于是多线程访问,有可能出现下面情况: 运行结果可能不一样,但是结果往往不是2000000。问

  • 以下是对不熟悉此问题的人的问题声明: 给定一个二维板和一个单词,找出这个单词是否存在于网格中。这个词可以由顺序相邻单元格的字母构成,其中“相邻”单元格是那些水平或垂直相邻的单元格。同一个字母单元格不能使用不止一次。 解决方案2 现在,据我所知,随着Java的短路,的两个版本都应该停止探索其他路径,如果任何子问题返回true。事实上,我可以评估的两个版本之间唯一的操作差异是,如果找到解决方案,第一个