<option id="mwy0y"><strong id="mwy0y"></strong></option>
  • <ul id="mwy0y"><sup id="mwy0y"></sup></ul>
  • <ul id="mwy0y"></ul>
  • <del id="mwy0y"><dfn id="mwy0y"></dfn></del><ul id="mwy0y"><sup id="mwy0y"></sup></ul>
  • <abbr id="mwy0y"></abbr>

    千鋒教育-做有情懷、有良心、有品質(zhì)的職業(yè)教育機(jī)構(gòu)

    400-811-9990
    手機(jī)站
    千鋒教育

    千鋒學(xué)習(xí)站 | 隨時(shí)隨地免費(fèi)學(xué)

    千鋒教育

    掃一掃進(jìn)入千鋒手機(jī)站

    領(lǐng)取全套視頻
    千鋒教育

    關(guān)注千鋒學(xué)習(xí)站小程序
    隨時(shí)隨地免費(fèi)學(xué)習(xí)課程

    上海
    • 北京
    • 鄭州
    • 武漢
    • 成都
    • 西安
    • 沈陽
    • 廣州
    • 南京
    • 深圳
    • 大連
    • 青島
    • 杭州
    • 重慶
    當(dāng)前位置:長沙千鋒IT培訓(xùn)  >  技術(shù)干貨  >  Linux并發(fā)、競態(tài)、互斥鎖、自旋鎖、信號(hào)量都是什么?

    Linux并發(fā)、競態(tài)、互斥鎖、自旋鎖、信號(hào)量都是什么?

    來源:千鋒教育
    發(fā)布人:xqq
    時(shí)間: 2023-10-14 19:20:01

    1、Linux并發(fā)

    并發(fā)是指多個(gè)執(zhí)行單元同時(shí)、并行被執(zhí)行。linux 系統(tǒng)產(chǎn)生并發(fā)的原因:

    多線程并發(fā)訪問,linux 是多任務(wù)(線程)的系統(tǒng),所以多線程訪問是最基本的原因。搶占式并發(fā)訪問,從內(nèi)核2.6版本開始,linux 內(nèi)核支持搶占,也就是說調(diào)度程序可以在任意時(shí)刻搶占正在運(yùn)行的線程,從而運(yùn)行其他的線程。中斷程序并發(fā)訪問,硬件中斷的權(quán)利是很大的。SMP(多核)核間并發(fā)訪問,在現(xiàn)代計(jì)算機(jī)體系結(jié)構(gòu)中,多核CPU已經(jīng)成為了常見的選擇,這意味著不同核之間會(huì)進(jìn)行并發(fā)訪問。然而,并發(fā)訪問也帶來了一些問題,其中最重要的是競爭。當(dāng)多個(gè)核同時(shí)訪問共享數(shù)據(jù)時(shí),就有可能出現(xiàn)臨界區(qū)問題,即同一時(shí)間只能有一個(gè)線程訪問臨界區(qū),因此必須保證臨界區(qū)操作是原子性的,不能分解成更小的步驟。否則,就會(huì)導(dǎo)致競爭現(xiàn)象的發(fā)生。在編寫驅(qū)動(dòng)程序時(shí),應(yīng)該考慮到并發(fā)和競爭問題,并在之前進(jìn)行防范,而不是編寫完整個(gè)驅(qū)動(dòng)程序后再解決這些問題。

    2、Linux競態(tài)

    并發(fā)的執(zhí)行單元對(duì)共享資源(硬件資源和軟件上的全局變量,靜態(tài)變量等)的訪問容易發(fā)生競態(tài)。競態(tài)發(fā)生的情況:

    對(duì)稱多處理器(SMP)的多個(gè)CPU:SMP是一種緊耦合、共享存儲(chǔ)的系統(tǒng)模型,它的特點(diǎn)是多個(gè)CPU使用共同的系統(tǒng)總線,因此可以訪問共同的外設(shè)和存儲(chǔ)器。單CPU內(nèi)進(jìn)程與搶占它的進(jìn)程:Linux內(nèi)核支持內(nèi)核搶占,一個(gè)進(jìn)程在內(nèi)核執(zhí)行的時(shí)候可能被另一個(gè)優(yōu)先級(jí)高的進(jìn)程打斷,進(jìn)程與搶占它的進(jìn)程訪問共享資源的情況類似于SMP的多個(gè)CPU。中斷(硬中斷、軟中斷)與進(jìn)程之間:中斷可以打斷正在執(zhí)行的進(jìn)程,如果中斷處理程序訪問進(jìn)程正在訪問的資源,競態(tài)也會(huì)發(fā)生。中斷也可能被新的更高優(yōu)先級(jí)的中斷打斷,因此,多個(gè)中斷之間也可能引起并發(fā)而導(dǎo)致競態(tài)發(fā)生。

    3、Linux互斥鎖

    互斥鎖是用以保護(hù)對(duì)共享資源的操作,即保護(hù)線程對(duì)共享資源的操作代碼可以完整執(zhí)行,而不會(huì)在訪問的中途被其他線程介入對(duì)共享資源訪問。通常把對(duì)共享資源操作的代碼段,稱之為臨界區(qū),其共享資源也可以稱為臨界資源。于是這種機(jī)制——互斥鎖的工作原理就是對(duì)臨界區(qū)進(jìn)行加鎖,保證處于臨界區(qū)的線程不被其他線程打斷,確保其臨界區(qū)運(yùn)行完整。

    Linux內(nèi)核中提供以下API來操作互斥鎖:

    //1)定義互斥鎖lockmutex_init(struct mutex* lock);//2)獲取互斥鎖 mutex_lock(struct mutex *lock);//3)釋放互斥鎖 mutex_unlock(struct mutex *lock);

    4、Linux自旋鎖

    自旋鎖是一種典型的對(duì)臨界資源進(jìn)行互斥訪問的手段,其名稱來源于他的工作方式。為了獲得一個(gè)自旋鎖,在某CPU上運(yùn)行的代碼需要先執(zhí)行一個(gè)原子操作,該操作測試并設(shè)置某個(gè)內(nèi)存變量,由于是原子操作,所以在該操作完成之前其他執(zhí)行單元不可能訪問這個(gè)內(nèi)存變量。如果測試表明鎖已經(jīng)空閑,則程序獲得這個(gè)自旋鎖并繼續(xù)執(zhí)行;如果測試表明自旋鎖被占用,程序?qū)⒃谝粋€(gè)小的循環(huán)中重復(fù)這個(gè)“測試并設(shè)置”的操作,即所謂的“自旋”。當(dāng)自旋鎖的持有者通過重置該變量釋放這個(gè)自旋鎖之后,某個(gè)“等待的測試并設(shè)置”操作向其調(diào)用者報(bào)告鎖已釋放。

    Linux內(nèi)核中提供以下API來操作自旋鎖:

    //1)定義自旋鎖spinlock_t lock;//2)初始化自旋鎖spin_lock_init(lock);//3)獲取自旋鎖spin_lock(lock);   //獲得自旋鎖lockspin_trylock(lock);//嘗試獲取lock如果不能獲得鎖,返回假值,不在原地打轉(zhuǎn)//4)釋放自旋鎖spin_unlock(lock); //釋放自旋鎖

    5、Linux信號(hào)量

    本質(zhì)上,信號(hào)量是一個(gè)計(jì)數(shù)器,它用來記錄對(duì)某個(gè)資源(如共享內(nèi)存)的存取狀況。它是對(duì)臨界區(qū)保護(hù)的一種常用方法,他的使用方法和自旋鎖差不多。與自旋鎖相同只有得到信號(hào)量的進(jìn)程才能執(zhí)行臨界區(qū)的代碼。但是與自旋鎖不同的是,當(dāng)獲取不到信號(hào)量時(shí),進(jìn)程不會(huì)原地打轉(zhuǎn)而是進(jìn)入休眠等待狀態(tài)。

    Linux內(nèi)核中提供以下API來操作信號(hào)量:

    //1)定義信號(hào)量Struct semaphore sem; //2)初始化信號(hào)量void sema_init(struct semaphore *sem, int val); //初始化sem為val,當(dāng)然還有系統(tǒng)定義的其他宏初始化,這里不列舉 //3)獲得信號(hào)量void down(struct semaphore *sem);               //獲得信號(hào)量sem,其會(huì)導(dǎo)致睡眠,并不能被信號(hào)打斷 int down_interruptible(struct semaphore *sem);  //進(jìn)入睡眠可以被信號(hào)打斷 int down_trylock(struct semaphore *sem);        //不會(huì)睡眠 //4)釋放信號(hào)量void up(struct semaphore *sem);                 //釋放信號(hào)量,喚醒等待進(jìn)程

    延伸閱讀1:競態(tài)的解決方法——中斷屏蔽

    在單個(gè)CPU范圍內(nèi)避免競態(tài)的一種簡單省事的方法是在進(jìn)入臨界區(qū)之前屏蔽系統(tǒng)的中斷。CPU一般具備屏蔽和打開中斷的能力,這樣可以保證正在執(zhí)行的內(nèi)核路徑不被中斷處理程序搶占,防止競態(tài)條件的發(fā)生。具體而言,中斷屏蔽使得中斷與進(jìn)程之間的并發(fā)不再發(fā)生,而且,由于Linux內(nèi)核的進(jìn)程調(diào)度等操作依賴中斷來實(shí)現(xiàn),內(nèi)核搶占進(jìn)程之間的并發(fā)得以避免。但是不能長時(shí)間屏蔽中斷,因?yàn)樵谥袛嗥帘纹陂g,所有的中斷得不到處理,有可能造成數(shù)據(jù)丟失和系統(tǒng)崩潰的可能。這就要求在中斷屏蔽之后,當(dāng)前的內(nèi)核執(zhí)行路徑應(yīng)當(dāng)盡快的執(zhí)行完臨界區(qū)的代碼。

    聲明:本站稿件版權(quán)均屬千鋒教育所有,未經(jīng)許可不得擅自轉(zhuǎn)載。

    猜你喜歡LIKE

    為什么要把web服務(wù)器和數(shù)據(jù)庫服務(wù)器運(yùn)行在不同機(jī)器上?

    2023-10-14

    粒度是什么意思?

    2023-10-14

    快照與備份有什么區(qū)別?

    2023-10-14

    最新文章NEW

    為什么MySQL中很少見到使用視圖功能?

    2023-10-14

    Notion Database中怎么能實(shí)現(xiàn)多級(jí)標(biāo)簽?

    2023-10-14

    蘋果TF上架是什么意思?

    2023-10-14

    相關(guān)推薦HOT

    更多>>

    快速通道 更多>>

    最新開班信息 更多>>

    網(wǎng)友熱搜 更多>>