【读书笔记】《Linux内核设计与实现》内核同步介绍&内核同步方法

简要做个笔记,以备忘。

需同步的原因是,我们并发访问了共享资源。我们将访问或操作共享资源的代码段称“临界区”,如果两个执行线程处于同一临界区中同时执行,称“竞争条件”。这里术语执行线程指任何正在执行的代码实例,如一个在内核执行的进程、一个中断处理程序或一个内核线程。

举个简单例子,i++操作。该操作可以转换为下面的机器指令序列:

1.得到当前变量i的值,并保存到一个寄存器。

2.将寄存器的值加1。

3.将i的新值写回到内存中。

当两个线程同时进入这个临界区,若i初值为7,我们期望如下操作:

线程1               线程2

获得 i(7)           ——

增加 i(7->8)        ——

写回 i(8)           ——

——                获得 i(8)

——                增加 i(8->9)

——                写回 i(9)

然而实现情况可能是:

线程1               线程2

获得 i(7)           获得 i(7)

增加 i(7->8)        ——

——                增加 i(7->8)

写回 i(8)           ——

——                写回 i(8)

上面描述中,并发访问共享资源,i值可能出现为8,导致了非预期的功能。

Linux内核中提供了多种方法和接口来解决上面的问题。

1.原子访问

即原子执行获得i,增加i和写回i 3条指令。相关接口示例如下:

#include <linux/types.h>

typedef struct {

volatile int counter;

} atomic_t;

#include <asm/atomic.h>

atomic_t v = ATOMIC_INIT(0); /* 定义v并初始化为0 */

atomic_set(&v, 4); /* v = 4(原子的) */

atomic_add(2, &v); /* v = v+2 = 6(原子的) */

atomic_inc(&v); /* v = v+1 =7(原子的) */

当然这里只演示少部分操作,更多参考man手册。

2.自旋锁

将临界区看作一个房间,将执行线程看作一个人。

自旋锁的意思就是,当执行线程A进入房间(临界区),则将其上锁。此时执行线程B来到门前,发现已经被上锁,则在门前等待址到A开锁出来。

这里一个关键信息是“等待”,这会占用大量CPU时间,因此持有自旋锁的执行线程要尽可能的短。否则会造成性能问题。

与自旋锁有关的接口定义在<linux/spinlock.h>中,其基本使用形式如下:

DEFINE_SPINLOCK(mr_lock);

spin_lock(&mr_lock);

/* 临界区…… */

spin_unloc(&mr_lock);

3.信号量

还是上面房间和人的比喻,信号量也是一种锁。

此时,执行线程B来到门前,发现门已被锁。这时它并不等待,而是在门口表格登记一下,找个椅子睡觉去了,这样做有个好处,CPU资源可以空闲出来,而不是浪费在等待。A出来后,发现表格上有名字,就根据名字找到B给他一拳。B醒来去到房间。

信号量的具体实现定义在<asm/semaphore.h>中,使用示例如下:

/* 声明一个信号量,名为mr_sem用于信号量计数 */

static DECLARE_MUTEM(mr_sem);

/* 尝试获取信号量 */

if (down_interruptible(&mr_sem)) {

/* 信号被接收,信号量还未获取 */

}

/* 临界区…… */

up(&mr_sem); /* 释放给定信号量 */

由于信号量在发生争用时,睡眠而非等待,因此可适用于锁被长时间持有的情况。相反若锁持有时间较短时,由于睡眠、维护等待队列以及唤醒所花费的开销可能比锁被占用的全部时间还要长,使用信号量就不适合了。

【读书笔记】《Linux内核设计与实现》内核同步介绍&内核同步方法

时间: 2024-10-07 05:27:17

【读书笔记】《Linux内核设计与实现》内核同步介绍&内核同步方法的相关文章

读薄「Linux 内核设计与实现」(1) - 从内核出发

这篇文章是<读薄「Linux 内核设计与实现」>系列文章的第一篇,本文主要讲了两个问题:内核编程的特点以及 GNU C 在内核开发中的特点. 0x00 内核编程特点 无 libc 库,不能访问标准 C 文件 使用 GNU C 无内存保护机制 慎用浮点数计算 注意同步和并发 可移植性考虑:保持字节顺序.64位对齐.不假定字长和页面长度 0x01 GNU C 内联函数:将函数展开至调用位置,省却函数调用代价 内联汇编:在确定体系结构的情况下,在 C 代码中直接嵌入汇编代码 分支声明:分支时可根据预

读书笔记----《windows核心编程》第三章 内核对象1(句柄与安全性)

