选自《PV经典》与《天勤》适合计算机期末与考研考试
以下为PV重难点
P(S)原语操作动作:
(1)S减少1;
(2)若S减少1后仍大于或等于零,则进程继续执行。
(3)若S减1后小于零,则该进程被阻塞后进入与该信号相对应队列中,然后转进程调度。
V(S)原语操作动作:
(1)S增加1;
(2)若S增加1后仍大于零,则进程继续执行。
(3)若S增加1后小于零等于零,则该进程信号等待队列中唤醒一个等待进程,然后转进程调度或返回原进程继续执行。
读者-写者问题:
(1)读者优先 (多个读者,一个写者)
定义读者优先:读者要进行读操作时,如果此时正有其他读者在进行操作他可直接开始读操作,而不需等待。
定义一个信号量Readcount:表明读者存在,写者不可进入
Semaphore rmutex=1;
Semaphore mutex=1;
int readcount=0;
reader()
{
While(true)
{
P(rmutex);
If(readcount== 0) p(mutex);
Readcount++;
V(rmutex);
进行读操作;
P(rmutex);
Readcount--;
If(readcount==0)
V(mutex);
V(rmutex);
}
}
Writer()
{
While(true)
{
p(mutex);
写操作;
V(mutex);
}
}
(2)公平情况
引入wmutex:是否有写者在写或等待,后续读者不可进入。
Semaphore mutex=1;
Semaphore rmutex=1,wmutex=1;
int readcount=0;
reader()
{
While(true)
{
P(wmutex); //检测是否有写者进入
P(rmutex);
If(readcount== 0) p(mutex);
Readcount++;
V(rmutex);
V(wmutex);
读操作;
P(rmutex);
Readcount--;
If(readcount==0)
V(mutex);
V(rmutex);
}
}
Writer()
{
While(true)
{
P(wmutex); //检测是否有其他写者,有则等待
P(mutex);
Writing….;
V(mutex);
V(wmutex);
}
}
(3)写者优先
Readable:写者到达时,写者优先进入临界区
Semaphore mutex=1;
Semaphore rmutex=1,wmutex=1;
Semaphore readable=1;
int readcount=0,writercount=0;
reader()
{
P(readable);
P(rmutex);
If(readcount== 0) p(mutex);
Readcount++;
V(rmutex);
V(readable);
Reading…;
P(rmutex);
Readcount--;
If(readcount== 0) v(mutex);
V(rmutex);
}
Writer()
{
While(true)
{
P(wmutex);
If(writecount== 0) p(readable);
Writecount++;
V(wmutex);
P(mutex);
Writing…;
V