并发控制互斥笔记

整理总结自蒋炎岩老师的b站课程,https://jyywiki.cn/OS/2022/index.html

  • 多处理器系统中数据的一致性和互斥访问

    • 所有的CPU的一级缓存都是连着的,如果是多个CPU的话,用在内存中放置标志位,来保证对当前内容的原子性读取,Xchg指令。
      在这里插入图片描述

    • Lock 指令的现代实现(自旋锁)(类似于悲观锁)

      • int table = YES;
        
        void lock() {
        retry:
          int got = xchg(&table, NOPE);
          if (got == NOPE)
            goto retry;
          assert(got == YES);
        }
        
        void unlock() {
          xchg(&table, YES)
        }
        
      • 通常描述

      • int locked = 0;
        void lock() { while (xchg(&locked, 1)) ; }
        void unlock() { xchg(&locked, 0); }
        
      • 在 L1 cache 层保持一致性 (ring/mesh bus)

        • 相当于每个 cache line 有分别的锁(实际上,这不是传统意义上的锁。在硬件层面,通过缓存一致性协议和高速互连网络,处理器能够确保当一个核心在其L1缓存中修改了某个缓存行时,其他核心能够即时地了解到这一变化。这种机制确保了数据的一致性,而无需显式的锁。)
        • store(x) 进入 L1 缓存即保证对其他处理器可见
          • 但要小心 store buffer 和乱序执行
      • Icache line 根据状态进行协调

        • M (Modified), 脏值
        • E (Exclusive), 独占访问
        • S (Shared), 只读共享
        • I (Invalid), 不拥有 cache line
    • Load-Reserved/Store-Conditional(LR/SC)(类似于乐观锁)

      • LR: 在内存上标记 reserved (盯上你了),中断、其他处理器写入都会导致标记消除

        lr.w rd, (rs1)
          rd = M[rs1]
          reserve M[rs1]
        
      • SC: 如果 “盯上” 未被解除,则写入

        sc.w rd, rs2, (rs1)
          if still reserved:
            M[rs1] = rs2
            rd = 0
          else:
            rd = nonzero
        
    • 自旋锁的缺陷

      • 性能问题 (0)

        • 自旋 (共享变量) 会触发处理器间的缓存同步,延迟增加
      • 性能问题 (1)

        • 除了进入临界区的线程,其他处理器上的线程都在空转
        • 争抢锁的处理器越多,利用率越低
      • 性能问题 (2)

        • 获得自旋锁的线程

          可能被操作系统切换出去

          • 操作系统不 “感知” 线程在做什么
          • (但为什么不能呢?)
        • 实现 100% 的资源浪费

    • 自旋锁的使用场景

      • 临界区几乎不 “拥堵”
      • 持有自旋锁时禁止执行流切换

      使用场景:操作系统内核的并发数据结构 (短临界区)

      • 操作系统可以关闭中断和抢占
        • 保证锁的持有者在很短的时间内可以释放锁
    • 线程+长临界区的互斥可以解决

      • 把锁的实现放到操作系统里就好啦!

        • syscall(SYSCALL_lock, &lk);
          
          • 试图获得 lk,但如果失败,就切换到其他线程
        • syscall(SYSCALL_unlock, &lk);
          
          • 释放 lk,如果有等待锁的线程就唤醒
        • 其他的线程仍然能继续执行

  • 关于互斥的一些分析

    • 自旋锁 (线程直接共享 locked)
      • 更快的 fast path
        • xchg 成功 → 立即进入临界区,开销很小
      • 更慢的 slow path
        • xchg 失败 → 浪费 CPU 自旋等待
    • 睡眠锁 (通过系统调用访问 locked)
      • 当没有获取到锁将线程转为就绪状态(会频繁切换上下文)
      • 更快的 slow path
        • 上锁失败线程不再占用 CPU
      • 更慢的 fast path
        • 即便上锁成功也需要进出内核 (syscall)
  • 互斥锁

    • 睡眠锁+自旋锁=互斥锁

    • 先在用户空间自旋

      • 如果获得锁,直接进入

      • 未能获得锁,系统调用

      • 解锁以后也需要系统调用

        class Futex:
            locked, waits = '', ''
        
            def tryacquire(self):
                if not self.locked:
                    # Test-and-set (cmpxchg)
                    # Same effect, but more efficient than xchg
                    self.locked = '🔒'
                    return ''
                else:
                    return '🔒'
        
            def release(self):
                if self.waits:
                    self.waits = self.waits[1:]
                else:
                    self.locked = ''
        
            @thread
            def t1(self):
                while True:
                    if self.tryacquire() == '🔒':     # User
                        self.waits = self.waits + '1' # Kernel
                        while '1' in self.waits:      # Kernel
                            pass
                    cs = True                         # User
                    del cs                            # User
                    self.release()                    # Kernel
        
            @thread
            def t2(self):
                while True:
                    if self.tryacquire() == '🔒':
                        self.waits = self.waits + '2'
                        while '2' in self.waits:
                            pass
                    cs = True
                    del cs
                    self.release()
        
        

        Python模拟操作系统实现

        • 更好的设计可以在 fast-path 不进行系统调用

