CHS_03.2.3.2_2+进程互斥的硬件实现方法

CHS_03.2.3.2_2+进程互斥的硬件实现方法

  • 知识总览
    • 中断屏蔽方法
    • TestAndSet指令
    • Swap指令
  • 知识回顾

进程互斥的四种软件实现方法

知识总览

在这里插入图片描述

这个小节我们会介绍另外的三种进程互斥的硬件实现方法

那么 这个小节的学习过程当中 大家需要注意理解各个方法的原理 并且要稍微的了解各个方法

有什么有缺点 那么首先来看第一种中断屏蔽方法 其中断屏蔽这种方式咱们在之前介绍原语的时候

中断屏蔽方法

在这里插入图片描述

也介绍过 他 无非就是使用开和关中断这两个指令来实现

不可被中断中断屏蔽这件事情 那么原语不可被中断的这个特性其实也是用这样一组指令来实现的

在一个进程访问临界区之前 他会执行一个关中断指令

也就意味着执行了关中断之后 这个进程就不可能在被中断 也就意味着不可能会再发生这个进程切换的事情

一直到这进程访问完临界区执行开中断指令之后 才有可能会有别的进程

被切换上处理机运行并访问这个临界区 所以这种方式很明显

它的优点就是实现起来很简单高效 并且这个逻辑其实很清晰
然后缺点呢就是它不适用于多处理机的这种系统 因为

关中断指令指对执行关中断指令的那个处理机有用

所以 如果此时处理机a执行了关中断指令 那么就意味着在这个处理机上面的进程不会被切换

那么 这个进程就可以顺利的访问临界区 但是对于另一个处理机处理机b来说

他其实还是会正常的切换进程 如果说此时另外的那个处理机上运行的进程

也需要访问这个临界区 也用这种方式的话 那么也有可能会发生两个处理机上的两个进程同时对临界区进行访问的情况

所以 这是中断屏蔽方法不适用于多处理机的原因

另外一个缺点呢就是关中断和开中断这两个指令 它的权限特别大 它属于特权指令 需要在内核太下才能运行 因此

这种方式只适用于操作系统内核进程 不适用于用户进程 只有操作系统内核进程才有权限执行这两个指令

所以这是中断屏蔽方法 那么第二个硬件实现方式是TestAndSet这样一个指令

TestAndSet指令

在这里插入图片描述

这个指令可以简称为ts 指令就是 TestAndSetLock 然后有的地方有的书上也可 也会把它称为 TestAndSetLock

也就tsl指令 所以在咱们的408真题当中也出现过tsl这样的

一个表述方式 所以这两个名称大家都需要注意一下 那这个指令其实是用

硬件来实现的 在执行的过程当中是不允许被中断 只能一气呵成 额 这个是用c语言描述的 TestAndSetLock 这个指令的一个逻辑

需要强调的是 这个只是为了表示一个逻辑 让大家理解他在背后做了一些什么事情

但这些事情其实都是由硬件来完成的 并且它不可以被中断 系统会为临界区设置一个共享变量 布尔行的变量lock

lock是用来表示当前这个临界区是否已经被枷锁是否已经被上锁

如果他为true的话 就表示已经有某一个进程 表示要对这个临界区上锁 如果为false的话 就是不上锁

那么他TestAndSet这个指令 他在背后做的事情就是

首先 它会用一个叫做od的一个也是布尔行的变量

用来记录以前lock他的值到底是多少 也就是用来记录之前这个临界区是否已经被上锁了

然后 无论这个临界区是否被上锁 他在记录下来这个值之后 一定会让这个临界区进入一个枷锁 一个上锁的状态

也就是把lock这个值设为true之后再用某种方式返回

这个值 那么 在实际使用tsl实现互斥的过程当中 就是用这样的方式来实现的

在while这个循环当中 会不断的执行TestAndSet这个指令

如果说lock本来就是true 也就是说 以前这个临界区就是被上锁的 那么他返回来的old这个值也会为true

那么while这个循环就会一直循环下去 循环条件会一直满足 一直到luck这个值

被当前访问临界区的那个进程在退出区改成了false 所以就会变成

TestAndSet这个返回来的old这个值变为了false 于是之前一直被卡在这儿的那个进程就可以跳出这个循环 然后

正式的开始访问临界区的代码段 一直到访问结束之后再把自己上的锁给解除

所以这是TestAndSet这个指令的一个实现的一个逻辑 这个地方虽然用了return 但实际硬件执行的过程当中其实就是把lock这个值放到了某一个物理寄存器里

然后再把log这个值覆盖为true 是做了这样一个事情 所以

刚才咱们已经分析了lock为false和lock为true的情况 那这个算法和之前咱们介绍的软件实现的方法相比

其实在那个双标志先检查当中 导致最后出问题的原因是
在进入区当中进行上锁和检查这两个操作并不是一气呵成的

但是如果说用硬件的卷tsl这个指令来执行的话 那么就可以保证检查和上锁这两个事情其实是一气呵成的

一边把他上锁一边进行检查 把以前的那个值给返回回来

