首页 > 其他分享 >一个操作系统的设计与实现——第25章 多处理器(上):多处理器同步原语

一个操作系统的设计与实现——第25章 多处理器(上):多处理器同步原语

时间:2024-09-01 10:25:41浏览次数:11  
标签:25 加锁 多处理器 rflags 原语 cmpxchg CPU rax

25.1 多处理器同步原语的实现原理

当计算机中存在不止一个CPU时,基于关中断的同步原语就失效了。这是因为每个CPU的中断是独立的,关闭一个CPU的中断并不会影响其他CPU。从本质上说,中断由rflags控制,但rflags在每个CPU中都有一个,因此,只有找到一个共享区域,才能实现多CPU间的同步原语。内存正是这样的共享区域,其可用于实现锁。

如果使用内存实现锁,那就需要一块内存标记锁的状态,并需要判断并尝试修改锁的状态。如果使用常规方法实现这套功能,需要的指令一定不止一条,这就陷入了循环依赖:这段指令本身也需要锁,但这段指令本身就是用于实现锁的。

想要解决这个问题,就需要使用一条指令同时判断并尝试修改锁的状态。xchg是实现这个功能的最简单的选择,具体来说:

  • 将锁初始化为0
  • 加锁时,固定使用1与锁进行xchg。如果交换来的是0,就说明锁曾经是0,现在是1,加锁成功;如果交换来的是1,就说明锁在交换前已经是1了,加锁失败,此时,任务应通过某种方式等待锁
  • 解锁时,mov [锁], 0即可

加锁是一个对效率要求很高的操作,因此,CPU提供了cmpxchg的二合一增强版:cmpxchg指令。顾名思义,cmpxchg能同时进行比较与交换操作。具体来说,cmpxchg lhs, rhs的效果是:比较lhsal/ax/eax/rax,如果相等,则mov lhs, rhs,否则,mov rax, lhs,此外,比较操作会影响rflags的ZF位,即je/jne考察的位。

cmpxchg的效果看上去比较绕,如果将其用在锁上,就可以得到一个比较具体的描述:将rax设为0,rdx设为1,然后执行cmpxchg [锁], rdxcmpxchg首先比较[锁]rax,如果相等,就说明锁是0,是可用的,于是执行mov [锁], rdx,将锁置1,同时修改rflags的ZF位,使je通过,且rax仍为0,表示加锁成功;否则,如果不等,就说明锁是1,是不可用的,于是执行mov rax, [锁],将rax置1,表示加锁失败,同时修改rflags的ZF位,使jne通过。

25.2 总线锁定

当内存被多个CPU同时访问时,其也需要锁。因此,CPU提供了总线锁定前缀lock,当使用lock前缀时,内存会被当前指令锁定,其他CPU不能使用内存,直至当前指令结束。

总线锁定对效率有影响,因此是不能滥用的。此外,仅有非常少的指令支持lock前缀,它们是:add, adc, and, btc, btr, bts, cmpxchg, cmpxch8b, cmpxchg16b, dec, inc, neg, not, or, sbb, sub, xor, xadd, xchg,其他指令不能使用lock前缀。

xchg被强制视为具有lock前缀。

25.3 自旋锁的实现

在我们的操作系统中,使用自旋锁进行多处理器同步。

请看本章代码25/Lock.h

第5行,声明了Lock类型。当锁不可用时,自旋锁将进行忙等待,因此其不需要等待队列,只需要一个整数即可。

第7~9行,声明了锁的接口函数,这些函数是用汇编语言实现的。

接下来,请看本章代码25/Lock.s

lockInit函数用于初始化锁,简单的将锁置0即可。

lockAcquire函数用于加锁并返回rflags的值。

第18行,将rdx置1,准备进入自旋状态。

第20~24行,不断尝试加锁。注意:xor rax, rax不能放在循环外面,因为cmpxchg会在加锁失败时将rax从0改成1。

第26~28行,返回rflags的值,然后关中断。

lockRelease函数用于解锁并恢复rflags的值。

第36行,将锁重新置0。

第38~39行,恢复rflags的值。

25.4 自旋锁的使用

在我们的操作系统中,任务队列和显卡驱动会被每个CPU使用,因此是需要加锁的。

请看本章代码25/Queue.h

第16行,在Queue中加入自旋锁。

接下来,请看本章代码25/Queue.hpp

第11行,初始化锁。

第17、21、29、37、43、50行,将关中断升级为自旋锁。

接下来,请看本章代码25/Print.hpp

第8行,定义显卡驱动锁。

第98、105行,在printStr函数中加入锁。

第214行,初始化显卡驱动锁。

25.5 编译与测试

