linux同步方法

姓名:尤乐航            学号:19029100006   学院:电子工程学院

【嵌牛导读】linux同步方法

【嵌牛鼻子】嵌入式  Linux系统

【嵌牛提问】linux同步方法

【嵌牛正文】

5.1原子操作

内核提供了两组原子操作接口,一组针对整数进行操作,另一组针对单独的位进行操作。针对整数的原子操作只能对atomic_t类型的数据进行处理。

Linux内核通过一些手段来实现某些操作的原子性,例如

操作码前缀为lock的汇编指令,即使多cpu下也能保证其后汇编指令的原子性,lock会锁定内存总线,保证在执行汇编指令时没有其他CPU同时读写内存。多处理器中,Linux内核通过提供atomic_t类型封装了一系列原子操作,如atomic_inc(v)表示把1加到v。

5.2屏障

屏障的意思就是在指令之间插入一道屏障,让这道屏障之前和之后的指令不可能因重排而跨越这道屏障。

5.3自旋锁

自旋锁是一种广泛的同步技术,它锁住的是一块临界区,进入临界区时需要先获取自旋锁,在离开临界区时需要释放自旋锁。如果已经有其他进程获取了该锁,那么当前想要获取该锁的进程只能在临界区门口来回溜达(自旋),直到获取该锁。自旋锁类似于现实生活中的给房间的门上锁,进入房间访问资源时需要锁住门,防止其他人同时进入房间,退出房间时,再打开锁。

5.4读写锁

普通自旋锁spin_lock类的函数在进入临界区时,对临界区中的操作行为不细分。只要是访问共享资源,就执行加锁操作。但是有时候,比如某些临界区的代码只是去读这些共享的数据,并不会改写,如果采用spin_lock()函数,就意味着,任意时刻只能有一个进程可以读取这些共享数据。如果系统中有大量对这些共享资源的读操作,很明显spin_lock将会降低系统的性能。因此提出了读写自旋锁rwlock的概念。对照普通自旋锁,读写自旋锁允许多个读者进程同时进入临界区,交错访问同一个临界资源,提高了系统的并发能力,提升了系统的吞吐量。

5.5信号量

信号量和自旋锁类似,也是为了控制进程进入临界区,但是信号量和自旋锁的重大区别是:

自旋锁获取锁的过程,不会主动调用schedule()进行进程切换,而是占用cpu,拼命的自旋,类似于while耗时操作。信号量中存在一个进程等待队列,未获取锁的进程将挂到该队列中,然后主动调用schedule()切换进程,让出cpu

5.6互斥体

互斥体是一种睡眠锁,他是一种简单的睡眠锁,其行为和count 为 1 的信号量类似。(关于信号量参考:Linux 内核同步(四):信号量 semaphore)。互斥体简洁高效,但是相比信号量,有更多的限制,因此对于互斥体的使用条件更加严格:

[if !supportLists]l [endif]任何时刻,只有一个指定的任务允许持有mutex,也就是说,mutex 的计数永远是 1;

[if !supportLists]l [endif]给mutex 上锁这,必须负责给他解锁,也就是不允许在一个上下文中上锁,在另外一个上下文中解锁。这个限制注定了 mutex 无法承担内核和用户空间同步的复杂场景。常用的方式是在一个上下文中进行上锁/解锁。

[if !supportLists]l [endif]递归的调用上锁和解锁是不允许的。也就是说,不能递归的去持有同一个锁,也不能够递归的解开一个已经解开的锁。

[if !supportLists]l [endif]当持有mutex 的进程,不允许退出。

[if !supportLists]l [endif]mutex 不允许在中断上下文和软中断上下文中使用过,即便是mutex_trylock 也不行。

[if !supportLists]l [endif]mutex 只能使用内核提供的 APIs操作,不允许拷贝,手动初始化和重复初始化。

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

推荐阅读更多精彩内容

  • 内核中提供了多种方法来防止竞争条件,理解了这些方法的使用场景有助于我们在编写内核代码时选用合适的同步方法,从而即可...
    钟离惜阅读 272评论 0 0
  • 主要内容 原子操作 自旋锁 读写自旋锁 信号量 读写信号量 互斥锁 完成变量 大内核锁 顺序锁 禁止抢占 顺序和屏...
    leon4ever阅读 574评论 0 2
  • 背景:内核同步问题,多个进程(线程)同时访问和操作共享资源时,就有可能发生各个线程之间相互覆盖共享数据的情况,造成...
    MagicDong阅读 482评论 0 0
  • 临界区和竞争条件 访问和操作共享数据的代码段称为临界区。如果两个执行线程在同一个临界区中同时执行,称为竞争条件。避...
    睡不醒的大橘阅读 534评论 0 0
  • 互斥体概述 信号量是在并行处理环境中对多个处理器访问某个公共资源进行保护的机制,mutex用于互斥操作。 信...
    一口Linux阅读 1,035评论 0 0