几句话总结内核中的锁

本文为原创,转载请注明:http://www.cnblogs.com/tolimit/

原子操作(atomic):

通过在汇编操作码前缀加个lock(0xf0)来给内存总线上锁(其他CPU无法访问这个内存单元),直到这条指令完成。atomic_t类型为volatile int

自旋锁(spinlock):

获取时“忙等”,进入临界区后禁止抢占,“忙等”期间可抢占。自旋锁分为临界区中关中断和开中断两种类型(临界区中都会禁止抢占)。在单核系统上,自旋锁只起到禁止和开启内核抢占的作用。

读写自旋锁(rwlock):

读写锁中包含读锁(读数据锁)和写锁(写数据锁),一个读写锁同时只能有一个写者或多个读者,不能同时既有读者又有写者。与自旋锁一样获取时会“忙等”,“忙等”期间可抢占,读锁和写锁进入临界区后都禁止内核抢占。

顺序自旋锁(seqlock):

读写锁的变种,写的优先级高于读。临界区中可同时拥有读者和写者,导致读者读数据前后都要检查顺序计数器的值,如果值为奇数则继续读取数据。顺序计数器的值只加不减,写者写过程中,计数器为奇数,释放写锁后会偶数。读临界区不会禁止内核抢占,写会禁止内核抢占。

RCU(读-拷贝-更新):

RCU允许多个读者和多个写者并发执行,并不使用锁。RCU只保护被动态分配内存并通过指针引用的数据结构。写者在访问时首先会拷贝一个副本,然后对副本进行修改,最后使用一个回调机制在适当的时机把指向原来数据的指针重新指向新的被修改的数据。在临界区中禁止内核抢占。

信号量(semaphore):

临界区忙时获取信号量的进程会被睡眠(挂起),因此在中断上下文中不能使用内核信号量。同时只能有一个路径进入临界区的信号量称为互斥锁。

读写信号量:

与读写自旋锁类似,只是临界区忙时获取锁不是“忙等”而是睡眠(挂起)。

时间: 2024-10-08 21:52:59

几句话总结内核中的锁的相关文章

内核中的锁机制--RCU

