OS | 读者写者问题(读者优先,写者优先 ,读写公平)
读者优先
读者优先的解决方案:
互斥信号量 wrt,初值是 \(1\),代表一个共享文件,解决 “读-写”互斥,“写-写”互斥。
一个记数器,即整型变量 readcount,记录读者数,初值是 \(0\)。 来一个读者, readcount 加 \(1\) 当 \(readcount =1\) 表示是第一个读者, 则需要执行 \(P\) 操作抢占文件;否则表示已有读者在安全的读数据。走一个读者,readcount 减 \(1\) 当 \(readcount =0\) 表示是最后一个读者,则需要 \(V\) 操作释放资源;否则表示还有读者在读数据。
readcount 为多个读者共享的变量,是临界资源。用互斥信号量 mutex 控制, mutex 初值是 \(1\) 。
int readcount=0;
semaphore mutex=1, wrt=1 ;
读者进程:
wait (mutex);
readcount++;
if (readcount == 1)
wait(wrt);
signal (mutex);
…
reading is performed
…
wait (mutex);
readcount--;
if (readcount == 0)
signal (wrt);
signal (mutex);
写者进程:
wait(wrt);
…
writing is performed
…
signal(wrt);
写者优先
- 写者线程的优先级高于读者线程。
- 当有写者到来时应该阻塞读者线程的队列。
- 当有一个写者正在写时或在阻塞队列时应当阻塞读者进程的读操作,直到所有写者进程完成写操作时放开读者进程。
- 当没有写者进程时读者进程应该能够同时读取文件。
解决方案:
在读者优先的基础上
增加信号量 \(r\),初值是 \(1\):当至少有一个写进程准备访问数据区时,用于禁止所有的读进程。
增加一个记数器,即整型变量 writecount ,记录写者数,初值是 \(0\) 。 \(writecount\) 为多个写者共享的变量,是临界资源。用互斥信号量 \(mutex2\) 控制, \(mutex2\) 初值是 \(1\)。
增加 \(mutex3\) ,初值是 \(1\) :在 \(r\) 上不允许建造长队列,否则写进程将不能跳过这个队列,因此,只允许一个读进程在 \(r\) 上排队,而所有其他读进程在等待 \(r\) 之前,在信号量 \(mutex3\) 上排队。
int readcount=0, writecount=0;
semaphore mutex1=1, mutex2=1, mutex3=1, w=1, r=1 ;
读者进程:
P(mutex 3);
P(r);
P(mutex 1);
readcount++;
if (readcount == 1 )
P(w);
V(mutex 1);
V(r);
V(mutex 3);
reading is performed
P(mutex 1);
readcount --;
if (readcount == 0 )
V(w);
V(mutex 1);
写者进程:
P(mutex 2);
writecount++;
if (writecount == 1 )
P(r);
V(mutex 2);
P(w);
writing is performed
V(w);
P(mutex 2);
writecount --;
if (writecount == 0)
V(r);
V(mutex 2);
读写公平
优先级相同。
写者、读者互斥访问。
只能有一个写者访问临界区。
可以有多个读者同时访问临界资源。
解决方案:
具体实现:
设置file信号量实现对临界资源的互斥访问。
设置计数器 \(readCount\) 实现多个读者访问临界资源,通过设置信号量 \(mutex\) 实现对 \(readCount\) 计数器的互斥访问。
设置信号量 \(w\) 实现读者和写者的公平竞争(令牌)。
设置信号量 \(rw\) 实现只有读者队列或写者阻塞在 \(w\)(对资源的访问控制)
int readcount=0;
semaphore mutex=1, rw=1 w=1;
读者进程:
wait (w);
wait (mutex);
if (readcount == 0)
wait(rw);
readcount++;
signal (mutex);
signal (w);
…
reading is performed
…
wait (mutex);
readcount--;
if (readcount == 0)
signal (rw);
signal (mutex);
写者进程:
wait(w);
wait(rw);
…
writing is performed
…
signal(rw);
signal(w);
OS | 读者写者问题(读者优先,写者优先 ,读写公平)的更多相关文章
- CS代码代写, 程序代写, java代写, python代写, c/c++代写,csdaixie,daixie,作业代写,代写
互联网一线工程师程序代写 微信联系 当天完成特色: 互联网一线工程师 24-48小时完成.用心代写/辅导/帮助客户CS作业. 客户反馈与评价 服务质量:保证honor code,代码原创.参考课程sl ...
- [改善Java代码]覆写equals方法必须覆写hashCode方法
覆写equals方法必须覆写hashCode方法,这条规则基本上每个Javaer都知道,这也是JDK API上反复说明的,不过为什么要这样做呢?这两个方法之间有什么关系呢?本建议就来解释该问题,我们先 ...
- 写文件前, 检查目录写权限(PHP)
写文件前, 检查目录写权限 写或保存文件前, 确保目录是可写的, 假如不可写, 输出错误信息. 这会节约你很多调试时间. linux系统中, 需要处理权限, 目录权限不当会导致很多很多的问题, 文件也 ...
- 为什么覆写equals必须要覆写hashCode?
============================================= 原文链接: 为什么覆写equals必须要覆写hashCode? 转载请注明出处! ============= ...
- Atitit.如何文章写好 论文 文章 如何写好论文 技术博客 v4
Atitit.如何文章写好 论文 文章 如何写好论文 技术博客 1. 原则 2 1.1. 有深度, 有广度 2 1.2. 业务通用性有通用性 尽可能向上抽象一俩层..业务通用性与语言通用性. 2 ...
- Atitit.如何文章写好 论文 文章 如何写好论文 技术博客
Atitit.如何文章写好 论文 文章 如何写好论文 技术博客 1. 原则 1 1.1. 有深度, 有广度 1 1.2. 业务通用性有通用性 尽可能向上抽象一俩层..业务通用性与语言通用性. 2 ...
- python手写神经网络实现识别手写数字
写在开头:这个实验和matlab手写神经网络实现识别手写数字一样. 实验说明 一直想自己写一个神经网络来实现手写数字的识别,而不是套用别人的框架.恰巧前几天,有幸从同学那拿到5000张已经贴好标签的手 ...
- 用JAVA写一个多线程程序,写四个线程,其中二个对一个变量加1,另外二个对一个变量减1
package com.ljn.base; /** * @author lijinnan * @date:2013-9-12 上午9:55:32 */ public class IncDecThrea ...
- Hibernate写hql语句与不写hql语句的区别?
写hql语句与不写hql语句的区别? 写hql语句:书写HQL语句,所有的查询与投影的设计均使用HQL语句完成. 不写hql语句:没有任何查询语句,所有的查询与投影的设计使用面向对象格式完成. 二者选 ...
- codeforces 876 D. Sorting the Coins(线段树(不用线段树写也行线段树写比较装逼))
题目链接:http://codeforces.com/contest/876/problem/D 题解:一道简单的类似模拟的题目.其实就是看右边连出来有多少连续不需要换的假设位置为pos只要找pos- ...
随机推荐
- centos虚拟机安装
目录 一.准备工作 1.vmware workstation软件安装 2.准备ios镜像 二.创建Centos虚拟机 三.进行Centos7的系统安装 四.虚拟机快照的使用 1.创建虚拟机快照 2.还 ...
- 基于DotNetty实现自动发布 - 项目的配置与发现
前言 上一篇,我们实现了基于 DotNetty 的通信基础模块的搭建,本篇,主要实现待发布 Web 项目的集成. 创建待发布项目 为了测试, 我创建了一个基于 .NET 4.8 的 Web 项目 Op ...
- 关于git 解决分支冲突问题(具体操作,包含截图,教你一步一步解决冲突问题)
当在Git中有多个开发者在同一个分支上工作时,可能会发生分支冲突.分支冲突指的是多个开发者在同一时间修改相同的代码文件,导致Git无法自动合并这些更改. 比如说:我在github上进行了md文件的修改 ...
- MybatisPlus条件查询方法全解
1.是什么? MybatisPlus通过条件构造器可以组装复杂的查询条件,写一些复杂的SQL语句,从而简化我们的开发提升我们的开发效率 # 可以简单的理解为就是我们写SQL语句时where后面的条件 ...
- 【C#】【串口通信(Serial Port)】无法使用(using System.IO.Ports;)命名空间<Error:SerialPort不存在上下文>
1.包缺失导致--安装相应包: 2.等待命令行初始化--输入命令: Install-Package Microsoft.Windows.Compatibility -Version 5.0.2 参考网 ...
- ASR项目实战-架构设计
一般而言,业务诉求作为架构设计的输入. 需求清单 对于语音识别产品而言,需满足的需求,举例如下: 功能需求 文件转写. 长文件转写,时长大于60秒,小于X小时,X可以指定为5. 短文件转写,时长小于6 ...
- MySQL运维实战(1.2)安装部署:使用二进制安装部署
作者:俊达 引言 上一篇我们使用了RPM进行安装部署,这是一种安装快速.简化部署和管理过程.与操作系统提供的包管理工具紧密集成的部署方法.此外,当你需要更高的灵活性和自定义性,并且愿意承担一些额外的手 ...
- wasm+pygbag让你在网页上也能运行Python代码:【贪吃蛇游戏】
引言 最近小伙伴告诉我一种新的方法,可以使用wasm来使浏览器网页能够运行Python代码.这一下子激起了我的兴趣,因为这意味着用户无需安装Python环境就能直接运行我的demo,这真是太方便了.所 ...
- node版本管理工具推荐
hello,今天给大家分享几款 node 版本管理的工具. 背景 在开发前端项目的时候,特别是新到公司接手一个多年维护的老项目时,如果 node 版本不正确,有的插件可能无法正确安装,比如我之前提到的 ...
- FlinkSQL实战开发
FlinkSQL实战开发 1.基础知识 FlinkSQL分为Table API和SQL API,是架构于Flink Core之上用SQL予以方便快捷地进行结构化数据处理的上层库. 工作流程 SQL和T ...