最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

帶你玩轉(zhuǎn)Linux內(nèi)核并發(fā)與同步- -原子操作和內(nèi)存屏障(一篇搞定)

2022-03-19 20:55 作者:補(bǔ)給站Linux內(nèi)核  | 我要投稿

并發(fā)訪問:多個(gè)內(nèi)核路徑同時(shí)訪問和操作數(shù)據(jù),就有可能發(fā)生相互覆蓋共享數(shù)據(jù)的情況,造成被訪問數(shù)據(jù)的不一致。

  1. 臨界區(qū):訪問和操作共享數(shù)據(jù)的代碼段。

  2. 并發(fā)源:訪問臨界區(qū)的執(zhí)行線程或代碼路徑。

在內(nèi)核中產(chǎn)生并發(fā)訪問的主要有如下4種:

  1. 中斷和異常:中斷發(fā)生后,中斷處理程序和被中斷的進(jìn)程之間有可能產(chǎn)生并發(fā)訪問。中斷<==>被中斷的線程

  2. 軟中斷和tasklet:軟中斷或者tasklet隨時(shí)可能會(huì)被調(diào)度執(zhí)行,從而打斷當(dāng)前正在執(zhí)行的進(jìn)程上下文。軟中斷<==>進(jìn)程上下文

  3. 內(nèi)核搶占:調(diào)度器支持可搶占特性,會(huì)導(dǎo)致進(jìn)程和進(jìn)程之間的并發(fā)訪問。進(jìn)程<==>進(jìn)程

  4. 多處理器并發(fā)執(zhí)行:多處理器上可以同時(shí)運(yùn)行多個(gè)進(jìn)程。A處理器進(jìn)程<==>B處理器進(jìn)程

對(duì)于單處理器系統(tǒng),主要有一下并發(fā)源:(硬中斷 > 軟中斷和tasklet > 進(jìn)程上下文)

  1. 中斷處理程序可以打斷軟中斷、tasklet和進(jìn)程上下文。

  2. 軟中斷和tasklet之間不會(huì)并發(fā),但是可以打斷進(jìn)程上下文的執(zhí)行。

  3. 在支持搶占的內(nèi)核中,進(jìn)程上下文之間會(huì)并發(fā)。

  4. 在不支持搶占的內(nèi)核中,進(jìn)程上下文之間不會(huì)產(chǎn)生并發(fā)。

對(duì)于SMP系統(tǒng),有如下并發(fā)情況:

  1. 同一類型的中斷處理程序不會(huì)并發(fā),但是不同類型的中斷有可能送達(dá)到不同的CPU上,因此不同類型的中斷處理程序可能會(huì)存在并發(fā)執(zhí)行。

  2. 同一類型的軟中斷會(huì)在不同的CPU上并發(fā)執(zhí)行。

  3. 同一類型的tasklet是串行執(zhí)行的,不會(huì)在多個(gè)CPU上并發(fā)。

  4. 不同CPU上的進(jìn)程上下文會(huì)并發(fā)。

并發(fā)保護(hù)的是資源或者數(shù)據(jù),而不是保護(hù)代碼;包括靜態(tài)局部變量、全局變量、共享的數(shù)據(jù)結(jié)構(gòu)、緩存、鏈表、紅黑樹等各種形式的資源數(shù)據(jù)。

  1. 原子操作

  2. 一個(gè)原子操作例子思考

  3. 原子操作API atomic_t數(shù)據(jù)結(jié)構(gòu)表示原子變量,它的實(shí)現(xiàn)依賴于不同的體系結(jié)構(gòu)。

【文章福利】小編推薦自己的Linux內(nèi)核技術(shù)交流群:【891587639】整理了一些個(gè)人覺得比較好的學(xué)習(xí)書籍、視頻資料共享在群文件里面,有需要的可以自行添加哦?。。∏?00名進(jìn)群領(lǐng)取,額外贈(zèng)送一份價(jià)值699的內(nèi)核資料包(含視頻教程、電子書、實(shí)戰(zhàn)項(xiàng)目及代碼)?

