课堂笔记学习视频来自 操作系统
说明:其他”课堂问答笔记“也在”操作系统“专栏
【2-4、2-5】
- 初始的读写者问题涉及几个信号量,为什么?
就是第一版的读写者问题,这些信号量都是什么含义?
第一版方案有可能会导致写者长期得不到写的机会。
公平型的读写者问题取消了读者优先。
公平型的改进:有写者等,则后来的读者要等(排队等待写者之后);无写者等(当然也无写者写,这个第一版已经实现),则后来的读者可读。 - 程序实现时在最前面增加一个整体的排队队列,即增加一个信号量s(初始值为1),那么如何理解s值的含义?
任何一个人进来,不管读或写,都要wait(s)。
s== 1可通过队列,即不用等待;s== 0表示有人正在通过这个队列。s只有这两个取值。
任何一个人通过队列后,都要signal(s)实现s+1。 - 写者优先的读写者问题中,信号量s,mutex,rmutex,wmutex的含义?
s,rmutex,wmutex前面已经说过,现在只需要理解mutex。
结合后面的程序,mutex表示排队等待修改写者人数的信号量。类似于rmutex,rmutex表示排队等待修改读者人数的信号量。
只有第一个写者才进入s队列,若当前写者人数>=1,后面的写者不必再到s中排队;当然如果当前当前写者人数==0,那么目前的第一个写者要进入s队列。
s,mutex,rmutex,wmutex这四个信号量都只有1,0这两个取值 - 如何理解Swait(m,a,b)的含义,为什么说Swait(m,1,0)是一个开关语句?Swait(m,a,b)在读写者问题中的用途?
Swait(m,1,0)是一个开关语句,不是Swait(m,a,0)。
Swait(m,a,b)的含义是每次执行Swait操作,m的值(要有初始值)减b,当m>=a时不必等待,否则等待。
Swait(m,1,0)表示执行Swait操作,m的值(要有初始值)减0(即不发生变化),当m>=1时不必等待,否则等待;这句话的意思也就是当执行Swait(m,1,0)时,如果m>=1不必等待,否则等待;因此是开关语句,就像前面所说的wait(mutex)操作,当然mutex初始值为1。
在读写者问题中,读者进程通过执行Swait(rMax,1,1; wmutex,1,0)确保无写者写可读,写者进程通过执行Swait(wmutex,1,1; rMax,RN,0)确保无写者在写以及无读者在读的情况下可写。其中wmutex的初始值为1,表示等待读写操作的信号量;rMax的初始值为RN,表示最多允许的读者数量。
Swait(rMax,1,1; wmutex,1,0);等价于Swait(rMax,1,1); Swait(wmutex,1,0);
若rMax目前的值等于RN,则表示无读者。
只要有读者就会把rMax-1,一个读者读完rMax+1 - 为什么引入管程?
信号量机制的缺点:进程自备同步操作,P(wait)和V(singal)操作大量分散在各个进程中,不易管理,易发生死锁。
引入管程机制的目的:
1、把分散在各进程中的临界区集中起来进行管理;
2、防止进程有意或无意的违法同步操作;
3、便于用高级语言来书写程序,也便于程序正确性验证。