第3章-进程同步、互斥与信号量(4)

news2024/9/27 17:33:48

进程同步、互斥与信号量

0 引言

操作系统的并发进程有些是独立的,有些需要相互协作。独立的进程在系统中执行时不受其他进程的影响,而另一些进程需要与其他进程共享数据,来完成共同的任务,这些进程之间具有协作关系。但我们要保证这种协作的时间顺序性,以便于让进程正常运行。
在单处理机多道程序环境系统中,进程表现出并发的特征,在一段时间内交替的对进程进行切换执行,但由于并发执行的进程之间的相对速度不可预测,即不确定性,取决于其他进程的活动、操作系统的调度策略等。因此我们保证进程同步,让进程的事件存在某种时序关系下运行。

1 进程同步与互斥

1.1 进程之间的协作关系(互斥、同步、通信)

互斥:多个进程不能同时使用同一资源。
同步:指多个进程中发生的事件存在着某种时序关系,它们必须按规定时序执行,以共同完成一项任务。
进程通信:是指多个进程之间要传递一定量的信息。

1.2 临界资源与临界区

临界资源:某段时间内仅允许一个进程使用的资源。
临界区:每个进程中访问临界资源的那段代码。

例:P1,P2两进程共享变量COUNT(COUNT的初值为5)

P1:{
R1=COUNT;
R1=R1+1;
COUNT=R1;}

P2:{
R2=COUNT;
R2=R2+1;
COUNT=R2;}

分析:
1》执行顺序P2→P1
执行结果:
P1:COUNT为7,
P2:COUNT为6。
2》两个进程交替
执行顺序:
P1:{R1=COUNT}
P2:{R2=COUNT}
P1:{R1=R1+1;COUNT=R1}
P2:{R2=R2=1;COUNT=R2}
执行结果
P1:COUNT为6,
P2:COUNT为6。
可以看出两种不同执行顺序的执行结果不同。并且COUNT是一个临界资源,P1和P2的两个程序段是临界区。为了保证进程能够互斥对临界资源进行访问,我们需要在P1和P2的前面判断临界资源是否空闲,以此来判断进程能否进入临界区(即执行访问资源的那段代码)来实现进程互斥。

用Bernstein条件考察
R(P1)={R1,COUNT}   W(P1)={R1,COUNT}
R(P2)={R2,COUNT}   W(P2)={R2,COUNT}
R(P1)∩W(P2)≠{}
P1、P2不符合Bernstein条件,必须对程序的执行顺序施加某种限制。
在这里插入图片描述

1.3 临界资源进入准则

(1)空闲让进:临界资源空闲时,允许进程进入临界区。
(2)忙则等待:临界资源被访问时,其他想进入临界区的进程必须等待。
(3)有限等待:需要访问临界资源的进程,因保证在有效时间内进入,避免进入死等状态。
(4)让权等待:当进程不能进入临界区时,应当立即释放处理机,避免让其他进程死等。

2 进程互斥的实现

2.1 硬件方法

为了解决进程互斥进入临界区的问题,采用硬件实现主要有两种:禁止中断专用机器指令
禁止中断:通过系统的内核开启、禁止中断来实现。
专用机器指令:
(1)TS(Test and Set)指令

/TS指令:
booleanTS(lock);
booleanlock;
{     
booleantemp;
 temp=lock;
lock=true;
returntemp;}

//TS指令的使用
while(TS(lock)) 
/*什么也不做*/;
临界区;
lock = false;
剩余区;

Lock有两种状态:1)当lock=false时,表示资源空闲;2)当lock=true时,表示资源正在被使用。为了实现互斥,设布尔变量lock,其初值为false,表示资源空闲。利用TS指令实现互斥。缺点:没有做到:“让权等待”。
(2)Swap指令
Swap指令是交换两个字节的内容来实现进程互斥。

//Swap指令
void Swap(a,b);
boolean a,b;
{     boolean temp;
temp=a;
a=b;
b=temp;
}

Swap指令的使用
key=true;
do{
Swap(lock,key);
}while(key);
临界区;
lock=false;
剩余区;

