进程互斥的软件实现方法-第二十六天

目录

前言

单标志法(谦让)

双标志先检查法(表达意愿)

双标志后检查法(表达意愿)

Peterson算法(集大成者)

本节思维导图


前言

        单标志法、双标志的先后检查法中,如果单个进程能一气呵成的执行完是没有问题的,但是如果出现进程切换的问题就会导致它们产生问题

单标志法(谦让)

谦让

基本思想:两个进程在访问完临界区后会把适用临界区的权限转交给另一个进程,即每个进程进入临界区的权限只能被另一个进程赋予

int turn = 0; //表示当前允许进入临界区的进程号//P0进程
while (turn != 0)①   //进入区
critical section;②   //临界区
turn = 1;        ③   //退出区
remainer section;④   //剩余区//P1进程
while(true != 1)  ⑤   //进入区
ctritical section;⑥   //临界区
true = 0;         ⑦   //退出区
remainder section;⑧   //剩余区

解释:trun初始值为0,即刚开始只允许P0进程进入临界区。若P0进程分配的时间片用完,P1进程要上处理机运行,则它会一直停留在⑤,直到分配给P1的时间片耗尽,然后又切换P0上处理机运行。只有在P0在退出区将true改为1后,P1才能进入临界区

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

缺点:违反“空闲让进”原则(只能按p0->p1->p0->p1->...这样轮流访问,这就会导致如果此时允许进入临界区的进程是p0,而p0一直不访问临界区,,那么虽然此临界区空闲,但是并不允许p1访问)

双标志先检查法(表达意愿)

表达意愿

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

bool flag[2];      //表示进入临界区意愿的数组
flag[0] = false;   
flag[1] = false;   //初始时两进程都不想进入临界区//P0进程
while(flag[1]);  ① //P0进程检查P1进程是否要访问临界区,如果对方不想访问就就进行②
flag[0] = true;  ② //P0进程将自己的意愿修改为true"上锁",此时P1进程就循环等待
critical section;③ //P0进程访问临界区
flag[0] = flase; ④ //P0进程完成对临界区的访问"解锁"
remainder section;//P1进程
while(flag[0]);  ⑤ //P1进程检查P0进程是否要访问临界区,如果对方不想访问就就进行⑥
flag[1] = true;  ⑥ //P1进程将自己的意愿修改为true"上锁",此时P0进程就循环等待
critical section;⑦ //P1进程访问临界区
flag[1] = flase; ⑧ //P1进程完成对临界区的访问"解锁"
remainder section;

缺点:违反”忙则等待“原则(如果两个进程并发执行,当P0进程执行完①还未执行②时时间片用完,切换至P1进程执行⑤但是P1进程执行完⑤未执行⑥时时间片也用完,然后重新切换至P0进程执行②,此时P0进程的意愿被改变为true,然后再切换至P1进程执行⑥,此时P1进程的意愿也被改为true,然后可能暂时不发生进程切换而是进入临界区,但是P1进程在访问临界区过程中又发生了进程切换此时P0进程也进入临界区访问资源,这就会导致P0与P1进程会同时访问临界区,这是不对的)

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

双标志后检查法(表达意愿)

表达意愿

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

bool flag[2];      //表示进入临界区意愿的数组
flag[0] = false;   
flag[1] = false;   //初始时两进程都不想进入临界区//P0进程
flag[0] = true;  ① //P0进程将自己的意愿修改为true"上锁",此时P1进程就循环等待
while(flag[1]);  ② //P0进程检查P1进程是否要访问临界区,如果对方不想访问就就进行③
critical section;③ //P0进程访问临界区
flag[0] = flase; ④ //P0进程完成对临界区的访问"解锁"
remainder section;//P1进程
flag[1] = true;  ⑤ //P1进程将自己的意愿修改为true"上锁",此时P0进程就循环等待
while(flag[0]);  ⑥ //P1进程检查P0进程是否要访问临界区,如果对方不想访问就就进行⑦
critical section;⑦ //P1进程访问临界区
flag[1] = flase; ⑧ //P1进程完成对临界区的访问"解锁"
remainder section;

优点:解决了”忙则等待“原则

缺点:违反了”空闲让进“和”有限等待“原则(如果由于进程切换导致要按照①⑤②⑥...的顺序执行那么两个进程都长期无法访问临界资源而产生“饥饿”现象)

Peterson算法(集大成者)

表达意愿 + 谦让

基本思想:结合单标志法、双标志的先后表示法的思想,如果双方都争着想要进入临界区,那可以让进程尝试“谦让”