最近一直没有更新博客,因为一直在想一个问题,内核对象这一章内容很多很重要,自己没有掌握好也没有把握写好这一章,最后还是决定能写多少写多少,一面写一面学,后续学到新的再更新吧; <windows核心编程>提了几种内核对象: 访问令牌对象:与windows的安全性有关,目前不是很懂,了解后再写; 事件对象: Event对象,可跨进程同步; 由CreateEvent创建; 文件对象: File对象,比较常见; 由CreateFile创建; 文件映射对象: 通过文件映射可以方便的操作文件(如同文件数据

类库开发的设计准则 读书笔记 2类型设计准则

MSDN链接:http://msdn.microsoft.com/zh-cn/library/vstudio/ms229036(v=vs.100).aspx 系列文章列表: 1名称准则:http://www.cnblogs.com/liu-meng/p/4181984.html 2类型设计准则:http://www.cnblogs.com/liu-meng/p/4182737.html 类型与命名空间: 使用命名空间将类型组织到相关功能区域的的层次结构中 避免使用较深的命名空间层次结构 避免使用

[读书笔记]Linux命令行与shell编程读书笔记04 安装软件,编辑器注意事项

1. debian以及redhat两种主流的linux发行版用的包管理工具 debian的包管理工具是 dpkg 再现安装的是 apt apt的工具主要有 apt-get apt-cache aptitude 其中aptitude需要手动按装 apt install aptitude 管理界面 搜索 aptitude search packagename 安装 aptitude install packagename 升级 aptitude safe-upgrade 卸载 aptitude re

读书笔记--领域驱动设计:软件核心复杂性应对之道-1

2015–6-28 第一章 消化知识 有效建模的要素 1. 模型和实现的绑定 模型要基于现实的业务,不能和用户现实的业务脱节 2. 获得一种基于模型的语言 通过一种统一的语言(业务人员和开发人员都能理解的)去描述所建立的模型,如UML图,基于业务的术语,无奇异的,作者的意思是业务人员和开发人员建立基于模型一个沟通的桥梁. 3.开发一个蕴含丰富知识的模型 灵活的,适应变化的的模型,模型不能简单等同于类图,而是解决复杂业务问题的方案.包含各种类型的知识 4. 提炼模型 对业务的描述要抽象,从场景的分

[读书笔记]Linux文件系统

1. 文件系统的种类 ext ext2 ext3 ext4 JFS XFS 其中ext3 开始支持journal日志模式 与raid卡类似 有 数据模式  排序模式 以及回写模式 数据模式最安全 回写模式性能最高. 2. 文件系统的命令: 1) fdisk fdisk -l 首先查看磁盘情况. fdisk /dev/sda的方式进行处理具体的磁盘 输入 m 进行处理 给出帮助,然后输入n 新建分区 输入p可以定义分区 可以进行1-4的选择 然后选择大小进行创建 2)mkfs 创建文件系统 mkf

SQL查询初学者指南读书笔记(五)集合操作与多表查询介绍

PART III:Thinking in Sets CHAPTER7 Thinking in Sets The three mostcommon set operations are as follows. Intersection Difference Union 在SQL中相应的关键词分别是 Intersection Except Union 实际数据库实现一般支持以下相应的数据库集合操作 INNER JOIN OUTER JOIN UNION JOIN 不过其区别是前者集合操作涉及表中所有

把握linux内核设计思想系列(未完待续......)

[版权声明:尊重原创,转载请保留出处:blog.csdn.net/shallnet,文章仅供学习交流,请勿用于商业用途] 把握linux内核设计思想(一):系统调用 把握linux内核设计思想(二):硬中断及中断处理 把握linux内核设计思想(三):下半部机制之软中断 把握linux内核设计思想(四):下半部机制之tasklet 把握linux内核设计思想(五):下半部机制之工作队列及几种机制的选择 把握linux内核设计思想(六):内核时钟中断 把握linux内核设计思想(七):内核定时器和

把握linux内核设计思想系列

[版权声明:尊重原创,转载请保留出处:blog.csdn.net/shallnet,文章仅供学习交流,请勿用于商业用途] 本专栏分析linux内核的设计实现,包含系统调用.中断.下半部机制.时间管理.内核同步.进程管理.内存管理等相关内容. 把握linux内核设计思想(一):系统调用 把握linux内核设计思想(二):硬中断及中断处理 把握linux内核设计思想(三):下半部机制之软中断 把握linux内核设计思想(四):下半部机制之tasklet 把握linux内核设计思想(五):下半部机制之