当前位置: 首页 > news >正文

【OS】操作系统课程笔记 第五章 并发性——互斥、同步和通信

并发性:并发执行的各个进程之间,既有独立性,又有制约性;

独立性:各进程可独立地向前推进;

制约性:一个进程会受到其他进程的影响,这种影响关系可能有3种形式:

  • 互斥:一种竞争关系
  • 同步:一种协作关系
  • 通信:交换信息

5.1 并发的原理

5.1.1 与时间有关的错误

现在有P1和P2两个进程共享一个变量count:

由于两个进程是异步的,所以它们执行的顺序不确定,这就会造成运行结果不可再现,除非规定它们使用共享变量的先后顺序。

5.1.2 互斥与同步的概念

进程的同步:系统中多个进程中发生的事件存在某种时序关系,需要相互合作,共同完成一项任务,即:

  • 一个进程运行到某一点时要求另一伙伴进程为它提供消息;
  • 未获得消息之前,该进程处于等待状态;
  • 获得消息后被唤醒进入就绪状态。

两个进程可以类比为接力赛中一前一后的两个队友:

进程的互斥:

互斥——不能“同时”的操作:对于系统一些共享资源,只有被释放后,才可以重新被操作;

进程互斥——进程间竞争使用不能被“同时”操作的共享资源的关系。

5.1.3 临界区与进程互斥

1. 临界资源

系统中某些资源一次只允许一个进程使用,称这样的资源为临界资源或互斥资源或共享变量。

2. 临界区

在进程中涉及到临界资源的程序段叫做临界区。多个进程指针对统一资源的临界区称为相关临界区。

3. 实现各进程互斥进入临界区(互斥使用临界资源)

进程需要在临界区前加上一段用于申请资源的代码,称为进入区;在临界区后加上一段用于释放资源的代码,称为退出区。

while ( 1 )

{

        进入区代码(使用前申请);

        临界区代码(使用临界资源);

        退出区代码(释放资源);

        其余代码;

}

 4. 进入临界区(使用临界资源)的四项原则:

  1. 空闲让进:当无进程在互斥区时,任何有权使用互斥区的进程可进入;
  2. 忙则等待:不允许两个以上的进程同时进入互斥区;
  3. 有限等待:任何人进入互斥区的要求应在有限的时间内得到满足;
  4. 让权等待:处于等待状态的进程应放弃占用CPU,以使其他进程有机会得到CPU的使用权。

5. 进程互斥的解决主要有两种,分别是硬件方法和软件方法。

5.1.4 硬件支持互斥的方法

1. 中断禁用:为保证互斥,只需保证进程不被中断就可以了,通过系统中有关中断的原语即可实现。其实就是把中断这个操作当作临界资源来看。

2. 专用机器指令:就是设置一个bolt值,通过它来看是否可以使用临界资源:

5.2 信号量机制

5.2.1 信号量的概念

信号量定义

信号量是一个记录型的数据结构;

定义如下:

struct semaphore {int value; //信号量的值pointer_PCB queue;
}
semaphore s; // 定义s为信号量

P、V操作

除初始化外,仅能通过两个标准的原子操作 wait(s) 和 signal(s) 来访问信号量。这两个操作一直被称为P、V操作。

原子操作(原语):在执行上不可被中断的操作。

P、V操作定义

P(s) { // =wait(s)s.value--;if (s.value < 0)block(s.queue);
// 将调用该P操作的进程放入与s有关的阻塞队列
}
V(s) { // = signal(s)s.value++;if (s.value <= 0)wakeup(s.queue);
// 从有关s的阻塞队列唤醒一个进程放入就绪队列
}

P、V操作的含义

信号量 s 的物理含义:

  • s > 0 表示有 s 个资源可用;
  • s = 0 表示无资源可用;
  • s < 0 则 s 绝对值就是等待队列中的进程个数

P、V操作的含义:

  • P(s) :表示申请一个资源
  • V(s) :表示释放一个资源

