进程同步、互斥

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

 

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

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

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

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

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

进程互斥的原则:

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 开发有什么区别 如果你的项目需要…

python【装饰器】

装饰器(decorators)是 Python 中的一种高级功能,它允许动态地修改函数或类的行为。装饰器也称装饰函数,是一种闭包的应用:它接受一个函数作为参数,并返回一个新的函数或修改原来的函数。 基本语法 其主要是…

解决方案:总结描述下知识蒸馏、量化、剪枝的区别

文章目录 一、现象二、解决方案 一、现象 在算法中,时而会听到知识蒸馏、量化、剪枝这三个专业名词,进行记录 二、解决方案 知识蒸馏:一般将复杂、学习能力强的网络学到的特征表示“知识”蒸馏出来,传递给参数量小、学习能力弱…

LSTM反向传播及公式推导

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

docker 资源限制+调优详解

容器资源限制介绍 下面我将详细讲解 Docker 的各种资源限制及其在生产环境中的实际应用案例。我们将逐一探讨 CPU、内存、磁盘 I/O 和网络带宽的限制,并提供具体的配置示例和解释。 1. CPU 限制 1.1 设置 CPU 份额 --cpu-shares:设置容器的 CPU 优先…

Nginx介绍+openresty配置

参考:资源下载 Nginx介绍openresty配置 nginx使用场景 1.什么是nginx性能高,官方测试5万并发连接;对cpu 内存资源消耗很低,而且运行非常稳定 免费 开源2.nginx应用场景1.http服务器静态资源 图片 js css 2.虚拟主机"虚拟"出多个主机, 域名80 www…

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

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

设计一个多格式文件压缩与解压系统

设计一个多格式文件压缩与解压系统 在现代软件开发中,文件压缩和解压缩是一个常见且重要的需求。无论是为了节省存储空间,还是为了提高文件传输的效率,掌握文件压缩和解压缩的技术都是每个开发者必备的技能。本文将详细介绍如何设计一个支持多种压缩格式的文件压缩和解压系…

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

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

redhat系列的yum源配置

一、Linux更改yum源为阿里云源 一)原yum源备份 cp -rp /etc/yum.repos.d/CentOS-Base.repo{,.bak} cp -rp /etc/yum.repos.d/epel.repo{,.bak} 二)更改为阿里云源  1、更改yum base源 下载新的CentOS-Base.repo 到/etc/yum.repos.d/ http://mirrors.al…

Android中的IntentService及其作用。

在Android开发中,处理后台任务是一个常见的需求。为了保证应用的流畅性和响应性,许多耗时操作需要在后台线程中执行。然而,直接管理后台线程可能会变得复杂且容易出错。为了简化这一过程,Android提供了IntentService,一…

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

工厂方法模式(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 }

速盾:cdn走国内要备案吗?

在当今互联网时代,CDN(Content Delivery Network,内容分发网络)已经成为许多网站提高访问速度和稳定性的重要手段。然而,对于使用 CDN 走国内线路的网站来说,是否需要备案呢?这是许多网站管理员…

我开源了Go语言连接数据库和一键生成结构体的包【实用】

项目地址:https://gitee.com/zht639/my_gopkg autosql autosql 是一个简化数据库使用的模块,支持常见的数据库(MySQL、PostgreSQL、SQLite、SQL Server)。该模块不仅提供了数据库连接函数,还能自动生成数据表对应的结…

qt QGraphicsEffect详解

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

基于netty实现简易版rpc服务-理论分析

1.技术要点 1.1 rpc协议 定义一个rpc协议类,用于rpc服务端和客户端数据交互。 1.2 netty粘包半包处理 由于数据传说使用tcp协议,rpc协议的数据在网络传输过程中会产生三种情况: 1)刚好是完整的一条rpc协议数据 2)不…

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

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