《Linux 内核设计与实现》09. 内核同步介绍

news2025/4/28 12:48:30

共享资源之所以要防止并发访问,是因为如果多个执行线程同时访问和操作数据,就有可能发生各线程之间相互覆盖共享数据的情况,从而造成被访问的数据不一致状态。

临界区和竞争条件

  • 临界区:访问和操作共享数据的代码段。
  • 原子操作:对资源的操作必须保证在结束之前不可被打断。
  • 竞争条件:两个执行线程对同一个临界区操作。
  • 同步:避免并发和防止竞争条件。

加锁

现在有一个队列,有两个函数,一个是在尾部添加元素,另一个是删除尾部元素。这两个函数在内核的各个部分都可以调用,因此现在假设程序 A 要增加一个元素,当增加完了后程序 A 被程序 B 抢占,此时程序 B 上 CPU 执行,程序 B 要删除尾部元素。

这样可以明显的看到,队列是共享资源,A 和 B 冲突了,B 删除了 A 需要的数据。

给程序加锁可以解决问题。

image-20230421202104944

锁有多种多样的形式,而且加锁的粒度范围也各不相同。

各种锁机制之间的区别在于,当锁已经被其它线程所持有,因而不可用时的行为表现:

  • 一些锁被争用时,会简单地执行忙等待(反复处于一个循环中,不断检测锁的状态,等待锁变为可用)
  • 一些锁会使当前任务睡眠直到锁可用为止。

锁是采用原子操作实现的,而原子操作不存在竞争。

造成并发执行的原因

用户空间之所以需要同步,是因为用户程序会被调度程序抢占和重新调度。由于用户进行任何时刻都可能会抢占,因此如果抢占后的那个进程也处于同一个临界区时,前后两个进程相互之间就会产生竞争。

另外,因为型号处理是异步发生的,所以,即使是单线程的多个进程共享文件,或者在一个程序内部处理信号,也有可能产生竞争条件。这种类型的并发操作,其实两者并不是真的同时发生,但它们相互交叉进行,所以也可称作伪并发执行。

在对称多处理器中,两个进程就可以真正地在临界区中同时执行,这种称为真并发。

内核中可能造成并发执行的原因:

  • 中断
  • 软中断和 tasklet
  • 内核抢占
  • 睡眠以及用户空间的同步
  • 对称多处理

在编写代码的开始阶段就要设计恰当的锁。

了解要保护什么

  • 如果有其它执行线程可以访问这些数据,那么就给这些数据加上某种所。
  • 如果任何其它睡眠东西都能看到它,那么就要锁住它。

要上锁的是数据,而不是代码。

在编写内核代码时,要清楚:

  • 这个数据是不是全局的?除了当前线程外,其它线程能不能访问它。
  • 这个数据会不会在进程上下文和中断上下文中共享?它是不是要在两个不同的中断处理程序中共享?
  • 进程在访问数据时是否可能被抢占?被调度的新程序会不会访问同一数据?
  • 当前进程是否会休眠(阻塞)在某些资源上,若是,它会让共享数据处于何种状态?
  • 怎么防止数据失控?
  • 如果这个函数又在另一个处理器上被调度将会发生什么?
  • 如何确保代码远离并发威胁?

几乎访问所有的内核全局变量和共享数据都需要某种形式的同步。

死锁

当有一个或多个执行线程和一个或多个资源,每个线程都在等待其中的一个资源,但所有的资源都已经被占用了。所有线程都在相互等待,但它们永远都不会释放已经占用的资源。于是任何线程都无法继续,这便是死锁

自死锁: 一个执行线程试图去获得一个自己已经持有的锁,它将不得不等待锁被释放,但因为它正在忙着等待这个锁,所以自己永远也不会有机会释放锁,最终形成死锁。

image-20230422092034533

ABBA死锁:n 个线程和 n 个锁,若每个线程都持有一把其它进程需要得到的锁,那么所有的线程都将阻塞地等待它们希望得到的锁重新可用。

image-20230422092057110

写代码中,避免死锁的一些规则:

  • 按顺序加锁。使用嵌套的锁时必须保证以相同的顺序获得锁。
  • 防止发生饥饿。程序是否一定会执行结束?若A进程不结束,那么B进程还需要等下去吗?
  • 不要重复请求同一个锁。
  • 设计锁要力求简单,越复杂的加锁方案越可能造成死锁。