bool flag[2];   //表示进入临界区意愿的数组,初始值均为false,表达“意愿”
int turn = 0;   //turn表示优先让哪个进程进入临界区,表达“谦让”//P0进程
flag[0] = true;             ①   //主动争取,将自己的意愿改为true
turn = 1;                   ②   //主动谦让,将先优先执行进程设置为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;

解释:对于一气呵成的P0进程,P0进程将自己的意愿修改为true,然后将turn修改为P1进程表示自己的谦让,然后再检查“P1进程是否想要使用并且自己也表示了谦让”如果是那么P0进程就循环等待,如果不是那么P0进程就访问临界区最后再将自己的意愿设置为false

谁最后说了“客气话”,谁就失去了行动的优先权

优点:遵循了“空闲让进”、“忙则等待”、“优先等待”三个原则(如果按照①⑥②⑦⑧③...的顺序并发的执行进程:初始turn=0,P0进程修改意愿为true,P1进程也修改意愿为true,P0进程主动谦让将turn改为1表示让P1进程先执行,然后P1进程也主动谦让将turn改为0表示让P0进程先执行,接着P1进程检查发现“P0进程有执行的意愿并且我(P1)也表示了谦让让P0进程先执行”,所以P1进程就会进入循环等待,然后P0进程检查时就会发现“P1进程虽然也有执行的意愿但是P1进程表示了谦让让我(P0)先执行”,也就是说我(P0)就可以向下单独的访问临界区,即使再次切换至P1进程也只是在循环而不会进入临界区,直到我(P0)结束访问临界区后将自己的意愿改为false,P1进程在检查时才会跳出循环区访问临界区)

缺点:未遵循“让权等待”原则(当进程无法进入临界区,就立即释放处理机资源,令该进程下CPU,但是该算法是让该进程依然位于处理机上循环等待)

本节思维导图

~over~

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

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

相关文章

【Java】SpringBoot快速整合WebSocket实现客户端服务端相互推送信息

目录 什么是webSocket? webSocket可以用来做什么? WebSocket操作类 一:测试客户端向服务端推送消息 1.启动SpringBoot项目 2.打开网站 3.进行测试消息推送 4.后端进行查看测试结果 二:测试服务端向客户端推送消息 1.接口代码 2.使…

48、激活函数 - 梯度消失和梯度爆炸

简单介绍下梯度消失和梯度爆炸,这个不是重点,但是我觉得有必要再深入了解这个概念,以及很多激活函数为什么是可以防止梯度消失的。 梯度消失和梯度爆炸实际上是在神经网络训练过程中经常会遇到的两类问题,这两类问题都与梯度有关。 什么是梯度 在神经网络训练中,梯度是指…

ALSA学习(5)——设备中的alsa

参考博客: https://blog.csdn.net/DroidPhone/article/details/7165482 (一下内容基本是原博主的博客转载) 文章目录 一、ASOC的由来二、硬件架构三、软件架构四、数据结构五、内核对ASoC的改进 一、ASOC的由来 ASoC–ALSA System on Chip …

08-接口文档管理工具-项目集成knife4j__ev

2、knife4j快速入门 2.1 knife4j介绍 knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案,前身是swagger-bootstrap-ui,取名kni4j是希望它能像一把匕首一样小巧,轻量,并且功能强悍! gitee地址:knife4j: Knife4j是一个集Swagger2 和 OpenAPI3为一体的增…

基于图神经网络的动态物化视图管理

本期 Paper Reading 主要介绍了发布于 2023 年 ICDE 的论文《Dynamic Materialized View Management using Graph Neural Network》,该文研究了动态物化视图管理问题,提出了一个基于 GNN 的模型。在真实的数据集上的实验结果表明,取得了更高的…

SPI通信

SPI通信 1、SPI通信概述 SPI(Serial peripheral interface)是一种同步、串行、全双工、总线制、主从工作方式。 有四线控制: SDO——主设备数据输出,从设备数据输入,对于MOSI output slave inputSDI——主设备数据输入,从事设备…

mapboxgl 中给地图添加遮罩蒙版,并不遮罩其中一块区域

文章目录 概要效果预览技术思路技术细节小结 概要 本篇文章主要是给一整块地图添加遮罩层蒙版,但是不遮罩其中一个区域,以反向高亮地区内容。 效果预览 技术思路 这里要实现某个区域反显高亮,需要这个区域的边界json文件,与ech…

CodeWhisperer:编码世界中的声音启迪者

