2013-08-20 197 views
1

信號量的當前實現如何工作?它使用自旋鎖或信號嗎?Linux信號量:自旋鎖或信號?

如果使用信號,調度程序如何知道調用哪一個?

它又如何在用戶空間中工作?內核鎖定建議螺旋鎖,但用戶空間不。那麼用戶空間和信號量的內核空間的實現是不同的?

+0

如果您在提問時注意到右側,您會看到它提示「提供詳細信息」。分享您的研究成果.'..請這樣做,以便我們知道您看過的地方,您找到的並幫助您! –

+0

@ user1761555問題是綽綽有餘 – user567879

回答

5

使用開源的力量 - 只要看看源代碼。

內核空間旗語被定義爲

struct semaphore { 
    raw_spinlock_t  lock; 
    unsigned int  count; 
    struct list_head wait_list; 
}; 

lock用於保護countwait_list

等待信號量的所有任務都駐留在wait_list中。當信號量被提升時,一個任務被喚醒。

用戶空間信號量應該依賴於信號量相關的系統調用,Kernel提供。用戶空間信號的定義如下:

/* One semaphore structure for each semaphore in the system. */ 
struct sem { 
    int    semval;  /* current value */ 
    int    sempid;  /* pid of last operation */ 
    spinlock_t  lock;  /* spinlock for fine-grained semtimedop */ 
    struct list_head sem_pending; /* pending single-sop operations */ 
}; 

內核使用類似於內核空間信號量的用戶空間信號量的定義。 sem_pending是一個等待進程的列表加上一些額外的信息。

我應該再次強調內核空間信號量和用戶空間信號量都不使用自旋鎖來等待鎖定。 Spinlock僅包含在兩種結構中,以保護結構成員免受併發訪問。在結構被修改之後,釋放螺旋鎖並且任務停留在列表中直到喚醒。

此外,自旋鎖不適合等待來自另一個線程的某個事件。在獲取自旋鎖之前,內核禁用搶佔。所以,在這種情況下,在單處理器機器上,自旋鎖永遠不會被釋放。

我還應該注意到,在代表用戶空間服務時,用戶空間信號在內核空間中執行。

P.S.內核空間信號量的源代碼位於include/linux/semaphore.hkernel/semaphore.c,用戶空間一個在ipc/sem.c

+0

我的問題是爲什麼它有spinlock而不是睡眠機制? – user567879

+1

自旋鎖僅包含用於保護'count'和'wait_list',並在編輯它們時避免競爭條件。任務添加到'wait_list'後,釋放spinlock並將任務放在'wait_list'中直到喚醒。 –

+1

用戶空間和內核空間中是否有任何信號量的實現? – user567879