linux鎖有哪幾種
linux鎖的種類:1、mutex(互斥鎖),用來保證在任何時刻,都只能有一個執行緒存取該物件;2、rwlock(讀寫鎖),分為讀鎖和寫鎖,適用於讀取資料的頻率遠大於寫資料的頻率的場合;3、spinlock(自旋鎖),在任何時刻同樣只能有一個執行緒存取物件;4、seqlock(順序鎖),用於能夠區分讀與寫的場合,且是讀取操作很多、寫入操作很少,寫入操作的優先權大於讀取操作。
本教學操作環境:linux7.3系統、Dell G3電腦。
Linux的幾種鎖定機制
互斥鎖:mutex
互斥鎖:mutex,用來保證在任何時刻,都只能有一個執行緒存取該物件。當取得鎖定操作失敗時,執行緒會進入睡眠,等待鎖定釋放時被喚醒。
讀寫鎖定:rwlock
讀寫鎖定:rwlock,分為讀鎖定和寫鎖定。處於讀取操作時,可以允許多個執行緒同時獲得讀取操作。但是同一時刻只能有一個執行緒可以獲得寫鎖。其它取得寫鎖失敗的執行緒都會進入睡眠狀態,直到寫鎖釋放時被喚醒。
注意:寫鎖定會阻塞其它讀寫鎖定。當有一個線程獲得寫鎖在寫時,讀鎖也不能被其它線程獲取;寫者優先於讀者(一旦有寫者,則後續讀者必須等待,喚醒時優先考慮寫者)。
- 適用於讀取資料的頻率遠大於寫入資料的頻率的場合。
自旋鎖定:spinlock
自旋鎖定:spinlock,在任何時刻同樣只能有一個執行緒存取物件。但是當獲取鎖定操作失敗時,不會進入睡眠,而是在原地自旋,直到鎖被釋放。這樣節省了執行緒從睡眠狀態到被喚醒期間的消耗,在加鎖時間短暫的環境下會極大的提高效率。但如果加鎖時間過長,則會非常浪費CPU資源。
RCU
RCU:即read-copy-update,在修改資料時,首先需要讀取數據,然後產生一個副本,對副本進行修改。修改完成後,再將舊資料update成新的資料。
使用RCU時,讀者幾乎不需要同步開銷,既不需要取得鎖,也不使用原子指令,不會導致鎖競爭,因此就不用考慮死鎖問題了。而對於寫者的同步開銷較大,它需要複製被修改的數據,也必須使用鎖定機制同步並行其它寫者的修改操作。在有大量讀取操作,少量寫入操作的情況下效率非常高。
信號量:semaphore
linux核心的信號量在概念和原理上與用戶態的SystemV的IPC機制信號量是一樣的,但是它絕不可能在核心之外使用,因此它與SystemV的IPC機制訊號量毫不相干。
信號量在創建時需要設定一個初始值,表示同時可以有幾個任務可以存取該信號量保護的共享資源,初始值為1就變成互斥鎖(Mutex),即同時只能有一個任務可以存取信號量保護的共享資源。一個任務要想存取共享資源,首先必須得到信號量,獲取信號量的操作將把信號量的值減1,若當前信號量的值為負數,表示無法獲得信號量,該任務必須掛起在該信號量的等待佇列等待該信號量可用;若目前信號量的值為非負數,表示可以獲得信號量,因而可以立刻存取被該信號量保護的共享資源。當任務存取完被信號量保護的共享資源後,必須釋放信號量,釋放信號量透過把信號量的值加1實現,如果信號量的值為非正數,表示有任務等待當前信號量,因此它也喚醒所有等待該信號量的任務。
rw_semaphore (讀寫訊號量)
讀寫信號量對訪問者進行了細分,或者為讀者,或者為寫者,讀者在保持讀寫信號量期間只能對該讀寫信號量保護的共享資源進行讀訪問,如果一個任務除了需要閱讀,可能還需要寫,那麼它必須被歸類為寫者,它在對共享資源訪問之前必須先獲得寫者身份,寫者在發現自己不需要寫訪問的情況下可以降級為讀者。讀寫信號量同時擁有的讀者數不受限制,也就說可以有任意多個讀者同時擁有一個讀寫信號量。如果一個讀寫信號量目前沒有被寫者擁有且也沒有寫者等待讀者釋放信號量,那麼任何讀者都可以成功獲得該讀寫信號量;否則,讀者必須被掛起直到寫者釋放該信號量。如果一個讀寫信號量目前沒有被讀者或寫者擁有並且也沒有寫者等待該信號量,那麼一個寫者可以成功獲得該讀寫信號量,否則寫者將被掛起,直到沒有任何訪問者。因此,寫者是排他性的,獨佔性的。
讀寫信號量有兩種實現,一種是通用的,不依賴硬體架構,因此,增加新的架構不需要重新實現它,但缺點是性能低,獲得和釋放讀寫信號量的開銷大;另一種是架構相關的,因此效能高,取得和釋放讀寫訊號量的開銷小,但增加新的架構需要重新實作。在核心配置時,可以透過選項去控制使用哪一種實作。
讀寫信號量:rw_semaphore
讀寫信號量對訪問者進行了細分,或者為讀者,或者為寫者,讀者在保持讀寫信號量期間只能對該讀寫信號量保護的共享資源進行讀取訪問,如果一個任務除了需要讀,可能還需要寫,那麼它必須被歸類為寫者,它在對共享資源訪問之前必須先獲得寫者身份,寫者在發現自己不需要寫訪問的情況下可以降級為讀者。讀寫信號量同時擁有的讀者數不受限制,也就說可以有任意多個讀者同時擁有一個讀寫信號量。如果一個讀寫信號量目前沒有被寫者擁有且也沒有寫者等待讀者釋放信號量,那麼任何讀者都可以成功獲得該讀寫信號量;否則,讀者必須被掛起直到寫者釋放該信號量。如果一個讀寫信號量目前沒有被讀者或寫者擁有並且也沒有寫者等待該信號量,那麼一個寫者可以成功獲得該讀寫信號量,否則寫者將被掛起,直到沒有任何訪問者。因此,寫者是排他性的,獨佔性的。
讀寫信號量有兩種實現,一種是通用的,不依賴硬體架構,因此,增加新的架構不需要重新實現它,但缺點是性能低,獲得和釋放讀寫信號量的開銷大;另一種是架構相關的,因此性能高,獲取和釋放讀寫信號量的開銷小,但增加新的架構需要重新實現。在核心配置時,可以透過選項去控制使用哪一種實作。
seqlock****(順序鎖定)
用於能夠區分讀取與寫入的場合,並且是讀取操作很多、寫入操作很少,寫入操作的優先權大於讀取操作。 seqlock的實作想法是,用一個遞增的整數數來表示sequence。寫入操作進入臨界區時,sequence ;退出臨界區時,sequence再 。
寫入作業還需要取得一個鎖(例如mutex),這個鎖僅用於寫寫互斥,以確保同一時間最多只有一個正在進行的寫入操作。當sequence為奇數時,表示有寫入操作正在進行,這時讀取操作要進入臨界區需要等待,直到sequence變成偶數。讀取操作進入臨界區時,需要記錄下當前sequence的值,等它退出臨界區的時候用記錄的sequence與當前sequence做比較,不相等則表示在讀操作進入臨界區期間發生了寫入操作,這時候讀操作讀到的東西是無效的,需要回傳重試。
seqlock寫寫是必須要互斥的。但是seqlock的應用程式場景本身就是讀多寫少的情況,寫衝突的機率是很低的。所以這裡的寫寫互斥基本上不會有什麼效能損失。而讀寫操作是不需要互斥的。 seqlock的應用程式場景是寫入操作優先於讀取操作,對於寫入操作來說,幾乎是沒有阻塞的(除非發生寫寫衝突這一小機率事件),只需要做sequence 這個附加動作。而讀取操作也不需要阻塞,只是當發現讀寫衝突時需要retry。 seqlock的一個典型應用是時鐘的更新,系統中每1毫秒會有一個時鐘中斷,對應的中斷處理程序會更新時鐘(寫入操作)。
而使用者程式可以呼叫gettimeofday之類的系統呼叫來取得目前時間(讀取操作)。在這種情況下,使用seqlock可以避免過多的gettimeofday系統呼叫把中斷處理程序給阻塞了(如果使用讀寫鎖,而不用seqlock的話就會這樣)。中斷處理程序總是優先的,如果gettimeofday系統呼叫與之衝突了,那麼用戶程式多等等也無妨。
互斥鎖和讀寫鎖的區別:
1)讀寫鎖定區分讀者和寫者,而互斥鎖不區分
2)互斥鎖同一時間只允許一個執行緒存取該對象,無論讀寫;讀寫鎖同一時間內只允許一個寫者,但是允許多個讀者同時讀取對象。
相關推薦:《Linux影片教學》
以上是linux鎖有哪幾種的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Linux系統的五個基本組件是:1.內核,2.系統庫,3.系統實用程序,4.圖形用戶界面,5.應用程序。內核管理硬件資源,系統庫提供預編譯函數,系統實用程序用於系統管理,GUI提供可視化交互,應用程序利用這些組件實現功能。

