Linux驱动设计之信号量
1.信號量的定義
? ? 信號量(semphore)是用于保護臨界區的一種常用方法,它的使用方式和自旋鎖類似。信號量的本質是一種數據操作鎖,它本身不具有數據交換的功能,而是通過控制其他的通信資源(文件,外部設備)來實現進程間通信,它本身只是一種外部資源的標識。信號量在此過程中負責數據操作的互斥、同步等功能。
2.信號量的主要操作
? 2.1、 定義信號量
下列代碼定義名稱為sem的信號量: struct semaphore sem;? 2.2、 初始化信號量
可用void sema_init(struct semaphore *sem, int val);直接創建,其中val為信號量初值。
也可以用兩個宏來定義和初始化信號量的值為1或0:
DECLARE_MUTEX(name) : 定義信號量name并初始化為1
DECLARE_MUTEX_LOCKED(name) : 定義信號量name并初始化為0
還可以用下面的函數初始化:
void init_MUTEX(struct semaphore *sem); //初始化信號量的值為1
void init_MUTEX_LOCKED(struct semaphore *sem); //初始化信號量的值為0
? ? 2.3、信號量的原子操作
* void down(struct semaphore *sem); //用來獲取信號量,如果信號量值大于或等于0,獲取信號量,否則進入睡眠狀態,睡眠狀態不可喚醒
* void down_interruptible(struct semephore *sem); //用來獲取信號量,如果信號量大于或等于0,獲取信號量,否則進入睡眠狀態,等待信號量被釋放后,激活該程。
* void down_trylock(struct semaphore *sem); //試圖獲取信號量,如果信號量已被其他進程獲取,則立刻返回非零值,調用者不會睡眠
* void up(struct semaphore *sem); //釋放信號量,并喚醒等待該資源進程隊列的第一個進程。
3 信號量與自旋鎖的區別
(1)當鎖不能獲取到時,使用信號量的開銷是進程上下文切換時間,使用自旋鎖的開銷是等待獲取自旋鎖; (2)信號量所保護的臨界區可能會引起阻塞,而自旋鎖則絕對要避免用來保護包含這樣的代碼,因為阻塞意味著要進行進程的切換,如果進程被切換出去后,另一個進程企圖要獲取本自旋鎖,死鎖就會發生。 (3)信號量存在于進程的上下文,因此,如果保護的共享資源需要在中斷或軟中斷情況下使用,則在信號量和自旋鎖之間只能選擇自旋鎖。當然如果一定要使用信號量,則只能通過down_trylock方式進行,不能獲取就立即返回避免阻塞。總結
以上是生活随笔為你收集整理的Linux驱动设计之信号量的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 最全面的linux信号量解析
- 下一篇: 信号量、互斥体和自旋锁