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- ...
随机推荐
- 吉客云与用友U8的系统数据集成对接方案
吉客云与用友U8之间的系统数据集成方案.吉客云作为一款电商ERP产品,旨在为企业的数字化升级提供全方位的支持.用友U8是一个经过多年发展的信息化管理系统,见证了企业信息化从简单到精细.从局部到全面的转 ...
- 【封装】二维BIT
struct BIT{ #define maxn 1000 int n, m; int d1[maxn][maxn], d2[maxn][maxn], d3[maxn][maxn], d4[maxn] ...
- 如何自学 PS、PR 等软件?
学习Photoshop(PS)和Premiere Pro(PR)等软件需要一定的时间和耐心,以下是非常详细的自学指南. 第一部分:规划学习路线 1. 确定学习目标 在自学PS和PR之前,首先要明确自己 ...
- Snipaste安装与使用教程
一.下载 1.官网 下载地址 2.下载 可以直接在官网下载,也可以跳转微软仓库下载增强版的.如果是其他系统,mac在最下面,而Linux现在没有需要等待. 二.开始安装 1.下载完毕,是一压缩包绿色版 ...
- 使用 PyTorch FSDP 微调 Llama 2 70B
引言 通过本文,你将了解如何使用 PyTorch FSDP 及相关最佳实践微调 Llama 2 70B.在此过程中,我们主要会用到 Hugging Face Transformers.Accelera ...
- [USACO2007NOVS] Cow Hurdles S
题目描述 Farmer John wants the cows to prepare for the county jumping competition, so Bessie and the gan ...
- erp——绩效考核系统——数据需求说明书
绩效考核--数据需求说明书 1.引言 1.1编写目的 数据要求说明书详细的提供了系统中各个数据的流向,是设计数据库的关键所在,为以后的编码以及测试提供一份可靠的依据. 1.2 对象 本<数据要求 ...
- hdu 5685
题目:http://acm.hdu.edu.cn/showproblem.php?pid=5685 解题思路:前缀积+费马小定理求逆元. AC代码: 1 #include<iostream> ...
- 神经网络优化篇:为什么正则化有利于预防过拟合呢?(Why regularization reduces overfitting?)
为什么正则化有利于预防过拟合呢? 通过两个例子来直观体会一下. 左图是高偏差,右图是高方差,中间是Just Right. 现在来看下这个庞大的深度拟合神经网络.知道这张图不够大,深度也不够,但可以想象 ...
- vue3.3新特性defineOptions
当我们使用选项式api时候,可以轻松创建与setup()选项同级别的选项. 但是,用了