【linux内核分析与应用-陈莉君】内核同步概述

本文探讨了内核同步机制的重要性及其实现方式。介绍了并发执行的原因、竞争条件的概念、临界区的保护方法,并讨论了原子操作和锁机制的应用。

目录

 

1.内核同步机制的引入

2.并发执行的原因

3.竞争条件

4.临界区

5.并发执行中共享变量V加操作

6.原子操作

7.共享队列和加锁

8.确定保护对象

9.死锁与死锁的避免

10.参考资料与思考题


1.内核同步机制的引入

如果把内核看做不断地对各种请求进行响应的服务器的话,那么正在CPU上执行的进程发出中断请求
的外部设备等相当于客户,正如服务器一直要响应客户的请求一样,内核也随时响应进程中断系统调用
等的请求.我们之所以这么比喻是需要强调内核中的各个任务并不是严格按照顺序依次执行的,而是相互
交错执行的.对于所有的内核任务而言,内核中的很多数据都是共享资源,这就像高速公路供给有很多车辆
行驶一样,对这些共享资源的访问,必须遵守一定的访问规则,否则就会造成对共享资源的破坏,就如同
不遵守交替规则会造成撞车一样.

2.并发执行的原因

1.中断
  中断几乎可以在任何时刻异步发生,也可能随时打断正在执行的代码;
2.内核抢占
  当内核具有抢占性的时候,内核中的任务就可能被另一个任务抢占;
3.睡眠
  在内核中执行的进程可能会睡眠,这将唤醒调度程序导致调度一个新的进程执行;
4.对称多处理器
  两个或多个处理器可以同时执行代码,这时就可能造成并发,问题是系统中还有没有其他的并发源.

3.竞争条件

竞争条件:
Race Condition.
在并发执行的过程中,会产生竞争,在这里我们就给出竞争的条件.
当以下两个条件同时发生的时候,竞争就发生:
(1)至少两个可执行上下文并行执行:
   一种是真正的并行,比如说两个系统调用在不同的处理器上执行;
   另一种是其中一个上下文能够随意地抢占另一个,比如说一个中断抢占系统调用;
(2)可执行上下文对共享变量执行读写操作.

问题:
为什么这些竞争条件会导致各种难以调试的错误?


竞争条件导致的错误的示例(释放资源的示例):
在大多数情况下,释放资源的函数只释放一次资源,然而在上图所示,
counter的初值为2,A线程将counter的值改成1的时候,B线程抢占了A,
counter的值又被减了一次,减为0,然后B线程就调用释放资源的函数去释放资源,
然后线程A恢复执行,因为此时counter的值为0了,线程A也释放了资源,于是出现
一个资源被释放两次的情况.

问题:
如何解决这样的问题?

4.临界区

所谓临界区就是访问或操作共享的代码段,多个内核任务并发访问同一个资源通常是
不安全的,为了避免对临界区进行并发访问,编程者必须保证临界区代码被原子执行,
也就是说代码在执行期间不可以被打断,就如同整个临界区是一个不可分割的指令一样,
如图:
A进程进入临界区以后,B试图进入的时候就被阻塞,只有当A离开临界区以后,B才能
进入.

问题:
在释放资源的那个例子中,临界区是什么?


如何保护临界区?
1.使得临界区的操作能够原子地进行;
2.进入临界区以后禁止抢占,比如通过中断,禁止下半部分处理,或者禁止线程的抢占等;
3.串行地访问临界区,比如使用自旋锁,互斥锁,只允许一个内核访问临界区.

5.并发执行中共享变量V加操作

多个CPU和内存通过总线互联,在任一时刻,只能有一个总线设备.
比如说CPU或DM控制器访问该从设备,在这个场景中该从设备就是RAM芯片,因此
来自两个CPU上的读内存的操作被串行执行,分别获得同样的旧值,比如说0,
完成修改之后两个CPU都想进行写操作,把修改的值写到内存,但是硬件的(??争抢)限制
使得CPU的写回同样必须是串行化的,因此CPU首先获得了访问权,进行写回的动作,
随后CPU2完成写回动作,在这种情况下CPU1对内存的修改就被CPU2覆盖了,
此时执行结果就是错误的.本来加两次结果应该为2,但这里就成1了.


在多处理器的SM系统中,为了提供原子操作,不同的CPU体系结构提供了不同的技术.
例如在x86,当执行加有lock前置位的指令的时候,这个前置位就用于锁定系统总线,
使得前面的错误就不会发生.


问题:
在ARM平台上采用什么指令?

