Linux内核同步方法

1、原子操作,是其它同步方法的基础。

2、自旋锁,线程试图获取一个已经被别人持有的自旋锁,当前线程处于忙等待,占用cpu资源。

3、读写自旋锁,根据通用性和针对性的特点,普通自旋锁在特定场景下的表现会退化。因此,提供了读写自旋锁,读锁可以加读锁,不能加写锁,写锁不能加任何锁。

4、需要注意的几项:

  普通自旋锁是不能递归的。读锁可以递归,写锁也不能递归。

  表面上锁的是代码,实际上锁的是共享数据。

  使用读写锁的时候,需要注意,读锁可以加读锁,多个线程都占用读锁,必须所有的线程都释放,才能加上写锁,这往往会导致写锁长时间处于饥饿状态。

5、自旋锁存在的问题,线程试图获取一个已经被别人持有的自旋锁,当前线程处于忙等待,占用cpu资源。怎么解决这个问题?

  使用信号量,信号量是一种睡眠锁。一个任务试图获取被别人占有的信号量,信号量会将其推进一个等待队列,让其睡眠,当请求的信号量被释放,处于等待队列的任务被唤醒,并获得信号量。

6、需要注意的是,信号量是一种睡眠锁,但它本身也会带有开销,上下文切换,被阻塞的线程要换出换入,也即是说让其睡眠并唤醒它,花费一定的开销。如果每个线程锁的时间很短,一般使用自旋锁,忙等待的时间也很短。如果锁的时间长,使用信号量。

7、相比自旋锁,信号量还有更广泛的用处,使用PV操作不仅能保护共享资源,还能够控制同时访问的数量,还能够控制访问顺序。对于锁,是谁加锁谁释放,而信号量可以再不同线程之间PV操作。

8、考虑信号量的一种特殊使用场景,可以睡眠的互斥锁。创建的信号量容量为1,可用数量为0,也就是允许同时访问的数量也就是1。这就是互斥体,互斥体加锁可以认为是V操作,再P操作。

时间: 2024-10-17 19:20:31

Linux内核同步方法的相关文章

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

简要做个笔记,以备忘. 需同步的原因是,我们并发访问了共享资源.我们将访问或操作共享资源的代码段称"临界区",如果两个执行线程处于同一临界区中同时执行,称"竞争条件".这里术语执行线程指任何正在执行的代码实例,如一个在内核执行的进程.一个中断处理程序或一个内核线程. 举个简单例子,i++操作.该操作可以转换为下面的机器指令序列: 1.得到当前变量i的值,并保存到一个寄存器. 2.将寄存器的值加1. 3.将i的新值写回到内存中. 当两个线程同时进入这个临界区,若i初值

《Linux内核设计与实现》读书笔记(十)- 内核同步方法

原blog:http://www.cnblogs.com/wang_yb/archive/2013/05/01/3052865.html 内核中提供了多种方法来防止竞争条件,理解了这些方法的使用场景有助于我们在编写内核代码时选用合适的同步方法, 从而即可保证代码中临界区的安全,同时也让性能的损失降到最低. 主要内容: 原子操作 自旋锁 读写自旋锁 信号量 读写信号量 互斥体 完成变量 大内核锁 顺序锁 禁止抢占 顺序和屏障 总结 1. 原子操作 原子操作是由编译器来保证的,保证一个线程对数据的操

把握linux内核设计(十):内核同步

[版权声明:尊重原创,转载请保留出处:blog.csdn.net/shallnet,文章仅供学习交流,请勿用于商业用途] 如同linux应用一样,内核的共享资源也要防止并发,因为如果多个执行线程同时访问和操作数据有可能发生各个线程之间相互覆盖共享数据的情况. 在linux只是单一处理器的时候,只有在中断发生或内核请求重新调度执行另一个任务时,数据才可能会并发访问.但自从内核开始支持对称多处理器之后,内核代码可以同时运行在多个处理器上,如果此时不加保护,运行在多个处理器上的代码完全可能在同一时刻并

《Linux内核设计与实现》读书笔记(十九)- 可移植性

摘自http://www.cnblogs.com/wang_yb/p/3512095.html <Linux内核设计与实现>读书笔记(十九)- 可移植性 linux内核的移植性非常好, 目前的内核也支持非常多的体系结构(有20多个). 但是刚开始时, linux也只支持 intel i386 架构, 从 v1.2版开始支持 Digital Alpha, Intel x86, MIPS和SPARC(虽然支持的还不是很完善). 从 v2.0版本开始加入了对 Motorala 68K和PowerPC

Linux内核设计与实现——内核同步

内核同步 同步介绍 同步的概念 临界区:也称为临界段,就是訪问和操作共享数据的代码段. 竞争条件: 2个或2个以上线程在临界区里同一时候运行的时候,就构成了竞争条件. 所谓同步.事实上防止在临界区中形成竞争条件. 假设临界区里是原子操作(即整个操作完毕前不会被打断),那么自然就不会出竞争条件.但在实际应用中.临界区中的代码往往不会那么简单,所以为了保持同步,引入了锁机制.但又会产生一些关于锁的问题. 死锁产生的条件:要有一个或多个运行线程和一个或多个资源,每一个线程都在等待当中的一个资源.但全部

读薄《Linux 内核设计与实现》(4) - 中断与同步

这篇文章是<读薄「Linux 内核设计与实现」>系列文章的第 IV 篇,本文主要讲了以下问题:中断和中断处理程序的概念与实现原理.Linux 中的下半部以及内核同步方法. 0x00 中断和中断处理程序 I 中断 中断是一种特殊的电信号,由硬件发向处理器,处理器接收到中断时,会马上箱操作系统反映,由操作系统进行处理.中断随时可以产生,因此,内核随时可能因为新到来的中断而被打断. 不同的设备对应的中断不同,每个中断通过一个唯一的数字标识,这些中断值通常被称为中断请求(IRQ)线. II 中断处理程

Linux内核实战演练教程

Linux内核实战演练 网盘下载链接:http://pan.baidu.com/s/1fIYf0 密码: 341f 要是网盘失效了,请加我QQ: 3113533060 课程内容: 第1部分 Linux 内核中的基础数据结构 内核模块: list链表: rb_tree: 第2部分 Linux内核中的同步方法详解 lock锁: mutex: spin_lock: RCU: atomic operations原子操作 第3部分 内存管理和进程管理 page allocator: slab alloca

《Linux内核设计与实现》笔记——内核同步简介

相关概念 竞争条件 多个执行线程(进程/线程/中断处理程序)并发(并行)访问共享资源,因为执行顺序不一样造成结果不一样的情况,称为竞争条件(race condition) 举例说明 #include<thread> using namespace std; int i = 0; void thread1(){ //for(int x=0;x<100000;x++) i++; } void thread2(){ //for(int x=0;x<100000;x++) i++; } i

《Linux内核设计与实现》读书笔记 - 目录 (完结)【转】

转自:http://www.cnblogs.com/wang_yb/p/3514730.html 读完这本书回过头才发现, 第一篇笔记居然是 2012年8月发的, 将近一年半的时间才看完这本书(汗!!!). 为了方便以后查看, 做个<Linux内核设计与实现>读书笔记 的目录: <Linux内核设计与实现>读书笔记(一)-内核简介 <Linux内核设计与实现>读书笔记(二)- 内核开发的准备 <Linux内核设计与实现>读书笔记(三)- Linux的进程 &