本章代码25/Makefile增加了Lock.s的编译与链接命令。

本章代码25/Kernel.c测试了加锁以后的任务切换和printStr函数。

标签:25,加锁,多处理器,rflags,原语,cmpxchg,CPU,rax
From: https://www.cnblogs.com/yingyulou/p/18391069

相关文章

  • 2024-2025-1 20221328 RocEDU.信息安全系统设计 1-1 Markdown学习(选做)
    一、向AI提问AI的回答:1.深入浅出的讲解Markdown及其详细语法Markdown是一种轻量级标记语言,其设计初衷是为了让人们能够使用易读易写的纯文本格式编写文档,并转换成有效的HTML(标准通用标记语言下的一个应用)文档。Markdown的语法简洁明了,比HTML更加简单易用,广泛应用于写作、博客......
  • STM32--硬件读写W25Q64
    声明:我是跟着B站江科大的视频的学习过程中记录下来作者的文案,记录下来是为了方便自己日后复习。如果你也是跟着江科大的视频学习的,可以一起学习。我把其中一些白话进行了修改,并且添加了自己的一些理解。我只有一些pyhon基础,所以可能有错误,学起来也比较吃力,就把自己的一些理解......
  • L2-006 树的遍历 分数 25
    硬写的//我也不知道多长时间了,估计有40min#include<bits/stdc++.h>usingnamespacestd;constintN=50;inthou[N],zhong[N];classNode{public:intval;intwei;Node*father;Node*left;Node*right;Node(intv=-114):val(v),......
  • 如何在愈发激烈的2025广西南宁中考中生存下来
    背景以2024年为例吃了择校的亏七年级结束后,北宁市教育局突然通知北宁市的X中学和S学校转为公办。近年来教育改革过程中,我确实没有吃到这个时代发展的红利,反观北宁市的一些高中越来越卷,逐渐衡水化。要求考前学科答题规范讲座(语文主讲:南宁二中申颖老师):不要盲目自信https://ww......
  • 20221325-杨筱-Markdown学习
    AI回答提示词:(1)深入浅出的讲解Markdown及其详细语法Markdown是一种轻量级的标记语言,它允许人们使用易读易写的纯文本格式编写文档,并通过简单的标记语法快速转换为格式丰富的HTML页面。Markdown被广泛应用于博客、文档编写、GitHub等平台,因其简洁的语法和高效的排版能力而深受用户......
  • 25岁,转行网络安全工程师来的赢吗?
    先说结论:一点不晚!首先说一下这个行业的现状,真正科班出身软件测试专业的很少,因为只有个别院校有这个专业,根据了解也是教的很浅,对接不了企业的需求。那么说根据目前的现状,可以将这个行业的从业者分为这么几类:第一种,应届毕业生,要么是本专业学的就是这个,要么是在毕业之前就有......
  • 游卡,三七互娱,得物,顺丰,快手,oppo,莉莉丝,康冠科技,途游游戏,埃科光电25秋招内推
    游卡,三七互娱,得物,顺丰,快手,oppo,莉莉丝,康冠科技,途游游戏,埃科光电25秋招内推①顺丰【招聘岗位】研发、算法、大数据、产品、项管、设计、人资等【官方内推码】4FOLXH【一键内推】https://sourl.cn/UzbDat②游卡【岗位】程序技术、产品策划、美术、发型运营、职能综合、桌游......
  • CSS 高级区块效果——WEB开发系列25
    CSS提供了多种工具和属性,使我们能够创建视觉上引人注目的效果。今天我们继续将深入了解几种高级CSS效果:盒子阴影、滤镜、混合模式和文本背景裁剪,提升网页设计的质感和深度。一、盒子阴影(BoxShadow)对于盒子元素,存在一个类似的属性——​​box-shadow​​​,用于在实际的元......
  • L2-007 家庭房产 分数 25
    #include<bits/stdc++.h>usingnamespacestd;constintN=1e5+10;//分别为祖宗节点,人数,房子数,总面积intp[N],cnt[N],fangzi[N],totalarea[N],minnum[N];//编号是否存在,为true存在boolflag[N];classans{public:intzuixiao;intrenkou;doub......
  • 基于javaweb的smile旅行社管理系统的设计与实现 毕业设计-附源码02508
    摘 要随着旅游行业的蓬勃发展,旅行社作为连接旅游资源和游客的桥梁,其管理效率和服务质量直接影响着客户满意度和企业竞争力。为了更好地满足市场需求,提升旅行社的管理水平和运营效率,设计与实现一套高效、稳定的旅行社管理系统显得尤为重要。基于JavaWeb的Smile旅行社管......