【高效复习】操作系统——PV重难点

本文详细阐述了操作系统中的PV操作,包括P(S)和V(S)原语的动作,并探讨了读者-写者问题、哲学家用餐问题、理发师问题等经典同步问题。此外,还列举了多个涉及PV操作的复杂场景,适合计算机期末和考研复习。
摘要由CSDN通过智能技术生成

选自《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…;
  • 8
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值