Linux提供了很多操作原子變量的API。以arch/arm/include/asm/atomic.h為例。

  • 上面雖然有多種API但是基礎(chǔ)的只有atomic_add()/atomic_sub()/atomic_add_return()/atomic_sub_return()四種。

  • 他們通過ATOMIC_OPS定義,產(chǎn)生atomic_add()/atomic_sub()/atomic_add_return()/atomic_sub_return()四個(gè)函數(shù)。

  • ARM使用ldrex和strex指令來保證add操作的原子性,指令后綴ex表示exclusive。

  • ldrex Rt, [Rn] - 把Rn寄存器只想內(nèi)存地址的內(nèi)容加載到Rt寄存器中。

  • strex Rd, Rt, [Rn] - 把Rt寄存器的值保存到Rn寄存器指向的內(nèi)存地址中,Rd保存更新的結(jié)果,0表示更新成功,1表示失敗。

GCC嵌入?yún)R編的格式如下:

ARM32如何保證原子性

內(nèi)存屏障

內(nèi)存屏障3條指令DMB/DSB/ISB

  • ARM體系架構(gòu)中常見的3條內(nèi)存屏障指令:

  • 數(shù)據(jù)內(nèi)存屏障DMB:Data Memory Barrier,它可確保會(huì)先檢測(cè)到程序中位于DMB指令前的所有顯示內(nèi)存訪問指令,然后再檢測(cè)到程序中位于DMB指令后的顯式內(nèi)存訪問指令。它不影響其它指令在處理器上的執(zhí)行順序。 數(shù)據(jù)同步屏障DSB:Data Synchronization Barrier,是一種特殊的內(nèi)存屏障,只有當(dāng)此指令執(zhí)行完畢后,才會(huì)執(zhí)行程序中位于此指令后的指令。

  • 當(dāng)滿足以下條件時(shí),此指令才會(huì)完成:

  • 位于此指令前的所有顯示內(nèi)存訪問均完成。

  • 位于此指令前的所有緩存、跳轉(zhuǎn)預(yù)測(cè)和TLB維護(hù)操作全部完成。

  • 指令同步屏障ISB:Instruction Synchronization Barrier,可刷新處理器中的管道,因此可確保在ISB指令完成后,才從高速緩存或內(nèi)存中提取位于該指令后的其他所有指令。

  • 這可確保提取時(shí)間晚于ISB指令的指令,能夠檢測(cè)到ISB指令執(zhí)行前就已經(jīng)執(zhí)行的上下文更改操作的執(zhí)行效果。

內(nèi)存屏障API

內(nèi)存屏障例子

一個(gè)網(wǎng)卡驅(qū)動(dòng)中發(fā)送數(shù)據(jù)包

  • 網(wǎng)絡(luò)數(shù)據(jù)包寫入buffer后交給DMA負(fù)責(zé)發(fā)送,wmb()保證在DMA傳輸之前,數(shù)據(jù)被完全寫入到buffer中。

睡眠喚醒API中的內(nèi)存屏障

  • 通常一個(gè)進(jìn)程因?yàn)榈却诚禃r(shí)間需要睡眠,調(diào)用wait_event()。

  • 在wait_event()中有prepare_to_wait_event()調(diào)用了set_current_state()。

喚醒者通常調(diào)用__set_task_cpu()來設(shè)置當(dāng)前進(jìn)程對(duì)應(yīng)的調(diào)度實(shí)體




帶你玩轉(zhuǎn)Linux內(nèi)核并發(fā)與同步- -原子操作和內(nèi)存屏障(一篇搞定)的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
晋州市| 平南县| 康平县| 平陆县| 响水县| 扶沟县| 西林县| 闽侯县| 林周县| 融水| 康保县| 山阴县| 迁西县| 阿克陶县| 枣强县| 石泉县| 衡阳县| 苍南县| 新巴尔虎右旗| 卢龙县| 鸡泽县| 弋阳县| 长治市| 镇康县| 安福县| 新平| 钟山县| 融水| 怀仁县| 奉新县| 丰台区| 松滋市| 奎屯市| 红安县| 临洮县| 萍乡市| 麟游县| 阿拉善左旗| 海门市| 石嘴山市| 湖南省|