四、操作系统——读者写者问题(详解)

一、问题描述:

在这里插入图片描述

二、需要满足的条件:

  1. 写进程与写进程之间必须互斥的写入数据(因为如果两个写进程同时对共享数据中的区域A中的数据进行写操作的话,会导致数据错误覆盖的问题
  2. 写进程与读进程之间必须互斥的访问共享数据(因为写进程与读进程如果同时访问共享数据,可能会导致数据不一致的问题。比如:读进程A想要访问共享数据中的B数据,但是写进程C在读进程A访问B数据之前将B数据进行了更新,这就会导致读进程A读不到它想要读到的数据,从而出现数据不一致问题
  3. 读进程与读进程之间可以同时访问数据,不需要实现互斥的访问共享数据(因为读进程读数据,并不会像之前的生产者消费者问题中的消费者那样改变数据或者是将数据清空,所以多个读进程可以同时访问共享数据)

三、解题思路:

  1. 第一步解决写进程与写进程之间必须互斥的写入数据写进程与读进程之间必须互斥的访问共享数据 两个问题。

在这里插入图片描述

上面这种实现方式确实解决了了写进程与写进程之间必须互斥的写入数据写进程与读进程之间必须互斥的访问共享数据 这两个问题。但是,
假设读进程A正在访问共享数据,执行了P(rw) 和 读数据操作,还没有执行V操作解锁,此时读进程B也想访问共享数据,此时,读进程B会卡在P(rw)中的循环里面,也就是说进程B被阻塞了。
读进程与读进程之间也变成了必须互斥访问共享数据,并不满足题目读进程与读进程可以同时访问共享数据的要求

  1. 下面来实现多个读进程可以同时访问共享数据
    解决方法:
    引入count变量,用来记录当前有几个读进程在访问共享数据。

在这里插入图片描述

  1. 上述实现方法表面上看达到了实现多个读进程可以同时访问共享数据的目的,但其实还是存在问题的。
    存在的问题:
    如果读进程A想要访问共享数据,并且执行了P(rw)“上锁”操作,此时,读进程B也想要访问共享数据,也会执行P(rw),但是因为进程A已经执行了“上锁”操作,所以进程B还是会被阻塞,无法访问共享数据。可见,仍然没有达到多个读进程可以同时访问共享数据的目的!
    出现这种问题的原因:
    对于count变量的检查与赋值操作无法“一气呵成”,可以被中断。
    解决方法:
    可以增加一个mutex互斥信号量来保证if判断语句 和 count++(count–) 能够“一气呵成”执行完,中间不会被打断,保证各进程对count的访问是互斥的
    在这里插入图片描述
    在这里插入图片描述

  2. 上述解决方案确实已经达到了多个读进程可以同时访问共享数据的目的,但此时,又出现了新的问题:只要又读进程在读取共享数据,写进程就要一直阻塞等待,这很可能导致写进程一直无法往共享数据中写入数据,也就是说写进程很有可能会被“饿死”。因此,这种算法中,读进程是优先的!下面我们来解决写进程可能会被“饿死”这个问题
    解决方法:
    设置变量semaphore w =1 ,用于实现“写优先”。然后分别为读进程、写进程增加关于信号变量w的P、V操作。
    在这里插入图片描述
    在这里插入图片描述
    经过上面的“改造”,我们来验证一下是否达到了“写优先”的目的:
    读进程A——>写进程a——>读进程B:
    假设读进程A正在访问共享数据,那么读进程A肯定已经执行了P(w)、P(mutex)、P(rw)、V(mutex)、V(w)。此时,写进程a也想要访问共享数据,那么当读进程a执行P(w)时,不会被阻塞,但是执行到P(rw)时,由于读进程A还没有执行V(rw)“解锁”操作,所以,写进程a会被阻塞等待
    而如果此时有第二个读进程B也想要访问共享数据,但由于之前第一个读进程A已经执行了P(w)“上锁”操作,所以当读进程B执行到P(w)操作时,也会被堵塞等待
    直到读进程A完成了读文件操作后,执行了V(rw)“解锁”操作,写进程a才会被“唤醒”。然后在写进程完成了写文件操作后,执行了V(w)“解锁”操作,读进程B才能被唤醒
    注意:这里为什么会先唤醒写进程a呢?
    答:因为这里是写进程a比读进程B先想要访问共享数据,所以优先被唤醒。这里其实就是“先来先服务算法

结论:
在这种算法中,连续进入的多个读进程,可以同时读文件;写进程和其他进程不能同时访问文件;写进程不会“饥饿”。但也并不是真正的“写优先”,而是遵循相对公平的先来先服务原则。有的也称这种算法为“读写公平法”。

四、总结:

读者-写者问题为我们解决复杂的互斥问题提供了一个参考思路:
核心思想在于设置了一个计数器count用来记录当前正在访问共享文件的读进程数。我们可以用count的值来判断当前进入的进程是否是第一个/最后一个读进程,从而做出不同的处理。如果是第一个进程则执行“上锁”操作,如果是最后一个进程则执行“解锁”操作。
另外,对count变量的检查和赋值不能一气呵成导致了一些错误,如果需要实现“一气呵成”,自然应该想到用互斥信号量
最后,还要认真体会我们是如何解决“写进程饥饿”问题的。
绝大多数的PV操作大题都可以用之前介绍的几种生产者-消费者问题的思想来解决,如果遇到更复杂的问题,可以想想能否用读者写者问题的这几个思想来解决。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/471253.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

二级vb笔试题库__全国计算机等级考试,2012年9月全国计算机二级VB笔试标准预测试卷试题六...

二级VisualBasic语言程序设计标准预测试卷六一、选择题(每小题2分。共70分)下列各题A)、B)、 C)、 D)四个选项中,只有一个选项是正确的,请将正确选项涂写在答题卡相应位置 上,答在试卷上不得分。(1)下列叙述中正确的是A)所有形态的二叉树都只…

