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;8while(flag[1]!=1){9critical section;flag[0]=false;remainder section;}//P1进程flag[1]=true;16while(flag[0]!=1){17critical 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资源


知识回顾与重要考点

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

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

相关文章

考研往应届考生报名流程?

文章目录: 一:考试时间相关 二:公告查询获取信息 三:提供材料 1.基本要求 2.证件要求 四:相关问题 1.报名流程如何操作 2.考点选择 2.1 应届考生考点选择 2.2 往届考生考点选择 3.预报名时间可能不同 4.档…

一种简单的自编码器PyTorch代码实现

1. 引言 对于许多新接触深度学习爱好者来说,玩AutoEncoder总是很有趣的,因为它具有简单的处理逻辑、简易的网络架构,方便可视化潜在的特征空间。在本文中,我将从头开始介绍一个简单的AutoEncoder模型,以及一些可视化潜…

Hadoop入门学习笔记——七、Hive语法

视频课程地址:https://www.bilibili.com/video/BV1WY4y197g7 课程资料链接:https://pan.baidu.com/s/15KpnWeKpvExpKmOC8xjmtQ?pwd5ay8 Hadoop入门学习笔记(汇总) 目录 七、Hive语法7.1. 数据库相关操作7.1.1. 创建数据库7.1.2…

w15初识php基础

一、计算100之内的偶数之和 实现思路 所有的偶数除2都为0 代码实现 <?php # 记录100以内的偶数和 $number1; $num0; while($number<100){if($number%20){ $num$number;}$number1; } echo $num; ?>输出的结果 二、计算100之内的奇数之和 实现思路 所有的奇数除…

【hcie-cloud】【9】华为云Stack_Deploy部署工具介绍

文章目录 前言华为云Stack Deploy简介华为云Stack Deploy工具简介华为云Stack Deploy工具部署范围华为云Stack Deploy工具节点网络要求华为云Stack Deploy工具部署流程 华为云Stack Deploy功能介绍部署工具工程场景部署流程介绍创建工程 - 基本信息填写创建工程 - 基本参数选择…

检漏继电器JJB-660/380B 柜内安装,可选新款数显型可选面板安装

JY82A检漏继电器 JY82B检漏继电器 JY82-380/660检漏继电器 JY82-IV检漏继电器 JY82-2P检漏继电器 JY82-2/3检漏继电器 JJKY检漏继电器 JD型检漏继电器 JY82-IV;JY82J JY82-II;JY82-III JY82-1P;JY82-2PA;JY82-2PB JJB-380;JJB-380/660 JD-127V/127V;JD-380V/380V; …

[Angular] 笔记 6:ngStyle

ngStyle 指令: 用于更新 HTML 元素的样式。设置一个或多个样式属性&#xff0c;用以冒号分隔的键值对指定。键是样式名称&#xff0c;带有可选的 .<unit> 后缀&#xff08;如 ‘top.px’、‘font-style.em’&#xff09;&#xff0c;值为待求值的表达式&#xff0c;得到…

从零构建tomcat环境

一、官网构建 1.1 下载 一般来说对于开源软件都有自己的官方网站&#xff0c;并且会附上使用文档以及一些特性和二次构建的方法&#xff0c;那么我们首先的话需要从官网或者tomcat上下载到我们需要的源码包。下载地址&#xff1a;官网、Github。 这里需要声明一下&#xff…

arm和x86架构服务器拉取arm64架构的docker镜像

dockerhub提供的镜像部分支持arm64架构 Docker arm架构服务器拉取docker镜像&#xff0c;默认是arm架构 # docker pull centos Using default tag: latest latest: Pulling from library/centos 52f9ef134af7: Pull complete Digest: sha256:a27fd8080b517143cbbbab9dfb7c8…

springboot实现发送邮件开箱即用

springboot实现发送邮件开箱即用 环境依赖包yml配置Service层Controller层测试 环境 jdk17 springboot版本3.2.1 依赖包 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId><ver…

C++初阶——类和对象

呀哈喽&#xff0c;我是结衣 C入门之后&#xff0c;我们就进入了C的初阶的学习了&#xff0c;在了解类和对象之前&#xff0c;我们还是先了解&#xff0c;面向过程和面向对象的初步认识。 在本篇博客中&#xff0c;我们要讲的内容有 1.面向过程和面向对象初步认识 2.类的引入 3…

DALL-E:Zero-Shot Text-to-Image Generation

DALL-E 论文是一个文本生成图片模型。 训练分为两个阶段 第一阶段&#xff0c;训练一个dVAE&#xff08;discrete variational autoencoder离散变分自动编码器&#xff09;&#xff0c;其将256 x 256的RGB图片转换为32 x 32的图片token。目的&#xff1a;降低图片的分辨率。图…