操作系统:读者优先、公平竞争、写者优先(P&V操作实现)

读者优先

解释:读者的优先级高于写者,意思是如果文件处于读状态,所有读请求都能被接受,但写请求会一直被阻塞,直到没有读进程。

// 读者优先
// int reader_count 记录读者的数量,读者数量为0意味着可以写
int reader_count = 0
// 互斥信号量 mutex 控制对变量 reader_count 的互斥修改
semaphore mutex = 1
// 互斥信号量 file 控制读者与写者对文件的互斥访问
semaphore file = 1

reader:
	P(mutex)
	if(reader_count==0)	P(file)	//  锁住文件不让写者访问
	reader_count++
	V(mutex)
	读文件
	P(mutex)
	reader_count--
	if(reader_count==0)	V(file)	//	 没有读者了再释放权限
	V(mutex)
	
writer:
	P(file)
	写文件
	V(file)

特点:写者大概率一直写不了,因为读者读文件的时候写者没有资格和读者竞争(file被锁)。

公平竞争

解释:读者和写者按照申请顺序访问文件,在写者优先的基础上,需要解决如何在读者读的时候,接受写请求。可以添加一个令牌 token(互斥信号量),利用 token 控制下一个访问的,具体一点:读写者都在访问文件前获取令牌 token 访问完释放,当读者获取到了令牌,新的写者就只能阻塞了。( 标注M的为相较于读者优先的改动之处 )

// 公平竞争
// int reader_count 记录读者的数量,读者数量为0意味着可以写
int reader_count = 0
// 互斥信号量 mutex 控制对变量 reader_count 的互斥修改
semaphore mutex = 1
// 互斥信号量 file 控制读者与写者对文件的互斥访问
semaphore file = 1

// 互斥信号量 token 谁获取到 token 谁下一个写
semaphore token = 1

reader:
M	P(token)	// 获取 token 代表可以开始访问
	P(mutex)
	if(reader_count==0)	P(file)	//  锁住文件不让写者访问
	reader_count++
	V(mutex)
M	V(token)	// 读文件前释放,读文件的时候新的写者/读者可以获取 token
	读文件
	P(mutex)
	reader_count--
	if(reader_count==0)	V(file)	//	 没有读者了再释放权限
	V(mutex)
	
writer:
M	P(token)	// 先获取 token,新的读者便不能再申请
	P(file)		// 等原来的读者都访问完成后释放 file,就能获取文件权限
M	V(token)	// 获得所有权限后就可交出令牌
	写文件
	V(file)

特点:读者写者讲究先来后到,读写者公平。

写者优先

解释:写者优先级高于读者,文件如果处于写状态,所有写请求都能接受(也不能同时写);如果处于读状态,需要在当前所有读者结束访问后立即进行写(这部分是公平竞争)。通俗来说,写的时候你“读者优先”怎么对我,我“写者优先”就怎么对你,但因为你能一群人一起读,不讲武德,以多欺少,我来的时候咱还是按先来后到,我先写后面的读请求都缓缓。。。
读者优先利用 reader_count (和 mutex)实现了读时锁文件权限,同样,写者优先利用一个 writer_count (和 w_mutex)就可以实现写时锁文件。其余部分可沿用公平竞争。( 标注M的为相较于公平竞争的改动之处 )

// 写者优先
// int reader_count 记录读者的数量,读者数量为0意味着可以写
int reader_count = 0
// 互斥信号量 mutex 控制对变量 reader_count 的互斥修改
semaphore mutex = 1
// 互斥信号量 file 控制读者与写者对文件的互斥访问
semaphore file = 1

// 互斥信号量 token 谁获取到 token 谁下一个写
semaphore token = 1

// int writer_count 记录读者的数量,写者数量为0可以读
int writer_count = 0
// 互斥信号量 w_mutex 控制对变量 writer_count 的互斥修改
semaphore mutex = 1

reader:
	P(token)	// 获取 token 代表可以开始访问
	P(mutex)
	if(reader_count==0)	P(file)	//  锁住文件不让写者访问
	reader_count++
	V(mutex)
	V(token)	// 读文件前释放,读文件的时候新的写者/读者可以获取 token
	读文件
	P(mutex)
	reader_count--
	if(reader_count==0)	V(file)	//	 没有读者了再释放权限
	V(mutex)
	
writer:
M	P(w_mutex)	// 访问 writer_count 互斥
M	if(writer_count == 0) P(token)	// 第一个写者获取令牌,直到没有新的写者了再释放
M	writer_count++
M	V(w_mutex)		

 	P(file)
	写文件
	V(file)
	
M	P(w_mutex)	// 访问 writer_count 互斥
M	writer_count--
M	if(writer_count == 0) V(token)	// 没有写者了释放权限
M	V(w_mutex)		
	

一些思考:为什么写者优先需要基于公平竞争读者优先不用?原因在于读操作是不互斥的,但写操作本质上是互斥的,这就导致了读者优先&写者优先间的不对称性。我们希望能利用“读共享”这一特性,因此读者可能长时间获取权限,而由于写者间的互斥,写者不会一直持有权限(若不特殊处理)。为了利用读共享,所以产生了读者优先,而从公平竞争写者优先都是在保证读共享的基础上,增加写者的优先级

附:明天考试,啥都不会,马上看球,不想复习,随便写写,自我安慰,拜佛烧香,不如躺平

  • 7
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值