【操作系统】进程同步与进程互斥

news2024/12/24 13:06:52

在这里插入图片描述

🐌个人主页: 🐌 叶落闲庭
💨我的专栏:💨
c语言
数据结构
javaEE
操作系统
Redis

石可破也,而不可夺坚;丹可磨也,而不可夺赤。


进程同步与进程互斥

  • 一、什么是进程同步
  • 二、什么是进程互斥
  • 三、 进程互斥的软件实现方法
    • 3.1 单标志法
    • 3.2 双标志先检查
    • 3.3 双标志后检查
    • 3.4 Peterson 算法
  • 四、 进程互斥的硬件实现方法
    • 4.1 中断屏蔽法
    • 4.2 TestAndSet(TS指令/TSL指令)
    • 4.3 Awap指令(XCHG指令)

一、什么是进程同步

进程具有异步性的特征。异步性是指,各并发执行的进程以各自独立的、不可预知的速度向前推进。
读进程和写进程并发地运行,由于并发必然导致异步性,因此“数据”和“读数据”两个操作执行的先后顺序是不确定的。而实际应用中,又必须按照“写数据→读数据”的顺序来执行的,如何解决这种异步问题,就是“进程同步”所讨论的内容。
同步亦称直接制约关系,它是指为完成某种任务而建立的两个或多个进程,这些进程因为需要在某些位置上协调它们的工作次序而产生的制约关系。进程间的直接制约关系就是源于它们之间的相互合作。

二、什么是进程互斥

  • 进程的“并发”需要“共享”的支持。各个并发执行的进程不可避免的需要共享一些系统资源(比如内存,又比如打印机、摄像头这样的/O设备)
  • 互斥共享方式:
    • 系统中的某些资源,虽然可以提供给多个进程使用,但一个时间段内只允许一个进程访问该资源
  • 同时共享方式:
    • 系统中的某些资源,允许一个时间段内由多个进程“同时”对它们进行访问
  • 我们把一个时间段内只允许一个进程使用的资源称为临界资源。许多物理设备(比如摄像头、打印机)都属于临界资源。此外还有许多变量、数据、内存缓冲区等都属于临界资源。
  • 对临界资源的访问,必须互斥地进行,互斥,亦称间接制约关系。进程互斥指当一个进程访问某临界资源时,另一个想要访问该临界资源的进程必须等待。当前访问临界资源的进程访问结束,释放该资源之后,另一个进程才能去访问临界资源。
do {
	entry section;		//进入区
	critical section;	//临界区
	exit section;		//退出区
	remainder section;	//剩余区
} while (true)
  • 注意:
    • 临界区是进程中访问临界资源的代码段
    • 进入区和退出区是负责实现互斥的代码段
    • 临界区也可称为“临界段”

三、 进程互斥的软件实现方法

3.1 单标志法

  • 算法思想:两个进程在访问完临界区后会把使用临界区的权限转交给另一个进程。也就是说每个进程进入临界区的权限只能被另一个进程赋予。
int turn = 0;	//turn表示当前允许进入临界区的进程号

P0进程:

while (turn != 0);	//①进入区
critical section;	//②临界区
turn= 1;			//③退出区
remainder section;	//④剩余区

P1进程:

while (turn!= 1);	//⑤进入区
critical section;	//⑥临界区
turn= 0;			//⑦退出区
remainder section;	//⑧剩余区

turn的初值为0,即刚开始只允许0号进程进入临界区。
若P1先上处理机运行,则会一直卡在⑤。直到P1的时间片用完,发生调度,切换P0上处理机运行。
代码①不会卡住P0,P0可以正常访问临界区,在P0访问临界区期间即使切换回P1,P1依然会卡在⑤。
只有P0在退出区将turn改为1后,P1才能进入临界区。

  • 因此,该算法可以实现“同一时刻最多只允许一个进程访问临界区”
  • 只能按P0→P1→P0→P1→…这样轮流访问。这种必须“轮流访问”带来的问题是,如果此时允许进入临界区的进程是P0,而P0一直不访问临界区,那么虽然此时临界区空闲,但是并不允许P1访问。
  • 因此,单标志法存在的主要问题是:违背“空闲让进”原则

3.2 双标志先检查

  • 算法思想:设置一个布尔型数组ag,数组中各个元素用来标记各进程想进入临界区的意愿,比如“flag[0]=true”意味着0号进程P0现在想要进入临界区。每个进程在进入临界区之前先检查当前有没有别的进程想进入临界区,如果没有,则把自身对应的标志flag[i]设为true,之后开始访问临界区。
