临界资源,临界区,通信的干扰问题(互斥),信号量(本质,上下文切换问题,原子性,自身的安全性,操作)

news2024/11/26 9:27:38

目录

引入

概念 

临界资源

临界区

干扰存在原因

互斥 

信号量 

引入

举例

概念

介绍

表示可用资源数

表示等待进程数

申请信号量

信号量的本质

全局变量?

共享内存?

不安全问题 -- 上下文切换

原子性

信号量自身的安全性

原子操作的意义

操作


引入

  • 通信的本质只有一个 -- 让不同进程看到同一份资源
  • 但这样会带来一些问题,管道还好(它底层自带有访问控制)
  • 共享内存没有 -> 会出现时序问题
  • 可能在数据只写入一半的时候,另一方就读取了 -> 导致数据不一致 -> 导致处理数据发生问题

概念 

临界资源

多个进程(执行流)看到的公共的一份资源(比如管道,共享内存块)

临界区

我们为了完成通信,会写很多代码

只有真正涉及到 对临界资源的访问 的部分,才被叫做临界区

干扰存在原因

  • 干扰的问题在于 -- 数据只写入一半的时候,另一方就读取了
  • 也就是 -- 让通信的进程都可以不加保护的访问了临界资源
  • 这样会发生相互竞争,导致数据读取写入的情况不符合我们的预期
  • 而各个进程的非临界区的代码运行是互不影响的

互斥 

  • 为了防止干扰情况的出现
  • 我们让任何时刻下,只能有一个执行流访问临界区(串行使用)
  • 但是,临界资源只被一个执行流使用,效率实在太低了
  • 为了保证多进程/线程之间通信的效率,我们可以将临界资源分成多份使用,每个进程在不同的部分执行

 

信号量 

引入

为了保证 让每一个进程 访问 临界资源不同的部分,互不干扰

需要先申请信号量,而不是直接去占用

举例

  • 类似于,当你要去看电影,你得先买票
  • 买票后可以保证在这个大厅一定拥有一个你的座位
  • 且保证这个座位在特定的时间只有你来使用
  • 并且也可以保证这场大厅的进入人数不会超过座位数
  • 这样恰好可以满足互斥的需求,也提高了使用效率

概念

介绍

  • 信号量实际上是一种计数器,用来表示可用资源的数量或者进程等待的数量
  • 它可以用于控制对共享资源的访问,防止多个进程同时访问共享资源而导致的数据混乱或冲突

表示可用资源数

  • 当一个进程或线程想要访问共享资源时,它会先检查信号量的值:
  • 如果信号量的值大于0,表示有可用资源,进程可以继续执行并减少信号量的值
  • 如果信号量的值为0,表示没有可用资源,进程可能会被阻塞或等待,直到信号量的值大于0为止

表示等待进程数

  • 当一个进程发送信号通知其他进程时,它可能会增加信号量的值
  • 而等待的进程在收到信号时会减少信号量的值
  • 这样,信号量的值可以用来跟踪等待的进程数量

申请信号量

  • 让信号量计数器的值--
  • 本质上是对临界资源的一种预定(类比看电影,买了电影票相当于你预定了这个座位被你使用)
  • 释放信号量,就是让计数器++

 

信号量的本质

全局变量?

如果它是一个全局变量

  • 对于父子进程,可以互相看到这个全局变量
  • 但一旦改变,这个计数器就互相独立了

  • 对于不同进程,进程之间具有独立性,无法看到

共享内存?

如果它是一个在共享内存的变量,所有进程都能看到这个计数器

不安全问题 -- 上下文切换
  • 假设它是一个整型
  • 当我们需要对整型计算时,只有借助cpu才能完成计算,因此n--需要有三步操作(读取指令,分析+执行指令,将结果写回内存)
  • 但是,进程是随时可能会被切走的
  • 当其中一个进程在执行完第一步的时候被切走了,会带走自己的临时数据(也就是上下文)
  • 然后其他进程过来执行临界区代码,他们读取到的计数器还是原先的值,因为第一步操作还没有改变计数器
  • 如果这段过程,当前进程改变了计数器的值
  • 这时再将之前那个进程切回来,它会按原先执行的地方向后执行,然后将原先的值-1 ,写回 计数器
  • 这样就使这个计数器不是按照顺序来改变,会导致这份临界资源是不安全的
