Linux内核同步机制之基本概念

一、概述

近期深入的学习了 Linux 内核同步机制,将相关内容整理于此,既是一次梳理,也是一个分享,希望能帮助到读者一二。当然,所谓的深入也只是笔者现有的技术能力所能达到的程度而已。由于能力有限,有错误之处还请各位读者不吝指教,一起学习一起进步。

常用的 Linux 内核同步机制有原子操作、per-cpu 变量、内存屏障、自旋锁、Mutex 锁、信号量和 RCU 等,后面几种锁实现会依赖于前三种基础同步机制。但是,在正式开始介绍具体的内核同步机制实现之前,需要先澄清一些基本概念。

二、基本概念

2.1 同步

既然是同步机制,那就首先要搞明白什么是同步。同步是指用于实现控制多个执行路径按照一定的规则或顺序访问某些系统资源的机制。所谓执行路径,就是在 CPU 上运行的代码流。我们知道,CPU 调度的最小单位是线程,可以是用户态线程,也可以是内核线程,甚至是中断服务程序。所以,执行路径在这里就包括用户态线程、内核线程和中断服务程序。执行路径、执行单元、控制路径等等,叫法不同,但本质都一样。那为什么需要同步机制呢?请继续往下看。

2.2 并发与竞态

并发是指两个以上的执行路径同时被执行,而并发的执行路径对共享资源(硬件资源和软件上的全局变量、静态变量等)的访问则很容易导致竞态。例如,现在系统有一个 LED 灯可以由 APP 控制,APP1 控制灯亮一秒灭一秒,APP2 控制灯亮 500ms 灭 1500ms。如果 APP1 和 APP2 分别在 CPU1 和 CPU2 上并发运行,LED 灯的行为会是什么样的呢?很有可能 LED 灯的亮灭节奏都不会如这两个 APP 所愿,APP1 在关掉 LED 灯时,很有可能恰逢 APP2 正要打开 LED 灯。很明显,APP1 和 APP2 对 LED 灯这个资源产生了竞争关系。竞态是危险的,如果不加以约束,轻则只是程序运行结果不符合预期,重则系统崩溃。在操作系统中,更复杂、更混乱的并发大量存在,而同步机制正是为了解决并发和竞态问题。同步机制通过保护临界区(访问共享资源的代码区域)达到对共享资源互斥访问的目的,所谓互斥访问,是指一个执行路径在访问共享资源时,另一个执行路径被禁止去访问。更多内容请查阅宋宝华老师的《Linux 设备驱动开发详解》一书中第七章第一节,书中详细列举了竞态发生的场景,总结如下图。

Linux内核同步机制之基本概念_第1张图片

2.3 编译乱序与编译屏障

参阅笔者转载的这篇文章 https://blog.csdn.net/weixin_43555423/article/details/113481578。

2.4 执行乱序与内存屏障

《Linux 设备驱动开发详解》一书中第七章第二节对编译乱序和执行乱序都有简略的介绍,通俗易懂,不可不读。不管是编译乱序还是执行乱序,都是为了提升 CPU 的性能。而要真正的理解透执行乱序,首先需要搞清楚 cache 的概念。强烈建议关注奔跑 Linux 社区这个公众号,里面有三篇关于 cache 的文章,分为上中下,作者笨叔讲解的非常透彻。内存屏障是为了解决执行乱序引入的问题,是同步机制里最难理解的一块。关于内存屏障,后面会开专题来介绍。

http://www.wowotech.net/kernel_synchronization/Why-Memory-Barriers.html  Why Memory Barriers?中文翻译(上)

http://www.wowotech.net/kernel_synchronization/why-memory-barrier-2.html  Why Memory Barriers?中文翻译(下)

http://www.wowotech.net/kernel_synchronization/memory-barrier-1.html  perfbook memory barrier(14.2章节)的中文翻译(上)

http://www.wowotech.net/kernel_synchronization/perfbook-memory-barrier-2.html  perfbook memory barrier(14.2章节)中文翻译(下)

 

 

 

你可能感兴趣的:(Linux内核同步机制)