【深入理解Linux内核锁】一、内核锁的由来

news2024/10/5 20:18:38
img
我的圈子: 高级工程师聚集地
我是董哥,高级嵌入式软件开发工程师,从事嵌入式Linux驱动开发和系统开发,曾就职于世界500强公司!
创作理念:专注分享高质量嵌入式文章,让大家读有所得!
img

文章目录

    • 1、并发和竞态
    • 2、竞态发生的场合
    • 3、编译乱序和执行乱序
      • 3.1 编译乱序
      • 3.2 执行乱序
        • 3.2.1 多CPU之间
        • 3.2.2 单CPU内部
    • 4、总结

img
 
Linux设备驱动中,我们必须要解决的一个问题是:多个进程对共享资源的并发访问,并发的访问会导致竞态。

 

1、并发和竞态

并发(Concurrency):指的是多个执行单元同时、并行的被执行。

竞态(RaceConditions):并发执行的单元对共享资源的访问,容易导致竞态。

共享资源:硬件资源和软件上的全局变量、静态变量等。

 

解决竞态的途径是:保证对共享资源的互斥访问。

互斥访问:一个执行单元在访问共享资源的时候,其他执行单元被禁止访问。

临界区(Critical Sections):访问共享资源的代码区域成为临界区。临界区需要以某种互斥机制加以保护。

常见的互斥机制包括:中断屏蔽,原子操作,自旋锁,信号量,互斥体等。

 

