信號量:二進位信號量和計數(shù)信號量

什么是信號量(semaphore)

信號量(semaphore)是一個被線程共享的非負(fù)變量。信號量是一個發(fā)信號的機制。一個等待一個信號量的線程可以被其他線程通知(signal)。這個機制通過 wait 和 signal 兩個原子操作(atomic operations)來實現(xiàn)進程同步。

一個信號量要么允許訪問資源,要么不允許訪問資源。二者只能選其一。而具體是哪一種,則要看設(shè)置。

信號量的特點

下面是信號量的一些特點:

  • 它是一個機制。該機制支持多任務(wù)的同時進行
  • 它是一個低層級的(low-level)的同步機制
  • 信號量的存儲值一直是非負(fù)的
  • 信號量可以使用測試操作和中斷來實現(xiàn)。這些操作和中斷需要用文件描述符來執(zhí)行

信號量的類型

最常見的兩種信號量:

  • 計數(shù)信號量(Counting semaphores)
  • 二進位信號量(Binary semaphores)

計數(shù)信號量

這種信號量用一個計數(shù)來幫助任務(wù)被獲取(be acquired)或釋放(be released)數(shù)次。

  • 如果起始時,計數(shù)器的計數(shù)值為0(count = 0),那么創(chuàng)建出來的信號量就應(yīng)該在不可獲得的狀態(tài)(unavailable state)。
  • 如果起始時,計數(shù)器的計數(shù)值大于0(count > 0),那么創(chuàng)建出來的信號量就應(yīng)該在可獲得的狀態(tài)(available state)。而且,總共的獲取次數(shù)(tokens)就等于計數(shù)器的值。

具體機制如下圖所示:

計數(shù)信號量

二進位信號量

二進位信號量和計數(shù)信號量非常相似,但是他們的計數(shù)值只能限制在0和1兩個數(shù)字。在這種信號量下,等待(wait)操作只能在信號量等于1(semaphore = 1)時工作。而通知(signal)操作只有在信號量等于0(semaphore = 0)時才能成功。二進位信號量的實現(xiàn)要比計數(shù)信號量的實現(xiàn)要簡單。


二進位信號量

信號量的等待操作和通知操作

信號量的等待操作(wait operation)和通知操作(signal operation)是用來實現(xiàn)同步的。信號量操作的不得是為了互相獨立。

等待操作(wait operation)

等待操作(wait operation)用來幫助我們控制任務(wù)是否可以進入關(guān)鍵的部分。當(dāng)信號量是正的時候,信號量將被減一。如果當(dāng)信號量為負(fù)數(shù)或者零的時候,等待操作不執(zhí)行任何操作。
當(dāng)信號量被遞減后,信號量值為負(fù)數(shù)或者零時,該指令將被掛起保持,直到信號量重新滿足大于0的條件。

function wait(S){
    while ( S < 0);
    S--;
}

通知操作(signal operation)

通知操作(signal operation)是用于控制一個任務(wù)退出某個重要部分。當(dāng)信號量的值是負(fù)的時候,信號量將被加一。

function signal(S){
    while (S >= 0);
    S++;
}

計數(shù)信號量vs二進位信號量

下面列舉了計數(shù)信號量和二進位信號量的主要不同:

計數(shù)信號量 二進位信號量
沒有互斥 互斥
任意整數(shù)值 只有0和1
多于一個槽(slot) 只有一個槽(slot)
Provide a set of Processes It has a mutual exclusion mechanism
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 本文為轉(zhuǎn)載資料,原文地址: http://www.itdecent.cn/p/02821f9d7777 一、信號量...
    一曰就是一天閱讀 1,285評論 0 3
  • 線程同步(互斥鎖與信號量的作用與區(qū)別) “信號量用在多線程多任務(wù)同步的,一個線程完成了某一個動作就通過信號量告訴別...
    勝浩_ae28閱讀 5,093評論 0 2
  • 在iOS開發(fā)的道路上,多線程的重要性不言而喻. 大部分我們都停留在基礎(chǔ)的使用上面.缺乏高級應(yīng)用. 缺乏提升,是因為...
    瘋狂的木頭人閱讀 1,234評論 0 1
  • 本文用來介紹 iOS 多線程中 GCD 的相關(guān)知識以及使用方法。這大概是史上最詳細(xì)、清晰的關(guān)于 GCD 的詳細(xì)講...
    花花世界的孤獨行者閱讀 576評論 0 1
  • 目標(biāo):實現(xiàn)一個頁面多個請求 我們經(jīng)常遇到這樣的情況:例如用戶界面的數(shù)據(jù)展示 里面有多個接口,我們數(shù)據(jù)請求完成之后展...
    icc_tips閱讀 1,022評論 1 7

友情鏈接更多精彩內(nèi)容