LeetCode 2149. 按符号重排数组(双指针)

文章目录1. 题目2. 解题1. 题目 给你一个下标从 0 开始的整数数组 nums ,数组长度为 偶数 ,由数目相等的正整数和负整数组成。 你需要 重排 nums 中的元素,使修改后的数组满足下述条件: 任意 连续 的两个整数 符号相反对于符号…

五、操作系统——内存相关基础知识 和 进程运行的基本原理(详解)

一、概述 二、什么是内存?有何作用? 内存是用于存放数据的硬件。程序在执行之前,需要先放到内存中才能被CPU处理。 平时,我们各种各样的软件都是存储在外存(辅存)里。电脑的话,一般是存储在硬盘…

LeetCode 2150. 找出数组中的所有孤独数字(哈希)

文章目录1. 题目2. 解题1. 题目 给你一个整数数组 nums 。如果数字 x 在数组中仅出现 一次 ,且没有 相邻 数字(即,x 1 和 x - 1)出现在数组中,则认为数字 x 是 孤独数字 。 返回 nums 中的 所有 孤独数字。你可以按…

六、操作系统——内存管理的概念(空间的分配与回收、空间的扩充、地址转换、存储保护)

一、概述 二、操作系统作为系统资源的管理者,当然也需要对内存进行管理,要管些什么呢? 1. 内存空间的分配与回收 连续分配:指为用户进程分配的必须是一个连续的内存空间。 1. 单一连续分配 在单一连续分配方式中,内…

计算机软件无形资产机械工具,考前秘籍,无形资产的定义及确认

原标题:考前秘籍,无形资产的定义及确认考查导向:每年考3分左右;比较简单,重要程度一般;建议与“固定资产”一章一起类比学习,效果更佳,效率更高。近三年主要考点:(1)无形…

一些iOS笔试题目

1.什么是arc?(arc是为了解决什么问题诞生的?) 首先解释ARC: automatic reference counting自动引用计数。 ARC几个要点: 在对象被创建时 retain count 1,在对象被release时 retain count -1.当retain count…

LeetCode 2151. 基于陈述统计最多好人数(状态压缩)

文章目录1. 题目2. 解题1. 题目 游戏中存在两种角色: 好人:该角色只说真话。坏人:该角色可能说真话,也可能说假话。 给你一个下标从 0 开始的二维整数数组 statements ,大小为 n x n ,表示 n 个玩家对彼…

七、操作系统——动态分区分配算法(详解)

一、引入 动态分区分配算法:在动态分区分配方式中,当很多个空闲分区都能满足需求时,应该选择哪个分区进行分配? 二、首次适应算法(First Fit) 算法思想:每次都从低地址开始查找,…

2015前端生态发展回顾(转)

