2.3_2 进程互斥的软件实现方法

2.3_2 进程互斥的软件实现方法

进程互斥的软件实现方法
单标志法
双标志先检查
双标志后检查
Peterson算法

单标志法

这块儿代码是基于我看的B站视频改进的,我认为他的代码逻辑不很好理解,所以,可能不是很正确

int turn = 0;	//turn表示当前允许进入临界区的进程号
while(true){
    //P0进程					   	   
    while(turn==0){					
        critical section;				
        turn = 1;						
        remainder section;				
    }
    
    //P1进程
    while(turn==1){
        critical section;
        turn = 0;
        remainder section;
    }
}

注意:上面P0和P1部分的代码是并发执行的

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

P0进程的时间片结束后,turn变为1,此时只有P1进程可以访问临界区。

该算法可以实现同一时刻最多只允许一个进程访问临界区

主要问题:违背"空闲让进"原则

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

双标志法先检查

算法思想:

设置一个布尔型数组 flag[],数组中各个元素用来标记各进程是否处于临界区内,比如“flag[0]=ture”意味着0号进程P0现在正在临界区内。每个进程在进入临界区之前先检查当前有没有别的进程处于临界区内。如果没有,则把自身对应的标志flag[i]设为true,之后开始访问临界区。

bool flag[2];
flag[0]=false;
flag[1]=false;

while(true){
    //P0进程
    while(flag[1]!=1){
        flag[0]=true;
        critical section;
        flag[0]=false;
        remainder section;
    }
    
    //P1进程
    while(flag[0]!=1){
        falg[1]=true;
        critical section;
        flag[1]=false;
        remainder section;
    }
}

注意:上面P0和P1部分的代码是并发执行的

主要问题:如果按照7行、15行、8行、16行这样的顺序来执行的话,临界区会被P0和P1同时访问。违反"忙则等待"原则

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

双标志后检查

算法思想:双标志先检查法的改版。前一个算法的问题是先“检查”后“上锁”,但是这两个操作又无法一气呵成,因此导致了两个进程同时进入临界区的问题。因此,人们又想到先“上锁”后“检查”的方法,来避免上述问题。

bool flag[2];
flag[0]=false;
flag[1]=false;

while(true){
    
    //P0进程
    flag[0]=true;8
    while(flag[1]!=1){9
        critical section;
        flag[0]=false;
        remainder section;
    }
    
    //P1进程
    flag[1]=true;16
    while(flag[0]!=1){17
        critical section;
        flag[1]=false;
        remainder section;
    }
}

注意:上面P0和P1部分的代码是并发执行的

主要问题:如果按照8行、16行、9行、17行这样的顺序来执行,每个进程都发现对面上锁了,都无法访问。

因此,双标志后检查法虽然解决了“忙则等待”的问题,但是又违背了“空闲让进”和“有限等待”原则,会因各进程都长期无法访问临界资源而产生“饥饿”现象

Peterson算法

算法思想:结合双标志法、单标志法的思想。如果双方都争着想进入临界区,那可以让进程尝试“孔融让梨”(谦让)。做一个有礼貌的进程。

bool flag[2];
int turn = 0;	//表示优先让哪个进程进入临界区

//P0进程
flag[0]=true;
turn=1;
while(flag[1] && turn==1);	//如果为真,则卡在这一步
critical section;
flag[0]=false;
remainder section;

//P1进程
flag[1]=true;
turn=0;
while(flag[0] && turn==0);	//如果为真,则卡在这一步
critical section;
flag[1]=false;
remainder section;

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

即:如果一个进程一直进不了临界区,那么会一直被卡在while循环。但是自己还在CPU上运行,不断检查while循环的条件是否得到满足。虽然这个进程进不了临界区,但是依然占用CPU资源


知识回顾与重要考点

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【微服务】:微服务最佳实践

关键需求 最大限度地提高团队的自主性:创建一个团队可以完成更多工作而不必与其他团队协调的环境。优化开发速度:硬件便宜,人不是。使团队能够轻松快捷地构建强大的服务。关注自动化:人们犯错误。更多的系统操作也意味着更多的事情…

Python多任务编程-09队列Queue