bool flag[2];		//表示进入临界区意愿的数组
flag[0] = false;
falg[1] = false;	//刚开始设置为两个进程都不想进入临界区

P0进程:

while (falg[1]);	//①
falg[0] = true;		//②
critical section;	//③
flag[0] = false;	//④
remainder section;	

P1进程:

while (flag[0]);	//⑤	如果此时P0想进入临界区,P1就一直循环等待
flag[1] = true;		//⑥	标记为P1进程想要进入临界区
critical section;	//⑦	访问临界区
flag[1] = false;	//⑧	访问完临界区,修改标记为P1不想使用临界区
remainder section;
  • 若按照①⑤②⑥③⑦.…的顺序执行,P0和P1将会同时访问临界区。
  • 因此,双标志先检查法的主要问题是:违反“忙则等待”原则。(原因在于,进入区的“检查”和“上锁”两个处理不是一气呵成的。“检查”后,“上锁”前可能发生进程切换。)

3.3 双标志后检查

  • 算法思想:双标志先检查法的改版。前一个算法的问题是先“检查”后“上锁”,但是这两个操作又无法一气呵成,因此导致了两个进程同时进入临界区的问题。因此,人们又想到先“上锁”后“检查”的方法,来避免上述问题。
bool flag[2];		//表示进入临界区意愿的数组
flag[0] = false;
falg[1] = false;	//刚开始设置为两个进程都不想进入临界区

P0进程:

falg[0] = true;		//①
while (falg[1]);	//②
critical section;	//③
flag[0] = false;	//④
remainder section;	

P1进程:

flag[1] = true;		//⑤	标记为P1进程想要进入临界区
while (flag[0]);	//⑥	如果此时P0想进入临界区,P1就一直循环等待
critical section;	//⑦	访问临界区
flag[1] = false;	//⑧	访问完临界区,修改标记为P1不想使用临界区
remainder section;
  • 若按照①⑤②⑥.的顺序执行,P0和P1将都无法进入临界区
  • 因此,双标志后检查法虽然解决了“忙则等待”的问题,但是又违背了“空闲让进”和“有限等待”原则,会因各进程都长期无法访问临界资源而产生“饥饿”现象。

3.4 Peterson 算法

  • 算法思想:结合双标志法、单标志法的思想。如果双方都争着想进入临界区,那可以让进程尝试“孔融让梨”(谦让),做一个有礼貌的进程。
bool flag[2];	//表示进入临界区意愿的数组,初始值都是false
int turn = 0;	//turn 表示优先让哪个进程进入临界区

P0进程:

flag[0] = true;
turn = 1;
while (flag[1] && turn == 1);
cirtical section;
flag[0] = false;
remainder section;

P1进程:

flag[1] = true;
turn = 0;
while (flag[0] && turn == 0);
cirtical section;
flag1] = false;
remainder section;
  • Peterson算法用软件方法解决了进程互斥问题,遵循了空闲让进、忙则等待、有限等待三个原测,但是依然未遵循让权等待的原则

四、 进程互斥的硬件实现方法

4.1 中断屏蔽法

  • 利用“开/关中断指令”实现(与原语的实现思想相同,即在某进程开始访问临界区到结束访问为止都不允许被中断,也就不能发生进程切换,因此也不可能发生两个同时访问临界区的情况)
  • 优点:简单、高效
  • 缺点:不适用于多处理机;只适用于操作系统内核进程,不适用于用户进程(因为开/关中断指令只能运行在内核态,这组指令如果能让用户随意使用会很危险)

4.2 TestAndSet(TS指令/TSL指令)

  • 简称TS指令,也有地方称为TestAndSetLock指令,或TSL指令
  • TSL指令是用硬件实现的,执行的过程不允许被中断,只能一气呵成。
  • 若刚开始lock是false,则TSL返回的old值为false,while循环条件不满足,直接跳过循环,进入临界区。若刚开始lock是true,则执行TLS后old返回的值为true,while循环条件满足,会一直循环,直到当前访问临界区的进程在退出区进行“解锁”
  • 相比软件实现方法,TS指令把“上锁”和“检查”操作用硬件的方式变成了一气呵成的原子操作。
  • 优点:实现简单,无需像软件实现方法那样严格检查是否会有逻辑漏洞;适用于多处理机环境