如果有两个或多个锁曾在同一时间内被请求,那么以后其它函数请求它们也必须按照前次的加锁顺序进行。

现在有个函数(线程1)以 cat、dog 最后以 fox 的顺序获得锁,那么其它函数也都必须要以这个顺序获得锁。现假设另一个函数并没有以这个顺序得到锁,而是先得到 fox 锁,然后获得 dog 锁,因为 dog 总是先于 fox 被获得(dog 被线程1拿走了),因此造成死锁。

image-20230422094940676

可以看到,线程2等到 dog 锁,而线程1在等到 fox 锁,两边都不肯释放自己所占用的锁,因此造成死锁。

在代码中使用锁的地方,对锁的获取顺序加上注释是个良好习惯,例如:

/*
 * cat_lock —— 用于保护访问 cat 数据结构的锁,总是要在获得锁 dog 前先获得
 */

争用和扩展性

略…

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

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

相关文章

键控流水灯

项目文件 文件 关于项目的内容知识点可以见专栏单片机原理及应用 的第四章 IO口编写 在电路图的基础上,编写可键控的流水灯程序。要求实现的功能为,K1是总开关,当K1首次按下时,流水灯由下往上流动;当K2按下时停止流动,且全部灯灭…

ASK,FSK和PSK

一、ASK,FSK和PSK 数字信号只有有限个离散值,使用数字信号对载波进行调制的方式称为键控(Keying),分为幅度键控(ASK)、频移键控(FSK)和相移键控(PSK)。 幅度键控可以通过乘法器和开关电路来实现,在数字信…

SpringBoot【开发实用篇】---- 配置高级

SpringBoot【开发实用篇】---- 配置高级 1. ConfigurationProperties2. 宽松绑定/松散绑定3. 常用计量单位绑定4. 校验5. 数据类型转换 进入开发实用篇第二章内容,配置高级,其实配置在基础篇讲了一部分,在运维实用篇讲了一部分,这…

离线安装Percona

前言 安装还是比较简单,这边简单进行记录一下。 版本差异 一、离线安装Percona 下载percona官网 去下载你需要对应的版本 jemalloc-3.6.0-1.el7.x86_64.rpm 需要单独下载 安装Percona 进入RPM安装文件目录,执行下面的脚本 yum localinstall *.rpm修改…

C语言CRC-16 X25格式校验函数

C语言CRC-16 X25格式校验函数 CRC-16校验产生2个字节长度的数据校验码,通过计算得到的校验码和获得的校验码比较,用于验证获得的数据的正确性。基本的CRC-16校验算法实现,参考: C语言标准CRC-16校验函数。 不同应用规范通过对输…

聊聊Doris向量化执行引擎-过滤操作

聊聊Doris向量化执行引擎-过滤操作 Doris是开源的新一代极速MPP数据库,和StarRocks同源,采用全面向量化技术,充分利用CPU单核资源,将单核执行性能做到极致。本文,我们聊聊过滤操作是如何利用SIMD指令进行向量化操作。 …

PCB设计流程步骤中的注意事项

PCB中文名称为印制电路板,又称印刷线路板,几乎所有电子设备中都会应用到PCB。这种由贵金属制成的绿色电路板连接了设备的所有电气组件,并使其能够正常运行。PCB原理图是一个计划,是一个蓝图。它说明的并不是组件将专门放置在何处&…

【51单片机HC6800-EM3 V3.0】动态数码管显示,原理分析,连线操作

🎊专栏【51单片机】 🍔喜欢的诗句:更喜岷山千里雪 三军过后尽开颜。 🎆音乐分享【如愿】 大一同学小吉,欢迎并且感谢大家指出我的问题🥰 目录 🍔提醒 🎊连线图片 🎊原理…

基于SSM框架扶贫信息综合平台前台管理系统(spring+springmvc+mybatis+jsp+jquery+css)

一、项目简介 本项目是一套基于SSM框架扶贫信息综合平台前台管理系统,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含:项目源码、数据库脚本等,该项目附带全部源码可作为毕设使用。 项目都经过严格调试&am…

【刷题】138. 复制带随机指针的链表

138. 复制带随机指针的链表 一、题目描述二、示例三、实现 138. 复制带随机指针的链表 一、题目描述 给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。 构造这个链表的 深拷贝。 深拷贝…

