linux 信号量锁 内核,Linux内核信号量互斥锁应用
主要介紹了Linux 內核關于信號量,互斥鎖等的應用
內核同步機制-信號量/互斥鎖/讀-寫信號量 sema ,mutex ,rwsem
信號量
通用信號量
用戶類進程之間使用信號量(semaphore)進行同步,內核線程之間也使用了信號量,一個線程完成了某一個動作就通過信號量告訴別的線程,別的線程再進行某些動作。信號量與自旋鎖類似,保護臨界區代碼。但信號量與自旋鎖有一定的區別,信號量在無法得到資源時,內核線程處于睡眠阻塞狀態,而自旋鎖處于忙等待狀態。因此,如果資源被占用時間很短時,使用自旋鎖較好,因為它可節約調度時間。如果資源被占用的時間較長,使用信號量較好,因為可讓CPU調度去做其它進程的工作。
函數定義 功能說明
sema_init(struct semaphore *sem, int val) 初始化信號量,將信號量計數器值設置val。 down(struct semaphore *sem) 獲取信號量,不建議使用此函數。
down_interruptible(struct semaphore *sem) 可被中斷地獲取信號量,如果睡眠被信號中斷,返回錯誤-EINTR。
down_killable (struct semaphore *sem) 可被殺死地獲取信號量。如果睡眠被致命信號中斷,返回錯誤-EINTR。
down_trylock(struct semaphore *sem) 嘗試原子地獲取信號量,如果成功獲取,返回0,不能獲取,返回1。
down_timeout(struct semaphore *sem, long jiffies) 在指定的時間jiffies內獲取信號量,若超時未獲取,返回錯誤-ETIME。
up(struct semaphore *sem) 釋放信號量sem。
樣例:信號量的使用
下面函數do_utimes利用信號量防止多個線程對文件系統節點inode同時進行訪問。其列出如下(在fs/open.c中):
long do_utimes(char __user * filename, struct timeval * times)
{
struct inode * inode;
……
down(&inode->i_sem); //獲取信號量
error = notify_change(nd.dentry, &newattrs);//修改inode中值
up(&inode->i_sem); //釋放信號量
……
}
下面說明信號量API函數。
(1)信號量結構semaphore
信號量用結構semaphore描述,它在自旋鎖的基礎上改進而成,它包括一個自旋鎖、信號量計數器和一個等待隊列。用戶程序只能調用信號量API函數,而不能直接訪問信號量結構,其列出如下(在include/linux/semaphore.h中):
總結
以上是生活随笔為你收集整理的linux 信号量锁 内核,Linux内核信号量互斥锁应用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 连板的股票能买吗?
- 下一篇: Linux搜索无线网络命令,Linux操