信号量的初值应 >= 0

 信号量的使用

必须设置一次且只能设置一次初值;

初值不能为负数;

只能通过 wait(s) 和 signal(s) 来操作信号量。

如何用信号量实现进程间互斥问题?

  1. 找出临界资源,设置信号量。有几类资源就设置几个信号量,对每类资源,资源数量就是对应的信号量初值;
  2. 划分处临界区(涉及到临界资源的代码,不要人为添加条件);
  3. 临界区前加上对应信号量的P操作,临界区后加上对应信号量的V操作。

5.2.2 信号量的应用

利用信号量实现进程互斥

设P1和P2是两个进程,它们都需要使用打印机进行打印,这时可以定义一个信号量mutex,其初值为1,用于实现P1、P2进程对打印机的互斥访问:

semaphore mutex = 1; // 表示现有的打印机资源数量为1//P1
while (true) {P(mutex);use printer;V(mutex);
}//P2
while (true) {P(mutex);use printer;V(mutex);
}

利用信号量实现进程同步(前驱关系)

现有两个进程P1和P2,其中P1需要先执行,才能执行P2,遵循两者的执行顺序,我们可以画出进程的前驱图:

这其中,s是我们设置的信号量,其初值为0,所以在执行中,需要先进行V操作(++)再进行P操作(--),由此可以实现进程同步:

semaphore s = 0;  //P1
{P1 code;V(s);
}//P2
{P2 code;P(s);
}

如此可以实现先执行P1,再执行P2。

5.2.3 生产者 - 消费者问题

1. 单缓冲区:生产者进程P和消费者进程C共用一个缓冲区,P生产产品放入缓冲区,C从缓冲区取产品来消费。

单缓冲区面临的问题

单缓冲区的同步问题:

  • 当缓冲区存在空位的时候,P进程才能往里面放产品,设置信号量为empty,初值为1,表明缓冲区存在空位;
  • 当缓冲区有产品的时候,C进程才能从里面取产品,设置信号量为full,初值为0,因为缓冲区刚开始是没有产品的;

单缓冲区互斥问题:

  • P、C进程不能同时使用缓冲区

1. 单缓冲区的生产者 - 消费者问题解

semaphore empty = 1; // 表示缓冲区空位数
semaphore full = 0; //表示缓冲区产品数//P进程
while (true) {produce a product;P(empty);put product in buffer;V(full);
}//C进程
while (true) {P(full);get product from buffer;V(empty);consume the product;
}

2. 多缓冲区的单生产者 - 单消费者问题解

 

semaphore empty = n; // 表示缓冲区有n个空位
semaphore full = 0;//P进程
while (true) {produce a product;P(empty);put product in buffer[in];in = (in + 1) mod n; //将产品放入缓冲区中后,in指针向后移动一位,这里的缓冲区相当于一个栈V(full);
}//V进程
while (true) {P(full);get product from buffer[out];out = (out + 1) mod n;V(empty);consume the product;
}

3. 多生产者多消费者多个缓冲区

因为多个生产者和多个消费者都要使用到缓冲区,所以缓冲区就是我们的临界资源,为了实现生产者之间以及消费者之间的互斥关系,需要引进信号量mutex,并且其C、V操作需要放在临界区前后:

semaphore empty = n;
semaphore full = 0;
semaphore mutex = 1; // 实现同类进程间对缓冲区的互斥访问//P进程
while (true) {produce a product;P(empty);P(mutex);put product in buffer[in];in = (in + 1) mod n;V(mutex);V(full);
}//V进程
while (true) {P(full);P(mutex);get product from buffer[out];out = (out + 1) mod n;V(mutex);V(empty);consume the product;
}

多缓冲区面临的问题

同步:当缓冲区已放满了产品时,生产者进程必须等待;当缓冲区已空时,消费者进程应该等待;

互斥:所有进程应互斥使用缓冲区资源;