人烟 导语: 在数字化时代,编码已经成为了一种不可或缺的技能。而 CodeWhisperer(编码世界中的声音启迪者)则以其卓越的技术和深厚的知识为人们带来了独特的启发和指导。本文将介绍 CodeWhisperer 的背景和成就,探讨他是…

在 Android 手机上从SD 卡恢复数据的 6 个有效应用程序

如果您有 Android 设备,您可能会将个人和专业的重要文件保存在设备的 SD 卡上。这些文件包括照片、视频、文档和各种其他类型的文件。您绝对不想丢失这些文件,但当您的 SD 卡损坏时,数据丢失是不可避免的。 幸运的是,您不需要这样…

web等保评测需要实机查看的操作系统、服务器、数据库和应用部分

“等保测评”全称是信息安全等级保护测评。是经公安部认证的具有资质的测评机构,依据国家信息安全等级保护规范规定,受有关单位委托,按照有关管理规范和技术标准,对信息系统安全等级保护状况进行检测评估的活动。 本文陆续将遇到的…

buildadmin实现多级关联下拉效果

文章目录 最终效果开始重新渲染组件编辑渲染完结 最终效果 开始 popupForm.vue代码 <FormItem :label"t(interior.interiorApply.interior_index_id)" type"remoteSelect"v-model"baTable.form.items!.interior_index_id" prop"interi…

12.29最小生成数K算法复习(注意输入输出格式),校园最短路径(通过PRE实现路径输出,以及输入输出格式注意)

7-2 最小生成树-kruskal算法 分数 15 const int maxn 1000; struct edge {int u, v, w; }e[maxn]; int n, m, f[30]; bool cmp(edge a, edge b) {return a.w < b.w; } int find(int x) {if (f[x] x) {return x;}else {f[x] find(f[x]);return f[x];} } //int arr[100…

linux调试笔记

文章目录 基本启动调试与附加进程断点程序运行控制tui模式查看堆栈与变量监视变量多线程调试 扩展自定义跳转命令解析自定义类型禁用动态库自动加载设置源码路径断点时执行命令gdbserver远程调试 gdb脚本QtCreator调试Linux下处理编译、运行时的一些问题undefined symbol问题-n…

大数据Doris(四十六):物化视图查询改写和适用场景

文章目录 物化视图查询改写和适用场景 一、查询改写

在Centos7中利用Shell脚本:实现MySQL的数据备份

目录 自动化备份MySQL 一.备份数据库脚本 1.创建备份目录 2.创建脚本文件 3.新建配置文件&#xff08;连接数据库的配置文件&#xff09; 4.给文件权限(mysql_backup.sh) ​编辑 5.执行命令 (mysql_backup.sh) ​编辑 二.数据库通过备份恢复 1.创建脚…

前端 js 基础(1)

js 结果输出 &#xff08;点击按钮修改文字 &#xff09; <!DOCTYPE html> <html> <head></head><body><h2>Head 中的 JavaScript</h2><p id"demo">一个段落。</p><button type"button" onclic…

腾讯今年的校招薪资。。。

昨天文章&#xff1a;《龙年红包封面的领取步骤&#xff0c;目前每个账号只能领取一个》。 在网上查了一下腾讯今年的校招薪资&#xff0c;这里主要以技术类为主&#xff0c;比如后端&#xff0c;前端&#xff0c;算法等。基本上都是20k以上&#xff0c;最高的看到有一个29k的&…

功能真强大!5个令人惊叹的 Jupyter 黑科技

Jupyter 是一种功能强大的交互式计算环境&#xff0c;被广泛应用于数据分析、机器学习、科学计算等领域。 除了常见的基本功能外&#xff0c;Jupyter还隐藏着许多令人惊叹的黑科技&#xff0c;这些功能可以帮助用户更高效地完成工作&#xff0c;提升工作体验。 在本文中&…

算法训练营Day34(贪心算法)

1005.K次取反后最大化的数组和 1005. K 次取反后最大化的数组和 - 力扣&#xff08;LeetCode&#xff09; 秒了 class Solution {public int largestSumAfterKNegations(int[] nums, int k) {Arrays.sort(nums);// -4 -3 -2 -1 5//-2 -2 0 2 5int last -1;for(int i 0;i<…

Qt+Opencv:人脸检测

话接上一篇&#xff0c;我们仍使用在上篇《QtOpencv&#xff1a;Qt中部署opencv》创建的Qt项目来测试opencv提供的sample。 在正式开始本篇之前&#xff0c;我们先说做一下准备工作&#xff1a; 一、opencv官方文档 学习最权威和最可靠的方式&#xff0c;就是阅读官方文档和…