课时八——进程同步(二)

news2024/9/21 14:31:40

1、信号量

信号量机制是一种功能较强的机制,可用来解决互斥和同步问题,它只能被两个标准的原语wait(S)(P操作)和signal(S)(V操作 )访问。
注意:原语是一种特殊的程序段,其执行只能一气呵成,不可被中断,原语由关中断/开中断指令实现。
1)整形信号量
整形信号量被定义为一个用于表示资源数目的整型量S,wait和signal操作可描述为:

wait(S){
while(S<=0);

/*注意:怎么理解这里,当资源数小于0时,就一直测试检测,所以会处于忙等
待情况,不是让权等待。*/

S=S-1;//上一句成功才会资源减一
}
signal(S){
S=S+1;//这里是释放资源的意思
}

该机制并未遵循“让权等待”的准则,而是使进程处于“忙等”状态。

2)记录型信号量(解决忙等)
记录型信号量是不存在“忙等”现象的进程同步机制。除需要一个用于代表资源数目的整型变量value外,再增加一个进程链表L,用于链接所有等待该资源的进程。记录型信号量得名于采用记录型的数据结构。记录型信号量可描述为:

typedef struct{
int value;
struct process*L;
}semaphore;
void wait(semaphore S){//申请资源
S.value--;//请求一个该类资源
if(S.value<0){
add this process to S.L;//这里的意思是资源不够就进入链表等待的进程(同一个资源)
block(S.L);//自我阻塞,放弃处理机
}
}

void signal(semaphore S){
S.value++;
if(S.value<=0){//这里意思是还有等待该资源的
remove a process to S.L;
wakeup(P);//所以再次唤醒P操作
}
}

(1)S->value的初值表示系统中某类资源的数目,因而又被称为资源信号量;
(2)对它进行的每次wait(S)操作(P操作),(注意这里主体是一个进程)意味着进程请求一个单位的该类资源,这会使系统中可供分配的该类资源数减少一个,因此描述为S->value–;当S->value<0时,表示该类资源已分配完毕,因此进程应调用block原语,进行自我阻塞,放弃处理机,并将该进程插入信号量链表S->list中。可见,该机制遵循了“让权等待”准则。

1、什么是让权等待准则呢?
当进程不能进入临界区时,应立即释放处理机,防止进程忙等待。
2、什么是临界区?
每个进程中访问临界资源的那段代码称为临界区,每次只允许一个进程进入临界区,进入后,不允许其他进程进入。
3、什么是临界资源?
是一次仅允许一个进程使用的共享资源。各进程采取互斥的方式,实现共享的资源称作临界资源。

(3)对信号量的每次signal(S)操作(V操作),表示执行进程释放一个单位的资源,这会使系统中可供分配的该类资源数增加一个,故S.value++操作表示资源数目加1。若加1后仍是S->value<=0,则表示在该信号链表中仍有等待该资源的进程被阻塞,故还应调用wakeup原语唤醒第一个等待进程。
(4)如果S->value的初值为1,则表示只允许一个进程访问临界资源,此时的信号量会转化为互斥信号量,用于进程互斥。

2、信号量的基本应用

1)实现多个进程的互斥

(1)互斥信号量mutex初值为1;
(2)每个进程中将临界区代码置于P(mutex)和V(mutex)原语之间;
(3)必须成对使用P和V原语(在同一进程中),不能次序错误、重复或遗漏。

遗漏P原语则不能保证互斥访问
遗漏V原语则不能在使用临界资源之后将其释放(给其他等待的进程)。

semaphore mutex=1;
P1(){
...
P(mutex);
临界区代码段...
V(mutex);
...
}

P2(){
...
P(mutex);
临界区代码段...
V(mutex);
...
}

2)实现同步

(1)分析什么地方需要实现“同步关系”,即必须保证“一前一后”执行的两个操作(或两句代码);
(2)设置同步信号量S,初始为0;
(3)在“前操作”之后执行V(S);
(4)在“后操作”之前执行P(S)。

/*信号机制实现同步*/
semaphore S =0//初始化同步信号量,初始值为0
P1(){
代码1;
代码2;
V(S);//我的理解是这里转去P2
代码3}
P2(){
P(S);
代码4;
代码5;
代码6;
}

保证了代码4一定在代码2之后执行。

3)实现前驱关系
其实每一对前驱关系都是一个进程同步问题(需要保证一前一后的操作)因此,
(1)要对每一对前驱关系各设置一个同步变量;
(2)在“前操作”之后对相应的同步变量执行V操作;
(3)在“后操作”之前对相应的同步变量执行P操作。
信号量值为0的点是限制的关键所在;
成对使用P和V原语(在有先后关系的两个进程中),不能次序错误、重复或遗漏,否则同步顺序出错。