实际上,在多缓冲情况下,为提高系统并发性,只是同类进程应当互斥

在多缓冲区问题中,如果把进程P或C的mutex和另一个相邻的变量互换,就会发生死锁,死锁就是在一个进程进展到某一步时被其他进程抢占后进入阻塞状态,其他进程由于某一变量未达到条件也进入了阻塞状态。所以记住要把mutex放里面,不包含其他的变量。

多缓冲区的生产者 - 消费者问题解法2

设置两个不相干的mutex变量,这样就只是同类进程间互斥,提高了系统并发性。

如何用信号量解决进程间同步问题?

  1. 找出进程间的前驱关系;
  2. 针对每个前驱关系设置信号量,通常初值为0,具体情况要根据题目来分析;
  3. 前驱进程的后面加上对应信号量的V操作,后继进程的前面加上对应信号量的P操作。

5.2.5 读者 - 写者问题

有两组并发进程:读者和写者,共享一组数据区,为保证数据的一致性和完整性,规定如下:

  • 允许多个读者同时执行读操作
  • 不允许读者、写者同时操作
  • 不允许多个写者同时操作

若读者优先,即当写者提出了写的要求后,允许新的读者进入。则代码如下:

wrt = 1; // 表示能否写,初始可写
mutex = 1; // 实现不同读者进程的互斥访问
readcount = 1; // 表示读进程数//读者进程
while (true) {P(mutex);readcount++;if(readcount == 1)P(wrt);V(mutex);read;P(mutex);readcount--;if(readcount == 0)V(wrt);V(mutex);
}// 写者进程
while (true) {P(wrt);write;V(wrt);
}

信号量应用小结

P、V操作必须成对出现,有一个P操作就一定有一个V操作;

当信号量用于实现进程互斥时,对于同一信号量的P、V操作处于同一进程;

当信号量用于实现进程同步时,对于同一信号量的P、V操作处于不同进程;

如果P(S1)和P(S2)两个操作在一起,那么P操作的顺序至关重要,一个同步P操作与一个互斥P操作在一起时,同步P操作在前,互斥P操作在后,而两个V操作则无关紧要。

相关文章:

【OS】操作系统课程笔记 第五章 并发性——互斥、同步和通信

并发性&#xff1a;并发执行的各个进程之间&#xff0c;既有独立性&#xff0c;又有制约性&#xff1b; 独立性&#xff1a;各进程可独立地向前推进&#xff1b; 制约性&#xff1a;一个进程会受到其他进程的影响&#xff0c;这种影响关系可能有3种形式&#xff1a; 互斥&am…...

RabbitMQ概述原理

RabbitMQ是一种消息队列中间件&#xff0c;其主要作用是在应用程序之间传输数据。它基于AMQP&#xff08;高级消息队列协议&#xff09;实现&#xff0c;可以用于不同语言和不同操作系统之间的通信。 RabbitMQ的工作原理是生产者将消息发送到队列中&#xff0c;消费者从队列中接…...

8.Covector Transformation Rules

上一节已知&#xff0c;任意的协向量都可以写成对偶基向量的线性组合&#xff0c;以及如何通过计算基向量穿过的协向量线来获得协向量分量&#xff0c;且看到 协向量分量 以 与向量分量 相反的方式进行变换。 现要在数学上确认协向量变换规则是什么。 第一件事&#xff1a;…...

RustDay04------Exercise[21-30]

21.使用()对变量进行解包 // primitive_types5.rs // Destructure the cat tuple so that the println will work. // Execute rustlings hint primitive_types5 or use the hint watch subcommand for a hint.fn main() {let cat ("Furry McFurson", 3.5);// 这里…...

OpenAI科学家谈GPT-4的潜力与挑战

