• <del id="a8uas"></del>
    • 千鋒教育-做有情懷、有良心、有品質的職業(yè)教育機構

      400-811-9990
      手機站
      千鋒教育

      千鋒學習站 | 隨時隨地免費學

      千鋒教育

      掃一掃進入千鋒手機站

      領取全套視頻
      千鋒教育

      關注千鋒學習站小程序
      隨時隨地免費學習課程

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

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

      來源:千鋒教育
      發(fā)布人:xqq
      時間: 2023-10-17 17:47:58

      1、Linux并發(fā)

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

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

      2、Linux競態(tài)

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

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

      3、Linux互斥鎖

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

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

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

      4、Linux自旋鎖

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

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

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

      5、Linux信號量

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

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

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

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

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

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

      猜你喜歡LIKE

      web前端會用到哪些軟件工具?

      2023-10-17

      java/Python這么火,c++這么難,為什么我們還要選擇用C++?

      2023-10-17

      app開發(fā)的制作為什么報價和開發(fā)周期都不一樣?

      2023-10-17

      最新文章NEW

      對數(shù)量龐大的照片進行分類管理,較好的方便檢索的方法是什么?

      2023-10-17

      PHP中的interface有什么用處?

      2023-10-17

      PHP有哪些運行環(huán)境?

      2023-10-17

      相關推薦HOT

      更多>>

      快速通道 更多>>

      最新開班信息 更多>>

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