Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Linux内核38-内核同步实际例子

Linux内核38-内核同步实际例子

作者头像
Tupelo
发布于 2022-08-15 08:10:10
发布于 2022-08-15 08:10:10
6690
举报
文章被收录于专栏:嵌入式ARM和Linux嵌入式ARM和Linux

要想一个系统不崩溃,性能还得好,同步技术是非常关键的。但是,完全避免竞态条件几乎是难于上青天。因为它要求对内核各个功能模块之间的交互得有一个清晰深刻的理解。下面我们看一下Linux内核中一些具体保护数据访问的示例,加深对其理解,甚至可以在自己的内核设计上借鉴一下。

1 引用计数器

引用计数器是内核中保护某个资源或者模块的一种有效手段,比如分配内存,使用某个内核模块,或者打开某个文件的时候。它是一个atomic_t类型的原子变量。当内核中某个程序访问该资源的时候,计数器加1,当内核程序释放资源,计数器减1。当计数器的值为0时,它就可以被释放了。

2 大内核锁

关于这部分请参阅网友universus写的这篇文章-大内核锁将何去何从。我觉得写得还是非常详细的。

3 内存描述符读写信号量

每个内存描述符都可以使用数据结构mm_struct进行表达,它有一个成员mmap_sem,专门用来保护该描述符避免竞态条件的发生。因为每个内存描述符可以被几个轻量级进程共享。这是用户态多线程共享内存的硬件基础。

假设内核需要为某个进程创建或扩展一段内存区域。为此,调用do_mmap()函数,分配一个新的类型为vm_area_struct虚拟内存给进程。在这个过程中,如果已经没有内存可用,且每段内存都有一个信号量保护,所以,当前进程挂起,其它进程还可以正常访问他们的共享内存继续运行。但是,如果没有信号量保护,当前进程申请内存就会成功(其实可能占用了其它进程的内存)。而与当前进程共享内存的进程就会请求访问内存描述符(比如,写时复制(Copy on Write)导致的页错误),从而导致严重的数据损坏。

此处一般使用的是读/写信号量,因为大部分的内核函数,比如页错误异常处理程序只需要查看内存描述符,不会修改它。这样可以提高系统的并发性能。

4 Slab Cache列表信号量

slab是一种Linux内核内存分配算法,slab分配算法采用cache存储内核对象。这些对象的描述符使用一个列表进行管理。这个列表使用一个称为cache_chain_sem的信号量进行保护,从而对列表进行独占访问。

因为往这个列表中插入新对象的同时,kmem_cache_shrink()和kmem_cache_reap()会扫描这个列表,这就带来了竞态条件的发生。当然了,中断不会调用这些函数,所以不需要信号量。所以,主要是在支持内核抢占的多核和单核系统中起作用。所以选择信号量而不是自旋锁。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-04-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 嵌入式ARM和Linux 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Linux内核24-内核同步理解
我们可以把内核想象成一个服务器,专门响应各种请求。这些请求可以是CPU上正在运行的进程发起的请求,也可以是外部的设备发起的中断请求。所以说,内核并不是串行运行,而是交错执行。既然是交错执行,就会产生竞态条件,我们可以采用同步技术消除这种竞态条件。
Tupelo
2022/08/15
1.1K0
Linux内核34-读/写信号量
每一种技术的出现必然是因为某种需求。正因为人的本性是贪婪的,所以科技的创新才能日新月异。
Tupelo
2022/08/15
1.5K0
深度剖析Linux内核同步机制:实现高效可靠的并发编程
前言:非常早之前就接触过同步这个概念了,可是一直都非常模糊。没有深入地学习了解过,最近有时间了,就花时间研习了一下《linux内核标准教程》和《深入linux设备驱动程序内核机制》这两本书的相关章节。趁刚看完,就把相关的内容总结一下。
嵌入式Linux内核
2023/08/08
1K0
深度剖析Linux内核同步机制:实现高效可靠的并发编程
Linux系统面试题
用户空间(User Space) :用户空间又包括用户的应用程序(User Applications)、C 库(C Library) 。
thierryzhou
2022/12/01
1.7K1
Linux系统面试题
第3阶段——内核启动分析之start_kernel初始化函数(5)
诺谦
2018/01/03
1.8K0
linux内核中听过就能记住的概念
  打算给我们部门弄个内部分享。发现大家对一些底层知识的认知停留在一句一句的,比如听说JVM使用-XX:-UseBiasedLocking取消偏向锁可以提高性能,因为它只适用于非多线程高并发应用。使用数字对象的缓存-XX:AutoBoxCacheMax=20000比默认缓存-128~127要提高性能。对于JVM和linux内核,操作系统没有系统的概念,遇到实际问题往往没有思路。所以我的内部分享,主要分为linux部分,jvm部分和redis部分。这篇是linux篇。学习思路为主,知识为辅。我也是菜鸟一枚~~
