linux内核的并发与竞态

2023-05-16

并发与竞态是指多个任务单元同时访问同一个资源,就会出现并发,竞态的现象。

其中多个任务单元包括中断,进程/线程,甚至多个多处理器;同一资源既包含硬件资源,也包括软件数据,比如:gpio,硬件设备... ...,软件包括全局变量等。

并发与竞态在内核的设计和驱动的设计都是非常重要的一个模块,因为当多个任务单元同时访问同一资源时,势必会造成某个数据单元的数据的异步,也就是访问错误的数据,如果放问的是指针,则甚至有可能导致系统的崩溃(访问非法内存),而造成这种结果的原因则是访问同一资源时,是并行访问,我们要解决这个问题,就必须将这种并行访问,认为的转化为串行访问,也就是当一个任务单元获取该资源时,其他的任务单元就不能访问该资源,要想访问必须等待拥有资源者将资源释放掉。

对于解决这个问题,内核提供了2个最主要的机制:信号量,自旋锁。另外还有其他的一些衍生机制,其功能都是相同的,只不过用在特定的条件下,不具有通用使用的价值,我们可以暂且了解一下,等到我们经验足够的时候,再去深入的学习。

内核编程模型通常都是结构体数据 + 对应的函数,这也是为什么底层编程的代码量少,并且内核源代码一般也都有现成的例子,我们也可以画瓢。

信号量:数据类型semaphore_t , 对应的函数则是down, up函数也就是我们常说的pv模型,p对应的就是down, v对应up函数。实际上信号量就是一个计数器,我们执行down函数的时候,信号量减1,也表示该当前任务单元获取了该资源,当sem等于0,或者小于0,则其他人物单元不能获取该资源;而执行up函数的时候正好与down函数相反,sem增加1,表示资源可以被其他任务单元获取到。

自旋锁:当信号量初始化为1的时候表示自旋锁,这也是内核中的常用手法,表示资源只能被一个任务单元获取。由于信号量允许任务单元休眠,所以,信号量只能工作在进程上下文中,不能工作在中断上下文。自旋锁也是内核设计中的一个非常有力的解决并发与竞态的手段。

自旋锁:编程模型与信号量相似,也是初始化,获取锁,释放锁,销毁锁。

自旋锁对应的数据类型:spinlock_t, 对应的函数spin_lock, spin_unlock函数,当然了还有init函数和destory函数,执行spin_lock函数则是获取到资源,而其他的任务单原则是不能再对该资源访问,只有执行过spin_unlock函数之后才表示资源可以被其他的任务单元获取,当然,如果当一个任务单元去访问该资源时,正好这个资源已经被其他的人物单元霸占着,那么在门口的这个人物单元只能在门前溜达,就好像我们等人一样,原地打转消磨时间,这也正是自旋锁,自旋的两个字的由来。

其实与并发竞态伴随的还有一个就是临界区,所谓临界区就是共享资源前后的代码,具体多大的范围,全靠程序员自己定,不过一般,都是紧挨着共享资源的代码作为临界区。

死锁是解决并发竞态时,因程序构思或者代码书写不规范等原因,造成死锁现象,在计算机上则表示为程序挂起。

具体死锁的一些特点和如何避免死锁,后边再说

出了上述两种普遍的解决方法,其实还有原子量,位操作,顺序锁。。。 。。。


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

linux内核的并发与竞态 的相关文章

