操作系统 day17(读者-写者问题、哲学家进餐问题、管程)

读者-写者问题

  1. 分析
    操作系统 day17(读者-写者问题、哲学家进餐问题、管程)_第1张图片
  2. 读者优先的代码实现
    操作系统 day17(读者-写者问题、哲学家进餐问题、管程)_第2张图片
  • 若不对count采用互斥操作,那么会导致读者进程之间存在:某个读者进程阻塞在P(rw)中,且它需要等到最后一个读者进程解锁V(rw)才能被唤醒,这很影响系统效率,如果我们对count进行互斥操作,那么读者进程只会阻塞在第一步的P(mutex),并且在下一个V(mutex)时就会被唤醒。

3.读写公平的代码实现
操作系统 day17(读者-写者问题、哲学家进餐问题、管程)_第3张图片

  • 在这种算法中,连续写入的多个读进程可以连续访问,且不会让写进程饥饿
  1. 核心
  • 设置计数器count,来记录当前访问共享文件的读进程数,并根据count的值来判断当前的读进程是否是第一个/最后一个,再做相应处理。
  • 对count变量的检查和赋值不能一气呵成,所以采用互斥信号量。
  • 复杂的互斥问题,使用读者-写者算法。同步问题,使用生产者-消费者算法

哲学家进餐问题

  1. 分析
  • 会产生死锁的代码
  • 防止死锁的想法
    操作系统 day17(读者-写者问题、哲学家进餐问题、管程)_第4张图片
    操作系统 day17(读者-写者问题、哲学家进餐问题、管程)_第5张图片
  1. 第三种方法的代码实现
  • 由于哲学家进程需要同时持有两个临界资源,就有了“死锁”问题的隐患。
  • 因此,如果遇到了一个进程需要同时持有多个临界资源,就应该参考哲学家问题,分析是否会发生死锁。

管程

操作系统 day17(读者-写者问题、哲学家进餐问题、管程)_第6张图片

  1. 基本特征
  • 各外部进程/线程只能通过管程提供的特定“入口”才能访问共享数据
  • 每次仅允许一个进程在管程内执行某个内部过程

你可能感兴趣的:(操作系统,操作系统)