linux-内核锁

2023-11-08

目录:

一、铺垫知识

1、指令执行流

2、上下文

3、抢占

二、内核锁基础知识

1、为什么要用锁?why

2、锁保护什么?what

3、锁是如何保护资源的?How

三、各类锁的介绍

1、原子操作

2spinlock

3mutex

4

进程指令执行流

代码在CPU上执行的指令数据流,由一系列代码组成。可分为两大类:线程维度和中断维度

1cpu只要上电,就需要不停的执行指令,永不停歇,若无事可做,那就执行空指令,直到下电。cpu类似一个跑道,各个task轮流到跑道上跑。

2、用户态视角:cpu执行一个个进程或者线程,一个线程就是一个执行流。内核态视角:CPU调度执行一个个task(对应一个进程或者线程),一个task就是一个执行流CPU就这样永不疲倦的轮换执行各个task(调度)。8CPU,同一时刻,最多有8个执行流。

3并发:用户态系统调用的代码编译成so,当so被多个bin链接时,运行时,就可能有多个指令执行流,就有可能分别在cpu0cpu1上执行。宏观并行,微观串行。

4、代码是静态的,执行流是动态的,这是两个不同的视角。若只存在一个cpu,那就只有一个执行流,那就不存在微观上的并发,也就不需要锁。但我们往往使用多个cpu,因而有多个执行流,同一个代码可能在两个执行流上执行。如上图。

上下文(context)

分类:进程上下文,中断上下文(硬中断上下文、软中断上下文,不可屏蔽中断上下文)

中断能够打断进程的执行流,无论进程优先级多高,都会被打断。因此原本执行流被打断,CPU转而执行中断的指令流。因此,与上下文对应,执行流也可分为:进程执行流和中断执行流

1cpu在用户态运行时,外部中断触发,程序会先陷入内核态,保存上下文后,再执行中断代码。

2cpu在内核态运行时,外部中断触发,保存上下文后,执行中断代码。

3、中断处理函数(中断上半部)必须要快速执行完成,以便返回继续执行各个进程。中断返回时,会发生调度,原来被打断的进程未必能够得到执行。

 假设进程和中断都调用如下函数,那么就有可能出现如下场景:

进程执行流:

1、某进程执行完743行后,全局变量enable=1

2、外部触发中断。

程序执行流:

7、从744行继续执行,此时enable变成0了。后边就会出错

中断执行流:

3、中断处理函数恰好也调用这个函数;

4、走了case1的分支,将enable又改成0

5、中断执行完毕返回。

抢占

什么是抢占? 一张图展现

1、抢占可以分为用户态抢占和内核态抢占。抢占时机?(中断、返回用户态、主动schedule())

2Linux kernel是抢占式内核。

 为什么要使用锁?-Why

为了性能,引入了多核。

但多核导致了并发,并发就导致了争抢,为了保证争抢有序,就出现了锁。

备注:

网上关于锁的介绍的文档很多,推荐知乎兰新宇的博客

术道经纬 - 知乎

关于锁的介绍,有一系列文章,个人感觉写的非常不错,我主要从这个博客学习锁的知识。

锁保护什么?-What

锁保护的对象:公共资源。公共资源,从某一方面讲,就是全局变量,或者从堆里面申请的共用内存。

如右图内核代码:

1、锁保护的是全局变量zone(从堆上申请的)。

2、无法保护局部变量tmplow,局部变量也不需要保护,想想这是为什么?

3、代码段不需要保护,因为它是只读的。

误区:常认为锁保护的是一段代码和变量。

其实:从保护资源的角度,锁只是为了保护全局变量,公共资源是一种更严谨的通用的说法。若非要说“锁也保护了代码”,那也只是在保护全局变量的时候,顺便保护了代码而已。

使用锁,首先要搞清楚使用锁的目的是什么?要保护什么?

锁是如何保护资源的?--How

核心原理:根据全局变量的状态来实现锁的控制。

“统一到门口排队,依次获得钥匙”

无进程持锁时,lock=0

进程0持锁后,lock=1

进程1再尝试持锁时,由于lock=1,无法获取,只能等待。

因此:lock一定要是全局的8字节,其实只用1bit即可Spinlock就充分利用这8个字节,仅用1bit表示锁状态。

衍生出锁的两大功能:同步和保护。

锁的种类

锁的分类

相关API

特点

注意点

原子操作:atomic

atomic_read(atomic_t * v);

