Linux并發(fā)、競態(tài)、互斥鎖、自旋鎖、信號量都是什么?
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ū)的代碼。

猜你喜歡LIKE
相關推薦HOT
更多>>
分析型數(shù)據(jù)庫是什么,和關系型數(shù)據(jù)庫有什么區(qū)別?
一、分析型數(shù)據(jù)庫分析型是從數(shù)據(jù)庫的作用來劃分的,其重點用來做數(shù)據(jù)分析(OLAP),大量都是select語句。還有一種是專門用來做事務處理的,一般...詳情>>
2023-10-17 23:26:16
python self是什么意思,怎么使用?
一、python self介紹首先明確的是self只有在類的方法中才會有,獨立的函數(shù)或方法是不必帶有self的。self在定義類的方法時是必須有的,雖然在調...詳情>>
2023-10-17 21:24:11
創(chuàng)建Project提交到Github需要做什么?
一、創(chuàng)建Project提交到Github需要做什么1、在Github新建一個repository。2、打開編譯器,編輯最外面的.gitignore,如果沒有就新建一個這樣的文件...詳情>>
2023-10-17 20:23:50
C/S和B/S架構的工作原理及優(yōu)缺點?
一、C/S架構的工作原理C/S 架構中客戶端和服務器之間通過網(wǎng)絡連接進行通信,客戶端發(fā)送請求后會等待服務器返回響應,直到收到響應后才能顯示給...詳情>>
2023-10-17 19:43:01熱門推薦
Web前端開發(fā)是什么技術?
沸分析型數(shù)據(jù)庫是什么,和關系型數(shù)據(jù)庫有什么區(qū)別?
熱對數(shù)量龐大的照片進行分類管理,較好的方便檢索的方法是什么?
熱web前端會用到哪些軟件工具?
新Flash動畫制作的原理是什么?
java/Python這么火,c++這么難,為什么我們還要選擇用C++?
app開發(fā)的制作為什么報價和開發(fā)周期都不一樣?
python self是什么意思,怎么使用?
什么是SEO?
PHP中的interface有什么用處?
創(chuàng)建Project提交到Github需要做什么?
為什么SwiftUI用struct來表示view?
C/S和B/S架構的工作原理及優(yōu)缺點?
Flash為什么被淘汰了?
技術干貨







快速通道 更多>>
-
課程介紹
點擊獲取大綱 -
就業(yè)前景
查看就業(yè)薪資 -
學習費用
了解課程價格 -
優(yōu)惠活動
領取優(yōu)惠券 -
學習資源
領3000G教程 -
師資團隊
了解師資團隊 -
實戰(zhàn)項目
獲取項目源碼 -
開班地區(qū)
查看來校路線