Matlab论文插图绘制模板第90期—带权重的有向图/图论图/网络图

在之前的文章中,分享了Matlab有向图的绘制模板: 进一步,如果我们想标注有向图的每条边的权重,或者直接用线条的粗细来表示权重,该怎么操作呢? 先来看一下成品效果: 特别提示:本期内…

洛谷P5047 [Ynoi2019 模拟赛] Yuno loves sqrt technology II(离线区间逆序对+莫队二次离线)

题目 给你一个长为n(1<n<1e5)的序列a(0<ai<1e9)&#xff0c; m(1<m<1e5)次询问&#xff0c;每次查询一个区间[l,r]的逆序对数&#xff0c;可离线。 思路来源 登录 - 洛谷 三道经典分块题的更优复杂度解法&[Ynoi2019模拟赛]题解 - 博客 - OldDriverT…

(异或相消)猫猫数字异或和

E - Red Scarf (atcoder.jp) 刚入坑写的一道题被我拉出来对比分析了 我的思路&#xff1a; 垃圾运气选手凭借直觉乱搞猜出来的&#xff0c;没有思路。 题解思路&#xff1a; 由问题陈述中XOR的定义&#xff0c;我们可以看出计算3个或更多整数的XOR可以以任意顺序进行&#…

fastjson 代码执行 (CNVD-2017-02833)

漏洞存在原因 在fastjson<1.2.24版本中&#xff0c;在解析json的过程中&#xff0c;支持使用autoType来实例化某一个具体的类&#xff0c;并调用该类的set/get方法来访问属性。而在1.24<fastjson<1.2.48版本中后增加了反序列化白名单。 漏洞复现过程如下 在vulfocu…

解读ChatGPT中的RLHF

无论是 ChatGPT 还是 GPT-4&#xff0c;它们的核心技术机制之一都是基于人类反馈的强化学习&#xff08;Reinforcement Learning from Human Feedback&#xff0c;RLHF&#xff09;。这是大型语言模型生成领域的新训练范式&#xff0c;即以强化学习方式依据人类反馈优化语言模型…

打造属于自己的私人云笔记

打造属于自己的私人云笔记 前言效果环境标题第一步 网盘部署开启webDAV协议使用 前言 现在市面上支持私有化部署的云笔记选择不多&#xff0c;而且大多数只支持mackDown语法&#xff0c;不支持word等其他文件的编辑&#xff0c;基于此需求&#xff0c;能不能有一款笔记软件&am…

盛元广通高等级生物安全实验室(P3)管理系统

近年来&#xff0c;传染性疾病频发&#xff0c;给传染病防控和生物安全带来了前所未有的挑战&#xff0c;重点构建集生物安全三级实验室&#xff0c;统一布局科技研究和科技力量&#xff0c;成为重要传染病原和生物防范基础及应用基础研究的高地&#xff0c;高等级生物安全实验…

JavaScript实现输入长方形的宽和高,输出周长和面积的代码

以下为实现输入长方形的宽和高&#xff0c;输出周长和面积的代码和运行截图 目录 前言 一、实现输入长方形的宽和高&#xff0c;输出周长和面积 1.1 运行流程及思想 1.2 代码段 1.3 JavaScript语句代码 1.4 输入数值不是要求必须输入数值的代码 1.5 运行截图 前言 1.若…

这款视频录制剪辑软件千万别错过!

案例&#xff1a;有没有录制完成之后&#xff0c;可以直接剪辑视频的软件&#xff1f; 【我的工作经常需要对电脑上的内容进行录制、剪辑。我每次都需要使用录屏工具录制完成后&#xff0c;再使用视频剪辑工具进行剪辑&#xff0c;十分麻烦。想问一下有没有软件既能录屏又能剪…

WGCNA | 不止一个组的WGCNA怎么分析嘞!?~(一)(共识网络分析-第一步-数据整理)

1写在前面 最近又是忙碌的一米&#xff0c;做不完的手术&#xff0c;收不完的病人&#xff0c;前途堪忧&#xff0c;收入更是不堪入目。&#x1f972; 把之前的WGCNA教程再补一补吧&#xff0c;之前介绍的是雌性鼠的表型数据分析&#xff0c;只有一组&#xff0c;相对简单。&am…