OpenAI Research Scientist Hyung Won Chung 在首尔国立大学发表的一场演讲。 模型足够大&#xff0c;某些能力才会显现&#xff0c;GPT-4 即将超越拐点并在其能力上实现显着跳跃。GPT-3 和 GPT-4 之间的能力仍然存在显着差距&#xff0c;并且尝试弥合与当前模型的差距可能是无…...

Java电子病历编辑器项目源码 采用B/S(Browser/Server)架构

电子病历&#xff08;EMR,Electronic Medical Record&#xff09;是用电子技术保存、管理、传输和重现的数字化的病人的医疗记录&#xff0c;取代手写纸张病历&#xff0c;将医务人员在医疗活动过程中,使用医疗机构管理系统生成的文字、符号、图表、图形、数据、影像等数字化内…...

使用 AWS DataSync 进行跨区域 AWS EFS 数据传输

如何跨区域EFS到EFS数据传输 部署 DataSync 代理 在可以访问源 EFS 和目标 EFS 的源区域中部署代理。转至AWS 代理 AMI 列表并按 AWS 区域选择您的 AMI。对于 us-west-1&#xff0c;单击 us-west-1 前面的启动实例。 启动实例 2. 选择您的实例类型。AWS 建议使用以下实例类型之…...

设计模式~解释器模式(Interpreter)-19

解释器模式&#xff08;Interpreter Pattern&#xff09;提供了评估语言的语法或表达式的方式&#xff0c;它属于行为型模式。这种模式实现了一个表达式接口&#xff0c;该接口解释一个特定的上下文。这种模式被用在 SQL 解析、符号处理引擎等。 【俺有一个《泡MM真经》&#x…...

对象混入的实现方式

对象混入&#xff08;Object mixins&#xff09;是一种在面向对象编程中用于组合和重用代码的技术。它允许你将一个对象的属性和方法混合&#xff08;或合并&#xff09;到另一个对象中&#xff0c;从而创建一个具有多个来源的对象&#xff0c;这些来源可以是不同的类、原型或其…...

Mac 远程 Ubuntu

1. Iterm2 添加ssh 参考&#xff1a;https://www.javatang.com/archives/2021/11/29/13063392.html 2. Finder 添加远程文件管理 2.1 ubuntu 配置 安装samba sudo apt-get install samba配置 [share]path /home/USER_NAME/shared_directoryavailable yesbrowseable ye…...

黑豹程序员-h5前端录音、播放

H5支持页面中调用录音机进行录音 H5加入录音组件&#xff0c;录音后可以进行播放&#xff0c;并形成录音文件&#xff0c;其采样率固化48000&#xff0c;传言是google浏览器的BUG&#xff0c;它无法改动采样率。 大BUG&#xff0c;目前主流的支持16000hz的采样率。 录音组件 …...

Leetcode622.设计循环队列

本专栏内容为&#xff1a;leetcode刷题专栏&#xff0c;记录了leetcode热门题目以及重难点题目的详细记录 &#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;Leetcode &#x1f69a;代码仓库&#xff1a;小小unicorn的代码仓库&#x1f69a; &…...

二十二、【形状工具组】

文章目录 基础图形多边形直线工具自定义形状工具 形状工具组画的图形是矢量图形&#xff0c;在放大和缩小后像素不变看起来不会模糊&#xff0c;位图和矢量图形的存储方式不一样&#xff0c;位图的存储方式是按各个像素的数据来进行存储的&#xff0c;而矢量图形是根据算法来进…...

设计模式~迭代器模式(Iterator)-20

目录 迭代器模式(Iterator) &#xff08;1&#xff09;优点 &#xff08;2&#xff09;缺点 &#xff08;3&#xff09;使用场景 &#xff08;4&#xff09;注意事项 &#xff08;5&#xff09;应用实例&#xff1a; 代码 迭代器模式(Iterator) 迭代器模式&#xff08…...

亳州市的自然风光与旅游资源:欣赏安徽省中部的壮丽景色