使用Linux維護模式的時機和原因:1)系統啟動問題時,2)進行重大系統更新或升級時,3)執行文件系統維護時。維護模式提供安全、控制的環境,確保操作的安全性和效率,減少對用戶的影響,並增強系統的安全性。

進入Linux恢復模式的步驟是:1.重啟系統並按特定鍵進入GRUB菜單;2.選擇帶有(recoverymode)的選項;3.在恢復模式菜單中選擇操作,如fsck或root。恢復模式允許你以單用戶模式啟動系統,進行文件系統檢查和修復、編輯配置文件等操作,幫助解決系統問題。

Linux的基本結構包括內核、文件系統和Shell。 1)內核管理硬件資源,使用uname-r查看版本。 2)EXT4文件系統支持大文件和日誌,使用mkfs.ext4創建。 3)Shell如Bash提供命令行交互,使用ls-l列出文件。

Linux的核心組件包括內核、文件系統、Shell和常用工具。 1.內核管理硬件資源並提供基本服務。 2.文件系統組織和存儲數據。 3.Shell是用戶與系統交互的接口。 4.常用工具幫助完成日常任務。

Linux的核心組件包括內核、文件系統、Shell、用戶空間與內核空間、設備驅動程序以及性能優化和最佳實踐。 1)內核是系統的核心,管理硬件、內存和進程。 2)文件系統組織數據,支持多種類型如ext4、Btrfs和XFS。 3)Shell是用戶與系統交互的命令中心,支持腳本編寫。 4)用戶空間與內核空間分離,確保系統穩定性。 5)設備驅動程序連接硬件與操作系統。 6)性能優化包括調整系統配置和遵循最佳實踐。

Linux的維護模式可以通過GRUB菜單進入,具體步驟為:1)在GRUB菜單中選擇內核並按'e'編輯,2)在'linux'行末添加'single'或'1',3)按Ctrl X啟動。維護模式提供了一個安全環境,適用於系統修復、重置密碼和系統升級等任務。

Linux中不可或缺的命令包括:1.ls:列出目錄內容;2.cd:改變工作目錄;3.mkdir:創建新目錄;4.rm:刪除文件或目錄;5.cp:複製文件或目錄;6.mv:移動或重命名文件或目錄。這些命令通過與內核交互執行操作,幫助用戶高效管理文件和系統。
