Semaphores

信號量介紹



信號量的基本內(nèi)容

  • 信號量是一個(gè)提供對臨界區(qū)的互斥訪問的抽象的數(shù)據(jù)類型
  • 每個(gè)信號量都有一個(gè)等待隊(duì)列
  • 信號量是支持P和V操作的整數(shù)
  • P(semaphore):整數(shù)減一伞矩,如果信號量關(guān)著則阻塞
  • V(semaphore):整數(shù)加一流椒,允許另外一個(gè)線程進(jìn)入
    如果有線程在等待隊(duì)列中董饰,則將其Unblock。如果沒有線程在等待,則信號量會“記住”這個(gè)空位的存在哥牍。
  • 信號量的安全性能:信號量的值永遠(yuǎn)大于等于0

信號量的分類

  • 互斥信號量(二元信號量)

保證對臨界區(qū)的互斥訪問,只提供對資源的單一的訪問途徑

  • 計(jì)數(shù)信號量(一般信號量)

用很多可用的單位資源表示一個(gè)資源喝检,或者說一個(gè)允許多種非同步化的并發(fā)的訪問嗅辣。(也就是多個(gè)線程可以同時(shí)訪問)(同時(shí)訪問數(shù)的上限用count定義)


信號量的語義

  • 一種假想:
void P(int *semaphore) {
    while (*semaphore <= 0);
    *semaphore--;
}
void V(int *semaphore) {
    *semaphore++;
}

上述實(shí)現(xiàn)的操作必須是原子,但忙等其實(shí)很耗資源蛇耀,所以實(shí)際信號量的實(shí)現(xiàn)并不是這樣辩诞。

實(shí)際信號量是如下的結(jié)構(gòu):

struct Semaphore {
    int value;
    Queue q;
};

也就是有一個(gè)等待隊(duì)列。mutex信號量其實(shí)很lock很像纺涤,僅僅是語義不一樣译暂。


使用信號量可能存在的問題



問題一:死鎖
先看下面一段代碼:
S = 1; Q = 1;
P0:P(S); P(Q); V(S); V(Q);
P1:P(Q); P(S); V(Q); V(S);
這種情況下,如果P0先搶到了S撩炊,P1先搶到了Q外永,則兩個(gè)線程會陷入死鎖


經(jīng)典的同步問題——讀者寫者問題

  • 問題描述:
    • 一個(gè)對象被多個(gè)線程共享
    • 有一些線程只讀拧咳,有一些線程只寫
    • 我們允許同時(shí)有多個(gè)讀者伯顶,但同時(shí)只能有一個(gè)寫者
  • 用信號量解決這個(gè)問題:
  • 嘗試一:
    Semaphore w_or_r = 1;
    Reader {
        P(w_or_r);
        read;
        V(w_or_r);
    }
    Writer {
        P(w_or_r);
        write;
        V(w_or_r);
    }
    
    但這是不可行的,讀者和寫者的角色沒有區(qū)分開骆膝。讀者和讀者之間也是互斥的祭衩,并不能滿足多個(gè)讀者同時(shí)讀的要求。
  • 嘗試二
    Semaphore w_or_r = 1;
    int readcount; //record readers
    Reader {
        readercount ++;
        if(readcount == 1) {
            P(w_or_r);   //lock out writers
        }
        read;
        readcount--;
        if(readcount == 0) {
            V(w_or_r); //up for grabs
        }
        Writer {
            P(w_or_r);    //lock out readers
            write
            V(w_or_r);  //up for grabs
        }
    }
    
    但這樣又存在一個(gè)問題:readcount是所有的讀者的共享變量阅签。假設(shè)所有的讀者都在readcount++;后被調(diào)度下CPU掐暮,則讀者無法搶到鎖。
  • 真實(shí)的做法(給readcount也加上鎖):
    使用三個(gè)變量readcount mutex w_or_r
    int readcount = 0; 
    Semaphore mutex = 1;
    Semaphore w_or_r = 1;
    Writer {
        P(w_or_r);
        write;
        V(w_or_r);
    }    
    Reader {
        P(mutex);
        readcount++;
        if(readcount == 1)
            P(w_or_r);
        V(mutex);
        Read;
        P(mutex);
        readcount--;
        if(readcount == 0)
            V(w_or_r);
        V(mutex);
    }
    
    這種做法就是讓第一個(gè)讀者作為所有讀者的代表去搶讀寫鎖政钟,但一個(gè)寫者只能自己搶鎖路克。所以會造成寫者的饑餓樟结。假想一直有讀者,則寫者就一直得不到鎖精算。