atomic_set

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

linux-内核锁 的相关文章

  • 【系统移植】开发板的启动过程(认识uboot)

    在系统移植之前 需要先了解开发板启动的大致流程 了解了大致流程后 才知道开发板启动需要哪些东西 了解开发板启动的时候 一定会遇到闻所未闻的东西 所以我们了解的顺序是 了解开发板启动时涉及到的部件 了解启动过程中涉及到的文件 uboot 内核
  • 手动更新(rpi-update)树莓派固件

    手动更新 rpi update 树莓派固件 1 下载固件 本地更新 先在 PC 上下载固件 也可以用如下方法下载 curl L https github com Hexxeh rpi firmware archive master tar
  • 嵌入式学习:stm32学习路线推荐之思维导图

    从9月1日开始学习STM32后 对于STM32的一些个人总结 1 对于STM32和51的区别 对于 STM32来说 基本的大概都和51单片的内容相似 但是由于STM的引脚和寄存器的数量较多 所以需要一个更加完善的管理机制 导致了 时钟 的产
  • FM33G0X之上电过程引脚配置

    八 FM33G0X之上电过程引脚配置 使用官方例程的代码初始化 在实际测试中会出现 配置成输出的引脚在上电过程中会将电平拉高 12v的输入电压 引脚可能会拉到3v 并持续一段时间 这对于实际应用中 是不应该出现的 比如一开始在io口配置中配
  • 基于DS18B20和HS1101的仓库自动报警系统

    基于DS18B20和HS1101的仓库自动报警系统 背景介绍 效果展示 完整版的项目代码 仿真文件 下面是项目原理图 具体管脚定义如下图 18B20温度原理 HS1101湿度传感器 红外测距报警模块我用到的是GP2D12 通过数模转化器AD
  • 使用MicroPython开发ESP32(02):库介绍

    文章目录 目的 库基础说明 库列表 Python基础库 嵌入式设备相关库 ESP32特有库 总结 目的 对于Python来说丰富的库是其使用快速简易的关键 这点对于MicroPython也一样 这篇文章就对MicroPython的库做个罗列
  • 嵌入式杂谈之中断向量表

    虽说接触了好久的单片机或者说嵌入式开发 不过对于有些概念还是比较模糊 因此此系列将会从一些零碎的小知识点出发 慢慢的遍历整张嵌入式开发的地图 这次先来看一下中断向量表 至于为什么会提到中断向量表 主要是因为我自己在学习嵌入式Linux开发的
  • main.c(31): warning: #223-D: function “uart_init“ declared implicitly

    Keil5编程之warning 223 D function xxx declared implicitly 1 函数没有头文件中进行声明 在头文件中添加声明 2 定义错误 字母大小可能不一致 仔细看一下出现问题的函数是否在声明和调用时使用
  • verilog奇数分频器的问题讲解(7分频为例)

    先不多哔哔 直接上代码 verilogHDL 代码的后面讲原理 module fenpin3 clk clk7 rst input clk rst 设置rst的目的是当rst 1的时候给cnt0和cnt1赋初值 output clk7 re
  • STM32F4之ADC1【库函数操作】

    折腾了两天ADC多通道采样 采样的结果都很乱 完全不是预期值 在amobbs求助也没有找到结果 于是决定从简单开始 一步步折腾着破ADC ADC试验1实验说明 1 这个实验仅仅是初始化一个ADC 对其输入进行采样 2 使用STM32F4的A
  • 计算机毕业设计项目大全

    文章目录 0 前言 1 java web 管理系统 毕设选题 2 java web 平台 业务系统 毕设选题 3 游戏设计 动画设计类 毕设选题 适合数媒的同学 4 算法开发 5 数据挖掘 毕设选题 6 大数据处理 云计算 区块链 毕设选题
  • connect函数的用法

    作者 曾宏安 华清远见嵌入式学院讲师 在网络编程中 connect函数经常用来在套接字上初始化连接 无论是流式套接字还是数据报套接字都可以使用connect函数 但含义却不一样 下面我们分别来讨论一下 一 流式套接字 流式套接字通常使用的是
  • 按键的短按和长按检测

    方法一 常用的加延时函数 在中断服务函数中加一个比如10ms的延时函数 延时时间的长短取决于实际所用的按键特性 只要延时时间比抖动时间略大即可 原理很简单 加了延时就避开了抖动的这段时间 在延时之后判断引脚电平 如果为低电平就表示是按下 v
  • 下载 arm-linux-gcc

    https releases linaro org components toolchain binaries latest 4 arm linux gnueabihf 如果你使用的是ubuntu系统 你可以使用apt方式来安装arm li
  • U-Boot启动过程完全分析

    1 1 U Boot工作过程 U Boot启动内核的过程可以分为两个阶段 两个阶段的功能如下 1 第一阶段的功能 硬件设备初始化 加载U Boot第二阶段代码到RAM空间 设置好栈 跳转到第二阶段代码入口 2 第二阶段的功能 初始化本阶段使
  • 毕业设计 STM32人体红外测温枪温度采集系统 - 单片机

    文章目录 1 前言 2 主要器件 3 实现效果 4 设计原理 MLX90614 红外温度传感器 5 部分实现代码 6 最后 1 前言 这两年开始毕业设计和毕业答辩的要求和难度不断提升 传统的毕设题目缺少创新和亮点 往往达不到毕业答辩的要求
  • STM32CubeMX HAL库串口+DMA+IDLE空闲中断不定长度数据接收和发送

    本文开发环境 MCU型号 STM32F103ZET6 IDE环境 MDK 5 29 代码生成工具 STM32CubeMx 5 3 0 HAL库版本 STM32Cube FW F1 V1 8 0 STM32Cube MCU Package f
  • 面经——小米面经(2021春招)

    摘自 小米面经 2021春招 感谢小米 感谢雷总 感谢上官可编程 作者 阿波罗啦啦啦啦 发布时间 2021 05 01 11 08 41 网址 https blog csdn net weixin 44933419 article deta
  • 2022年 大学生工程训练比赛[物料搬运]

    本人和团结参加了2022年大学生工程训练 简称工训赛 校赛选拔 准备了几个月的时间和花费了较多的资金 由于疫情等多种情况 很遗憾未能参加湖南省省赛 过了这么久还是写个博客记录参赛准备和调试过程 目录 一 比赛要求 二 整体思路 三 硬件模块
  • Java18都在路上了,你还在用Java8吗?

    Java18都在路上了 你还在用Java8吗 在开始前我有一些资料 是我根据自己从业十年经验 熬夜搞了几个通宵 精心整理了一份 Java的资料从专业入门到高级教程 工具包 点个关注 全部无偿共享给大家 在评论区回复 888 之后私信回复 8

