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

news2024/10/6 20:28:07

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等技术内容,立即学习

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

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

相关文章

OpenHarmony RK3568 启动流程优化

目前rk3568的开机时间有21s,统计的是关机后从按下 power 按键到显示锁屏的时间,当对openharmony的系统进行了裁剪子系统,系统app,禁用部分服务后发现开机时间仅仅提高到了20.94s 优化微乎其微。在对init进程的log进行分析并解决其…

机器学习:多项式回归(Python)

多元线性回归闭式解: closed_form_sol.py import numpy as np import matplotlib.pyplot as pltclass LRClosedFormSol:def __init__(self, fit_interceptTrue, normalizeTrue):""":param fit_intercept: 是否训练bias:param normalize: 是否标准化…

重写Sylar基于协程的服务器(1、日志模块的架构)

重写Sylar基于协程的服务器(1、日志模块的架构) 重写Sylar基于协程的服务器系列: 重写Sylar基于协程的服务器(0、搭建开发环境以及项目框架 || 下载编译简化版Sylar) 重写Sylar基于协程的服务器(1、日志模…

2.室内设计学习 - CAD 2021 调整经典界面教程及基本设置

设置经典界面 1.在第二行的空白处右击,弹出对话框,并点击【关闭】,关闭掉。 2.菜单栏没有显示的情况下,在最上面的一排,点击向下的箭头展开下拉框,勾选 【显示菜单栏】 3.点击菜单【工具】-【工具栏】-【a…

AES 加解密python实现

1. 要求 编程实现AES-128的加解密算法,满足给定明文和密钥加密得到密文,给定密文和密钥解密得到明文,最终用界面化的形式呈现。 2. 算法流程 程序主要分为加密与解密两个大模块。在加密模块中包括四个小模块,分别为轮密钥加、字…

C语言KR圣经笔记 6.4结构体指针 6.5自引用结构体

6.4 结构体指针 为了说明结构体指针和数组的某些注意事项&#xff0c;我们把上一节的关键字计数程序再写一次&#xff0c;不过这回使用指针而不是数组下标。 keytab 的外部声明不需要动&#xff0c;但 main 和 binsearch 确实需要修改。 #include <stdio.h> #include …

3、css设置样式总结、节点、节点之间关系、创建元素的方式、BOM

一、css设置样式的方式总结&#xff1a; 对象.style.css属性 对象.className ‘’ 会覆盖原来的类 对象.setAttribut(‘style’,‘css样式’) 对象.setAttribute(‘class’,‘类名’) 对象.style.setProperty(css属性名,css属性值) 对象.style.cssText “css样式表” …

开发工具之GIT协同开发流程和微服务部署实践与总结

GIT协同开发流程和微服务部署的实践&#xff0c;并总结经验和教训。通过合理的GIT协同开发流程和良好的微服务部署策略&#xff0c;团队可以更高效地开发和部署软件。 ## 引言 在当今快节奏的软件开发环境中&#xff0c;采用合适的工具和流程对于实现高效协同开发和可靠部署至…

1.25时间序列分析,FB先知模型、简要傅里叶变化解决周期性变化,实例步骤

目录 FB概念 ​编辑 GEOGEBRA可视化傅里叶​编辑 先知模型步骤 财务数据要考虑到可解释性 FB模型概念 可以用傅里叶级数来描述周期性变化的因素 GEOGEBRA可视化傅里叶 先知模型步骤

vue+ElementPlus实现中国省市区三级级联动封装

安装插件获取中国省份的所有数据 npm install element-china-area-data -S 借助ElementPlus 级联选择器 Cascader实现 <template><div><el-cascadersize"large":options"options"v-model"selectedOptions"change"handleCh…

C# 一个快速读取写入操作execl的方法封装

这里封装了3个实用类ExcelDataReaderExtensions&#xff0c;ExcelDataSetConfiguration&#xff0c;ExcelDataTableConfiguration和一个实用代码参考&#xff1a; using ExcelDataReader; using System; using System.Collections.Generic; using System.Linq; using System.T…

2024.1.29 关于 Redis 缓存详解

目录 缓存基本概念 二八定律 Redis 作为缓存 缓存更新策略 定期生成 实时生成 内存淘汰策略 缓存使用的注意事项 关于缓存预热 关于缓存穿透 关于缓存雪崩 关于缓存击穿&#xff08;瘫痪&#xff09; 缓存基本概念 所谓缓存&#xff0c;其实就是将一部分常用数据放…

向日葵企业“云策略”升级 支持Android 被控策略设置

此前&#xff0c;贝锐向日葵推出了适配PC企业客户端的云策略功能&#xff0c;这一功能支持管理平台统一修改设备设置&#xff0c;上万设备实时下发实时生效&#xff0c;很好的解决了当远程控制方案部署后&#xff0c;想要灵活调整配置需要逐台手工操作的痛点&#xff0c;大幅提…

计算机网络-数据交换方式(电路交换 报文交换 分组交换及其两种方式 )

文章目录 为什么要数据交换&#xff1f;总览电路交换电路交换的各个阶段建立连接数据传输释放连接 电路交换的特点电路交换的优缺点 报文交换报文交换流程报文交换的优缺点 分组交换分组交换流程分组交换的优缺点 数据交换方式的选择分组交换的两种方式数据报方式数据报方式的特…

正则表达式(RE)

什么是正则表达式 正则表达式&#xff0c;又称规则表达式&#xff08;Regular Expression&#xff09;。正则表达式通常被用来检索、替换那些符合某个规则的文本 正则表达式的作用 验证数据的有效性替换文本内容从字符串中提取子字符串 匹配单个字符 字符功能.匹配任意1个…

(一)Spring 核心之控制反转(IoC)—— 配置及使用

目录 一. 前言 二. IoC 基础 2.1. IoC 是什么 2.2. IoC 能做什么 2.3. IoC 和 DI 是什么关系 三. IoC 配置的三种方式 3.1. XML 配置 3.2. Java 配置 3.3. 注解配置 四. 依赖注入的三种方式 4.1. 属性注入&#xff08;setter 注入&#xff09; 4.2. 构造方法注入&a…

ES Serverless让日志检索更加便捷

前言 在项目中,或者开发过程中,出现bug或者其他线上问题,开发人员可以通过查看日志记录来定位问题。通过日志定位 bug 是一种常见的软件开发和运维技巧,只有观察日志才能追踪到具体代码。在软件开发过程中,开发人员会在代码中添加日志记录,以记录程序的运行情况和异常信…

【蓝桥杯日记】复盘篇二:分支结构

前言 本篇笔记主要进行复盘的内容是分支结构&#xff0c;通过学习分支结构从而更好巩固之前所学的内容。 目录 前言 目录 &#x1f34a;1.数的性质 分析&#xff1a; 知识点&#xff1a; &#x1f345;2.闰年判断 说明/提示 分析&#xff1a; 知识点&#xff1a; &am…

【Linux操作系统】:Linux开发工具编辑器vim

目录 Linux 软件包管理器 yum 什么是软件包 注意事项 查看软件包 如何安装软件 如何卸载软件 Linux 开发工具 Linux编辑器-vim使用 vim的基本概念 vim的基本操作 vim正常模式命令集 插入模式 插入模式切换为命令模式 移动光标 删除文字 复制 替换 撤销 跳至指…

C++——list的使用及其模拟实现

list 文章目录 list1. 基本使用1.1 list对象的定义1.2 增&#xff08;插入数据&#xff09;1.3 删&#xff08;删除数据&#xff09;1.4 遍历访问 2. 模拟实现2.1 节点类ListNode2.2 封装ListNode类&#xff0c;实现list基本功能2.3 实现迭代器iterator2.3.1 实现const迭代器co…