利用Swap指令实现进程互斥算法,为每个临界资源设置一个全局布尔变量lock,初始值为false,每个进程设置一个局部变量key,然后进入区利用Swap指令交换lock与key的内容,循环检查key的状态,知道进程进入临界区。

2.2 软件方法

(1)单标志算法

//进程P0
while (turn!=0) 
//什么都不做;
临界区;
turn =1;
剩余区;

//进程P1
while (turn!=1) 
//什么都不做‘;
临界区;
turn =0;
剩余区;

设置公共整型变量turn,用于指示进入临界区的进程编号i(i=0,1)。当turn=0时,进程P0跳出while循环,进入临界区,在退出区将turn该为1,则进程P1跳出循环,进入临界区,循环往返使P0、P1轮流访问临界资源。缺点:强制性轮流进入临界区,不能保证“空闲让进”。
(2)双标志、先检查算法

//进程P0
while (flag[1])
//什么都不做;
flag[0]=true;
临界区;
flag[0] =false;
剩余区;

//进程P1
while ( flag[0]) 
//什么都不做;
flag[1]=true;
临界区;
flag[1] =false;
剩余区;

设置数组flag,初始时设每个元素为false,表示所有进程都未进入临界区。若flag[i]=true,表示进程进入临界区执行。在每个进程进入临界区时,先查看临界资源是否被使用,若正在使用,该进程等待,否则才可进入。解决了“空闲让进”问题。缺点:可能同时进入临界区,不能保证“忙则等待”如果先执行while (flag[1]),跳过进程P0的循环,然后再执行while ( flag[0]) ,跳过进程P1的循环,使两个进程同时进入临界区),主要问题先检查后修改导致的。
(3)双标志、先修改后检查算法

//进程P0
flag[0]=true;
while (flag[1])
//什么也不做;
临界区;
flag[0] =false;
剩余区;

//进程P1
flag[1]=true;
while (flag[0])
//什么也不做;
临界区;
flag[1] =false ;
剩余区;

