信号量实现前驱
p代表首,v代表下一个
临界区之前执行p操作,临界区之后执行v操作
前V后P: 前面事件发生之后执行V操作,后面事件发生之前执行P操作
进程互斥
p进入临界区加锁,退出临界区解锁
进程同步:
异步执行,执行顺序不一定
为了保证同步: 在v操作之前执行A,在p操作之后执行B 即:A->B
生产者消费者模式
先执行同步信号量,再执行互斥信号量
如果先执行互斥信号量
当生产者mutex=0时,代表生产者没有空闲缓冲区,生产者被阻塞,
切换到消费者,消费者metex=0,生产者还没有释放锁,因此消费者也被阻塞
生产者被堵住了还(占着临界资源),导致消费者一起被堵塞了\
=>生产者等待消费者消费掉缓冲区
消费者等待生产者释放临界区\
因此实现互斥的P操作需要在实现同步的P操作之后
实现互斥在同一个进程进行 p(mutex) 对同一变量的PV需要在不同进程中进行 v(full)
多生产者消费者问题
父亲放入苹果 母亲放入橘子 儿子只取出苹果 女儿只取出橘子
读者写者问题
多读者读,单写者写,否则第一次写会被第二次覆盖 写优先,w=1 实现对共享文件的互斥访问: rw=1 多读者读: 计数 count=0 count++ 读者读了就加 读写不同时:互斥p(mutex) 信号量mutex=1
解决读者一直读,写者饥饿问题:
(1)开始读者进程上处理机运行,开始读文件,读者进程在读取文件之前先对w的互斥信号量先执行p再执行v,所以这个进程在读文件的时候w的值=1,
(2)此时如果切换到写者进程w=1,所以写者进程在写的P(w)操作不会被阻塞,对P(rw)操作 但此时P(rw)对读者进程已经执行P(rw)操作,p(rw)=0,所以写进程会被阻塞在rw互斥信号量 因为此时w已经对写者进行p操作,所以此时w的互斥信号量的值变为0,
(3)此时如果读者2上处理机运行,此时对w执行p操作时,由于此时w为0,所以读者进程会被阻塞在p(w)
w阻止源源不断的读者,w初始为0 可读写,写者运行时由0变1,其他不可读写
(4)读者发现自己是最后一个读者,将rw执行v操作,此时唤醒被阻塞在rw的写进程 p(rw), 读者2被阻塞在p(w) (5)读文件过程中,写者在读者之前到来,写者先被唤醒,写者写完文件并且对w信号量执行v操作之后,才会把读者2唤醒(读者2阻塞在p(w))