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

目录

引入

概念 

临界资源

临界区

干扰存在原因

互斥 

信号量 

引入

举例

概念

介绍

表示可用资源数

表示等待进程数

申请信号量

信号量的本质

全局变量?

共享内存?

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

原子性

信号量自身的安全性

原子操作的意义

操作


引入

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

概念 

临界资源

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

临界区

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

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

干扰存在原因

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

互斥 

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

 

信号量 

引入

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

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

举例

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

概念

介绍

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

表示可用资源数

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

表示等待进程数

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

申请信号量

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

 

信号量的本质

全局变量?

如果它是一个全局变量

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

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

共享内存?

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

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

信号量自身的安全性

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

 

操作

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

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

相关文章

Collection集合 迭代器遍历Iterator 和集合增强For

迭代器遍历Iterator 标准写法: 增强For for(类型 名称 : 集合 ) 举例: 不仅可以集合也可以数组 底层仍然是iterator

Power Apps-库组件连接数据表

点击添加数据 可以选择Excel或SharePoint导入 选择右侧边栏中的网站,再选择想要连接的数据表 点击插入,选择布局中的某个库, 选中它可以点击上方的布局,选择想要的样式 右侧选择数据源中的表就将组件与数据表连接起来了 如果想修…

Vite创建React项目,另外一种更加简单的方法

在上一篇blog中一个一个安装依赖dependencies,有没有一步到位的方法呢,有! 参考《React 18 Design Patterns and Best Practices Design, build, and deploy production-ready web applications with React》4th 第一章倒数第二节Vite as a solution有个…

flutter生态一统甜夏 @Android @ios @windowse @macos @linux @Web

(愿景)G o o g l e 中 国flutter生态一统天下(IT) Web Android ios Windowse Macos Linux Google中国https://space.bilibili.com/64169458 https://pub-web.flutter-io.cn 构建 Flutter Web 应用 构建 Flutter Web 应用 - Flutter 中文文档 - Flutter 中文开发者网站 …

vue3+setup 解决:this.$refs引用子组件报错 is not a function

一、如果在父组件中以下四步都没问题的话&#xff0c;再看下面步骤 二、如果父组件引用的是index页面 请在 头部加上以下代码 &#xff08;如果是form页面请忽略这一步&#xff09; <template> <a-modalv-model:visible"visible"title"头部名称&…

SpringCloud 微服务全栈体系(十三)

第十一章 分布式搜索引擎 elasticsearch 二、索引库操作 索引库就类似数据库表&#xff0c;mapping 映射就类似表的结构。 我们要向 es 中存储数据&#xff0c;必须先创建“库”和“表”。 1. mapping 映射属性 mapping 是对索引库中文档的约束&#xff0c;常见的 mapping …

SpringDataJpa(二)

三、Spring Data JPA概述 Spring Data JPA 是 Spring 基于 ORM 框架、JPA 规范的基础上封装的一套JPA应用框架&#xff0c;可使开发者用极简的代码即可实现对数据库的访问和操作。它提供了包括增删改查等在内的常用功能&#xff0c;且易于扩展&#xff01;学习并使用 Spring D…

汽车标定技术(五)--基于模型开发如何生成完整的A2L文件(1)

1 数据对象的创建 CtrlH打开Model Explorer&#xff0c;在Base workspace中点击工具栏add&#xff0c;出现如下界面&#xff0c; 可以看到Simulink提供了多种数据类型 Matlab Variable&#xff1a;Simulink.Parameter&#xff1a;使用该数据对象表示工程应用中的标定量Simuli…

js:React中使用classnames实现按照条件将类名连接起来

参考文档 https://www.npmjs.com/package/classnameshttps://github.com/JedWatson/classnames 安装 npm install classnames示例 import classNames from "classnames";// 字符串合并 console.log(classNames("foo", "bar")); // foo bar//…

高性能网络编程 - The C10M problem