信号量题目做题一般方法:
(1)分析问题,找出同步、互斥关系;
(2)根据资源设置信号量变量;
(3)写出代码过程,并注意P、V操作的位置;
(4)检查代码,模拟机器运行,体验信号量的变化和程序运行过程是否正确。

3、管程

1)为什么引入管程?
信号量机制存在:编写程序困难、易出错等问题,而管程—一种高级的同步机制,可以让程序员学程序不需要再关注复杂的PV操作,让写程序更加轻松。

2)管程的定义
管程是一种特殊的软件模块,
管程包含:
(1)多个彼此可以交互并共用资源的线程
(2)多个与资源使用有关的变量
(3)一个互斥锁
(4)一个用来避免竞态条件的不变量

3)管程的基本特征
(1)模块化。
管程是一个基本的软件模块,可以被单独编译。
(2)抽象数据类型。
管程中封装了数据及对数据的操作,这点有点像面对对象编程语言中的类。
(3)信息隐藏。
管程外的进程或其他软件模块只能通过对管程对外的接口来访问管程提供的操作,管程内部的实现细节对外界是透明的。(就是看不见的意思)
(4)使用的互斥性
任何一个时刻,管程只能由一个进程使用。进入管程时的互斥由编译器负责完成。
在这里插入图片描述

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

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

相关文章

EV 电动汽车远程监控系统

EV 电动汽车远程监控系统 远程监控系统简介 目录 EV 电动汽车远程监控系统 1、远程监控系统是什么&#xff1f; 2、远程监控系统包含什么&#xff1f; 2.1车载终端 2.2、数据服务器 ​​​​​​​ 2.3、监控页面 3、远程监控系统有什么用&#xff1f; 4、车载终端…

中性市场观下,贝壳驶入长期价值之海

&#xff08;图片来源于网络&#xff0c;侵删&#xff09; 文 | 螳螂观察 作者 | 易不二 2023年一季度&#xff0c;房地产市场实现了久违的回暖。 国家统计局公布的数据显示&#xff0c;2023年1-4月&#xff0c;全国商品房销售额39750亿元&#xff0c;增长8.8%&#xff0c;…

Atlassian数据迁移攻略:迁移前必备须知

到2024年2月&#xff0c;Atlassian将终止对Server产品及插件的所有支持。是时候制定您的迁移计划了——Atlassian为您提供两种迁移选择&#xff0c;一是本地部署的数据中心版本&#xff0c;中国用户25人以上即可使用&#xff0c;二是云版。作为Atlassian全球白金合作伙伴&#…

es Elasticsearch 六 java api spirngboot 集成es

