读者优先

读者优先的解决方案:

互斥信号量 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);

写者优先

  1. 写者线程的优先级高于读者线程。
  2. 当有写者到来时应该阻塞读者线程的队列。
  3. 当有一个写者正在写时或在阻塞队列时应当阻塞读者进程的读操作,直到所有写者进程完成写操作时放开读者进程。
  4. 当没有写者进程时读者进程应该能够同时读取文件。

解决方案:

在读者优先的基础上

增加信号量 \(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);

读写公平

  1. 优先级相同。

  2. 写者、读者互斥访问。

  3. 只能有一个写者访问临界区。

  4. 可以有多个读者同时访问临界资源。

解决方案:

具体实现:

  1. 设置file信号量实现对临界资源的互斥访问。

  2. 设置计数器 \(readCount\) 实现多个读者访问临界资源,通过设置信号量 \(mutex\) 实现对 \(readCount\) 计数器的互斥访问。

  3. 设置信号量 \(w\) 实现读者和写者的公平竞争(令牌)。

  4. 设置信号量 \(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 | 读者写者问题(读者优先,写者优先 ,读写公平)的更多相关文章

  1. CS代码代写, 程序代写, java代写, python代写, c/c++代写,csdaixie,daixie,作业代写,代写

    互联网一线工程师程序代写 微信联系 当天完成特色: 互联网一线工程师 24-48小时完成.用心代写/辅导/帮助客户CS作业. 客户反馈与评价 服务质量:保证honor code,代码原创.参考课程sl ...

  2. [改善Java代码]覆写equals方法必须覆写hashCode方法

    覆写equals方法必须覆写hashCode方法,这条规则基本上每个Javaer都知道,这也是JDK API上反复说明的,不过为什么要这样做呢?这两个方法之间有什么关系呢?本建议就来解释该问题,我们先 ...

  3. 写文件前, 检查目录写权限(PHP)

    写文件前, 检查目录写权限 写或保存文件前, 确保目录是可写的, 假如不可写, 输出错误信息. 这会节约你很多调试时间. linux系统中, 需要处理权限, 目录权限不当会导致很多很多的问题, 文件也 ...

  4. 为什么覆写equals必须要覆写hashCode?

    ============================================= 原文链接: 为什么覆写equals必须要覆写hashCode? 转载请注明出处! ============= ...

  5. Atitit.如何文章写好 论文 文章 如何写好论文 技术博客 v4

    Atitit.如何文章写好 论文  文章  如何写好论文 技术博客 1. 原则 2 1.1. 有深度, 有广度 2 1.2. 业务通用性有通用性 尽可能向上抽象一俩层..业务通用性与语言通用性. 2 ...

  6. Atitit.如何文章写好 论文 文章 如何写好论文 技术博客

    Atitit.如何文章写好 论文  文章  如何写好论文 技术博客 1. 原则 1 1.1. 有深度, 有广度 1 1.2. 业务通用性有通用性 尽可能向上抽象一俩层..业务通用性与语言通用性. 2 ...

  7. python手写神经网络实现识别手写数字

    写在开头:这个实验和matlab手写神经网络实现识别手写数字一样. 实验说明 一直想自己写一个神经网络来实现手写数字的识别,而不是套用别人的框架.恰巧前几天,有幸从同学那拿到5000张已经贴好标签的手 ...

  8. 用JAVA写一个多线程程序,写四个线程,其中二个对一个变量加1,另外二个对一个变量减1

    package com.ljn.base; /** * @author lijinnan * @date:2013-9-12 上午9:55:32 */ public class IncDecThrea ...

  9. Hibernate写hql语句与不写hql语句的区别?

    写hql语句与不写hql语句的区别? 写hql语句:书写HQL语句,所有的查询与投影的设计均使用HQL语句完成. 不写hql语句:没有任何查询语句,所有的查询与投影的设计使用面向对象格式完成. 二者选 ...

  10. codeforces 876 D. Sorting the Coins(线段树(不用线段树写也行线段树写比较装逼))

    题目链接:http://codeforces.com/contest/876/problem/D 题解:一道简单的类似模拟的题目.其实就是看右边连出来有多少连续不需要换的假设位置为pos只要找pos- ...

随机推荐

  1. 手撕Vue-Router-提取路由信息

    前言 好了经过上一篇的学习,我们已经知道了如何监听 Hash 的变化,如何监听路径的一个变化,本篇我们就可以来实现我们自己的 VueRouter 了, 那么怎么实现呢,在实现之前我们先来回顾一下官方的 ...

  2. Vite4+Typescript+Vue3+Pinia 从零搭建(6) - 状态管理pina

    项目代码同步至码云 weiz-vue3-template pina 是 vue3 官方推荐的状态管理库,由 Vue 核心团队维护,旨在替代 vuex.pina 的更多介绍,可从 pina官网 查看 特 ...

  3. LeetCode190:颠倒二进制(位运算分治! 时间复杂度O(1))

    解题思路:这道题很两种解法,常规的就是O(n),另一种就是巧妙的利用位运算实现分治,时间复杂度O(1),类似于归并排序.不过这个递归不是自顶向下,而是巧用位运算从自底向上实现. 比如01001000通 ...

  4. EEPROM M24C64替换AT24C64出现读取数据为0xff情况解决办法

    EEPROM M24C64替换AT24C64出现读取数据为0xff情况解决办法 硬件情况 STM32F103CBT6+模拟IIC,主频72MHz,IIC上拉电阻3.3kΩ 出现原因 在IIC停止信号上 ...

  5. Linux磁盘专题-linux文件系统详解

    这可是我几年前的杰作笔记呀.....当初手写计算都会,现在忘光光.... 物理硬盘Block的概念和作用 硬盘底层一次IO就是读.写一次扇区,一个扇区默认是512Byte. 读写大量文件如果以扇区为单 ...

  6. kubernetes安装(一)

    参考: https://www.cnblogs.com/liuyangQAQ/p/17299871.html 部署组件包 名称 安装包 kubeadm集群组件 kubelet-1.20.9 kubea ...

  7. windows 和 Linux 下 git status 结果不一致

    解决该问题 运行一下命令即可 git config core.autocrlf true 解释 git config core.autocrlf true 这个命令是在任何支持的操作系统上都可以运行的 ...

  8. 未经授权访问 .js

    流程顺序:后台管理登陆地址 → 后台主页地址 → fuzz测试出用户管理列表接口 → 直接调接口..全程黑盒. 那么接下来我逆着来推理下逻辑: 首先是拿到某后台管理登录的网址 接着查看html源码,发 ...

  9. QNX 性能分析工具

    QNX 性能分析工具 小结 hogs:列出最占用 CPU/RAM 的进程,可以统计内存占用详细情况[可单个进程] pidin:显示进程信息.系统信息.库信息...[可单个进程] ps:显示进程信息[可 ...

  10. LayoutBuilder(获取父类的宽高)

    LayoutBuilder 是 Flutter 中的一个构建组件,用于根据父容器的约束对其子组件进行布局. import 'package:flutter/material.dart'; void m ...