5.内核同步

内核同步

在使用共享内存的应用程序中,程序员必须留意保护共享资源,防止对共享资源的并发访问,内核也不例外。如果多个执行线程同时访问和操作数据,就有可能发生各线程之间相互覆盖共享数据的情况,造成被访问的数据处于不一致状态。

1.临界区和竞争条件

临界区就是访问和操作共享数据的代码段。多个执行线程并发访问同一个资源是不安全的,因此通常对临界区采用原子操作(顾名思义,这些操作看作一个原子,不可分的单元)。若两个执行线程处于同一个临界区同时执行,这是一个bug,称这种情况为竞争条件。避免并发和防止竞争条件称为同步(synchronization)

2.造成并发执行的原因

内核中造成并发执行的原因有:

  • 中断,中断可能随时打断当前执行的代码
  • 软中断和tasklet
  • 内核抢占,内核中的任务可能被另一个任务抢占
  • 睡眠以及与用户空间的同步,内核执行的进程可能睡眠,就会唤醒调度程序,从而导致调度一个新的用户进程执行
  • 对此多处理,多个处理器同时执行代码

3.死锁

死锁需要四个必要条件:

  • 互斥条件:一个资源每次只能被一个进程使用
  • 请求与保持条件:一个进程因请求资源而阻塞时,不释放已获得资源
  • 不剥夺条件:进程已获得的资源,在未使用完之前,不能强行剥夺
  • 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系

4.内核同步方法

Linux内核提供了一组相当完备的同步方法。

原子操作

内核提供了两组原子操作接口——一组针对整数进行操作,另一组针对单独的位进行操作。

自旋锁

Linux内核中最常见的锁是自旋锁自旋锁只能被一个可执行线程持有。若一个执行线程试图获得一个被占用的自旋锁,那么该线程就会一直忙循环——旋转——等待锁重新可用。

用现实生活例子解释,你去上厕所,厕所只有一个坑,先去的那人把门锁了,你只有抽根烟,再去看看出来没,没出来再去抽根烟,在回来看看...只有持锁的人才能开门,所以自旋锁不适合长时间占用临界区的执行线程。

Linux中自旋锁接口定义在<linux/spinlock.h>中,基本形式如下:

DEFINE_SPINLOCK(mr_lock);
spin_lock(&mr_lock);
/*临界区*/
spin_unlock(&mr_lock);

对于读写操作,还存在读-写自旋锁

  • 一个或多个读任务可以并发持有读者锁
  • 写的锁最多只能被一个写任务持有,而且此时不能有并发读操作

信号量

Linux中的信号量是一种睡眠锁。如果一个任务试图获得一个不可用的信号量时,信号量会将其推进一个等待队列,然后让其睡眠。此时处理器能重获自由,从而执行其他代码。

同样是上厕所,这个厕所升级了,具有一个记录和通知功能,当发现厕所坑被占用之后,到来的人就在册子末尾添加自己的电话,你就可以继续去抽烟泡妞。等蹲坑那哥们一出来,就挑选册子上第一个电话号码,打电话通知你,兄弟来上厕所。

计数信号量是高级版信号量,就是说允许多个执行线程(多个但是有上限)同时访问临界区。通过PV操作执行计数器的加减操作。

继续上厕所,厕所扩容了,不止一个坑!!!因此这里就有一个计数器,最大值就是坑数,来一个人就减一,走一个人就加一。计数器为0时,嘿嘿,小伙,再夹一会吧,有坑,哥会打电话给你的。

互斥体(mutex)

互斥体和信号量类似,但是互斥体的上锁者必须负责给其解锁,因此互斥体不适合内核同用户空间复杂的同步场景,更多用于同一上下文的上锁和解锁。

小结

同步是是Linux以及多线程编程等场景下非常重要的内容,需要进一步了解同步的知识,需要动手实验一下。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念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

推荐阅读更多精彩内容