1. 程式人生 > >linux核心驅動同步、非同步、併發

linux核心驅動同步、非同步、併發

本部落格內容會不定期更新

--------------------------------------------------------------------Miscellaneous------------------------------------------------

        所謂臨界區(臨界段)就是訪問和操作共享資料的程式碼段,一行C語言可能含有多條彙編指令,原子操作就是將多行C語言的執行等效成一條需要更長時間的彙編指令,在這期間不會被任何外界中斷。將這些指令集等效於不可分割的一部分。

自旋鎖,在單處理器上,編譯的時候,並不會加入自旋鎖。它僅僅被當作做一個設定核心搶佔機制是否被啟用的開關。如果禁止核心搶佔,那麼在編譯時自旋鎖會被完全剔除出核心。自旋鎖是不可遞迴的。linux核心實現的自旋鎖是不可遞迴的,這點不同於自旋鎖在於其他作業系統中的實現。所以如果你試圖得到一個你正持有的鎖,你必須自旋,等待你自己釋放這個鎖。但你處於自旋忙等嗲中,所以你永遠沒有機會釋放鎖,於是你自己被自己鎖死。千萬小心自旋鎖。

自旋鎖可以使用在中斷處理程式中,在中斷中不能使用訊號量,可能會導致休眠。在中斷處理程式中使用自旋鎖,一定要在獲取鎖之前,首先禁止本地中斷

------------------------------------------------------------------------Miscellaneous-----------------------------------------------

訊號量

1、definition

struct semaphore sem;

2、initialization

void sema_init(struct semapjore *sem,int value);

講訊號量sem的值初始化為value;

3、獲取訊號量

void down(struct semaphore * sem);

該函式會可能導致程序休眠,在獲取不到訊號量的情況下會導致程序休眠,因此訊號量不一起在中斷上下文中使用。

int dowm_interruptible(struct semaphore *sem);

該函式功能與down()函式類似,不同之處為,因為down而進入休眠轉態的程序不能被訊號打斷,但因為down_interruptible而進入睡眠狀態的程序能被訊號打斷,訊號也會導致該函式返回,這時候函式的返回值非0;

int down_trylock(struct semaphore *sem);

該函式嘗試獲得訊號量sem,如果能立刻獲得,它就獲得該訊號量並返回0,否則,返回非0值,它不會導致呼叫者睡眠,可以在中斷上下文中使用。

在使用down_interruptible()獲得訊號時,對返回值一般會進行檢查,如果非0,通常立即返回-ERESTARTSYS 如:

if(down_interruptible(&sem))

return -RESTARTSYS;