静儿
2018/07/02
7530
Linux内核中的各种锁:信号量/互斥锁/读写锁/原子锁/自旋锁/内存屏障等
既然是锁CPU,那就都是针对多核处理器或多CPU处理器。单核的话,只有发生中断会使任务被抢占,那么可以进入临界区之前先关中断,但是对多核CPU光关中断就不够了,因为对当前CPU关了中断只能使得当前CPU不会运行其它要进入临界区的程序,但其它CPU还是可能执行进入临界区的程序。
Linux阅码场
2024/02/21
1.8K0
Linux内核中的各种锁:信号量/互斥锁/读写锁/原子锁/自旋锁/内存屏障等
Linux 的进程间通信:信号量
本文介绍了Linux信号量、POSIX信号量、Linux条件变量和Linux线程同步基本概念,并通过代码示例展示了如何使用这些技术进行线程同步。
邹立巍
2017/07/25
6.8K0
linux内核同步机制
关于同步理论的一些基本概念 临界区(critical area): 访问或操作共享数据的代码段 简单理解:synchronized大括号中部分(原子性) 竞争条件(race conditions)两个线程同时拥有临界区的执行权 数据不一致:(data unconsistency) 由竞争条件引起的数据破坏 同步(synchronization)避免race conditions 锁:完成同步的手段(门锁,门后是临界区,只允许一个线程存在) 上锁解锁必须具备原子性 原子性(象原子一样不可分割的操作) 有序
lovelife110
2021/01/14
2K0
Linux内核36-内核同步之禁止中断
每一种技术的出现必然是因为某种需求。正因为人的本性是贪婪的,所以科技的创新才能日新月异。
Tupelo
2022/08/15
1.5K0
操作系统常见面试题
可以这么说,内核是一个计算机程序,它是操作系统的核心,提供了操作系统最核心的能力,可以控制操作系统中所有的内容。
三分恶
2021/10/09
1.2K0
操作系统常见面试题
Linux内核37-内核数据的同步访问
每一种技术的出现必然是因为某种需求。正因为人的本性是贪婪的,所以科技的创新才能日新月异。
Tupelo
2022/08/15
9430
Linux内核同步原理学习笔记
在多年前,linux还没有支持对称多处理器SMP的时候,避免并发数据访问相对简单。
杨源鑫
2019/07/04
1.3K0
基于进程信号量的多线程同步机制研究与实现
信号量机制本质是对于资源的预订操作,线程或者进程预订了之后,确保未来有一段时间,资源是属于我的。
绝活蛋炒饭
2024/12/29
1470
Linux内核33-信号量
对于信号量我们并不陌生。信号量在计算机科学中是一个很容易理解的概念。本质上,信号量就是一个简单的整数,对其进行的操作称为PV操作。进入某段临界代码段就会调用相关信号量的P操作;如果信号量的值大于0,该值会减1,进程继续执行。相反,如果信号量的值等于0,该进程就会等待,直到有其它程序释放该信号量。释放信号量的过程就称为V操作,通过增加信号量的值,唤醒正在等待的进程。
Tupelo
2022/08/15
1.7K0
LINUX一些面试问题集合
(1)复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。
心跳包
2020/08/31
1.2K0
LINUX一些面试问题集合
linux 内核同步机制使用
Linux 内核中的同步机制:原子操作、信号量、读写信号量、自旋锁的API、大内核锁、读写锁、大读者锁、RCU和顺序锁。 1、介绍 在现代操作系统里,同一时间可能有多个内核执行流在执行,即使单CPU内核也需要一些同步机制来同步不同执行单元对共享的数据的访问。 主流的Linux内核中的同步机制包括: 原子操作 信号量(semaphore) 读写信号量(rw_semaphore) 自旋锁spinlock 大内核锁BKL(Big Kernel Lock) 读写锁rwlock、 brlock(只包含在2.4内核中
李海彬
2018/03/22
2.4K0
Linux:进程间通信之system V
为了让不同的进程看到同一份资源,首先我们需要由操作系统为我们提供一个公共的内存块。
小陈在拼命
2024/12/03
1430
Linux:进程间通信之system V
linux内核进程创建fork源码解析
    平时写过多进程多线程程序,比如使用linux的系统调用fork创建子进程和glibc中的nptl包里的pthread_create创建线程,甚至在java里使用Thread类创建线程等,虽然使用问题不大,但需要知道底层原理。这次在自己写操作系统的时候,看了一遍linux内核的进程创建过程。算是有了比较深入的理解。
用户4415180
2022/06/23
8.8K0
linux内核进程创建fork源码解析
linux 内存管理初探
导语 linux 内存是后台开发人员,需要深入了解的计算机资源。合理的使用内存,有助于提升机器的性能和稳定性。本文主要介绍 linux 内存组织结构和页面布局,内存碎片产生原因和优化算法,linux
郑剑
2017/08/11
10K2
linux 内存管理初探
相关推荐
Linux内核24-内核同步理解
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档