两进程先后同时作flag[i]=true;
缺点:保证了不同时进入临界区,但又可能都进不去。不能保证“有空让进”。(如果先执行flag[0]=true;,使得P1进入循环状态,然后再执行flag[1]=true;,使得P0进入循环状态,最终两个进程都进不去临界区
(4)先修改、后检查、后修改算法

//进程P0
flag[0]=true;
turn=1;
while (flag[1]) && (turn==1)
//什么也不做;
临界区;
flag[0] =false ;
剩余区;

//进程P1
flag[1]=true;
turn=0;
while (flag[0]) && (turn==0)
//什么也不做;
临界区;
flag[1] =false ;
剩余区;

保证了“有空让进”和“忙则等待”。

3 信号量和PV操作

3.1 信号量的定义

1965年,荷兰学者Dijkstra提出了信号灯机制,卓有成效地解决了进程同步问题。
记录型信号灯的定义:

(1)定义记录型信号量数据结构。
struct semaphore{
	int value;  //定义资源数的标识
	struct PCB*queue; //等待队列
} 

(2)wait 原语:请求一个资源(P 操作)
void wait(semaphore s){   
	s.value = s.value -1;  占用一个资源
	if(s.value < 0)
		block(s.queue); 
 /* 将进程阻塞,并将其投入等待队列s.queue */
 }
 
(3)signal 原语:释放一个资源(V 操作)
void signal(semaphore s){  
	s.value = s.value + 1;//释放一个资源
	if(s.value <= 0)
  		wackup(s.queue);      
  /* 唤醒阻塞进程,将其从等待队列s.queue 取出,投入就绪队列*/
  }
  
//s.value的初值表示系统中某种资源数目。
//wait(s)表示要申请一个资源。
//signal(s)表示要释放一个资源。
//s.value <0时,|s.value|表示等待队列的进程数。

3.2 用信号灯(信号量)解决互斥问题

semaphoremutex=1;
P1:
	while (1){
		P(mutex);
		临界区;
		V(mutex);
		剩余区;
	};

P2:
	while (1){
		P(mutex);
		临界区;
		V(mutex);
		剩余区;
	};

3.3 用信号灯解决同步问题

semaphore a,b=0,0;
{s1;V(a); V(b)}
{P(a);s2
{P(b);s3}

在这里插入图片描述
因此,信号灯可以解决互斥问题和同步问题。

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

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

相关文章

2023发卡商城源码,最新自助下单彩虹云商城系统免授权无后门源码

# 彩虹自助下单系统 > PHP版本: > 7.0.1 ____ * 去除所有授权验证 * 支持自定义说说接口 * 去除后台广告与更新 * 可自定义易支付接口 ____ >安装教程: > 1、上传源代码到空间或服务器&#xff0c;并确保权限可读写。 > 2、上传完成后&#xff0c;使用浏览器…

vue-cli3打包上线页面空白接口404

使用vue-cli3创建一个vue3ts的项目输入npm run build 打包后生成dist文件夹 把文件夹上传到服务器此时发现页面一片空白&#xff0c;接口显示404 解决这个问题&#xff0c;需要手动在根目录下配置vue.config.js module.exports {publicPath: ./ }然后重新打包&#xff0c;重新…

mycat安装

查看是否安装jdk java -versionjdk安装方法 mycat下载&#xff1a; Mycat安装包1.6.7.3版本 创建新文件夹 mkdir test_mycat上传jar后移动到对应位置 mv Mycat-server-1.6.7.3-release-20210913163959-linux.tar.gz ./test_mycat/解压 tar zxvf Mycat-server-1.6.7.3-rele…

【成为架构师课程系列】一线架构师:6个经典困惑及其解法

目录 一线架构师:6个经典困惑及其解法 多阶段还是多视图? 内置最佳实践 架构方法论:3个阶段,一个贯穿

经典进程同步与互斥问题(5)

经典进程同步与互斥问题 1 生产者-消费者问题 1.1 问题描述 生产者-消费者问题是指有两组进程共享一个环形的缓冲池。一组进程被称为生产者&#xff0c;另一组进程被称为消费者。缓冲池是由若干个大小相等的缓冲区组成的&#xff0c;每个缓冲区可以容纳一个产品。生产者进程…

学习802.11之MAC帧格式(一篇就够!)

802.11规范的关键在于MAC&#xff08;媒介访问控制层&#xff09;&#xff0c;MAC位于各式物理层之上&#xff0c;控制数据传输。负责核心成帧操作以及与有线骨干网络之间的交互。 802.11 MAC采用载波监听多路访问&#xff08;CSMA&#xff09;机制来控制对传输媒介的访问&…

操作系统闲谈05——内存管理

操作系统闲谈05——内存管理 一、 内存管理的基本方式 01 段式内存管理 将程序按照逻辑关系划分为段&#xff0c;每个段的大小不等&#xff0c;比如从下到上&#xff08;代码段、数据段、bss段、栈、文件映射、堆等等&#xff09;&#xff0c;然后通过地址映射机制转换为实际…

阻抗匹配之反射波形测量

稍微接触过高速信号的朋友&#xff0c;一定对阻抗匹配和信号反射都有所了解&#xff0c;甚至可以按照公式&#xff0c;把反射波形一路推导出来。但是&#xff0c;纸上得来终绝浅&#xff0c;绝知此事要躬行。 今天&#xff0c;我们就来实测一下信号反射波形&#xff0c;测试环…

【MySQL】MyCat分库分表分片规则配置详解与实战(MySQL专栏启动)

&#x1f4eb;作者简介&#xff1a;小明java问道之路&#xff0c;2022年度博客之星全国TOP3&#xff0c;专注于后端、中间件、计算机底层、架构设计演进与稳定性建工设优化。文章内容兼具广度深度、大厂技术方案&#xff0c;对待技术喜欢推理加验证&#xff0c;就职于知名金融公…

2023年美国大学生数学建模时间、分析及算法代码

美国大学生数学建模——干货2023年美赛比赛日期和时间赛题类型算法代码美赛常见数模问题分类问题判别分析&#xff1a;聚类分析&#xff1a;神经网络分类&#xff1a;优化问题线性规划&#xff1a;非线性规划&#xff1a;整数规划&#xff1a;动态规划&#xff1a;多目标规划&a…

超详细讲解字符串查找函数(保姆级教程!!!)

超详细讲解字符串查找函数&#xff08;保姆级教程&#xff01;&#xff01;&#xff01;&#xff09;字符串查找函数strstr函数strstr函数的使用strstr函数的模拟实现strtok函数strtok函数的使用strtok函数的模拟实现strpbrk函数strpbrk函数的使用strpbrk函数的模拟实现strcspn…

地级市用电、用水、用气数据指标

用电用水量和煤气及液化石油气供应及利用情况可以反映出城市基础设施的建设情况&#xff01;之前我们基于历年的《中国城市统计年鉴》整理了1999—2020年的人口数量数据指标、人口变动数据指标、用地相关数据指标、污染物排放和环境治理相关数据指标、地区生产总值及一二三产构…

【MyBatis】| MyBatis的逆向⼯程

目录 一&#xff1a;MyBatis的逆向⼯程 1. 逆向⼯程配置与⽣成 2. 测试生成的逆向⼯程 一&#xff1a;MyBatis的逆向⼯程 &#xff08;1&#xff09;所谓的逆向⼯程是&#xff1a;根据数据库表逆向⽣成Java的pojo类&#xff0c;SqlMapper.xml⽂件&#xff0c;以及Mapper接⼝…

redis高可用之主从复制

一、前置知识 分布式系统理论基石CAP&#xff1a;consistent-一致性&#xff0c;availability-可用性&#xff0c;partition tolerance-分区容忍性。网络分区&#xff1a;网络断开也叫网络分区&#xff0c;当网络分区发生时&#xff0c;一致性会被破坏&#xff0c;除非牺牲可用…

磁盘管理(8)

磁盘管理 0 引言 速度是影响文件系统性能的主要因素&#xff0c;因此提高磁盘I/O速度的主要途径&#xff1a;选择性能好的磁盘、采用好的磁盘调度算法和设置磁盘高速缓冲区。 1 磁盘的性能 影响磁盘性能的因素&#xff1a; 数据的结构磁盘的类型磁盘访问时间 2 磁盘的结构…

Vscode使用ChatGPT插件

文章目录1.下载vscode插件2.登录ChatGPT&#xff0c;生成APIKeys3.测试4.使用5.其他功能1.下载vscode插件 2.登录ChatGPT&#xff0c;生成APIKeys 地址&#xff1a;https://beta.openai.com/account/api-keys 3.测试 4.使用 &#xff08;1&#xff09;请求简单的模版代码 …

Pycharm 2020 社区版常用快捷键

版本确实有点旧不过快捷键应该不会怎么 变记录一下。 Ctrl Space 基本的代码完成&#xff08;类、方法、属性&#xff09; Ctrl Alt Space 快速导入任意类 Ctrl Shift Enter 语句完成 Ctrl P 参数信息&#xff08;在方法中调用参数&#xff09; Ctrl Q 快速查看文档…

Golang 结构体笔记

结构体是一个自定义的数据类型&#xff0c;是值类型声明结构体type 结构体名称 struct {field_1 typefield_2 type}注意事项字段声明语法同变量&#xff0c;示例&#xff1a;字段名 字段类型字段的类型可以为&#xff1a;基本类型、数组或引用类型创建一个结构体变量后&#xf…

谷粒商城--品牌管理详情

目录 1.简单上传测试 2.Aliyun Spring Boot OSS 3.模块mall-third-service 4.前端 5.数据校验 6.JSR303数据校验 7.分组校验功能 8.自定义校验功能 9.完善代码 1.简单上传测试 OSS是对象存储服务&#xff0c;有什么用呢&#xff1f;把图片存储到云服务器上能让所有人…

杨校老师课堂之JavaScript定时器案例的红绿灯设计--原始写法

主要介绍了JavaScript定时器设置、使用与倒计时案例,详细分析了javascript定时器的设置、取消、循环调用并附带一个倒计时功能应用案例,需要的朋友可以参考下&#xff1a; 运行效果图&#xff1a; 配套视频课程 基于JavaScript的红绿灯设计演示代码如下: <!DOCTYPE html>…