第10章 内核同步方法

一、原子操作

原子操作可以操作指令以原子的方式执行,执行过程不会被打断。

1.1 原子整数操作

image.png

针对整数的原子操作只跟对atomic_t类型的数据进行处理。原子操作通常是内联函数,往往是通过内嵌汇编指令来实现的。在编写代码时,能使用原子操作时,就尽量不要使用复杂的加锁机制。原子操作给系统带来的开销小,对高速缓存行(cache-line)的影响也小。

1.2 64位原子操作

所有的64位体系结构都提供了atomic64_t类型,以及一组对应的算数操作方法:


image.png

1.3 原子位操作

位操作函数是对普通的内存地址进行操作的:


image.png

内核还提供了一组与上述操作对应的非原子位函数,不保证原子性,其函数名字前缀多了两个下划线,执行速度可能更快。

二、自旋锁

Linux内核最常见的锁是自旋锁(spin lock)。自旋锁最多只能被一个可执行线程持有。如果一个执行线程试图获得一个被持有的自旋锁,那么该线程会一直进程忙循环--旋转--等待锁重新可用。要是锁未被争用,请求锁的执行线程便立即得到它,继续执行。因此,自旋锁不应该被长时间持有,最好小于完成两次上下文切换的耗时。


image.png

Linux内核提供了专门的读-写自旋锁(共享/排斥锁、并发/排斥锁)。一个或多个读任务可以并发地持有读者锁;写锁最多只能被一个写任务持有,而且不能有并发的读操作。


image.png

三、信号量

Linux中的信号量是一种睡眠锁。如果有一个任务试图获得一个已被占用的信号量时,信号量会将其推进一个等待队列,然后让其睡眠。这时处理器可以执行其他代码。当持有信号量被释放后,处于等待队列的任务将被唤醒,并获得该信号量。信号量比自旋锁提供了更好的处理器利用率,但造成了更大的开销。

信号量可以同时允许任意数量的锁持有者,根据该数量的大小可分为:

  • 二值信号量(或互斥信号量,数量为1):
  • 计数信号量(数量大于1)
image.png

信号量也可区分读写信号量。

四、互斥体

互斥体是指任何可以睡眠的强制互斥锁,比如使用计数为1的信号量。

image.png

一般情况下,除非互斥体不够用,才使用信号量。而对于互斥体和自旋锁:


image.png

五、完成变量

如果在内核中一个任务需要发出信号通知另一个任务发生了某个特定事件,可以利用完成变量(completion variable)。如果一个任务要执行一些工作时,另一个任务就会在完成变量上等待。当这个任务完成工作后,会使用完成变量去唤醒在等待的任务。


image.png

六 BLK:大内核锁

BLK是一个全局自旋锁:

  • 持有BLK的任务可以休眠
  • BLK是一种递归锁
  • BLK只可以用在进程上下文
  • 新用户不允许使用BLK
image.png

六、顺序锁

顺序锁(seq锁),主要依靠一个序列计数器。当有疑义的数据被写入时,会得到一个锁,并且序列值会增加,在读取数据之前和之后,序列号都会被读取。如果序列号相同则说明读操作进行过程中没有被写操作打断。适用于:

  • 数据存在很多读者
  • 数据写者很少
  • 写者虽少,但写优先于读,不允许读者让写者饥饿
  • 被保护的数据结构简单

七、禁止抢占

内核抢占代码使用自旋锁作为非抢占区域的标记。如果一个自旋锁被持有,内核便不能进行抢占。

某些情况下不需要自旋锁,但仍需要关闭内核抢占:


image.png

八、顺序和屏障

image.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,013评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,205评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,370评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,168评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,153评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,954评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,271评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,916评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,382评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,877评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,989评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,624评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,209评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,199评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,418评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,401评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,700评论 2 345

推荐阅读更多精彩内容

  • 主要内容 原子操作 自旋锁 读写自旋锁 信号量 读写信号量 互斥锁 完成变量 大内核锁 顺序锁 禁止抢占 顺序和屏...
    leon4ever阅读 574评论 0 2
  • 背景:内核同步问题,多个进程(线程)同时访问和操作共享资源时,就有可能发生各个线程之间相互覆盖共享数据的情况,造成...
    MagicDong阅读 482评论 0 0
  • 1 内核提供了两组原子操作接口:一组针对整数进行操作,另一组针对单独的位进行操作。 2 原子整数操作: 针对整数的...
    且听风吟LiKing阅读 214评论 0 1
  • 临界区和竞争条件 访问和操作共享数据的代码段称为临界区。如果两个执行线程在同一个临界区中同时执行,称为竞争条件。避...
    睡不醒的大橘阅读 534评论 0 0
  • 内核同步 在使用共享内存的应用程序中,程序员必须留意保护共享资源,防止对共享资源的并发访问,内核也不例外。如果多个...
    大雄good阅读 180评论 0 0