吸烟者问题

image.png
这里不需要专门设置一个单独的互斥信号量实现对临界区的互斥访问。因为同一时刻至多有一个进程会从临界区获取资源,临界区的容量是1。
上面是轮流让吸烟者吸烟。随机让一个吸烟者吸烟,可以用random。

读者-写者问题

image.png
读者写者是两组并发进程,共享一个文件。当两个及以上进程读数据时不会产生问题,当若某个写进程和其他进程同时访问时就有可能会导致数据不一致的错误。
因此要满足以下的要求:

  • 允许多个读者可以同时对文件执行读操作。
  • 只允许一个写者往文件中写信息。
  • 任一写者都在完成写操作之前不允许任何读者写者工作。
  • 写者执行写操作前,应该让已有的读者和写者退出。

如何用PV操作实现:
image.png
问题:上面的实现方式,当有源源不断的读进程进来,会导致写进程一直等不到rw锁,导致饥饿现象。

解决饥饿问题:
image.png
新加一个互斥信号量实现:(划重点)
读者->写者->读者:利用新加的信号量对rw实现进程互斥,这样当写者要写操作的时候也会同其他的读进程一样进入w的阻塞队列,等待正在读的进程释放w资源并唤醒。当写进程被唤醒等待w,由于w只有一个,那么其他的读写进程只能依次进入w的阻塞队列,等待写进程操作完成。
写者->读者->写者:同理