王道考研 訊號量機制

2021-10-10 23:16:03 字數 1601 閱讀 6147

使用者程序可以通過使用作業系統提供的一對原語來對訊號量進行操作,從而很方便的實現了程序互斥、程序同步。

訊號量其實就是乙個變數,可以是用乙個訊號量來表示系統中某種資源的數量。

原語是一種特殊的程式段,其執行只能一氣呵成,不可被中斷,原語可由關中斷/開中斷指令實現

一對原語:wait(s)和signal(s),s為訊號量。

wait、signal簡稱p、v操作。

用乙個整數型的變數作為訊號量,用來表示系統中某種資源的數量

整型訊號量與普通整數變數的區別:對訊號量的操作只有三種, 初始化、p操作、v操作。

void

wait

(int s)

「檢查」和「上鎖」一氣呵成,避免了併發、非同步導致的問題。

存在的問題:不滿足「讓權等待」原則,會發生「忙等」

void

signal

(int s)

解決整型訊號量「忙等」問題

// 記錄型訊號量的定義

typedef

struct

semaphore;

// 某程序需要使用資源時,通過wait原語申請

void

wait

(semaphore s)

}

// 程序使用完資源後,通過signal原語釋放

void

signal

(semaphore s)

}

s.value的初值表示系統中某些資源的數目對訊號量s的一次p操作意味著程序請求乙個單位的該類資源,因此需要執行s.value – ,表示資源數減1,當s.value < 0時表示該類資源已分配完畢,因此程序應呼叫block原語進行自我阻塞(當前執行的程序從執行態–>阻塞態),主動放棄處理機,並插入該資源的等待佇列s.l中。可見,該機制遵循了「讓權等待」原則,不會出現「忙等」現象。

對訊號量s的一次v操作意味著程序釋放乙個單位的該類資源,因此需要執行s.value ++,表示資源數加1,若加1後仍是s.value <= 0,表示依然有程序在等待該類資源,因此呼叫wakeup原語喚醒等待佇列中的第乙個程序(被喚醒程序從阻塞態 --> 就緒態

訊號量機制

1 訊號量的型別定義 訊號量 semaphore 的資料結構為乙個值和乙個 指標,指標指向等待該訊號量的下乙個程序。訊號量的值與相應資源的使用情況有關。當它的值大於0時,表示當前可用資源的數量 當它的值小於0時,其絕對值表示等待使用該資源的程序個數。注意,訊號量的值僅能由pv操作來改變。一般來說,訊...

訊號量機制

訊號量機制 整型訊號量 p操作 wait s.value s.value 1 if s.value 0 then block s,l v操作 signal s.value s.value 1 if s.value 0 then wakeup s,l 定義訊號量semaphore代表可用資源實體的數量...

訊號量機制

整型訊號量符合 有限等待 原則 signal釋放資源後,當cpu被分配給等待程序後,等待程序仍可繼續執行,可以符合 有限等待 但整型訊號量不符合 讓權等待 原則 整型訊號量的wait操作,當s 0時,當前程序會佔著cpu不斷測試 訊號量原語不能被打斷,這個占有cpu的程序會一直不斷的佔據cpu迴圈下...