引用苏宁前端架构师的一个总结作为开篇 编程技术及生态发展的三个阶段 最初的时候人们忙着补全各种API,代表着他们拥有的东西还很匮乏,需要在语言跟基础设施上继续完善然后就开始各种模式,标志他们做的东西逐渐变大变复杂,需要更好…

LeetCode 2154. 将找到的值乘以 2

文章目录1. 题目2. 解题1. 题目 给你一个整数数组 nums ,另给你一个整数 original ,这是需要在 nums 中搜索的第一个数字。 接下来,你需要按下述步骤操作: 如果在 nums 中找到 original ,将 original 乘以 2 &#…

网际控制报文协议ICMP(Internet Control Message Protocol)(详解)

一、回顾下TCP/IP协议栈 二、ICMP(Internet Control Message Protocol)协议概述 三、ICMP协议的组成 四、ICMP差错报告报文(5种): 终点不可达:当路由器或主机不能交付数据报时就向源点发送终点不可达报文。(无法交付&…

王道考研学习笔记IP数据报格式IP数据报分片(超详细)

一、回顾TCP/IP协议栈 二、IP数据报格式 记忆方法: TCP是面向连接的服务,面向连接就非常6。而UDP是不面向连接的,数据就非常容易被“遗弃”(17)。因为如果不建立连接,这个链路是不太可靠的,所以…

LeetCode 2155. 分组得分最高的所有下标(前缀和)

文章目录1. 题目2. 解题1. 题目 给你一个下标从 0 开始的二进制数组 nums &#xff0c;数组长度为 n 。 nums 可以按下标 i&#xff08; 0 < i < n &#xff09;拆分成两个数组&#xff08;可能为空&#xff09;&#xff1a;numsleft 和 numsright 。 numsleft 包含 nu…

强基计划对计算机,你对报考强基计划怎么看?

原标题&#xff1a;你对报考强基计划怎么看&#xff1f;提起“强基计划”&#xff0c;可能是近期高三家长们、考生们提到最多的话题了&#xff0c;尤其是高校的强基计划招生章程发布之后&#xff0c;关于“强基计划”的咨询量明显上升了许多&#xff0c;那么对于今年第一年实施…

路由算法及路由协议(详解)

一、路由算法 最佳路由&#xff1a;“最佳”只能是相对于某一种特定要求下得出的较为合理的选择而已。 二、路由算法的分类 三、分层次的路由选择协议 为什么要采用分层次的路由选择协议呢&#xff1f; 因特网规模很大许多单位不想让外界知道自己的路由选择协议&#xff0c;…

LeetCode 2156. 查找给定哈希值的子串(字符串哈希)

文章目录1. 题目2. 解题1. 题目 给定整数 p 和 m &#xff0c;一个长度为 k 且下标从 0 开始的字符串 s 的哈希值按照如下函数计算&#xff1a; hash(s,p,m)(val(s[0])∗p0val(s[1])∗p1...val(s[k−1])∗pk−1)modmhash(s,p,m) (val(s[0])*p^0 val(s[1])*p^1...val(s[k-1])…

二维码扫描利用ZBar实现

上次是根据系统的属性自己封装的一个二维码扫描&#xff0c;这次给大家介绍一下基于ZBar集成的类似于QQ二维码扫描界面的二维码扫描的效果。 最下方配有效果图哦&#xff01; 首先&#xff0c;需要引入ZBar第三方库文件&#xff1a; ZBarSDK libqrencode 其次&#xff0c;利用Z…

十二、一篇文章帮助你快速读懂MySQL索引(B树、B+树详解)

2. 索引 2.1 索引概述 MySQL官方对索引的定义为&#xff1a;索引&#xff08;index&#xff09;是帮助MySQL高效获取数据的数据结构&#xff08;有序&#xff09;。在数据之外&#xff0c;数据库系统还维护者满足特定查找算法的数据结构&#xff0c;这些数据结构以某种方式引…

LeetCode 2157. 字符串分组(状态压缩+位运算+图的遍历)

文章目录1. 题目2. 解题1. 题目 给你一个下标从 0 开始的字符串数组 words 。 每个字符串都只包含 小写英文字母 。words 中任意一个子串中&#xff0c;每个字母都至多只出现一次。 如果通过以下操作之一&#xff0c;我们可以从 s1 的字母集合得到 s2 的字母集合&#xff0c;…