原子性
  • 因此,我们需要保证对信号量的改变是不被打断的
  • 信号量的改变结果只有两种情况,要么没变,要么改变,没有中间状态
  • (如果有中间状态,在不断的切换中,会导致上面的信号量的值不一致的问题)
  • 也就是操作要具有原子性
  • 除此之外,我们也需要不断的更新计数器的值(每个进程拥有自己的计数器副本)
  • 如果具有原子性,一旦对其操作,就一定会改变计数器,所以可以及时的拿到计数器新的状态

信号量自身的安全性

  • 上面我们假设每个进程都可以看到这个计数器,是不是就说明信号量也是临界资源呢?
  • 我们就相当于用临界资源来保护临界资源,那是不是意味着我们还需要另一种"信号量"来保护信号量?
  • 所以,为了不陷入无限循环,我们要确保信号量是安全的,不需要其他的东西来保护它不受干扰
  • 所以,对信号量的操作必须都是原子的
原子操作的意义
  • 原子操作可以确保在同一时刻只有一个进程或线程可以进行信号量的修改或访问,从而保证信号量的正确性和一致性
  • 这也就是我们引入信号量和原子操作的原因,保护临界资源,也保护他自己

 

操作

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

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

相关文章

【算法练习Day42】买卖股票的最佳时机 III买卖股票的最佳时机 IV

​📝个人主页:Sherry的成长之路 🏠学习社区:Sherry的成长之路(个人社区) 📖专栏链接:练题 🎯长路漫漫浩浩,万事皆有期待 文章目录 买卖股票的最佳时机 III买卖…

详解FreeRTOS:系统时钟节拍(进阶篇—8)

在详解FreeRTOS:FreeRTOS时间片调度(进阶篇—7)中我们讲到了时钟节拍这个概念,本篇博文将详细讲解FreeRTOS系统时钟节拍相关知识。 不管是什么系统,运行都需要有个系统时钟节拍,xTickCount 就是FreeRTOS 的系统时钟节拍计数器。每个滴答定时器中断中 xTickCount 就会加一…

第七讲:利用类事件改变对象的属性(上)

《VBA中类的解读及应用》教程【10165646】是我推出的第五套教程,目前已经是第一版修订了。这套教程定位于最高级,是学完初级,中级后的教程。 类,是非常抽象的,更具研究的价值。随着我们学习、应用VBA的深入&#xff0…

数据结构-栈和队列(一)

目录 1.栈 1.1 栈的概念及结构 1.2 栈的实现 初始化栈: 入栈: 判空函数: 出栈: 获取栈顶元素: 获取栈中有效元素的个数: 销毁栈: 完整代码: 测试: 2. 队列 …

AI 绘画 | Stable Diffusion 高清修复、细节优化

前言 在 Stable Diffusion 想要生成高清分辨率的图片。在文生图的功能里,需要设置更大的宽度和高度。在图生图的功能里,需要设置更大的重绘尺寸或者重绘尺寸。但是设置完更大的图像分辨率,需要更大显存,1024*1024的至少要电脑的空…

软磁直流测试系统电参量指标

软磁直流测试系统电参量指标 输出能力 电流范围 0 ~ 25 A 最大功率 1000 W 调节细度 0.005%*RG ① 最佳测量不确定度 0.2% 磁通测量 (磁通计) 磁通计量程 500 μWb、5 mWb、25 mWb 磁通计漂移 ( 0.05%*RG )/min或1 μWb…

“双11”近300万商家为消费者贴息,花呗分期免息成增长“利器”

今年双11,很多消费者发现,能用花呗分期免息的商品变多了,不光是品牌旗舰店,还有中小淘宝卖家,不少直播间里的商品,都能用花呗分期免息。这背后,是平台、商家对花呗分期免息的重视和需要。 数据…

STM32独立看门狗(IWDG)溢出时间计算

什么是IWDG? 独立看门狗(IWDG)由专用的低速时钟(LSI)驱动,即使主时钟发生故障它也仍然有效。 IWDG最适合应用于那些需要看门狗作为一个在主程序之外,能够完全独立工作,并且对时间精度要求较低的场合。 从上图我们可以看出IWDG的时…