6.原子操作

推荐阅读1

推荐阅读2

对于由多个内核任务进行共享的变量,对变量的装载修改和存储必须原子地进行,不能分割.
于是内核提供了一个特殊的类型--原子类型atomic_t.
typedef struct{
    int counter;
}atomic;

7.共享队列和加锁

当共享资源是一个复杂的数据结构的时候,竞争状态往往会使得数据结构遭到破坏,对于这种情况怎么处理
呢?
锁机制是可以避免禁止状态的.
正如锁和门一样,门后的房间可以想象成一个临界区,在给定时间内,房间里只能有一个内核存在,当一个
任务进入房间以后,它会锁住房门,当它结束对共享数据的操作以后,就会走出房间,打开门锁.
如图A和B试图同时进入房间,当一个任务进去以后,就必须加锁,出来以后打开锁.


任何要访问队列的代码首先都要占着相应的锁,这样的话,该锁就能阻塞来自其他内核中的并发访问.
比如说任务1试图锁定队列,那么它成功获得锁之后才能访问队列,若此时也有任务2也要访问共享的
队列,那么可能的情况就如上图.

8.确定保护对象

9.死锁与死锁的避免

10.参考资料与思考题

内容概要:本文详细介绍了MySQL中InnoDB存储引擎的逻辑存储结构及其表分区技术。InnoDB的逻辑存储单元由高到低依次为表空间、段、区、页和行,其中表空间包括系统表空间、独立表空间、通用表空间、Undo表空间和临时表空间,每种表空间具有不同的用途和管理方式。文章进一步讲解了表分区的概念类型,包括RANGE、LIST、HASH、KEY以及多字段COLUMNS分区,阐述了分区的优势如提升查询性能、便于数据维护、支持跨物理设备存储等,并列举了实际SQL操作示例,帮助理解分区表的创建、修改、删除及重组等操作。同时指出了分区的限制条件,如最大分区数量、主键约束要求等。; 适合人群:具备一定MySQL数据库基础,从事数据库开发、运维或架构设计的技术人员,尤其是工作中涉及大数据量表管理性能优化的1-3年经验研发人员。; 使用场景及目标:①深入理解InnoDB存储机制,优化数据库物理结构设计;②掌握表分区技术,应用于海量数据存储高效查询场景,如日志系统、订单系统的时间分区设计;③通过分区实现数据归档、快速删除历史数据、提升查询性能等运维目标; 阅读建议:学习时应结合MySQL实际环境动手实践文中提供的SQL命令,重点关注表空间管理和分区策略的选择,理解其对性能和维护的影响,并注意分区使用中的限制条件以避免设计失误。
【采用BPSK或GMSK的Turbo码】MSK、GMSK调制二比特差分解调、turbo+BPSK、turbo+GMSK研究(Matlab代码实现)【采用BPSK或GMSK的Turbo码】MSK、GMS内容概要:本文主要介绍了采用BPSK或GMSK调制方式的Turbo码相关技术研究,重点涵盖GMSK调制下的二比特差分解调方法、Turbo码BPSK/GMSK调制相结合的系统性能分析,并提供了完整的Matlab代码实现方案。研究内容包括调制解调原理、编码结构设计、误码率仿真及系统优化等关键环节,旨在通过仿真手段验证所提出方案的有效性和可靠性,帮助研究人员深入理解现代数字通信系统中的关键技术和其实现方法。; 适合人群:具备一定通信原理和Matlab编程基础,从事无线通信、信号处理、编码理论等相关领域的研究生、科研人员及工程技术人员。; 使用场景及目标:①掌握GMSK调制Turbo码结合的系统设计仿真方法;②学习二比特差分解调算法在实际通信系统中的应用;③通过Matlab代码实现提升对数字调制解调和信道编码技术的理解实践能力;④为相关课题研究、毕业设计或工程项目提供参考和技术支持。; 阅读建议:建议读者结合文中提供的Matlab代码逐模块运行调试,对照通信系统基本原理深入理解各环节功能,重点关注调制解调过程Turbo译码的协同工作机制,并尝试修改参数以观察系统性能变化,从而达到理论实践相结合的学习效果。
源码下载地址: https://pan.quark.cn/s/7958f591353c 在Java应用程序的开发过程中,尤其是针对SpringBoot项目的构建,IntelliJ IDEA(简称IDEA)被广泛地采纳为一个极为流行的集成开发平台。本文将系统性地阐述如何在IDEA环境中部署并执行一个SpringBoot项目,涵盖了必要的环境搭建、Maven的配置、JDK环境的设定以及数据库的设置等关键环节。在进行后续操作前,请确认已经安装了以下基础组件: 1. IDEA:作为一个专门用于Java应用程序开发的集成开发环境,它提供了丰富的功能选项和强大的代码辅助能力。 2. JDK1.8:由于SpringBoot项目通常基于Java 8版本或更新版本进行开发,因此需要在计算机系统中安装对应的JDK版本。 3. MySQL8.0:如果项目需求中涉及到MySQL数据库的使用,请确保该数据库已经安装并处于运行状态。 4. Maven:作为项目的构建工具,它负责管理和构建SpringBoot项目。 **步骤一:Maven的配置** 1. **未配置Maven的情况**:当系统内部没有预先配置Maven时,IDEA将采用其内置的Maven版本来进行构建工作。用户可以直接利用IDEA自带的默认配置。 2. **已配置Maven的情况**:对于拥有个人Maven配置的用户,需要在IDEA中进行相应的设置。通过访问`File` > `Settings` > `Build, Execution, Deployment` > `Build Tools` > `Maven`菜单路径,用户可以在`Maven home directory`字段中指定本地Maven安装的路径。此外,还需确保`...
源码链接: https://pan.quark.cn/s/a4b39357ea24 在Linux操作系统,特别是服务器部署场景下,网络连接的不可靠性或缺失是常见问题,因此,进行离线模式下的软件安装变得尤为关键。本文将系统阐述在CentOS虚拟平台上如何实现wget工具及其相关组件的脱网安装。 首先,让我们对wget的功能特性有一个清晰的认识。wget作为一款功能全面的网络数据获取软件,支持通过HTTP、HTTPS以及FTP等传输协议执行文件下载操作,并且具备在用户中断连接后自动续传的功能,特别适用于在终端操作界面中完成文件获取任务。值得注意的是,wget程序的有效运行可能需要依赖特定的系统库和其他辅助工具,因此在部署过程中必须确认这些前置条件已经得到满足。 在执行wget的离线安装作业前,需要在具备网络连接的条件下预先准备一个集成所有必要组件的归档文件。该归档通常包含了wget的安装程序以及其运行所需的所有支持库。根据所提供的文件清单信息,识别到存在一个命名为“wget_offline_dependencies”的压缩文档,此文件应包含所有必需的元素。 接下来,将遵循以下操作流程开展离线安装工作: 1. **配置安装环境**:保证CentOS虚拟机的操作系统版本是最新的,以避免因系统组件版本陈旧而引发的兼容性障碍。执行`sudo yum update`(适用于CentOS 7及更早版本)或`sudo dnf update`(适用于CentOS 8及后续版本)指令来更新系统组件。 2. **传输离线安装包**:将“wget_offline_dependencies”压缩文件从网络可用的设备传输至CentOS虚拟机。可以使用U盘存储设备、网络文件服务或其他个人偏...
已经博主授权,源码转载自 https://pan.quark.cn/s/653d18f4b516 个人归纳了电子学会Python一级考试的要点及常见错误点,有需求的用户请在评论区留言。考试内容范围: 一、明确Python存在多种开发平台,精通Python原配的IDLE开发平台,能够开展程序编写、调试及分析工作,需具备借助Python开发平台进行程序设计的实践能力: (1)认识Python常用的几种编程平台:IDLE、Visual Studio Code、JupyterNotebook; (2)熟练IDLE的操作步骤,能够启动IDLE,能够创建文档、储存文档;(3)熟练运用IDLE进行编程,能够修改文档、执行文档等操作;(4)熟悉IDLE的两种开发途径,能够在不同途径间进行切换; (5)明确Python的版本标识以及当前最普遍应用的Python版本。 二、掌握Python程序编写的基础方法: (1)掌握“输入、处理、输出”程序编写流程; (2)熟练Python的基本格式,编写代码时会恰当的使用空格缩进、注释、字符串界定; (3)掌握变量基础概念,能够运用变量,并且掌握变量命名的规范和保留字等基础语法规格; (4)理解字符串、数值型变量,能够对变量类型进行转换; (5)掌握并熟练编写含有数值类型需求的程序。 Python作为教育及考核领域内广泛使用的高级程序设计语言,特别适合初学者学习入门。电子学会的Python一级考核主要检测考生对Python基础知识的掌握程度及应用水平。以下是一些关键的要点: 1. **开发平台**:考生应认识到Python的多种编程平台,如IDLE(Python自带的集成开发平台)、Visual Studio Code和Jupyter Notebook...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值