OS筆記 16 程序同步篇 訊號量機制

2021-10-23 14:16:47 字數 1500 閱讀 4777

1. 訊號量的定義

除初始化外,僅能由同步原語對其進行操作的整型變數。

2. 訊號量的分類

整型訊號量、記錄型訊號量、and型訊號量、訊號量集

按照用途分類,又可分為兩大類:

二元訊號量:用作互斥變數,初值為1

一般訊號量:用於一般同步,初值為共享資源的初始數量

1. 整型訊號量的定義

除初始化外,僅能通過兩個標準的原子操作 wait(s) 和 siganl(s) 訪問的整型變數s。用於表示資源數目。

2. 同步原語

為什麼又叫做p、v操作呢?因為是它們是「測試」和「增加」的荷蘭語首字母。

p、v操作是兩個原子操作,因此,在執行過程中是不可中斷的。

p() / wait () :測試資源數量(即訊號量s)是否大於0

v() / signal () :使資源數量(即訊號量s)加一,表示執行程序釋放乙個單位的資源

wait () 操作可描述如下:

wait( s )

signal () 操作可描述如下:

signal( s )

對整型訊號量的缺陷做出了改進:

整型訊號量機制的 wait 操作中,只要訊號量s<=0,就會一直測試。因此,該機制並沒有遵循「讓權等待」的原則(不知道什麼是讓權等待的可以去看我的【os筆記 14】),而是處於忙等狀態。

記錄型訊號量則克服了「忙等」,下面來講解:

1. 記錄型訊號量的組成

① 用於表示資源數目的整型變數 value (但是這裡可以是負數,比如 value = -5,表示已經有5個程序在等待該資源了)

② 程序鍊錶指標 list,用於鏈結所有正在等待資源的程序

2. wait 和 signal 操作的描述

其中,block()原語是程序用來自我阻塞的,也就是放棄了處理機,這樣也就避免了忙等。

舉個例子來講一下具體過程,更好理解:

value 初值為5。接下來依次有五個程序 abcde 各使用了乙個資源,那麼此時value = 0。

現在又來了兩個程序 fg,各請求了乙個資源,那麼此時 value = -2,這兩個程序都處於阻塞態。

a首先使用完畢,釋放了資源,呼叫 signal 操作,value++之後變成 -1,然後從阻塞鍊錶中取出頭部的那個程序f,使用 wakeup() 原語把它喚醒。

然後b釋放資源,value變成0,value<=0 說明還有程序在阻塞,繼續喚醒g。

然後c釋放資源,value變成1,說明已經沒有阻塞的程序了,不需要喚醒。

16 程序同步與死鎖 程序同步與訊號量

司機 while true 售票員 while true 印表機按照列印佇列執行列印,當列印佇列中有 6個列印任務,2個程序同時新增列印任務,列印佇列的第7個任務是哪個,需要協調 小結 程序有自己的執行條件,有時執行 有時等待,執行完 可能也要 發出訊號,讓等待該訊號的其他程序執行 程序同步 就是 ...

OS 李治軍 L16 程序同步與訊號量

引例 多程序合作要溝通好。總不能售票員還在賣票的時候就開車。在停車的時候,司機在等售票員的乙個訊號,這樣他才可以開車。在開車的時候,售票員也在等司機的乙個訊號,這樣他才可以開門。形成一種合理有序向前推進的工作。程序同步的核心 等!等訊號!但是,只發訊號還是解決不了全部問題。如果框滿了,來了兩個生產者...

程序同步 訊號量機制

由dijkstra提出,目前已廣泛應用於單處理機和多處理機系統以及計算機網路中。一 整形訊號量 1.s 乙個用於表示資源數目的整型量 2.與一般整型量不同,除初始化外,僅能通過兩個標準的原子操作 wait s 和signal s 長期以來一直被稱為p v操作 3.wait操作偽碼描述 wait s ...