走进黑客漏洞赏金猎人的大门

走进黑客漏洞赏金猎人的大门,了解最新的漏洞、漏洞EXP和安全技术。 自动化SQL盲注 创建Nuclei模板:该文章首先介绍了如何创建一个Nuclei模板,以利用clusterbomb方法对我们感兴趣的功能点进行有效的暴力破解。 使用GET请求:在模板中,我们只使用GET请求。其中,{}被视为替换…

【题解 堆】 [蓝桥杯2023初赛] 整数删除

题目描述: 分析: 这道题一看就是一道堆的模板题 我们用堆记录当前的最小值以及当前值所在的下标 每次取出堆顶元素删除,而后将他的前一个以及后一个元素的值加上他的值就可以了 但是会有一个问题 你删除一个数之后,当前数左边和右…

电脑软件:推荐一款电脑多屏幕管理工具DisplayFusion

下载https://download.csdn.net/download/mo3408/88514558 一、软件简介 DisplayFusion是一款多屏幕管理工具,它可以让用户更轻松地管理连接到同一台计算机上的多个显示器。 二、软件功能 2.1 多个任务栏 通过在每个显示器上显示任务栏,让您的窗口管理更…

Leetcode—剑指OfferII LCR 044.在每个树行中找最大值【中等】

2023每日刷题(二十三) Leetcode—LCR 044.在每个树行中找最大值 DFS实现代码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/ /*** Note: The returned …

Go 面向对象,多态,基本数据类型

程序功能解读 第一行为可执行程序的包名,所有的Go源文件头部必须有一个包生命语句,Go通过包名来管理命名空间。 第三行import是引用外部包的说明 func关键字声明定义一个函数,如果是main则代表是Go程序入口函数 Go源码特征解读 源程序以.g…

【MySQL数据库】 五

本文主要介绍了如果根据表之间的关系设计表,以及mysql的聚合/分组/联合查询. 一.表的设计 实体和关系的四种关系 1.一对一 一个账号只能对应一个学生; 一个学生只能有一个账号; 比如:账号表和学生是一对一的关系 * 可以在账号表中引入学生id * 也可以在学生表中引入账号id…

能链智电,“重”症在身

文 | 智能相对论 作者 | 陈选滨 在过去的1-9月,充电基础设施增量为243.2万台,新能源汽车销量627.8万辆,充电桩与新能源汽车的增量比为1:2.6,距离工信部此前提出“2025年实现车桩比2:1,2030年实现车桩比1:…

自主SSL品牌—JoySSL

JoySSL是一家为数不多的中国自主品牌SSL证书服务厂商,是自研推出的新一代https数字证书。 它不仅有着自己品牌JoySSL,还拥有着国内外绝大数主流证书品牌,遍寻诚意伙伴,单域名证书都是不限年限、不限证书张数不限量提供。 目前了…

C语言——计算n的阶乘

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h> int main() {int i;int n 0;int s1;scanf("%d",&n);for(i1; i<n; i){s*i;}printf("s%d\n",s);return 0; }

HP电脑主机清除BIOS密码

HP电脑主机清除BIOS密码 重装系统肯定不能清除BIOS密码的。 拔掉电池一般也只能是将BIOS设定恢复出厂。 台式机需要清除BIOS密码&#xff0c;一般是主机板上会有对应的跳线&#xff0c; 关机&#xff0c;记住跳线的预设位置&#xff0c;拔掉跳线&#xff0c;重新开机&#x…

于道 - 前端项目启动步骤参考

1. 安装 启动过程有9个步骤&#xff1a; 1.1 安装 Node JS , V18版本的 &#xff08;安装步骤省略&#xff09; 1.2 安装 npm install -g yarn &#xff0c;node JS里边好像自带npm &#xff0c;通过npm的命令安装 yarn 1.3 切换到项目中去安装&#xff0c;npm install &a…

C++初阶 | [二] 类和对象(上)

摘要&#xff1a;class&#xff0c;成员函数&#xff0c;成员变量&#xff0c;类的大小&#xff0c;this 指针 C语言是面向过程的&#xff0c;关注的是过程&#xff0c;分析出求解问题的步骤&#xff0c;通过函数调用逐步解决问题。 C是基于面向对象的&#xff0c;关注的是对象…