下篇聊并发控制同步

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

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

相关文章

跟TED演讲学英文:4 pillars of college success in science by Freeman Hrabowski

4 pillars of college success in science Link: https://www.ted.com/talks/freeman_hrabowski_4_pillars_of_college_success_in_science Speaker: Freeman Hrabowski Date: February 2013 文章目录 4 pillars of college success in scienceIntroductionVocabularyTranscr…

嵌入式学习——C语言基础——day15

1. 段错误调试 1.1 打印法 在可能出现错误的位置加入打印,前一句能够打印出来,后一句打印不出来,问题就可以定位到两次打印中间的代码 1.2 gbd调试法 1. 编译代码时加入-g选项 gcc filename.c -g 2. 使用gdb调试生成的代码 gdb a.out 3. gdb调试命令 l 查看…

mysql优化面试总结

mysql优化 和 mysql优化之索引 两篇文章有大量的实验性的内容,我暂时没时间理解,把八股部分总结到这篇文章中,方便记忆 我们为什么要对sql进行优化 我们开发项目上线初期,由于业务数据量相对较少,一些SQL的执行效率对…

实现同一份数据的各种镜像

一个数据集通过某个轴(通常是垂直或水平轴)的镜像对称。这可以通过简单的数学运算来实现。 如果想要通过一块数据生成四份,可以通过以下步骤: 下面是一个简单的示例,展示了如何通过垂直轴(左右对称&#…

HCIP的学习(13)

第五章,重发布和路由策略 重发布 ​ 在路由协议的边界设备上,将某一种路由协议的路由信息引入到另一种路由协议中,这个操作被称为路由引入或者路由重分发。----技术本质为重发布。 条件 必须存在ASBR设备(路由边界设备&#x…

VMware虚拟机提示内存不足

VMware虚拟机,k8s集群搭建内存不足的问题 疑问:我的电脑是8G8G双通道的内存,当我在搭建k8s集群时给master-2G内存,node1-3G内存,node2-3G内存; 当依次打开虚拟机到node2时VM提示“物理内存不足,…

Python-100-Days: Day11 Files and Exception

1.读取csv文件 读取文本文件时,需要在使用open函数时指定好带路径的文件名(可以使用相对路径或绝对路径)并将文件模式设置为r(如果不指定,默认值也是r),然后通过encoding参数指定编码&#xf…

PTA|小字辈

题目 本题给定一个庞大家族的家谱,要请你给出最小一辈的名单。 输入格式: 输入在第一行给出家族人口总数 N(不超过 100 000 的正整数) —— 简单起见,我们把家族成员从 1 到 N 编号。随后第二行给出 N 个编号&#x…

JAVA语言VUE2+Spring boot+MySQL开发的智慧校园系统源码(电子班牌可人脸识别)Saas 模式

技术栈 1. 开发语言:JAVA 2. 数据库:MySQL 3. 后端框架:Spring boot 4. 前端框架:VUE2 5. 电子班牌: Android 7.1 6. 小程序:原生开发 7. 多学校Saas 模式 电子班牌是一款智慧校园管理工具&#xf…

Java实现手机短信验证码(互亿无线)

互亿无线 互亿无线是一家提供电信类增值服务插件以及其他相关插件的公司,是中国移动、中国联通、中国电信三大运营商的战略合作伙伴与工信部认定的电信增值业务服务商。公司旗下运营三大业务平台:数字奖励营销活动平台、应用短信平台、营销短信平台。 官…

上网行为审计软件分享|三款热门上网行为监控软件推荐

“小王,去找一款软件给我们公司安上,你去搜上网行为审计软件,看看买哪家合适” 这是某公司老板交给助理的一项工作,原话是这样的。 可见其实这类软件大多是人还是比较陌生的。 上网行为审计软件顾名思义就是对上网行为也就是电…

04-22 周日 阿里云-瑶光上部署FastBuild过程(配置TLS、自定义辅助命令)

04-22 周日 阿里云-瑶光上部署FastBuild过程 时间版本修改人描述2024年4月22日14:18:59V0.1宋全恒新建文档2024年4月23日20:41:26V1.0宋全恒完成了基本流程的添加 简介 前提 准备两台服务,一台部署Docker,一台部署FastBuild的镜像容器服务所述的Docke…

落地企业业财一体化的关键能力和路径

在财务数字化的改革过程中,财务部门已经通过会计电算化、ERP、财务共享,基本实现业务财务流程拉通和财务运营效率的提升,接下来面临问题是如何通过构建业财一体化体系,进一步挖掘数字利用价值,为管理决策赋能。 但在业…

LLM应用-prompt提示:让大模型总结生成Mermaid流程图;充当角色输出

1、prompt提示让大模型总结生成Mermaid流程图 生成内容、总结文章让大模型Mermaid流程图展示: mermaid 美人鱼, 是一个类似 markdown,用文本语法来描述文档图形(流程图、 时序图、甘特图)的工具,您可以在文档中嵌入一段 mermaid 文本来生成 …

国内如何下载TikTOK,手机刷机教程

最近很多玩家都来问怎么刷机?手机环境怎么搭建?这里给大家整理了苹果IOS刷机教程 1.iOS下载教程 : 步骤一:手机调试 苹果手机系统配置推荐:iPhone6S以上,16G。 注意:如果是选择购入二手手机…

Devin AI程序员是如何设计出来的

背景 Devin是一个能够执行复杂工程任务并与用户在软件开发项目上积极合作的自主人工智能软件工程师,它擅长planning、tool use、reflecting,碾压大部分初级开发。 设计思路 一、界面设计 先来看 Devin 的界面,左边是对话框,记…

C++笔记之调用PCL库显示PCD文件的点云

C++笔记之调用PCL库显示PCD文件的点云 —— 2024-05-05 杭州 code review! 文章目录 C++笔记之调用PCL库显示PCD文件的点云1.运行2.点云pcd文件github下载地址2.main.cpp3.CMakeLists.txt1.运行 2.点云pcd文件github下载地址 https://github.com/luolaihua/point-cloud-data-…

如果insightface/instantID安装失败怎么办(关于InsightFaceLoader_Zho节点的报错)

可能性有很多,但是今天帮朋友解决问题的时候又收集了一种新的思路。 首先,可以先按照这篇文章里边提到的方法去安装: 【全网最详细】ComfyUI下,Insightface安装指南-聚梦小课堂_insightface如何安装-CSDN博客 其次,…

牛客周赛 Round 41 C-F

C 小红的循环移位 思路&#xff1a; 一个数是不是四的倍数&#xff0c;只用看最后两位是否能够整除4即可。 #include <bits/stdc.h>using namespace std; const int N 1e6 5; typedef long long ll; typedef pair<ll, ll> pll; typedef array<ll, 3> p3;…