一. 引言 众所周知,为了保护共享数据,需要一些同步机制,如自旋锁(spinlock),读写锁(rwlock),它们使用起来非常简单,而且是一种很有效的同步机制,在UNIX系统和Linux系统中得到了广泛的使用.但是随着计算机硬件的快速发展,获得这种锁的开销相对于CPU的速度在成倍地增加,原因很简单,CPU的速度与访问内存的速度差距越来越大,而这种锁使用了原子操作指令,它需要原子地访问内存,也就说获得锁的开销与访存速度相关,另外在大部分非x86架构上获取锁使用了内存栅(Memory Barrie

深入理解Solaris内核中互斥锁(mutex)与条件变量(condvar)之协同工作原理

在Solaris上写内核模块总是会用到互斥锁(mutex)与条件变量(condvar), 光阴荏苒日月如梭弹指一挥间,Solaris的大船说沉就要沉了,此刻心情不是太好(Orz).每次被年轻的有才华的同事们(比如Letty同学)问起mutex和cv怎么协同工作的,我总是不能给出一个非常清晰的解释.直到今天,看了cv_wait()的源代码之后,我终于可以给他们一个清楚明白的回答了. Solaris的源码无法被公开粘贴出来,幸好还有OpenSolaris的继承者illumos. 先贴cv_wait(

大话Linux内核中锁机制之RCU、大内核锁

大话Linux内核中锁机制之RCU.大内核锁 在上篇博文中笔者分析了关于完成量和互斥量的使用以及一些经典的问题,下面笔者将在本篇博文中重点分析有关RCU机制的相关内容以及介绍目前已被淘汰出内核的大内核锁(BKL).文章的最后对<大话Linux内核中锁机制>系列博文进行了总结,并提出关于目前Linux内核中提供的锁机制的一些基本使用观点. 十.RCU机制 本节将讨论另一种重要锁机制:RCU锁机制.首先我们从概念上理解下什么叫RCU,其中读(Read):读者不需要获得任何锁就可访问RCU保护的临界

大话Linux内核中锁机制之原子操作、自旋锁

转至:http://blog.sina.com.cn/s/blog_6d7fa49b01014q7p.html 很多人会问这样的问题,Linux内核中提供了各式各样的同步锁机制到底有何作用?追根到底其实是由于操作系统中存在多进程对共享资源的并发访问,从而引起了进程间的竞态.这其中包括了我们所熟知的SMP系统,多核间的相互竞争资源,单CPU之间的相互竞争,中断和进程间的相互抢占等诸多问题. 通常情况下,如图1所示,对于一段程序,我们的理想是总是美好的,希望它能够这样执行:进程1先对临界区完成操作,

大话Linux内核中锁机制之内存屏障、读写自旋锁及顺序锁

大话Linux内核中锁机制之内存屏障.读写自旋锁及顺序锁 在上一篇博文中笔者讨论了关于原子操作和自旋锁的相关内容,本篇博文将继续锁机制的讨论,包括内存屏障.读写自旋锁以及顺序锁的相关内容.下面首先讨论内存屏障的相关内容. 三.内存屏障 不知读者是是否记得在笔者讨论自旋锁的禁止或使能的时候,提到过一个内存屏障函数.OK,接下来,笔者将讨论内存屏障的具体细节内容.我们首先来看下它的概念,Memory Barrier是指编译器和处理器对代码进行优化(对读写指令进行重新排序)后,导致对内存的写入操作不能

大话Linux内核中锁机制之完成量、互斥量

大话Linux内核中锁机制之完成量.互斥量 在上一篇博文中笔者分析了关于信号量.读写信号量的使用及源码实现,接下来本篇博文将讨论有关完成量和互斥量的使用和一些经典问题. 八.完成量 下面讨论完成量的内容,首先需明确完成量表示为一个执行单元需要等待另一个执行单元完成某事后方可执行,它是一种轻量级机制.事实上,它即是为了完成进程间的同步而设计的,故而仅仅提供了代替同步信号量的一种解决方法,初值被初始化为0.它在include\linux\completion.h定义. 如图8.1所示,对于执行单元A

大话Linux内核中锁机制之信号量、读写信号量

大话Linux内核中锁机制之信号量.读写信号量 在上一篇博文中笔者分析了关于内存屏障.读写自旋锁以及顺序锁的相关内容,本篇博文将着重讨论有关信号量.读写信号量的内容. 六.信号量 关于信号量的内容,实际上它是与自旋锁类似的概念,只有得到信号量的进程才能执行临界区的代码:不同的是获取不到信号量时,进程不会原地打转而是进入休眠等待状态.它的定义是include\linux\semaphore.h文件中,结构体如图6.1所示.其中的count变量是计数作用,通过使用lock变量实现对count变量的保

Linux 2.6内核中新的锁机制--RCU

转自:http://www.ibm.com/developerworks/cn/linux/l-rcu/ 一. 引言 众所周知,为了保护共享数据,需要一些同步机制,如自旋锁(spinlock),读写锁(rwlock),它们使用起来非常简单,而且是一种很有效的同步机制,在UNIX系统和Linux系统中得到了广泛的使用.但是随着计算机硬件的快速发展,获得这种锁的开销相对于CPU的速度在成倍地增加,原因很简单,CPU的速度与访问内存的速度差距越来越大,而这种锁使用了原子操作指令,它需要原子地访问内存,

工作中遇到的几句话

实施人员: 话不要说的太大,想想好再说(书**) 熟悉具体的业务,必须熟记,甚至背下来,自己首先处理,除非处理不了,否则不要轻易问,问要有想法(管**) 同事: 属性业务流程,走通流程,挂接具体的业务操作(周**) 看待问题的角度是什么(李**) 经理: 知识面要广,之后找一个点深入研究,通过广的面支撑这个点(张**) 以上是个人工作期间,别人对自己的一些建议 工作中遇到的几句话