亳州市是中国安徽省的一个地级市&#xff0c;位于该省的中部。 亳州市辖区包括谯城区、涡阳县、蒙城县和利辛县等地。亳州市拥有悠久的历史和丰富的文化遗产&#xff0c;同时也以其独特的自然风光而闻名。 首先&#xff0c;让我们来了解一下亳州的历史和景点。亳州的历史可以…...

windows安装nvm以及解决yarn问题

源代码 下载 下一步一下步安装即可 检查是否安装成功 nvm出现上面的代码即可安装成功 常用命令 查看目前安装的node版本 nvm list [available]说明没有安装任何版本&#xff0c;下面进行安装 nvm install 18.14使用该版本 node use 18.14.2打开一个新的cmd输入node -…...

【TA 挖坑04】薄膜干涉 镭射材质 matcap

镭射材质&#xff0c;相对物理的实现&#xff1f; 万物皆可镭射&#xff0c;个性吸睛的材质渲染技术 - 知乎 (zhihu.com) 薄膜干涉材质&#xff0c;matcap更trick的方法&#xff1f;matcapremap&#xff0c; MatCap原理介绍及应用 - 知乎 (zhihu.com) 庄懂的某节课也做了mat…...

OpenCV13-图像噪声:椒盐噪声和高斯噪声

OpenCV13-图像噪声&#xff1a;椒盐噪声和高斯噪声 1.噪声种类2.椒盐噪声3.高斯噪声 1.噪声种类 图像噪声是指图像中的随机或非随机的不希望的视觉扰动。它可以出现在数字图像中的各种形式&#xff0c;例如颗粒状噪声、条纹、斑点、模糊、失真等。图像噪声可能是由于图像采集过…...

天堂2服务器基本设置

[system] server_nameLocal Server ——〉服务器名称 server_rulesPvP http_host127.0.0.1 ——〉HTTP注册页面&#xff08;需先搭建IIS服务器&#xff09; http_port8080 rs_host127.0.0.1——〉填你IP rs_port3724 ws_host127.0.0.1 ——〉填你的IP就对啦 ws_port8085 wor…...

如何解决网站被攻击的问题

在当今数字化时代&#xff0c;网站攻击已经成为互联网上的一个常见问题。这些攻击可能会导致数据泄漏、服务中断和用户信息安全问题。然而&#xff0c;我们可以采取一些简单的措施来解决这些问题&#xff0c;以确保网站的安全性和可用性。 使用强密码和多因素认证 密码是保护网…...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能&#xff0c;包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

2024年赣州旅游投资集团社会招聘笔试真

2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?

论文网址&#xff1a;pdf 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向于笔记&#xff0c;谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 &#xff08;忘了有没有这步了 估计有&#xff09; 刷机程序 和 镜像 就不提供了。要刷的时…...

【项目实战】通过多模态+LangGraph实现PPT生成助手

PPT自动生成系统 基于LangGraph的PPT自动生成系统&#xff0c;可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析&#xff1a;自动解析Markdown文档结构PPT模板分析&#xff1a;分析PPT模板的布局和风格智能布局决策&#xff1a;匹配内容与合适的PPT布局自动…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课&#xff0c;做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程&#xff0c;它的核心机制是 Goroutine 协程、Channel 通道&#xff0c;并基于CSP&#xff08;Communicating Sequential Processes&#xff0…...

Module Federation 和 Native Federation 的比较

前言 Module Federation 是 Webpack 5 引入的微前端架构方案&#xff0c;允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

自然语言处理——Transformer

自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效&#xff0c;它能挖掘数据中的时序信息以及语义信息&#xff0c;但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN&#xff0c;但是…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式

今天是关于AI如何在教学中增强学生的学习体验&#xff0c;我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育&#xff0c;这并非炒作&#xff0c;而是已经发生的巨大变革。教育机构和教育者不能忽视它&#xff0c;试图简单地禁止学生使…...

STM32HAL库USART源代码解析及应用

STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...