文章目录 Pre概述回顾C10K实现C10M的挑战思路总结 Pre 高性能网络编程 - The C10K problem 以及 网络编程技术角度的解决思路 概述 在接下来的10年里&#xff0c;因为IPv6协议下每个服务器的潜在连接数都是数以百万级的&#xff0c;单机服务器处理数百万的并发连接&#xff0…

基于单片机智能加湿器控制系统仿真设计

**单片机设计介绍&#xff0c; 698【毕业课设】基于单片机智能加湿器控制系统仿真设计 文章目录 一 概要系统组成总结 二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 单片机智能加湿器控制系统仿真设计介绍 单片机智能加湿器控制系统是一种利用微…

Jakarta-JVM篇

文章目录 一.前言1. 1 JVM-堆常用调参1.2 JVM-方法区常用参数1.3 JVM-codeCache 二.JVM内存结构三. 对象创建四. JVM垃圾回收算法4.1 可达性分析算法4.1.1 对象引用4.1.2 回收方法区. 4.2 分代回收4.3 标记清除4.4 标记复制4.5 标记整理 五.垃圾回收器5.1 根节点枚举5.2 安全点…

umi4 React项目使用icon集合

umi项目中使用icon集合。 icon集合&#xff1a;https://icones.js.org/ 测试使用这个ion .umirc.ts文件 icons:{autoInstall:{iconify-json/ion: true,//自动安装iconify-json/ion},include: [ion:social-windows-outline]&#xff0c;//要使用的必须把icon类名加到include中…

AndroidStudio 运行报错:Invalid keystore format

AndroidStudio 运行报错&#xff1a;Invalid keystore format 把这玩意儿删了重新打开Android Studio运行一下就好了&#xff01;&#xff01;&#xff01;

esxi 6.7下安装黑裙

esxi上创建一个黑裙系统的虚拟机&#xff0c;用来存资料 一、工具 硬件&#xff1a; 工控机&#xff1a;装有esxi6.7系统&#xff08;192.168.100.2&#xff09;&#xff0c;配置&#xff1a;3865U&#xff0c;16G内存&#xff0c;120Gmsata120sata硬盘&#xff0c;6个网口 主…

利用Ansible实现批量Linux服务器安全配置

1.摘要 在上一篇<<初步利用Ansible实现批量服务器自动化管理>>文章中, 我初步实现了通过编写清单和剧本来实现多台服务器的自动化管理,在本章节中, 我将利用Ansible的剧本来实现更实用、更复杂一点的功能, 主要功能包括三个:1.同时在三台服务器中增加IP访问控制,只…

杂货铺 | citespace的使用

安装教程 【CiteSpace保姆级教程1】文献综述怎么写&#xff1f; &#x1f4da;数据下载 1. 新建文件夹 2. 数据下载 知网高级检索 数据选中导出 &#xff1a;一次500 导出后重命名为download_xxx.txt&#xff0c;放到input文件里 3. 数据转换 把output里的数据复制到data里…

Qt实现自定义多选下拉列表

目录 前言1、 功能描述2、代码实现总结 前言 本文记录了一种通过继承 QComboBox 实现下拉列表多选功能的方法。效果如下图所示&#xff1a; 1、 功能描述 普通的下拉列表只支持选择一个选项&#xff0c;在软件开发过程中&#xff0c;经常会遇到下拉列表支持选择多个选项的需…

Mybatis-Plus同时使用逻辑删除和唯一索引的问题及解决办法

1 问题背景 在开发中&#xff0c;我们经常会有逻辑删除和唯一索引同时使用的情况。但当使用mybatis plus时&#xff0c;如果同时使用逻辑删除和唯一索引&#xff0c;会报数据重复Duplicate entry的问题。 举例来说&#xff0c;有表user&#xff0c;建立唯一索引&#xff08;u…

centos 7部署Mysql8.0主从

Mysql官网中关于部署主从的网址 环境准备&#xff1a; 搭建虚拟机和安装Mysql之前的文章中已经涉及&#xff0c;在此不再赘述。 主从IPMysql账号密码主192.168.213.4root/Root1234!从192.168.213.5root/Root1234! 1、主数据库设置 配置my.cnf 一般存放于/etc/。 主从配…