目录 Java restApi Springboot 集成es 新增-同步 新增-异步 增删改查流程 _bulk 批量操作 Java restApi Springboot 集成es 新增-同步 Testpublic void te2() throws IOException {System.out.println(1);IndexRequest ir new IndexRequest("test");ir.id(&qu…

STM8 模拟iic接口调试温湿度传感器SHT3x驱动

背景 项目实际使用SHT3x进行温湿度测量&#xff0c;主控芯片采用STM8S003F3P6&#xff0c;并且使用模拟IIC接口的硬件连接。 原理图 如下图所示&#xff0c;使用STM8S003F3P6管脚PB4/PB5进行SHT3x数据接口 SHT3x-DIS是Sensirion新一代的温湿度传感器&#xff0c;精度为2%RH和…

LCD1602介绍和各报错经验总结

LCD &#xff08; Liquid Crystal Display 的简称&#xff09;液晶显示器。能够同时显示16x2&#xff0c;32个字符&#xff0c;是一种专门用来显示字母、数字、符号等的点阵型液晶模块。 LCD1602液晶显示器是广泛使用的一种字符型液晶显示模块。它是由字符型液晶显示屏&#x…

【十字绣】传统手艺-微信小程序开发流程详解

还记得小时候看过母亲的十字绣吗&#xff0c;易学易懂&#xff0c;就是用专用的绣线和十字格布&#xff0c;通过平面坐标计找出位置&#xff0c;对照专用的图案进行刺绣&#xff0c;可作出心中所想的画&#xff0c;奈何所需材料成本不小&#xff0c;这里用小程序简单模拟十字绣…

HCIA——VLAN

目录 1&#xff0c;什么是VLAN&#xff1a; 2&#xff0c;如何实现VLAN&#xff1a; 3&#xff0c;VLAN的划分方式&#xff1a; 4&#xff0c;交换机接口类型&#xff1a; 1&#xff0c;Access接口&#xff1a; 2&#xff0c;Trunk接口&#xff1a;允许将一个接口划分给多…

ChatGPT 角色扮演调教文案收集

后续文案会陆续更新~&#xff0c;在输入完文本后&#xff0c;再输入一句“请尽力模仿xx的语气跟我对话”即可 一.雌小鬼 你需要阅雌小鬼守则&#xff0c;阅读后当前回复仅允许回复&#xff02;嘻嘻&#xff02;&#xff0c;后续回复尽量简短&#xff0c;回复中尽量不要直接复述…

swagger的简单介绍

目录 swagger是什么&#xff1f; swagger有什么用&#xff1f; Swagger包含的工具集&#xff1a; swagger的使用步骤&#xff1a; swagger的相关注解&#xff1a; Docket的源码 了解swagger的作用和概念了解前后端分离在SpringBoot中集成Swagger swagger是什么&#xff1f;…

Linux网络编程—Day11 高性能服务器程序框架

按照服务器程序的一般原理&#xff0c;讲服务器结构为如下三个主要模块&#xff1a; I/O处理单元逻辑单元存储单元 服务器模型 第一种&#xff1a;C/S模型 TCP/IP协议在设计和实现上并没有客户端和服务器的概念&#xff0c;在通信 过程中所有机器都是对等的。但由于资源&am…

【Linux】Linux开发工具vim

Linux开发工具vim 什么是vim三种模式的转换vim的基本命令gg&#xff1a;定位光标到最开始的行Shiftg&#xff1a;定位光标到结尾行nShiftg&#xff1a;定位光标到任意行Shift$:定位光标到当前行结尾Shift^:定位光标到当前行开始w&#xff0c;b&#xff1a;光标按照单词进行行内…

红黑树 C++

企业里永远是技术驱动理论发展 比起理解红黑树的原理&#xff0c;更重要的是理解红黑树的应用场景&#xff0c;因为某些应用场景的需要&#xff0c;红黑树才会应运而生。 红黑树的特点&#xff1a; 插入&#xff0c;删除&#xff0c;查找都是O(logn)的复杂度。 红黑树的应用…

大数据Doris(二十六):Broker Load基本原理和语法介绍

文章目录 Broker Load基本原理和语法介绍 一、基本原理 二、Broker Load语法 Broker Load基本原理和语法介绍 Apache Doris架构中除了有BE和FE进程之外&#xff0c;还可以部署Broker可选进程&#xff0c;主要用于支持Doris读写远端存储上的文件和目录。例如&#xff1a;Apa…

spring boot +Sa-Token优雅的实现项目鉴权!

1. 技术选型 最近在做登录、授权的功能&#xff0c;一开始考虑到的是spring boot spring security&#xff0c;但spring security太重&#xff0c;而我们是轻量级的项目&#xff0c;所以&#xff0c;spring security不适合我们。 而后考虑spring boot shiro&#xff0c;但s…

【老王读SpringMVC-5】Controller method 是如何执行的?

通过前面对 Controller method 参数绑定的分析&#xff0c;我们知道&#xff0c; 被 RequestMapping 标记 handler method 的执行是通过调用 RequestMappingHandlerAdapter#handle()。 RequestMappingHandlerAdapter#handle() 具体的调用过程如下&#xff1a; 参数解析、han…

【Java基础篇】运算符

作者简介&#xff1a; 辭七七&#xff0c;目前大一&#xff0c;正在学习C/C&#xff0c;Java&#xff0c;Python等 作者主页&#xff1a; 七七的个人主页 文章收录专栏&#xff1a;Java.SE&#xff0c;本专栏主要讲解运算符&#xff0c;程序逻辑控制&#xff0c;方法的使用&…

由浅入深Dubbo网络通信深入解析

目录 1 dubbo中数据格式2 消费方发送请求3 提供方接收请求4 提供方返回调用结果5 消费方接收调用结果6 异步转同步7 异步多线程数据一致8 心跳检查 1 dubbo中数据格式 解决socket中数据粘包拆包问题&#xff0c;一般有三种方式 定长协议&#xff08;数据包长度一致&#xff09…

5GNR——RACH随机接入流程(1):随机接入的原因

1、随机接入触发原因 1- Initial access from RRC_IDLE; 2- RRC Connection Re-establishment procedure; 3- DL or UL data arrival during RRC_CONNECTED when UL synchronisation status is “non-synchronised”; 4- UL data arrival during RRC_CONNECTED when there are …

Java之运算符

&#xff0b;加号的作用 1.表示正数 2.相加运算符 3.进行字符串的拼接 4.自增 Tips&#xff1a; 运算运算符优于 扩展赋值运算符 byte a ; int b ; ab&#xff1b; 右侧为byte&#xff0c;无需强制转换 aab; 右侧为int&#xff0c;需强制转换为byte&#xff0c;赋给左边…