由此我們引出了第二個(gè)問題:饑餓
如何寫出一個(gè)不會出現(xiàn)饑餓問題的解法呢瓢宦?


回顧信號量

  • 信號量可以被用來解決一些傳統(tǒng)的同步問題
  • 但信號量有一些缺陷:
    • 它們本質(zhì)上是共享變量,可以在程序的任何地方使用
    • 在共享變量和信號量之間其實(shí)沒有什么邏輯聯(lián)系
    • 既可以用作臨界區(qū)(互斥機(jī)制)又可以用于協(xié)調(diào)(schedulling)
    • 沒有辦法控制和保證正確的使用
  • 有的時(shí)候很難使用灰羽,而且易于出錯(cuò)驮履。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市廉嚼,隨后出現(xiàn)的幾起案子疲吸,更是在濱河造成了極大的恐慌,老刑警劉巖前鹅,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件摘悴,死亡現(xiàn)場離奇詭異,居然都是意外死亡舰绘,警方通過查閱死者的電腦和手機(jī)蹂喻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來捂寿,“玉大人口四,你說我怎么就攤上這事∏芈” “怎么了蔓彩?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長驳概。 經(jīng)常有香客問我赤嚼,道長,這世上最難降的妖魔是什么顺又? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任更卒,我火速辦了婚禮,結(jié)果婚禮上稚照,老公的妹妹穿的比我還像新娘蹂空。我一直安慰自己,他們只是感情好果录,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布上枕。 她就那樣靜靜地躺著,像睡著了一般弱恒。 火紅的嫁衣襯著肌膚如雪辨萍。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天斤彼,我揣著相機(jī)與錄音分瘦,去河邊找鬼。 笑死琉苇,一個(gè)胖子當(dāng)著我的面吹牛嘲玫,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播并扇,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼去团,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了穷蛹?” 一聲冷哼從身側(cè)響起土陪,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎肴熏,沒想到半個(gè)月后鬼雀,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體叶洞,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡桨菜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了奄毡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鸦做。...
    茶點(diǎn)故事閱讀 40,030評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡励烦,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出泼诱,到底是詐尸還是另有隱情坛掠,我是刑警寧澤,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布治筒,位于F島的核電站屉栓,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏耸袜。R本人自食惡果不足惜系瓢,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望句灌。 院中可真熱鬧夷陋,春花似錦、人聲如沸胰锌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽资昧。三九已至酬土,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間格带,已是汗流浹背撤缴。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工刹枉, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人屈呕。 一個(gè)月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓微宝,卻偏偏與公主長得像,于是被迫代替她去往敵國和親虎眨。 傳聞我的和親對象是個(gè)殘疾皇子蟋软,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 前言 記得當(dāng)年在學(xué)習(xí)《操作系統(tǒng)》時(shí),對信號量和P,V操作這一塊一直搞不太清楚嗽桩,書中的偽代碼著實(shí)令人費(fèi)解(看得懂岳守,就...
    松照閱讀 4,862評論 0 1
  • 因著某必辦事項(xiàng)和某些緣由,我必須獨(dú)自去倫敦一趟碌冶,約定時(shí)間是1430湿痢。 決定選擇雙程火車,每程四列:鎮(zhèn)站--市站--...
    蘋果藍(lán)貓閱讀 196評論 0 0
  • 你懂得越多,你就越像這個(gè)世界的孤兒嫩挤。 走的越遠(yuǎn)害幅,越明白這世界本是孤兒院。
    徐利奧小朋友的心情閱讀 127評論 0 1
  • 安裝首選需要一個(gè)安裝包對不對 官網(wǎng)地址:http://jmeter.apache.org/download_jme...
    測試的旅途中閱讀 582評論 0 0
  • 一岂昭、本月情境 5月著重于公司R項(xiàng)目的調(diào)研以现,其他工作大多授權(quán)和暫停。 5月持續(xù)鍛煉约啊,在步行上下班上有突破邑遏。 5月開展...
    嚴(yán)哥閱讀 379評論 0 2