linux 核心鎖機制簡單介紹

2021-09-28 17:03:20 字數 1770 閱讀 9050

在作業系統引入了程序概念,程序成為排程實體後,系統就具備了併發執行多個程序的能力,但也導致了系統中各個程序之間的

資源競爭和共享。另外,由於中斷、異常機制的引入,以及核心態搶占都導致了這些核心執行路徑(程序)以交錯的方式執行。

對於這些交錯路徑執行的核心路徑,如不採取必要的同步措施,將會對一些關鍵資料結構進行交錯訪問和修改,從而導致這些

資料結構狀態的不一致,進而導致系統崩潰。因此,為了確保系統高效穩定有序地執行,linux必須要採用同步機制。

這些機制包括:原子操作、自旋鎖、訊號量、互斥體、完成變數、順序鎖等下面我介紹下常用的三種鎖機制:

1、互斥鎖 metux

以前核心唯一可以睡眠的鎖是訊號量(sem),metux是更簡單睡眠鎖,簡單來說metux是訊號量的一種簡化,

因為多數使用者可能只需要互斥,也就是說使用計數為1就可以了,而使用訊號量相對就比較複雜。

mutex在核心中對應的資料結構mutex,其行為和使用計數為1的訊號量類似,但是操作介面非常簡單,也很高效

define_mutex(name);  #靜態初始化

mutex_init(&mutex);       #動態初始化

二中初始化選其一;

mutex_lock(&mutex);

/*臨界區*/

mutex_unlock(&mutex);

2、自旋鎖spinlock

自旋鎖的最初設計目的是在多處理器系統中提供對共享資料的保護,自旋鎖獲取鎖的過程,不會主動呼叫schedule()進行程序切換,而是占用cpu,

拼命的自旋,類似於while耗時操作。

自旋鎖顧名思義,自旋,自旋鎖只能被乙個執行緒持有,如果另乙個執行緒師徒獲取被已經持有的自旋鎖,那麼執行緒會一直自旋占用cpu

--一直等到鎖被釋放,所以自旋鎖的使用必須在使用時間短的地方。舉例說明就是乙個房間,只有一把鑰匙,執行緒相當於人,房間同

時只能進乙個人,房間空了,另乙個人才能獲取鑰匙進去。

define_spinlock(my_lock);

spin_lock(&my_lock);

/*臨界區*/

spin_unlock(&my_lock);

讀寫自旋鎖rwlock:對照普通自旋鎖,讀寫自旋鎖允許多個讀者程序同時進入臨界區,交錯訪問同乙個臨界資源。

順序自旋鎖seqlock:允許任意數量的讀取者同時進入臨界區,但寫入者必須進行互斥訪問

3、訊號量·semaphone

訊號量在建立時需要設定乙個初始值,表示同時可以有幾個任務可以訪問該訊號量保護的共享資源,初始值為1就變成互斥鎖(mutex)即同時只能有乙個任務可以訪問訊號量保護的共享資源。乙個任務要想訪問共享資源,首先必須得到訊號量,獲取訊號量的操作將把訊號量的值減1,若當前訊號量的值為負數,表明無法獲得訊號量,該任務必須掛起在該訊號量的等待佇列等待該訊號量可用;若當前訊號量的值為非負數,表示可以獲得訊號量,因而可以立刻訪問被該訊號量保護的共享資源。當任務訪問完被訊號量保護的共享資源後,必須釋放訊號量,釋放訊號量通過把訊號量的值加1實現,如果訊號量的值為非正數,表明有任務等待當前訊號量,因此它也喚醒所有等待該訊號量的任務。

struct smeaphone name;

sema_init(&name,count); # name 是訊號量變數名,count是使用數量

if(down_interrupt(&name)) #試圖獲取訊號量

{}/*臨界區*/

up(&name);  #釋放訊號量

互斥訊號量:count=1,類似於mutex

linux核心鎖機制

核心鎖的討論 為什麼需要核心鎖?多核處理器下,會存在多個程序處於核心態的情況,而在核心態下,程序是可以訪問所有核心資料的,因此要對共享資料進行保護,即互斥處理 有哪些核心鎖機制?1 原子操作 atomic t資料型別,atomic inc atomic t v 將v加1 原子操作比普通操作效率要低,...

鎖機制介紹

悲觀鎖 在資料處理時將資料上鎖,直到執行完釋放鎖,在此期間其他操作會block。樂觀鎖 cas 用原值和期望值比較,如果一致,則替換成新值。常用機制有 版本號控制和時間戳。用類實現樂觀鎖,基礎型別會引起 a b a read uncommitted 不推薦 會讀取未提交的事務,引起髒讀read co...

Linux核心訊號處理機制介紹

本文簡單介紹下linux訊號處理機制,為介紹二進位制翻譯下訊號處理機制做乙個鋪墊。本文主要參考書目 linux核心源 情景分析 程式錯誤 除零,非法記憶體訪問 外部訊號 終端ctrl c產生sgint訊號,定時器到期產生sigalrm 顯式請求 kill函式允許程序傳送任何訊號給其他程序或程序組。在...