当前位置: 首页 > news >正文

读者写者问题(读者优先、公平竞争、写者优先)

1.读者优先

        当有读者进程进行读时,允许多个读者同时读,但不允许写者写;当有写者进程进行写时,不允许其他写者写,也不允许读者读

读者算法:
p(r_mutex);  //申请修改read_count
if read_count==0:p(mutex);  //获得读文件的权限
read_count++;
V(r_mutex);阅读;//阅读结束
p(r_mutex);
read_count--;
if read_count==0:V(mutex);  //最后一个读者阅读完毕,释放文件权限
V(r_mutex);   
写者算法:
p(mutex); //请求写文件的权限进行写操作;v(mutex);  //释放权限

r_mutex:实现读者互斥修改read_count

mutex:实现读者和写者互斥操作文件

        如果还有读者在读的话,那就一直抓住mutex,实现读者的鱼贯而入,此时若写者想要进行写的话,也只能等最后一个读者释放mutex。

2.公平竞争

        读者进程运行时,允许多个读者同时读,但不允许写者写;写者进程运行时,不允许其他写者写,也不允许读者读。

        同时,读者与写者公平竞争,即读者与写者先来先得,谁先来,谁就排在前面

读者算法:
p(s);  //请求外围互斥量s
p(r_mutex); //请求修改read_count
if read_count == 0:p(mutex); //请求内围互斥量mutex,实现多个读者同时读
read_count++;
v(r_mutex);
v(s);  //释放外围互斥量阅读;//阅读结束p(r_mutex);
read_count--;
if read_count==0: //表示最后一个读者阅读完毕v(mutex);
v(r_mutex);
写者算法:
p(s);  //请求外围互斥量
p(mutex);  //请求内围互斥量进行写操作v(mutex);
v(s);

相较于读者优先算法,引入了互斥信号量s,每一个读者想要进行读操作时,都要和写者一样先申请一下s。

一旦当写者申请s后,读者就无法成功申请到s,只能进入阻塞队列等待,避免了读者鱼贯而入导致写者无法进行写的现象。

s控制了读者进入的过程

3.写者优先

        写者的优先级高于读者,读者在等待的时候,此时若有写者想要进行写,那么读者只能进行让路,让写者插队进行写操作

读者算法:
p(x);
p(s);  //请求外围互斥量s
p(r_mutex); //请求修改read_count
if read_count == 0:p(mutex); //请求内围互斥量mutex,实现多个读者同时读
read_count++;
v(r_mutex);
v(s);  //释放外围互斥量
v(x);阅读;//阅读结束p(r_mutex);
read_count--;
if read_count==0: //表示最后一个读者阅读完毕v(mutex);
v(r_mutex);
写者算法:
p(w_mutex); //申请修改write_count
if write_count==0:p(s);  //申请s,把s抓住
v(w_mutex);
p(mutex);  //申请文件操作权限进行写操作v(mutex);
p(w_mutex);
write_count--;
if write_count==0:v(s); 释放外围互斥量s
v(w_mutex);

        在写者算法里,增加的和读者优先里读者的算法类似,增加了一个write_count来抓住s。

        当读者在读的时候,若第一个写者想要进行写,那么就会p(s),申请s,抓住s,此时读者无法在接着加入队列进行读。

        当有其他写者在进行写的时候,若有写者想要进行写操作,那么他只需要等上一个写者释放mutex即可

        在读者算法里,新加了一个互斥量x

        为什么要多引入一个x?假设没有x,去掉p(x),v(x)。试想如下这种情形:一个读者申请到了s,但还没释放s,此时若先来一个读者,又来了一个写者,读者先p(s),申请s,写者由于是第一个,所以也要p(s),当上面第一个读者v(s)后,此时若系统将s分配给了先到达的读者,那么读者就会优先了

http://www.lryc.cn/news/379760.html

相关文章:

  • Springboot开发之 Excel 处理工具(二)-- Easyexcel
  • 6月27日云技术研讨会 | 中央集中架构新车型功能和网络测试解决方案
  • 微信小程序生命周期
  • 【JS重点15】原型对象概述
  • Java之Hutool/Guava/Apache Commons工具包项目实践
  • 哈喽GPT-4o——对GPT-4o 提示词的思考与看法
  • 《计算机英语》 Unit 3 Software Engineering 软件工程
  • 2024-6-18(沉默Spring,Springboot)
  • Java热部署:让应用更新如丝般顺滑,告别繁琐重启!
  • 微信小程序毕业设计-小区疫情防控系统项目开发实战(附源码+论文)
  • PyTorch -- RNN 快速实践
  • SpringBoot 快速入门(保姆级详细教程)
  • 【第18章】Vue实战篇之登录界面
  • [C++]使用C++部署yolov10目标检测的tensorrt模型支持图片视频推理windows测试通过
  • 分享uniapp + Springboot3+vue3小程序项目实战
  • Ubuntu 24.04安装zabbix7.0.0图形中文乱码
  • MybatisPlus 调用 原生SQL
  • 1.SG90
  • 【yolov8语义分割】跑通:下载yolov8+预测图片+预测视频
  • 基于STM8系列单片机驱动74HC595驱动两个3位一体的数码管
  • Jlink下载固件到RAM区
  • Kotlin基础——Typeclass
  • DC-DC 高压降压、非隔离AC-DC、提供强大的动力,选择优质电源芯片-(昱灿)
  • GPT-4o的视觉识别能力,将绕过所有登陆的图形验证码
  • 【LinuxC语言】进程间的通信——管道
  • CompletableFuture 基本用法
  • 网页如何发布到服务器上
  • Jenkins简要说明
  • C# 比较基础知识:最佳实践和技巧
  • Ansible 自动化运维实践