随机推荐

  • Android 开发的技术方向

    xff11 应用开发 xff12 源码级开发 分为系统应用开发 xff0c Framework开发 xff0c 底层浏览器内核开发 xff0c 音视频编码开发 虚拟机开发 底层驱动开发等系统ROM相关的开发 3 安全 逆向 xff0c 病毒
  • Java内存优化和性能优化的几点建议

    1 没有必要时请不用使用静态变量 使用Java的开发者都知道 xff0c 当某个对象被定义为stataic变量所引用 xff0c 这个对象所占有的内存将不会被回收 有时 xff0c 开发者会将经常调用的对象或者变量定义为static xff
  • Linux系统安装docker并用ssh登录docker容器

    说明 xff1a 我使用的是Centos安装docker 第一步 xff1a 安装docker sudo yum install y yum utils sudo yum config manager add repo https down
  • 码云使用简介

    1 xff0c 何为码云 xff1f 码云属于中国的一个代码托管平台 xff0c 由 OSCHINA NET推出 简单说 xff0c 相当于GitHub的精简版 xff0c 对像小编这样英文盲显得更为友善 xff01 2 xff0c 下载及
  • Centos7搭建KVM虚拟化环境

    如果觉得写得不错 xff0c 烦请微信搜索公众号 34 郑州行疆户外 34 了解程序员的户外业余喜好 1 查看系统版本 root 64 openstack cat etc centos release CentOS Linux releas
  • Linux字符驱动之主设备号与次设备号

    drv demo c include lt linux version h gt include lt linux init h gt include lt linux module h gt include lt linux pci h
  • linux 更新内核,安装内核树

    https www cnblogs com williamjie p 10723919 html
  • x86计算CPU频率示例

    include lt stdio h gt include lt stdlib h gt include lt assert h gt include lt stdint h gt include lt string h gt includ
  • SM2 签名预处理操作

    如果觉得写得不错 xff0c 烦请微信搜索公众号 34 郑州行疆户外 34 了解程序员的户外业余喜好 转载 xff1a https www xuebuyuan com 1473900 html 一般情况下 xff0c 计算数字签名时应执行以
  • dataset中shuffle()、repeat()、batch()用法

    import numpy as np import tensorflow as tf np random seed 0 x 61 np random sample 11 2 make a dataset from a numpy array
  • Linux内核模块编程,多源码Makefile编写

    https mp csdn net console editor html 107838044 在学习内核模块编程的时候遇到了一些由于Makefile书写不正确导致的问题 一个 c源文件的Makefile按照网上的大部分资料介绍那样是没有问
  • 分组加密, 算法模式(ECB CBC CFB OFB)

    如果觉得写得不错 xff0c 烦请微信搜索公众号 34 郑州行疆户外 34 了解程序员的户外业余喜好 块加密 块加密 xff0c 英文Block Cyper xff0c 又称分组加密 xff0c 是一种常见的对称加密 xff0c 具有代表性
  • Linux UIO机制--用户空间I / O操作方法

    目录 前言 关于UIO UIO 的工作原理 前言 于许多类型的设备 xff0c 创建Linux内核驱动程序是过分的 真正需要的只是某种方式来处理中断并提供对设备存储空间的访问 控制设备的逻辑不必一定要在内核之内 xff0c 因为设备不需要利
  • Linux UIO驱动实例介绍

    接上一篇介绍UIO机制 https blog csdn net hpu11 article details 109395820 uio驱动详解 为了用最简单的例子说明问题 xff0c 我们在我们uio驱动的内核部分只映射了一块1024字节的
  • Mosquitto服务安装与使用---入门操作介绍

    关于Mosquitto配置的资料网上还是有几篇的 xff0c 但是看来看去 xff0c 基本上都是基于Linux 基于Window的凤毛麟角 xff0c 看上去貌似配置的东西相差不大 xff0c 实操过程中真的烦透了 xff0c 配置就是不
  • Windows 11 系统下载,正式版尚未发布

    下载链接方式 xff1a 关注 郑州行疆户外 程序员自己的订阅号 xff0c 回复 win11 xff0c 获取win11系统下载链接 一 发布 今年5月的Build大会 xff0c 微软便正式明确新一代操作系统为Windows 11 xf
  • Windows 11 系统下载安装 教程

    关 注 郑州行疆户外 订阅号 xff0c 回复 win11 xff0c 获取win11系统下载链接 xff0c 安装教程 说明 Windows11系统安装教程 xff0c 这里使用VM虚拟机演示具体安装教程 xff0c 如果是新手 xff0
  • Windows 11 TPM2.0问题及解决方法

    关注 郑州行疆户外 订阅号 回复 win11 xff0c 下载 windows11系统 回复 问题 xff0c 查看 windows11安装过程中遇到的问题及其解决方法 随着2021年6月24日 xff0c 微软正式发布会上确定windon
  • linux的dma驱动

    硬件平台 xff1a TI的3530 内核 xff1a linux 2 6 36 功能 xff1a 将fpga的数据从内存的一个地方复制到内存另一个地方 初学dma感到很是吃力 xff0c 编写的内核驱动代码仔细看了一个星期 xff0c 才
  • linux内核的并发与竞态

    并发与竞态是指多个任务单元同时访问同一个资源 xff0c 就会出现并发 xff0c 竞态的现象 其中多个任务单元包括中断 xff0c 进程 线程 xff0c 甚至多个多处理器 xff1b 同一资源既包含硬件资源 xff0c 也包括软件数据