所以这是这是他能解决问题的一个原因 这种方式的优点呢 就是实现起来很简单 其实如果用如果有这样一个指令的话 那我们的代码不会特别复杂 可以很简洁

不需要像软件的实现方法那样计算推算是否会有异步带来的一些逻辑漏洞

所以这种方式其实是比起软件解决方法来说是要好的多的 并且它也适用于多处理机环境 当然为什么适用于多处以及环境 这个有兴趣的同学大家可以去傻查一下 涉及到总线相关的一些

一些一些特性 但这个方法也有一个缺点 就是它不满足让权等待的原则

通过刚才的分析 我们知道 当这个lock此时是被上锁的情况下

那么 此时想要再进入临界区的另外一个进程 它会一直在这个while循环里被卡住 一直不断的执行tsl这个指令 所以即使暂时没有办法进入临界区 但是它也会一直占用着cpu 然后执行这个指令

从而导致这种满本的这种现象随着它的一个缺点 但最后我们再来介绍swap指令

Swap指令

在这里插入图片描述

那大家也需要注意一下 另外这两个名称在考试中如果不小心遇到的话 也需要能够知道 他说的就是swap指令

这个指令和刚才tsl一样 它也是用硬件实现 并且中间是不允许被中断的

那么 swap指令做的事情其实就是交换了两个变量的值 把a的值换到了b 这把b的值换到a 这这个逻辑并不复杂

那么 它在具体的使用当中实现互斥 是这样实现的 其实表面上看起来swap和之前tsl是有很大不同 但是

逻辑上来看 他们所做的事情其实也差不多 也就是刚开始他会用一个old这样的一个变量

来记录以前lock这个值到底是是true还是

lock这个值和tsl里面一样 就是用来表示当前临界区是否已经被上锁

那么 swap这个指令对lock好和old这两个变量进行交换 之后

那么以前的lock的值会放到old里面 然后old本来是true的 那么他这个处这个值又会被设置到lock 这所以其实他做的和tsl指令可以说在逻辑上看是一模一样的 那么

在执行了这个指令之后 会例行检查以前lock这个值是否为true

如果说old这个值为true的话 那么就说明在之前这个临界区就已经被上锁了 那么这个循环会一直循环下去

一直到old为false 那么说明之前这个临界区是没有被上锁的状态 那么就会跳出这个循环 然后可以顺利的

进入临界区 访问这些代码段 当然swap指令和tsl指令在硬件层次可能实现的方式会不太一样 但是我们可以看到逻辑上看 他们俩做的事情其实并没有太大的区别

所以他们的优点和缺点也可以说是一样的 就是实现简单 但是也适合于多处理机的环境

不过 同样和tsl指令一样 都不满足让权等待的原则 如果说此时暂时不能进临界区的话 他可能一直被卡在这个循环 这占用处理机 然后不断的循环检查 进入满等的状态

所以这就是这个小节的全部内容 我们介绍了三种硬件进程互斥的硬件实现方式 其中tsl和sw这两种指令在逻辑上其实就是做了这样几个事情

知识回顾

在这里插入图片描述

大家再结合这个图再来回忆分析一下 那么对于中断屏蔽这种方法来说 它只适用于单处理机系统

并且只能由操作系统内核进程来使用开关中断这两个特权指令

好的 那么以上就是这个小节的全部内容

推荐一个零声学院免费公开课程,个人觉得老师讲得不错,分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,立即学习

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

OpenGL ES 渲染 NV21、NV12 格式图像有哪些“姿势”?

使用2个纹理实现 NV21 格式图像渲染 前文提到渲染 NV21 格式图像需要使用 2 个纹理,分别用于保存 Y plane 和 UV plane 的数据,然后在片段着色器中分别对 2 个纹理进行采样,转换成 RGB 数据。 OpenGLES 渲染 NV21或 NV12 格式图像需要用到 GL_LUMINANCE 和 GL_LUMINANCE_A…

更改远程桌面网关端口和远程Web应用程序端口

