进程同步、互斥

进程同步、互斥的基本概念 

 

系统中的某些资源,虽然可以提供给多个进程使用,但一个时间段内只允许一个进程访问该资源。

        我们把一个时间段内只允许一个进程使用的资源称为临界资源。许多物理设备(比如摄像头、打印机)都属于临界资源。此外还有许多变量、数据、内存缓冲区等都属于临界资源。

        对临界资源的访问,必须互斥地进行。互斥,亦称间接制约关系。进程互斥指当一个进程访问某临界资源时,另一个想要访问该临界资源的进程必须等待。当前访问临界资源的进程访问结束,释放该资源之后,另一个进程才能去访问临界资源。

进入区和退出区是负责实现互斥的代码段。

临界区是进程中访问临界资源的代码段。 

进程互斥的原则:

1. 空闲让进:

        临界区空闲时,可以允许一个请求进入临界区的进程立即进入临界区;

2. 忙则等待:

        当已有进程进入临界区时,其他试图进入临界区的进程必须等待;

3. 有限等待:

        对请求访问的进程,应保证能在有限时间内进入临界区(保证不会饥饿);

4. 让权等待:

        当进程不能进入临界区时,应立即释放处理机,防止进程忙等待。

进程互斥的软件实现方法

单标志法

turn 的初值为 0,即刚开始只允许 0 号进程进入临界区。

若 P1 先上处理机运行,则会一直卡在 ⑤。直到 P1 的时间片用完,发生调度,切换 P0 上处理机运行。

代码 ① 不会卡住 P0,P0 可以正常访问临界区,在 P0 访问临界区期间即时切换回 P1,P1依然会卡在 ⑤。

只有 P0 在退出区将 turn 改为 1 后,P1才能进入临界区。

因此,单标志法可以实现“同一时刻最多只允许一个进程访问临界区”。

缺点是:

只能按 P0 → P1→  P0→  P1 → ……这样轮流访问。这种必须“轮流访问”带来的问题是,如果此时允许进入临界区的进程是 P0,而 P0 一直不访问临界区,那么虽然此时临界区空闲,但是并不允许 P1 访问。

因此,单标志法存在的主要问题是:违背“空闲让进”原则。

🌏总结:单标志法可以实现 “同一时刻最多只允许一个进程访问临界区”,但是违背了“空闲让进”原则。

双标志先检查

若按照 ①⑤②⑥③⑦….的顺序执行,P0 和 P1 将会同时访问临界区。

因此,双标志先检查法的主要问题是:违反“忙则等待”原则。

原因在于,进入区的“检查”和“上锁” 两个处理不是一气呵成的。“检查”后,“上锁”前可能发生进程切换。

🌏总结:双标志检查法违背了“忙则等待”原则,原因在于,进入区的“检查”和“上锁” 两个处理不是一气呵成的。“检查”后,“上锁”前可能发生进程切换。(就是无法实现互斥)

双标志后检查

若按照 ①⑤②⑥….的顺序执行,P0 和 P1 将都无法进入临界区

因此,双标志后检查法虽然解决了“忙则等待”的问题,但是又违背了“空闲让进”和“有限等待”

原则,会因各进程都长期无法访问临界资源而产生“饥饿”现象。

两个进程都争着想进入临界区,但是谁也不让谁,最后谁都无法进入临界区。

🌏总结:双标志后检查法虽然解决了“忙则等待”的问题,但是又违背了“空闲让进”和“有限等待”

原则,会因各进程都长期无法访问临界资源而产生“饥饿”现象。 两个进程都争着想进入临界区,但是谁也不让谁,最后谁都无法进入临界区。

Peterson算法

🌏Peterson 算法用软件方法解决了进程互斥问题,遵循了空闲让进、忙则等待、有限等待 三个原则,但是依然未遵循让权等待的原则。

增加一个标志位 int turn=0来表示谦让,turn等于几,就表示优先让那个进程进入临界区。

P0进程解读:先表达P0想要进入临界区的意愿,然后再谦让一下,让P1先进,然后检查,如果P1想进并且此时turn=1,那么让P1进入临界区,P0一直等待。如果不满足(flag[1]==1&&turn=1),那么P0进入临界区。

分析一下,如果是①②③⑥⑦⑧…

如果是①②③⑥⑦⑧…