2、竞态发生的场合

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-22GWyopk-1686191322786)(https://image-1305421143.cos.ap-nanjing.myqcloud.com/image/image-20230511140139520.png)]

  1. 多对称处理器(SMP)的多个CPU之间

多个CPU使用共同的系统总线,可以访问共同的外设和存储器。在SMP的情况下,多核(CPU0、CPU1)的竞态可能发生于:

  • CPU0的进程和CPU1的进程之间
  • CPU0的进程和CPU1的中断之间
  • CPU0的中断和CPU1的中断之间

 

  1. 单CPU内,该进程与抢占它的进程之间

在单CPU内,多个进程并发执行,当一个进程执行的时间片耗尽,也有可能被另一个高优先级进程打断,会发生竞态。

 

  1. 中断(软中断、硬中断、Tasklet、底半部)与进程之间

当一个进程正在执行,一个外部/内部中断(软中断、硬中断、Tasklet等)将其打断,会导致竞态发生。

 

3、编译乱序和执行乱序

除了并发访问导致的竞态外,还需要了解编译器和处理器的一些特点所引发的一些问题。

3.1 编译乱序

现代的高性能编译器在目标代码优化上都具有乱序优化的能力,编译器为了尽量提高Cache命中率以及CPU的Load/Store单元的工作效率,可以对访存的指令进行乱序,减少逻辑上不必要的访存。

因此,在打开编译器优化后,生成的汇编码并没有严格按照代码的逻辑顺序执行,这是正常的。

为了解决编译乱序的问题,可以加入barrier()编译屏障

该屏障可以阻挡编译器的优化。设置屏障的前后,可以保证执行的语句不乱。

加入barrier()编译屏障,即可保证正确的执行顺序。

例子:

#define barrier() __asm__ __volatile__("": : :"memory")

int main(int argc,char *argv[])
{
	int a = 0,b,c,d[4096],e;
	e = d[4095];
    barrier();
	b = a;
	c = a;
	return 0;
}

 

3.2 执行乱序

编译乱序是编译器的行为,而执行乱序就是处理器运行时的行为。

**高级的CPU往往会根据自身的缓存特性,将访存指令重新排序执行!**这样就导致了多个顺序的指令,后发的指令仍有可能先执行完毕。

这种执行乱序,在多个CPU之间,以及单个CPU内部,都是非常常见的。

3.2.1 多CPU之间

处理器为了解决多核之间,一个CPU的行为对另一个CPU可见的情况,ARM处理器引入了内存屏障指令:

  • DMB(数据内存屏障),保证在该指令前的所有指令,内存访问完成,再去访问该指令之后的访存动作
  • DSB(数据同步屏障),保证在该指令前的所有访存指令执行完毕(访存,缓存,跳转预测,TLB维护等)完成
  • ISB(指令同步屏障),Flush流水线,保证所有在ISB之后执行的指令都是从缓存或者内存中获得。

 

3.2.2 单CPU内部

在单CPU中,我们常遇到访问外设寄存器时,某些外设寄存器就对读写顺序有很高的要求,为了避免执行乱序的发生,这时候就需要CPU的一些内存屏障指令了。

CPU内部,为了解决这种问题,CPU提供了一些内存屏障指令:

可以参考Documentation/memory-devices.txtDocumentation/io_ordering.txt

  • 读写屏障:mb()
  • 读屏障:rmb()
  • 写屏障:wmb()
  • 寄存器读屏障__iormb()__
  • 寄存器写屏障__iowmb()__
#define writeb_relaxed(v,c)	__raw_writeb(v,c)
#define writew_relaxed(v,c)	__raw_writew((__force u16) cpu_to_le16(v),c)
#define writel_relaxed(v,c)	__raw_writel((__force u32) cpu_to_le32(v),c)

#define readb(c)		({ u8  __v = readb_relaxed(c); __iormb(); __v; })
#define readw(c)		({ u16 __v = readw_relaxed(c); __iormb(); __v; })
#define readl(c)		({ u32 __v = readl_relaxed(c); __iormb(); __v; })

#define writeb(v,c)		({ __iowmb(); writeb_relaxed(v,c); })
#define writew(v,c)		({ __iowmb(); writew_relaxed(v,c); })
#define writel(v,c)		({ __iowmb(); writel_relaxed(v,c); })

writelwritel_relaxed的区别就在于有无屏障。

 

4、总结

由上文可知,为了解决

  1. 并发导致的竞态问题
  2. 高性能的编译器编译乱序问题
  3. 高性能的CPU带来的执行乱序问题

CPUARM处理器提供的内存屏障指令等,这也是内核锁存在的意义。

点赞+关注,永远不迷路

img
欢迎关注 公号&星球【嵌入式艺术】,董哥原创!

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

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

相关文章

Java Web——使用Filter实现用户登录

实验名称: 使用Filter实现用户登录 实验目的: (1)了解什么是Filter。 (2)熟悉Filter的拦截过程和接口中的方法。 (3)掌握第一个Filter程序的编写方法。 (4&#xf…

华为荣获上海市技术发明一等奖!基于CANN的视频增强平台以AI技术修复历史视频

2023年5月26日,上海市科学技术奖励大会隆重召开,由上海交通大学牵头,中国科学院深圳先进技术研究院、咪咕视讯科技有限公司、华为技术有限公司、上海云视科技股份有限公司、上海人工智能创新中心、上海媒智科技有限公司、上海数字电视国家工程…

Oracle免费云设置Multi-factor Authentication

申请Oracle免费云账号的时候系统就强迫用户设置Multi-factor Authentication,我选择了OracleMobileAuthenticator作为2次认证工具。刚开始用还顺利,但用了一段时间后Oracle登录页面迟迟未向OracleMobileAuthenticator发送通知,要等非常久App才…

大模型 LLM 综述, A Survey of Large Language Models

大模型 LLM 综述, A Survey of Large Language Models 一、概述 一般认为NLP领域的大模型>10 Billion参数(也有人认为是6B、7B, 工业界用, 开始展现涌现能力); 经典大模型有GPT-3、BLOOM、Flan-T5、GPT-NeoX、OPT、GLM-130B、PaLM、LaMDA、LLaMA等; 大模型时间线, 图来自…

chatgpt赋能python:Python绘图教程:将画笔移动到绝对位置的方法

Python绘图教程:将画笔移动到绝对位置的方法 Python作为一门高级编程语言,设计初衷是让编程变得简单、易学、易用,且支持多种编程范式,其中产生了让人惊艳的绘图模块——Turtle(海龟)。 在这篇教程中&…

Mybatis-plus代码生成器

官网:MyBatis-Plus (baomidou.com) 顾名思义,就是它为你生成代码,这里可以为你生成Entity、Mapper、MapperXML、Service、controller等各个模块的代码,极大的提升开发效率 环境:mysql8.0.24、mybatis-plus3.5.3.1、spr…

<<Linux多线程服务端编程>>学习之栏1————线程安全的对象生命期管理

线程安全的对象生命期管理 此章节开头的前两句话,把我点醒,原来思考功力可以这么深厚!如下: 第一句话: 编写线程安全的类不是难事, 用同步原语保护内部状态即可; 第二句话: 但是对…

【论文阅读】ControlNet

简介 目标:加入额外的条件(例如边缘图像,深度图像)控制生成的图像 现有挑战 特定领域上的数据较少,而预训练模型很大,很容易出现过拟合的情况。在资源有限的情况下,只能选择pretrain- finetun…

传统工业制造企业如何实现数字化转型?

传统工业制造企业如何实现数字化转型,以数字驱动、实现高价值管理? 传统企业实现数字化转型是一条很漫长但不得不走的道路,看到这个问题下有很多专业人士对传统企业如何做数字化转型都提出了专业的见解,所以这篇就以传统制造业为…

用ChatGPT来写高考作文,看看效果!

又是一年高考日,今天高考作文题目一出来,很多人第一时间就用AI进行写作,我这边也用gpt3和4分别生成了一篇文章,没有给他投喂范文,把要求和题目的prompt给它,让它分析和写作,来看看效果吧。 GPT4…

学习态度记录JRebel本地验证

学习态度记录JRebel本地验证 网上有两种方式。 1、直接使用其他同学提供好的远程服务器验证地址(可自行搜索) 2、设置本地反向代理,激活JRebel ps:我的IDEA升级到2023.1.2后无法使用第一种方式了。搜了半天网上都是基于windows环境的教程解说&#xff0…

html 原生js手写树 仿照antd 样式

效果如图 <!doctype html> <html><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-width, initial-scale1.0"…

百度Apollo视频学习笔记

APOLLO视频学习笔记 一、总览 无人驾驶车的运作方式 五个核心部件&#xff1a; 计算机视觉&#xff1a;弄清楚周围的世界是怎样的传感器融合&#xff1a; 合并来自其他传感器的数据&#xff0c;如激光和雷达&#xff0c;更加深入了了解我们周围的环境定位&#xff1a;精确地…

一级建造师执业资格考试--工程法规--速学36记--联想法

第一记&#xff1a;法的效力层级 第二记&#xff1a;法人的分类 【速记方法】口诀&#xff1a;赚钱营利和特别 关键词&#xff1a;营利、特别 【速记内容】 1、营利法人:以取得利润并分配给股东等出资人为目的成立的法人,为营利法人; 如有限责任公司、股份有限公司。经依法登记…

什么牌子电容笔性价比高?iPad触屏笔推荐

电容笔已经成为日常生活中不可或缺的一部分。它可以用于书写&#xff0c;绘画&#xff0c;甚至玩游戏。使用电容笔可以代替传统无纸化书写&#xff0c;提高工作效率。市面上有许多不同价格的电容笔品牌可供选择。本文将介绍四款性价比高的平替电容笔&#xff0c;有需要入手的小…

常用的三种拖拽方法(内置方法 + 接口 + Event Trigger组件)

前言 在Unity中实现拖拽的方法有多种&#xff0c;以下是几种常见的方法和它们的优缺点&#xff1a; Input.GetMouseButtonDown Input.GetMouseButtonDown 方法可以监测用户鼠标按键的点击事件&#xff0c;通过检测鼠标按钮的状态来实现拖拽效果。用户通过鼠标进行拖拽操作。…

Web基本概念

一、前言 World Wide Web的简称&#xff0c;是一个由许多互相链接的超文本组成的系统&#xff0c;通过互联网访问 &#xff08;为用户提供信息&#xff09; 静态网页 仅适用于不能经常更改内容的网页&#xff1b; 动态网页 网络编程技术创建的页面&#xff1b;通过在传统的静态…

MongoDB安装与使用

目录 一、MongoDB介绍与安装 什么是MongoDB 为什么要用MongoDB MongoDB下载 MongoDB安装完成 二、MongoDB Compass MongoDB Compass使用 三、使用mongoose连接数据库 使用MongoDB Compass 创建数据库 使用mongoose 连接数据库 每日一课&#xff1a;MongoDB 常用命令…

Vue项目打包dist目录介绍

如下 CSS目录&#xff1a; ① .css文件是项目要用到的css文件,当你做webpack打包的时候&#xff0c;会把所有的css样式打包到这里 ② .css.map文件是一个Source map文件&#xff0c;Source map就是一个信息文件&#xff0c;里面储存着位置信息。也就是说&#xff0c;转换后的代…

ChatGPT扩展系列之使用pandora本地搭建ChatGPT

ChatGPT扩展系列之使用pandora本地搭建ChatGPT 1. 为什么要本地搭建 主要解决使用上的几个痛点,我们可以看一下下面就是我们最常遇到的几个问题,这里我们重点提一下就是我们本地搭建好了之后,我们获取Access Token,这个Token的有效期长达14天,也就是这14天中,我们都不需…