很多玩Home-Lab的小伙伴会使用远程桌面网关(Remote Desktop Gateway)来安全远程家庭内网的计算机,但由于国内电信法律法规的原因,普通家庭宽带并不能使用默认的443端口(TCP)和3391端口(UDP&…

Shell中sed编辑器

1.简介 sed是一种流编辑器,流编辑器会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流。 sed编辑器可以根据命令来处理数据流中的数据,这些命令要么从命令行中输入,要么存储在一个 命令文本文件中。 2.sed编辑器的工作流程 sed…

【高效开发工具系列】Wolfram Alpha

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

linux离线升级openssh方法

检查openssh版本: 升级前openssh 版本为7.4 openssl 版本为1.0.2k Openssh9.6 所需openssl >1.1.1 因此openssl也需要升级。 为了防止升级失败,无法使用SSH登录,首先安装telnet 预防。查看是否安装了telnet 客户端及服务 未安装tel…

npm安装下载修改镜像源

问题描述一 npm install 时,报错:npm ERR! network request to https://registry.npmjs.org/postcss-pxtorem failed, reason: connect ETIMEDOU,这是因为默认npm安装会请求国外的镜像源,导致下载缓慢容易断开请求下载失败的 np…

高效集成|聚道云软件连接器实现薪人薪事与每刻报销无缝对接

一、客户介绍 某石油天然气有限公司是一家在石油天然气领域拥有深厚实力和丰富经验的公司。在技术方面,该公司始终保持领先地位,拥有高素质、专业化的技术团队,不断引进和吸收国际先进技术,加强自主创新,为公司的持续…

C语言菜鸟入门·判断语句(if语句、if...else语句、嵌套if语句)详细介绍

目录 1. if语句 2. if...else语句 3. if...else if...else 语句 4. 嵌套if语句 C 语言把任何非零和非空的值假定为 true,把零或 null 假定为 false。 语句描述if语句一个 if 语句 由一个布尔表达式后跟一个或多个语句组成。if...else语句一个 if 语句 后可跟…

绿色荧光素标记半胱氨酸,FITC-Cysteine,可以用来标记和追踪细胞内的蛋白质

您好,欢迎来到新研之家 文章关键词:FITC半胱氨酸,绿色荧光素标记半胱氨酸,FITC Cysteine 一、基本信息 产品简介:FITC Crystal green fluorescent labeled cysteine is a widely used biological tracer with high …

海外云手机开辟企业跨境电商新道路

近几年,海外云手机为跨境电商、海外媒体引流、游戏行业等互联网领域注入了蓬勃活力。对于国内跨境电商而言,在亚马逊及其他平台上,短视频引流和社交电商营销成为最为有效的流量来源。如何通过海外云手机的助力,在新兴社交平台为企…

28 python快速上手

索引和函数及存储过程 1. 索引1.1 索引原理1.1.1 非聚簇索引(mysiam引擎)1.1.2 聚簇索引(innodb引擎) 1.2 常见索引1.2.1 主键和联合主键索引1.2.2 唯一和联合唯一索引1.2.3 索引和联合索引案例:博客系统 1.3 操作表1.…

​ArcGIS Pro 如何批量删除字段

在某些时候,我们得到的图层属性表内可能会有很多不需要的字段,如果挨个去删除会十分的麻烦,对于这种情况,我们可以使用工具箱内的字段删除工具批量删除,这里为大家介绍一下使用方法,希望能对你有所帮助。 …

Unity3d Cinemachine篇(三)— FreeLook

文章目录 前言一、使用FreeLook制造第三人称跟随效果1. 创建一个游戏物体2. 创建FreeLook相机4. 完成 前言 上一期我们简单的使用了Dolly CamerawithTrack相机,这次我们来使用一下FreeLook 一、使用FreeLook制造第三人称跟随效果 1. 创建一个游戏物体 游戏物体比较…

类与对象下篇

前言 在类与对象上篇我们讲解了类的基础框架,中篇我们讲解了类的基本内容,下篇我们将补充类的一些零散知识点。 一、构造函数的初始化(初始值)列表 构造函数:创建类对象时自动调用,给对象中各个成员变量一…

多模态大模型综述整理

论文:MM-LLMs: Recent Advances in MultiModal Large Language Models 论文地址: https://arxiv.org/pdf/2401.13601.pdf 表1:26种主流多模态大型语言模型(MM-LLMs)概要 输入到输出模态(I→O)…

[React源码解析] Fiber (二)

在React15及以前, Reconciler采用递归的方式创建虚拟Dom, 但是递归过程不可以中断, 如果组件的层级比较深的话, 递归会占用线程很多时间, 那么会造成卡顿。 为了解决这个问题, React16将递归的无法中断的更新重构为异步的可中断更新, Fiber架构诞生。 文章目录 1.Fiber的结构2…

MySQL前百分之N问题--percent_rank()函数

PERCENT_RANK()函数 PERCENT_RANK()函数用于将每行按照(rank - 1) / (rows - 1)进行计算,用以求MySQL中前百分之N问题。其中,rank为RANK()函数产生的序号,rows为当前窗口的记录总行数 PERCENT_RANK()函数返回介于 0 和 1 之间的小数值 selectstudent_…

Ubuntu22.04 网络图标突然消失

本来好好的,突然就发现没有网络了,图标也不见了。 特别是Ubuntu虚拟机,容易出现此问题。 修复办法 1. sudo service network-manager stop2. sudo rm /var/lib/NetworkManager/NetworkManager.state3. sudo service network-manager start到…

通过Nacos权重配置,模拟微服务金丝雀发布效果(不停机部署)

在微服务项目迭代的过程中,不可避免需要上线;上线对应着部署,或者升级部署;部署对应着修改,修改则意味着风险。 传统的部署都需要先停止旧系统,然后部署新系统,之后需要对新系统进行全面的功能测试&#xf…

腾讯云SDK并发调用优化方案

目录 一、概述 二、 网关的使用 2.1 核心代码 三、腾讯云SDK依赖包的改造 一、概述 此网关主要用于协调腾讯云SDK调用的QPS消耗,使得多个腾讯云用户资源能得到最大限度的利用。避免直接使用腾讯云SDK 时,在较大并发情况下导致接口调用异常。网关的工…