P0先说自己想进,然后谦让让P1先进,但此时P1不想进,所以P0进入临界区,若此时⑥执行,那就是P1说他想进了,然后P1谦让让P0先进,P1循环检查时发现此时的条件是(P0想进,并且此时turn=0)所以P0继续访问,P1等待,直到P0访问完改成P0不想访问了,P1才能继续访问。(所以说Peterson算法实现了互斥访问即“忙则等待”)

turn有一个最新值,turn等于最后一次赋值。

如果是①⑥②③...

P0说P0想进,然后P1说P1想进,然后P0说P1先进,然后P1说P0先进,最后turn=0,等到P0检查时条件为(P1想进,但turn=0,不等于1)所以P0先访问临界区。P1一直等,P0访问完后,改成P0不想进,然后P1进去临界区。(体现了“忙则等待”、有限等待)

 但是没有实现“让权等待”,当P0不能进入临界区时,P1只能忙等。

回顾一下四个原则:

1. 空闲让进。临界区空闲时,可以允许一个请求进入临界区的进程立即进入临界区;

2. 忙则等待。当已有进程进入临界区时,其他试图进入临界区的进程必须等待;

3. 有限等待。对请求访问的进程,应保证能在有限时间内进入临界区(保证不会饥饿);

4. 让权等待。当进程不能进入临界区时,应立即释放处理机,防止进程忙等待。

🌏Peterson 算法用软件方法解决了进程互斥问题,遵循了空闲让进、忙则等待、有限等待 三个原则,但是依然未遵循让权等待的原则。

 

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

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

相关文章

python爬虫加解密分析及实现

第一种: 1、找到加密的接口地址,通过加密的接口地址全局搜索 2、通过打断点的方式,操作页面,跑到断点处时,即可找到加密串,如图二; 3、找到用的是哪种加密方式,如: cr…

Unity Apple Vision Pro 保姆级开发教程-准备阶段

视频教程: Unity PolySpatial 开发Apple Vision Pro教程, 三十分钟快速了解 Unity Vision Pro 中文课堂教程地址: Unity3D Vision Pro 开发教程【保姆级】 | Unity 中文课堂 开发Apple Vision Pro 使用原生开发和unity 开发有什么区别 如果你的项目需要…

LSTM反向传播及公式推导

先回顾一下正向传播的公式: 化简一下: 反向传播从下到上逐步求偏导: 对zt求偏导(预测值和标签值相减): zt对未知数wt,ht,bt分别求偏导: ht对ot,Ct求偏导: ot对Net0求偏导: Net0对w0,b0求偏导: .... 总体的思路就是那个公式从下到上逐步对未知数求偏导: 下面是总体的流程…

【AIGC】ChatGPT与人类理解力的共鸣:人机交互中的心智理论(ToM)探索

博客主页: [小ᶻZ࿆] 本文专栏: AIGC | ChatGPT 文章目录 💯前言💯心智理论(Theory of Mind,ToM)心智理论在心理学与神经科学中的重要性心智理论对理解同理心、道德判断和社交技能的重要性结论 💯乌得勒支大学研究对ChatGPT-4…

【C++篇】类与对象深度解析(六):全面剖析拷贝省略、RVO、NRVO优化策略

文章目录 前言 💬 欢迎讨论:如果你在学习过程中有任何问题或想法,欢迎在评论区留言,我们一起交流学习。你的支持是我继续创作的动力! 👍 点赞、收藏与分享:觉得这篇文章对你有帮助吗&#xff1…

软件设计模式------工厂方法模式

工厂方法模式(Factory Method Pattern),又称工厂模式,也叫虚拟构造器模式(Virtual Constructor Pattern)或多态工厂模式(Polymorphic Pactory Pattern),属于类创建型模式。 我们知道…

WIFI实现透传+接线图

单片机通过TX接WIFI模块的RX将设置的AT代码写入WIFI模块(连接WIFI调为设备模式(有设备,路由,双模等模式)) WIFI模块将响应信号通过TX通过CH340发给PC的RX 通过STC-ISP或安信可串口调试助手查看响应信息 …

Golang | Leetcode Golang题解之第495题提莫攻击

题目: 题解: func findPoisonedDuration(timeSeries []int, duration int) (ans int) {expired : 0for _, t : range timeSeries {if t > expired {ans duration} else {ans t duration - expired}expired t duration}return }

qt QGraphicsEffect详解

一、QGraphicsEffect概述 QGraphicsEffect通过挂接到渲染管道并在源(例如QGraphicsPixmapItem、QWidget)和目标设备(例如QGraphicsView的视口)之间进行操作来更改元素的外观。它允许开发者为图形项添加各种视觉效果,如…

