linux--內核同步

一、原子操作

        原子操作可以保證指令以原子的方式執行,執行過程不被打斷。它通過把讀取和修改變量的行爲包含在一個單步中執行,從而防止了競爭的發生,保證操作結果總是一致的。原子操作在Linux內核裏分爲原子整數操作和原子位操作,針對整數的原子操作只能對atomic_t類型的數據進行處理。

二、信號量

       信號量是包含一個非負整數型的變量,並且帶有兩個原子操作wait和signal。Wait還可以被稱爲down、P或lock,signal還可以被稱爲up、V、unlock或post。在UNIX的API中(POSIX標準)用的是wait和post。POSIX信號量是一個sem_t類型的變量,但POSIX有兩種信號量的實現機制:無名信號量命名信號量。無名信號量只可以在共享內存的情況下,比如實現進程中各個線程之間的互斥和同步,因此無名信號量也被稱作基於內存的信號量;命名信號量通常用於不共享內存的情況下,比如進程間通信。

三 、互斥量

       互斥量,又稱爲互斥鎖,是一種用來保護臨界區的特殊變量,它可以處於鎖定狀態,也可以處於解鎖狀態。每個互斥鎖內部都有一個線程等待隊列,用來保存等待該互斥鎖的線程。當互斥鎖處於解鎖狀態時,一個線程試圖獲取這個互斥鎖時,這個線程就可以得到這個互斥鎖而不會阻塞;當互斥鎖處於鎖定狀態時,一個線程試圖獲取這個互斥鎖時,這個線程將素色在互斥鎖的等待線程隊列內。

四、自旋鎖

        Linux的的內核最常見的鎖是自旋鎖。自旋鎖最多隻能被一個可執行線程持有。如果一個執行線程試圖獲得一個被已經持有(爭用)的自旋鎖,那麼該線程就會一直進行忙循環-旋轉-等待鎖重新可用要是鎖未被爭用,請求鎖的執行線程就可以立即得到它,繼續執行。在任意時間,自旋鎖都可以防止多於一個的執行線程同時進入臨界區。zixu自旋鎖的相關代碼定義在/linux/include/linux/seqlock.h中。對應體系結構中的在/linux/arch/x86/include/asm目錄下。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章