//布尔型共享变量lock表示当前临界区是否被加锁
//true表示已加锁,false表示未加锁
bool TestAndSet (bool *lock) {
	bool old;
	old = *lock;	//old用来存放lock原来的值
	*lock = true;	//无论之前是否已加锁,都将lock设为true
	return old;		//返回lock原来的值
}
//以下是使用TSL指令实现互斥的算法逻辑
while (TestAndSet (&lock)) {	//上锁并检查
	//临界区代码段...
	lock = false;	//解锁
	//剩余区代码段...
}
  • 缺点:不满足“让权等待”原则,暂时无法进入临界区的进程会占用CPU并循环执行TSL指令,从而导致“忙等”。

4.3 Awap指令(XCHG指令)

  • 有的地方也叫Exchange指令,或简称XCHG指令。
  • Swap指令是用硬件实现的,执行的过程不允许被中断,只能一气呵成。
//Swap指令的作用是交换两个变量的值
Swap(bool *a,bool *b) {
	bool temp = *a;
	*a = *b;
	*b = temp;
}
//以下是用Swap指令实现互斥的算法逻辑
//lock表示当前临界区是否被加锁
bool old = true;
while (old == true) 
Swap(&lock,&old);
//临界代码段...
lock = false;
//剩余代码段...
  • 逻辑上来看Swap和TSL并无太大区别,都是先记录下此时临界区是否己经被上锁(记录在old变量上),再将上锁标记Iock设置为true,最后检查old,如果old为false则说明之前没有别的进程对临界区上锁,则可跳出循环,进入临界区。
  • 优点:实现简单,无需像软件实现方法那样严格检查是否会有逻辑漏洞;适用于多处理机环境
  • 缺点:不满足“让权等待”原则,暂时无法进入临界区的进程会占用CPU并循环执行TSL指令,从而导致“忙等”。

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

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

相关文章

RabbitMQ-主题模式

接上文 RabbitMQ-发布订阅模式和路由模式 1 主题模式 #通配符 代表0个或多个。*通配符 代表 1个或多个 进行测试,修改配置文件 Configuration public class RabbitConfiguration {Bean("topicExchange") //这里使用预置的Topic类型交换机public Exchan…

深度学习(3)---PyTorch中的张量

文章目录 一、张量简介与创建1.1 简介1.2 张量的创建 二、张量的操作2.1 张量的拼接与切分2.2 张量索引 三、张量的数学运算 一、张量简介与创建 1.1 简介 1. 张量是一个多维数组,它是标量、向量、矩阵的高维拓展。 2. 在张量的定义中,方括号用于表示张…

智慧公厕是什么?

随着城市化进程的不断加速,公共厕所作为城市基础设施之一,也在不断进行着前所未有的变革。智慧公厕作为新一代的公共厕所形式,旨在提供更便捷、舒适、卫生的使用体验,不仅仅是个人使用需求的满足,更是城市文明程度和城…

山西电力市场日前价格预测【2023-10-05】

日前价格预测 预测说明: 如上图所示,预测明日(2023-10-05)山西电力市场全天平均日前电价为363.87元/MWh。其中,最高日前电价为649.89元/MWh,预计出现在18: 45。最低日前电价为291.58元/MWh,预计…

实验三十四、串联型稳压电路参数的选择

一、题目 电路如图1所示。已知输入电压为 50 Hz 50\,\textrm{Hz} 50Hz 的正弦交流电,来源于电源变压器副边;输出电压调节范围为 5 ∼ 20 V 5\sim20\,\textrm V 5∼20V,满载为 0.5 A 0.5\,\textrm A 0.5A; C 3 C_3 C3​ 为消振…

【itext7】使用itext7将多个PDF文件、图片合并成一个PDF文件,图片旋转、图片缩放

这篇文章,主要介绍使用itext7将多个PDF文件、图片合并成一个PDF文件,图片旋转、图片缩放。 目录 一、itext7合并PDF 1.1、引入依赖 1.2、合并PDF介绍 1.3、采用字节数组方式读取PDF文件 1.4、合并多个PDF文件 1.5、合并图片到PDF文件 1.6、旋转图…

LVGL_基础控件label

LVGL_基础控件label 1、创建一个基础对象 /* 创建一个基础对象 label */ lv_obj_t * label lv_label_create(lv_scr_act()); // 创建一个label部件(对象),他的父对象是活动屏幕对象2、设置显示内容 char * text "www.100ask.net"; // 要显示的文字 /* 展示文…

K8S网络原理