Java网络编程-简单的API调用

Get请求 - 无参数 安装依赖库 首先需要安装一个库&#xff1a; Okhttp3&#xff0c;这是一个非常流行的 HTTP 库&#xff0c;可以简单、快速的实现 HTTP 调用。 安装 Okhttp3 的方式是在 pom.xml 文件中增加依赖&#xff1a; <!-- https://mvnrepository.com/artifact/co…

【算法】哈希表:49.字母异位词分组

目录 1、题目链接 2、题目介绍 3、解法 初始化设定--图解 步骤图解 4、代码 1、题目链接 49. 字母异位词分组 - 力扣&#xff08;LeetCode&#xff09; 2、题目介绍 3、解法 字母异位词的本质是字符相同但排列不同。因此&#xff0c;我们可以对字符串进行排序&#xf…

YOLOv8实战水果识别【数据集+YOLOv8模型+源码+PyQt5界面】

本文采用YOLOv8作为核心算法框架&#xff0c;结合PyQt5构建用户界面&#xff0c;使用Python3进行开发。YOLOv8以其高效的实时检测能力&#xff0c;在多个目标检测任务中展现出卓越性能。本研究针对水果数据集进行训练和优化&#xff0c;该数据集包含丰富的水果图像样本&#xf…

零基础Java第七期:方法的使用

一、方法的概念与使用 1.1. 方法的概念 方法就是一个代码片段. 类似于 C 语言中的 "函数"。方法存在的意义&#xff1a; 是能够模块化的组织代码(当代码规模比较复杂的时候)做到代码被重复使用, 一份代码可以在多个位置使用让代码更好理解更简单直接调用现有方法开…

Solidity基础语法

Solidity的在线编辑器&#xff1a;https://remix.ethereum.org/ 一、合约结构 1、SPDX许可标识&#xff1a;指定代码的开源许可 2、pragma指令&#xff1a;声明Solidity版本 3、导入语句&#xff1a;引入其他合约或库 4、合约声明&#xff1a;使用contract关键字 5、状态变量&…

直流和交流变频压缩机工作原理

直流变频压缩机工作原理&#xff1a; 压缩机定子产生旋转磁场与转子永磁磁场直接作用&#xff0c;实现压缩机运转。转子是永磁体&#xff0c;没有线圈/绕组&#xff0c;无需外部供电&#xff0c;不产生电能损耗&#xff0c;效率高、节能&#xff1b;直流变频压缩机属于同步控制…

uboot中mmc是使用

进入uboot的界面后 mmc命令 mmc list #查看有哪些可用的mmc设备 mmc dev 0 #切换到mmc的0设备&#xff0c;一般是指SD卡 ls mmc 0:1 #查看mmc 0设备&#xff08;sd卡&#xff09;中1分区保存的信息 ls mmc 0:2 #查看mmc 0设备&#xff08;sd卡&#xff09;中2分区保存的信…

Leetcode 1129. 颜色交替的最短路径

1.题目基本信息 1.1.题目描述 给定一个整数 n&#xff0c;即有向图中的节点数&#xff0c;其中节点标记为 0 到 n – 1。图中的每条边为红色或者蓝色&#xff0c;并且可能存在自环或平行边。 给定两个数组 redEdges 和 blueEdges&#xff0c;其中&#xff1a; redEdges[i] …

顺序表算法题【不一样的解法!】

本章概述 算法题1算法题2算法题3彩蛋时刻&#xff01;&#xff01;&#xff01; 算法题1 力扣&#xff1a;移除元素 我们先来看这个题目的要求描述&#xff1a; 把与val相同数值的元素移除掉&#xff0c;忽略元素的相对位置变化&#xff0c;然后返回剩下与val值不同的元素个数…

基于SpringBoot+Vue+uniapp的涪陵区特色农产品交易系统的详细设计和实现(源码+lw+部署文档+讲解等)

详细视频演示 请联系我获取更详细的视频演示 项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而不…

pytest中@pytest.fixture常用顺序function

ytest中pytest.fixture用法讲解 1、测试函数开始之前2、执行测试函数&#xff1a;3、测试函数结束后&#xff1a; 备注&#xff1a;内容来自chatGPT 在 pytest 中&#xff0c;pytest.fixture 是一个非常强大的功能&#xff0c;用于设置测试所需的环境和状态。它可以通过 scope…