信號量是什么,讓你幾分鐘弄懂
時間:2018-07-16 來(lai)源(yuan):未(wei)知
在了(le)解和(he)學習(xi)信(xin)號量(liang)之前,我們需要(yao)明(ming)確一點(dian),信(xin)號量(liang)和(he)信(xin)號不同,切勿將信(xin)號和(he)信(xin)號量(liang)混淆,因為二者根本不是一個概(gai)念(nian)。
一(yi)、 什(shen)么是信號量?
為了防止(zhi)出(chu)現因多個程序同時(shi)訪問一個共(gong)享資源(yuan)而(er)引發的(de)一系列問題(ti),我們需要一種方法,它(ta)可以通(tong)過生成并使用令牌來授權,在任何時(shi)刻只(zhi)能有一個執行(xing)線程訪問代碼(ma)的(de)臨界(jie)區(qu)(qu)域。臨界(jie)區(qu)(qu)域是(shi)指執行(xing)數據更(geng)新的(de)代碼(ma)需要獨(du)占式地執行(xing)。
信(xin)(xin)號(hao)量(liang)(liang)(liang)是一(yi)個(ge)特(te)殊的(de)變量(liang)(liang)(liang),程序對(dui)其訪(fang)問都是原(yuan)子(zi)操(cao)(cao)(cao)作,且(qie)只(zhi)提供它等待(dai)或者發送(song)兩種操(cao)(cao)(cao)作,也(ye)就是P操(cao)(cao)(cao)作和(he)V操(cao)(cao)(cao)作。何為P/V操(cao)(cao)(cao)作:舉個(ge)例子(zi),我們平常最(zui)常見(jian)也(ye)最(zui)簡單的(de)信(xin)(xin)號(hao)形式——二值(zhi)信(xin)(xin)號(hao)量(liang)(liang)(liang)。P操(cao)(cao)(cao)作則是對(dui)等待(dai)的(de)信(xin)(xin)號(hao)量(liang)(liang)(liang)的(de)值(zhi)進(jin)行(xing)減(jian)一(yi)操(cao)(cao)(cao)作,而V操(cao)(cao)(cao)作則是對(dui)某一(yi)個(ge)信(xin)(xin)號(hao)量(liang)(liang)(liang)執(zhi)行(xing)加一(yi)操(cao)(cao)(cao)作。這里(li)我們暫時也(ye)僅針對(dui)于二值(zhi)信(xin)(xin)號(hao)量(liang)(liang)(liang)來(lai)討論。
二、信號量的工作原理
信號量只能進行兩種(zhong)操作等待和發(fa)送(song)信號,即P操作和V操作,他(ta)們的行為是這樣的:
P:如果信號量的(de)值(zhi)大于零,就給(gei)它(ta)減1;如果它(ta)的(de)值(zhi)為零,就掛起該進程(cheng)的(de)執行直到
該信號量的值不為一(yi)為止。
V:如果有(you)其他(ta)進(jin)(jin)程因(yin)等待(dai)(dai)該信號(hao)量(liang)而(er)(er)被掛(gua)起(qi),就(jiu)讓它恢復運行(xing),如果沒有(you)進(jin)(jin)程因(yin)等待(dai)(dai)該 信號(hao)量(liang)而(er)(er)掛(gua)起(qi),就(jiu)給它加1。
三、 POSIX信號量相關函數
int sem_init(sem_t *sem, int pshared, unsigned int value);
int sem_wait(sem_t *sem);
int sem_post(sem_t *sem);
sem_init可以(yi)設置信(xin)號(hao)(hao)量(liang)(liang)的初始值(zhi)和初始狀態,sem_wait則(ze)會等(deng)待指(zhi)(zhi)定信(xin)號(hao)(hao)量(liang)(liang),如果該值(zhi)為(wei)0,則(ze)等(deng)待,否則(ze)對信(xin)號(hao)(hao)量(liang)(liang)的值(zhi)減一并獲取(qu)資(zi)源,即P操作。sem_post則(ze)對指(zhi)(zhi)定信(xin)號(hao)(hao)量(liang)(liang)的值(zhi)加一,即V操作。
四、 總結
信(xin)(xin)號量(liang)(liang)是一個特殊(shu)的(de)(de)變量(liang)(liang),程序(xu)對其訪問都是原子操作(zuo),且只允(yun)許對它進(jin)行等待(即P(信(xin)(xin)號變量(liang)(liang)))和發送(song)(即V(信(xin)(xin)號變量(liang)(liang)))信(xin)(xin)息操作(zuo)。我們通常通過信(xin)(xin)號來解決多個進(jin)程或線程對同一資源(yuan)的(de)(de)訪問競爭(zheng)的(de)(de)問題。