程序中的定义:一种特殊的存储数据的方式,可以实现先存入的数据,先出去 1.程序中的队列Queue FIFO(first in first out先进先出) import queueq queue.Queue() q.put("22") q.put(500) q.put({"num&q…

nodejs微信小程序+python+PHP医院挂号系统-计算机毕业设计推荐

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性:…

C练习题13答案

单项选择题(本大题共20小题,每小题2分,共40分。在每小题给出的四个备选项中,选出一个正确的答案,并将所选项前的字母填写在答题纸的相应位置上。) 1.结构化程序由三种基本结构组成、三种基本结构组成的算法是(A) A.可以完成任何复杂的任务 B. 只能完成部分复杂的任务 C. 只能完…

MySQL运维实战(1.2)安装部署:使用二进制安装部署

作者:俊达 引言 上一篇我们使用了RPM进行安装部署,这是一种安装快速、简化部署和管理过程、与操作系统提供的包管理工具紧密集成的部署方法。此外,当你需要更高的灵活性和自定义性,并且愿意承担一些额外的手动配置和管理工作&am…

JavaScript高级 函数进阶篇

函数进阶 1、函数的定义和调用 函数声明方式function关键字(命名函数);函数表达式(匿名函数);new Function()(此处的Function()是一个构造函数);var fn new Function(参…

IntelliJ IDEA 2020将SpringMVC项目打成war包

一 、打开 Project Structure 进行配置 1. 打开方式 (1)CtrlAltShiftS (2)File->Project Structure (3)点击如下图标: 2. 进入 Project Structure,添加Artifacts Web Applica…

YB75XXH系列是采用CMOS工艺制造,低功耗的高压稳压器

YB75xxH 高耐压线性稳压器 ■产品简介: YB75XXH系列是采用CMOS工艺制造,低功耗的高压稳压器,最高输入电压可达25V,输出电压范围为1.5V一12.0V。它具有高精度的输出电压、极低的供电电流、极低的跌落电压等特点。 ■产品特点: …

Python并行计算和分布式任务全面指南

更多Python学习内容:ipengtao.com 大家好,我是彭涛,今天为大家分享 Python并行计算和分布式任务全面指南。全文2900字,阅读大约8分钟 并发编程是现代软件开发中不可或缺的一部分,它允许程序同时执行多个任务&#xff0…

spring基于Xml管理bean---Ioc依赖注入:对象类型属性赋值(1)----外部bean的引入(bean和bean之间的引入)

文章目录 注入普通属性的方式1、set方法注入2、构造器(构造方法)注入 总结:注入对象类型属性 注入普通属性的方式 1、set方法注入 2、构造器(构造方法)注入 总结: set方法注入和构造器方法的注入&#…

基于Netty构建Websocket服务端

除了构建TCP和UDP服务器和客户端,Netty还可以用于构建WebSocket服务器。WebSocket是一种基于TCP协议的双向通信协议,可以在Web浏览器和Web服务器之间建立实时通信通道。下面是一个简单的示例,演示如何使用Netty构建一个WebSocket服务器。 项目…

构建数字化金融生态系统:云原生的创新方法

内容来自演讲:曾祥龙 | DaoCloud | 解决方案架构师 摘要 本文探讨了金融企业在实施云原生体系时面临的挑战,包括复杂性、安全、数据持久化、服务网格使用和高可用容灾架构等。针对网络管理复杂性,文章提出了Spiderpool开源项目,…

csrf自动化检测调研

https://github.com/pillarjs/understanding-csrf/blob/master/README_zh.md CSRF 攻击者在钓鱼站点&#xff0c;可以通过创建一个AJAX按钮或者表单来针对你的网站创建一个请求&#xff1a; <form action"https://my.site.com/me/something-destructive" metho…

VM进行TCP/IP通信

OK就变成这样 vm充当服务端的话也是差不多的操作 点击连接 这里我把端口号换掉了因为可能被占用报错了&#xff0c;如果有报错可以尝试尝试换个端口号 注&#xff1a; 还有一个点在工作中要是充当服务器&#xff0c;要去网络这边看下他的ip地址 拉到最后面

HarmonyOS - macOS 上搭建 鸿蒙开发环境

文章目录 安装 DevEco第一个 App1、工程基本信息设置2、安装设备3、运行工程 安装 DevEco 软件下载地址&#xff1a; https://developer.harmonyos.com/cn/develop/deveco-studio 今天我下载 DevEco Studio 3.1.1 Release - Mac 版本 解压后是一个 dmg 文件&#xff08;也不必…

Mac电脑上soucetree账户更改

在开发公司项目的时候遇到一个问题。soucetree提示需要输入已离职员工-张三的密码。 问题&#xff1a;Mac电脑使用souetree&#xff0c;拉取仓库代码提示需要输入其他员工密码。 解决&#xff1a; Mac电脑 SourceTree去掉之前的账户 1、前往文件路径 /Library/Application Su…

03-基于GEC6818开发板实现BMP图片的加载——实例分析

03-基于GEC6818开发板实现加载一张图片 实现基于GEC6818开发板实现加载一张BMP文件。其中详细解析了一张BMP格式图的内容。 其他相关GEC6818开发板的内容可以参考 01-基于粤嵌GEC6818实现屏幕的显示固定颜色进行自动切换 02-基于GEC6818开发板的画正方形、画圆的操作——使用mm…

LTO-3 磁带机种草终于是用上了

跑来跑去&#xff0c;买了不少配件&#xff0c;终于是把这磁带机给用上了&#xff0c;已经备份好了300 多 GB 的数据。 我们用了 NAS 的数据压缩功能&#xff0c;把需要备份的文件用 NAS 压缩成一个 Zip 文件&#xff0c;如果你可以 tar 的话也行。 这样传输速度更快&#xf…

【即插即用篇】YOLOv8改进实战 | 引入 Involution(内卷),用于视觉识别的新一代神经网络!涨点神器!

YOLOv8专栏导航:点击此处跳转 前言 YOLOv8 是由 YOLOv5 的发布者 Ultralytics 发布的最新版本的 YOLO。它可用于对象检测、分割、分类任务以及大型数据集的学习,并且可以在包括 CPU 和 GPU 在内的各种硬件上执行。 YOLOv8是一种尖端的、最先进的 (SOTA) 模型,它建立在以前成…

金蝶Apusic应用服务器 loadTree JNDI注入漏洞复现(QVD-2023-48297)

0x01 产品简介 金蝶Apusic应用服务器是一款企业级应用服务器,支持Java EE技术,适用于各种商业环境。 0x02 漏洞概述 由于金蝶Apusic应用服务器权限验证不当,导致攻击者可以向loadTree接口执行JNDI注入,造成远程代码执行漏洞。利用该漏洞需低版本JDK。(漏洞比较旧,8月份…