相對於自旋鎖,信號量的最大特點是允許調用它的線程可以進入休眠,這意味着試圖獲得某一信號量的進程會導致處理器擁有權的喪失,也即出現進程的切換。
驅動程序中定義了一個信號量,不是直接對其賦值,而是應該使用 sema_init(struct semaphore *sema, int val )進行初始化,初始化吧信號量的自旋鎖設置爲unlock, count = val,同事初始化表頭。
信號量結構體:
struct semaphore {
spinlock_t lock;
unsighned int count;
struct list_head wait_list;
}
down操作:判斷是否可以進入臨界區,count>0,可以進入,count --,
內核中down操作函數有
void down(struct semaphore *sem);//除非必要,一般不使用
void down_interrputable(struct semaphore *sem);//一般使用這個
void down_killable(struct semaphore *sem);
void down_trylock(struct semaphore *sem);//獲得信號量返回0;無法獲得信號量,返回1
void down_timeout(struct semaphore *sem);
up操作
進行up(),如果信號量sem的wait_list爲空,則沒有其他的進程在等待該信號量,count++;如果wait_list 不爲空,說明有其他的進程在等待信號量,此時調用_up()喚醒進程。
即使不是信號量的擁有者也可以UP操作。