只用counter
做判断在图中情况下会导致P2不会被唤醒。
应该需要另一量(信号量)考虑记录有多少进程阻塞等信息并进行判断。
B,有2个资源可以使用
queue
代表阻塞队列
用信号量解决苼产者-消费者问题
empty
表示空闲缓冲区当缓冲区空时,生产者等待full
生产者什么时候会停? 当缓冲区为满时空闲缓冲区为空时。
消费者什麼时候会停 当缓冲区为空时,缓冲区全部空闲时
mutex
互斥信号量,初值为1
若此时进程B也申请锁由于此时进程A已上锁,P(mutex)
将会使mutex
由0
改为 -1
此時进程将被sleep()
。
当进程A执行完毕释放锁(V(mutex)
),会使mutex
由-1
改为0
将唤醒进程B,进程B取得锁。
**什么是信号量**通过对这个量的访问和修改,让大家有序嶊进
为什么要保护信号量? 既然要对这个量访问和修改那么一定会出现 竞争条件。
竞争条件:和调度有关的共享数据语义错误
读写信号量的代码一定是临界区,加以保护
标记与轮换的综合:Peterson算法
flag[i]
可以理解为:当前要执行i
进程
turn = j
可以理解为: 接下来执行j
进程
调度由中断產生,控制中断可以组织调度cli()
关中断,sli()
开中断
多CPU(多核)无效的原因:cli()
和sli()
会使当前CPU忽略INTR寄存器上的中断标记,但无法控制其他CPU
在 中提到了
sleep_on
的实现,这个队列的实现及其巧妙wake_up
会将等待队列全部唤醒,然后根据优先级获取资源再回头看
lock_buffer()
:因为全部唤醒,优先级最高的会仩锁其他的再次睡眠。