首页 > 系统 > Linux >

《深入理解LINUX内核》笔记(五)

2017-04-18

《深入理解LINUX内核》笔记,一种广泛应用的同步技术就是加锁(locking),当内核控制路径必须访问共享数据结构或进入临界区时,就需要获取“锁”。

《深入理解LINUX内核》笔记,一种广泛应用的同步技术就是加锁(locking),当内核控制路径必须访问共享数据结构或进入临界区时,就需要获取“锁”。

自旋锁(spinlock)是用来在一种多处理器环境中工作的一种特殊的锁

在单处理器系统上,这种锁本身并不起锁的作用,自旋锁原语仅仅是禁止或启用内核抢占

读/写自旋锁的引入是为了增加内核的并发能力

允许对数据并发读可以提高系统性能

对于顺序锁(seqlock)来说,读者必须读数据前后两次读顺序计数器,若值不同,则暗示刚读到的值是无效的

读-拷贝-更新(RCU)是为了保护在多数情况下被多个CPU读的数据结构而设计的另一种同步技术,(RCU不使用锁)

RCU只保护被动态分配并通过指针引用的数据结构

在被RCU保护的临界区中,任何内核控制路径都不能睡眠

内存屏障的作用:

只有在数据结构被修改之后,已更新的指针对其他CPU才是可见的

信号量,从本质上说,提供了一个加锁原语,即让等待者睡眠,直到等待的资源变为空闲

实际上,LINUX提供两种信号量:内核信号量,由内核控制路径使用

SYSTEM VIPC信号量,由用户态进程使用

只有可以睡眠的函数可以获取内核信号量,中断处理程序和可延迟函数都不能使用内核信号量

内核以严格的FIFO顺序处理等待读/写信号量的所有进程

当信号量被释放时,就检查处于等待队列链表第一个位置的进程。如果是写者进程,则其他进程继续睡眠,如果是读者进程,其他进程也被唤醒并等待锁。不过,在写者进程之后的读者进程继续睡眠

补充completion原语

补充原语和信号量之间的关系在于如何使用等待队列中的自旋锁

在补充原语中,自旋锁用来确保complete()和wait_for_competion()不会并发执行。在信号量中,自旋锁用于并发执行的down()函数信号量的数据结构

确保组内核语句被当作一个临界区处理的主要机制之一就是中断禁止

可延迟函数可能在不可预知的时间执行

没有中断处理程序被激活,则软中断保护就不能异步地开始

把系统的并发度保存在尽可能的高的一个程度

并发读取决于两个主要因素:同时运转的I/O设备数;云是有效工作的CPU数

为了使I/O设备吞吐量最大化,应该使中断禁止保持在很短的时间

为了有效利用CPU,应尽可能避免使用基于自旋锁的同步原语

自旋锁对硬件高速缓存有影响

原子操作速度快

同步原语的选择取决于访问数据结构的内核控制路径的种类

访问数据结构的内核控制路径 单处理器保护 多处理器进一步保护

异常 信号量 无

中断 本地中断禁止 自旋锁

可延迟函数 无 无或自旋锁

异常与中断 本地中断禁止 自旋锁

异常与可延迟函数 本地软中断禁止 自旋锁

中断与可延迟函数 本地中断禁止 自旋锁

异常与可延迟函数 本地中断禁止 自旋锁

linux内核使用了几个宏,把本地中断激活/禁止与自旋锁结合起来

相关文章
最新文章
热点推荐