进程管理二(操作系统笔记三)
进程同步、进程互斥
进程互斥的软件实现方法
互斥进程的硬件实现方法
信号量
信号量 机制是一种较强的机制,可用来解决互斥与同步问题,它只能被两个标准的原语 wait(S) 和 signal(S) 访问,也可以记为 “ P操作 ” 和 “ V操作 ” 。
注意: 若考试中出现P(S)、V(S)的操作,除非特殊说明,否则默认S为记录型信号量
信号量(semaphore)实现互斥(mutex)、同步、前驱关系
P、V操作 必须成对出现,缺少了 P 操作就不能保证资源的互斥访问,缺少 V 操作会导致资源不被释放,等待进程用不被唤醒。
经典同步问题
生产者-消费者问题
一组生产者进程和一组消费者进程共享一个初始为空、大小为n的缓冲区,只有缓冲区没满时,生产者才能把消息放入缓冲区,否则必须等待;只有缓冲区不空时,消费者才能从中取出消息,否则必须等待。由于缓冲区是临界资源,它只允许一个生产者放入消息,或一个消费者从中取出消息。
注意 :实现互斥的 P 操作要放在实现同步的 P 操作之后,避免死锁问题。当缓冲区大小为1时, 可能 不需要互斥信号量。
读者-写者问题
有读者和写者两组并发进程,共享一个文件,当两个或以上的读进程同时访问共享数据时不会产生副作用,但若某个写进程和其它进程(读进程或写进程)同时访问共享数据时则可能导致数据不一致错误。因此要求:1.允许多个读者可以同时对文件执行读操作;2.只允许一个写者往文件中写信息;3.任一写者在完成写操作之前不允许其他读者或写者工作;4.写者执行写操作之前,应让已有的读者和写者全部退出。
使用 计数器 来实现多个读进程的同时访问,通过一个 信号量 来实现计数器的互斥访问,解决计数器查询和更改不能 “一气呵成” 的问题,增加 信号量 解决写进程可能发生饥饿的问题。
哲学家进餐问题
一张圆桌边上坐着5名哲学家,每两名哲学家之间的桌上摆一根筷子,两根筷子中间是一碗米饭,差不多如上图。哲学家们倾注毕生精力用于思考和进餐,哲学家在思考时,并不影响他人。只有当哲学家饥饿时,才试图拿起左、右两根筷子(一根一根的拿起)。若筷子已在他人手上,则需要等待。饥饿的哲学家只有同时拿到了两根筷子才可以开始进餐,进餐完毕后放下筷子继续思考。
吸烟者问题
假设一个系统中有三个抽烟者进程和一个供应者进程。每个抽烟者不停地卷烟并抽掉它,但要卷起并抽掉一支烟,抽烟者需要三种材料:烟草、纸和胶水。三个抽烟者中,第一个拥有烟草,第二个拥有纸,第三个拥有胶水。供应者进程无限的提供三种材料,供应者每次将两种材料放到桌子上,拥有剩下那种材料的抽烟者卷一根烟并抽掉它,并给供应者一个信号告诉已完成,此时供应者就会将另外两种材料放到桌子上,如此重复(让三个抽烟者轮流抽烟)
管程
死锁的概念及处理策略
死锁预防
死锁避免
安全序列 就是指如果系统按照这种序列分配资源,则每个进程都能顺利完成。只要能找到安全序列,系统就是 安全状态 ,当然,安全序列可能有多个 。
如果系统处于 安全状态 ,就 一定不会 发生 死锁 。如果系统进入 不安全状态 ,可能 会发生 死锁 (如果有资源提前归还,则可避免死锁)。因此可以在 资源分配之前预先判断这次分配是否会导致系统进入不安全状态 ,以此决定是否答应资源分配请求。这也是 “银行家算法” 的核心思想。