随机推荐

  • 【mcuclub】压力检测模块-XGZP6847

    一 实物图 型号 XGZP6847 二 原理图 编号 名称 功能 1 NC 空置 2 VDD 电源正 3 GND 电源地 4 VDD 电源正 5 OUT 信号引脚 输出的是模拟量 6 GND 电源地 三 简介 XGZP6847型压力传感器是
  • Spyder预测标签和真实标签以Mat格式输出(待续)

    1 需求 需要将Spyder里面的预测标签和真实标签输出 并保存为Mat格式 以通过Matlab生成混淆矩阵 为什么要用Matlab生成混淆矩阵呢 python不是也是可以的吗 import pandas as pd import torc
  • 【《程序员的自我修养---链接装载于库》读书笔记】可执行文件的装载与进程

    系列文章目录 程序员的自我修养 链接装载于库 读书笔记 初探ELF 程序员的自我修养 链接装载于库 读书笔记 windows PE COFF 程序员的自我修养 链接装载于库 读书笔记 可执行文件的装载与进程 文章目录 系列文章目录 前言 6
  • 为什么TCP建立连接要求发送方和接收方的初始化序列号不一样的呢?

    前几天有位读者问我为什么 TCP 建立连接需要三次握手文章中一个问题 就是他不明白 序列号解决了数据包的缺失和顺序颠倒等问题 但为什么要求发送方和接收方的初始序列号不一样 后来 我跟他交流半个小时 终于把他讲明白了 我觉得应该有不少人会有以
  • postman之在tests断言中使用for循环断言和断言空

    一 tests断言中使用for循环断言 1 在使用postman判断过程中 想要实现这么一个场景的判断 因为banner位置的配置是多变的 可以不配置 可以配置一个 也可以配置多个 在接口检测判断过程中想要通过for循环对banner列表中
  • Ubuntu安装了python3.8和python3.7,安装numpy时出现问题

    环境 Ubuntu20 04 由于目前PySpark只支持python3 7及以下的版本 而Ubuntu20 04自带的python3是python3 8 5 于是我安装了python3 7 9 且没有改动默认的python版本 千万别改
  • 接口测试的维度

    在 Python自动化测试实战 的书籍里面系统的介绍了基于Python语言的接口自动化测试实战和基于Python语言的UI自动化测试实战 特别是接口测试部分 详细的介绍了HTTP的协议原理 序列化与反序列化 主流测试工具 Postman和J
  • 2020CCPC河南省赛 发通知(离散+差分)

    学院一共有 n 位学生 用 1 编号 每天 学院都会派遣辅导员给学生发送若干通知 以保证各项措施 活动消息得到落实 现在 学院要求辅导员发送一条关于光盘行动的通知 对于通知信息 同学们的反应往往各不相同 辅导员预测出第 i 号学生收到通知后
  • vue面试题——v-if 和v-show的区别

    面试前端时 涉及到vue v if和v show几乎是必问的一道题 所以记录一下 首先我们先来看一段代码
  • iwconfig查看网卡 ifconfig查看ip /etc/init.d/ssh restart

    iwconfig查看网卡 ifconfig查看ip etc init d ssh restart 开启ssh服务 1 查看是否有sshd config cat etc ssh sshd config 查看是否有sshd config文件 2
  • python二级练习软件(90%原题)题库、三天速成。

    刷题软件 文末有联系方式 注明来意 我发现大家对考Python计算机二级都比较感兴趣 也有一些疑问 对于考证这个问题我简单说一下我的经验 python二级其实很容易通过 考试题题库是前九年真题加一套新题 你会遇到90 的原题 只要考前三天练
  • linux下搭建SVN遇到authentication failed问题的解决方法

    之前由于要管理项目组的文档 所以就想在linux下搭建一个svn平台 于是我就在网上找资料 并按照步骤搭建了一个SVN 结果老是出现一个authentication failed的错误 经过一个下午的努力 终于让我找出了错误的原因 一个非常
  • 微信小程序实例源码大全下载

    小程序QQ交流群 131894955 小程序开发直播腾讯课堂 https edu csdn net course detail 6743 微信小程序实例源码大全下载 微信小应用示例代码 phodal weapp quick 源码链接 htt
  • 避免Django重复提交表单,ERR_cache_miss错误

    在做项目时 遇到这个问题 首页设置为登录页login html 登录后跳转至工具页tool html 使用django自带的会话及身份验证中间件 自己认为的应该没问题 但总报标题所述错误 折腾了半天 终于解决 这里记录一下 我的urls p
  • 卷积神经网络详解

    卷积神经网络 Convolutional Neural Networks CNN 是应用最多 研究最广的一种神经网络 卷积神经网络 以下简称CNN 主要用于图片分类 自动标注以及产品推荐系统中 以CNN实现图片分类为例 图像经过多个卷积层
  • 【Unity入门计划】CreatorKitFPS:第一人称射击3D小游戏

    目录 Unity学习教程 1 添加并载入项目资源 添加项目资源 载入到Unity 2 载入Scene 3 从预制体添加射击Targets 4 管理游戏对象 4 1创建分组关系 4 2 区分相对坐标 世界坐标 5 自己做一个预制件 5 1 添
  • 【Python全栈开发从入门到实战】持续更新中......

    本专栏为Python全栈开发系列文章 技术包括Python基础 函数 文件 面向对象 网络编程 并发编程 MySQL数据库 HTML JavaScript CSS JQuery bootstrap WSGI Django Flask 后期运
  • OpenCV中的图像变换——傅里叶变换

    OpenCV中的图像变换 傅里叶变换 1 效果图 2 原理 3 源码 3 1 Numpy实现傅里叶变换 3 2 OpenCV实现傅里叶变换 3 3 HPF or LPF 参考 这篇博客将介绍OpenCV中的图像变换 包括用Numpy Ope
  • post方式加载iframe

    我们平常使用iframe时 直接设定src属性只能是get请求方式 get请求的参数大小有限制 如何实现即使用iframe又能通过post请求 两种方式 ajax使用post请求返回页面 直接将返回的页面数据放入iframe标签中 结合fo
  • linux-内核锁

    目录 一 铺垫知识 1 指令执行流 2 上下文 3 抢占 二 内核锁基础知识 1 为什么要用锁 why 2 锁保护什么 what 3 锁是如何保护资源的 How 三 各类锁的介绍 1 原子操作 2 spinlock 3 mutex 4 进程