文章目录 一、Kubernetes网络模型设计原则IP-per-Pod模型 二、Kubernetes的网络实现容器到容器的通信Pod之间的通信同一个Node内Pod之间的通信不同Node上Pod之间的通信 CNI网络模型CNM模型CNI模型在Kubernetes中使用网络插件 开源的网络组件FlannelFlannel实现图Flannel特点 Op…

视频批量剪辑工具,自定义视频速率,批量剪辑工具助力创意无限”

在视频制作的世界里,每一个细节都至关重要。今天,让我们来探索一项强大且创新的功能——自定义视频速率。利用它,你可以轻松地调整视频播放速度,赋予你的作品独特的个性和风格。 首先第一步,我们要打开好简单批量智剪…

智慧公厕有什么?

智慧公厕作为一种新形态的公共厕所,把智慧化的技术融入到公共厕所的日常使用与管理当中,赋予公共厕所更良好的信息化、数字化、科技化、联网化。 那么,智慧公厕有什么?本文从设施、技术、服务三方面进行快速了解。 首先&#xf…

vue实现轮播图详解

vue实现轮播图详解 目录 vue实现轮播图详解1 引言2 vue实现轮播图2.1 Vant组件引入2.1.1 vant组件引入2.2.2 使用van-swipe组件 2.2 vue代码实现2.2.1 功能需求2.2.2 实现思路2.2.3 代码实现2.2.4 实现效果 3 总结 1 引言 在互联网日渐内卷的情况下,越来越注重用户…

【重拾C语言】四、循环程序设计(后判断条件循环、先判断条件循环、多重循环;典例:计算平均成绩、打印素数、百钱百鸡问题)

目录 前言 四、循环程序设计 4.1 计算平均成绩——循环程序 4.1.1 后判断条件的循环 a. 语法 b. 典例 4.1.2 先判断条件的循环 a. 语法 b. 典例 4.1.3 for语句 a. 语法 b. 典例 4.2 计算全班每人平均成绩—多重循环 4.2.1 打印100以内素数 4.2.2 百钱百…

批量png图片格式转eps格式

问题描述: 在利用Latex排版论文格式时,当插入图片的格式要求为eps格式 ,当然也适用于其它文件格式转换 解决方法: 推荐一格好用的免费在线格式转换工具:https://cdkm.com/cn/ 操作步骤: step1:打开网址 ste…

Access注入---Cookie注入

Access注入----Cookie注入Access数据库(微软) 逐渐淘汰 (没有库的概念,是表的集合)Access没有系统自带库Cookie注入(头注入HEAD注入的)php中产生Cookie注入的可能性小,但ASP产生Cook…

CCF CSP认证 历年题目自练Day21

题目一 试题编号: 201909-1 试题名称: 小明种苹果 时间限制: 2.0s 内存限制: 512.0MB 题目分析(个人理解) 先看输入,第一行输入苹果的棵树n和每一次掉的苹果数m还是先如何存的问题&#xf…

船用法兰铸钢止回阀

声明 本文是学习GB-T 586-2015 船用法兰铸钢止回阀. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本标准规定了法兰连接尺寸和密封面按 CB/T 4196、GB/T 2501 的船用法兰铸钢止回阀(以下简 称止回阀)的分类和标记、要求、试验方法、检验规…

计算机竞赛 行人重识别(person reid) - 机器视觉 深度学习 opencv python

文章目录 0 前言1 技术背景2 技术介绍3 重识别技术实现3.1 数据集3.2 Person REID3.2.1 算法原理3.2.2 算法流程图 4 实现效果5 部分代码6 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 深度学习行人重识别(person reid)系统 该项目…

RabbitMQ-第四种交换机类型

接上文 RabbitMQ-主题模式 1 第四种交换机类型 header:它是根据头部信息来决定的,在我们发送的消息中是可以携带一些头部信息的,类似与HTTP,我们可以根据这些头部信息来决定路由到哪一个消息队列中。 修改配置类内容 Configuration public…

win10自动更新后vpn不能使用

win10自动更新后vpn连接报错:不能建立到远程计算机的连接,请更改网络设置。 查看事件查看器: 错误日志如下: CoId{7E9C11AE-F6AF-0000-BC96-9C7EAFF6D901}: 用户 win10\myname 已进行名为 vpn1 的拨号连接,该连接已失…

写一个宏,可以将一个整数的二进制位的奇数位和偶数位交换。

题目要求: 写一个宏,可以将一个整数的二进制位的奇数位和偶数位交换。 思考内容: 怎么确定一个二进制数位的奇数位和偶数位?且这个位上的是0还是1? 假设: 数字 13 的二进制数位 0000 0000 0000 0000 0000 0000 00…