訊號量同步 P V 操作

2021-05-01 02:40:15 字數 2177 閱讀 3974

訊號是 e. w. dijkstra 在二十世紀六十年代末設計的一種程式設計架構。dijkstra 的模型與鐵路操作有關:假設某段鐵路是單線的,因此一次只允許一列火車通過。

訊號將用於同步通過該軌道的火車。火車在進入單一軌道之前必須等待訊號燈變為允許通行的狀態。火車進入軌道後,會改變訊號狀態,防止其他火車進入該軌道。火車離開這段軌道時,必須再次更改訊號的狀態,以便允許其他火車進入軌道。

在計算機版本中,訊號以簡單整數來表示。執行緒等待獲得許可以便繼續執行,然後發出訊號,表示該執行緒已經通過針對訊號執行 p 操作來繼續執行。

執行緒必須等到訊號的值為正,然後才能通過將訊號值減 1 來更改該值。完成此操作後,執行緒會執行 v 操作,即通過將訊號值加 1 來更改該值。這些操作必須以原子方式執行,不能再將其劃分成子操作,即,在這些子操作之間不能對訊號執行其他操作。在 p 操作中,訊號值在減小之前必須為正,從而確保生成的訊號值不為負,並且比該值減小之前小 1。

在 p 和 v 操作中,必須在沒有干擾的情況下進行運算。如果針對同一訊號同時執行兩個 v 操作,則實際結果是訊號的新值比原來大 2。

對於大多數人來說,如同記住 dijkstra 是荷蘭人一樣,記住 p 和 v 本身的含義並不重要。但是,從真正學術的角度來說,p 代表 prolagen,這是由 proberen te verlagen 演變而來的杜撰詞,其意思是嘗試減小。v 代表 verhogen,其意思是增加。dijkstra 的技術說明 ewd 74 中介紹了這些含義。

sem_wait (3rt) 和 sem_post (3rt) 分別與 dijkstra 的 p 和 v 操作相對應。sem_trywait (3rt) 是 p 操作的一種條件形式。如果呼叫執行緒不等待就不能減小訊號的值,則該呼叫會立即返回乙個非零值。

有兩種基本訊號:二進位制訊號和計數訊號量。二進位制訊號的值只能是 0 或 1,計數訊號量可以是任意非負值。二進位制訊號在邏輯上相當於乙個互斥鎖。

不過,儘管不會強制,但互斥鎖應當僅由持有該鎖的執行緒來解除鎖定。因為不存在「持有訊號的執行緒」這一概念,所以,任何執行緒都可以執行 v 或 sem_post (3rt) 操作。

但是,將互斥鎖用於條件變數時,會存在乙個隱含的括號。該括號可以清楚表明程式受保護的部分。對於訊號則不必如此,可以使用併發程式設計當中的go to對其進行呼叫。訊號的功能強大,但是容易以非結構化的不確定方式使用。

posix 訊號可以是未命名的,也可以是命名的。未命名訊號在程序記憶體中分配,並會進行初始化。未命名訊號可能可供多個程序使用,具體取決於訊號的分配和初始化的方式。未命名訊號可以是通過fork()繼承的專用訊號,也可以通過用來分配和對映這些訊號的常規檔案的訪問保護功能對其進行保護。

命名訊號類似於程序共享的訊號,區別在於命名訊號是使用路徑名而非 pshared 值引用的。命名訊號可以由多個程序共享。命名訊號具有屬主使用者 id、組 id 和保護模式。

對於 open 、retrieve 、close 和 remove 命名訊號,可以使用以下函式:sem_open 、sem_getvalue 、sem_close 和 sem_unlink 。通過使用 sem_open ,可以建立乙個命名訊號,其名稱是在檔案系統的命名空間中定義的。

有關命名訊號的更多資訊,請參見 sem_open 、sem_getvalue 、sem_close 和 sem_unlink 手冊頁。

從概念上來說,訊號量是乙個非負整數計數。訊號量通常用來協調對資源的訪問,其中訊號計數會初始化為可用資源的數目。然後,執行緒在資源增加時會增加計數,在刪除資源時會減小計數,這些操作都以原子方式執行。

如果訊號計數變為零,則表明已無可用資源。計數為零時,嘗試減小訊號的執行緒會被阻塞,直到計數大於零為止。

表 4–7 訊號例程

操作

相關函式說明

初始化訊號

增加訊號

基於訊號計數阻塞

減小訊號計數

銷毀訊號狀態

由於訊號無需由同乙個執行緒來獲取和釋放,因此訊號可用於非同步事件通知,如用於訊號處理程式中。同時,由於訊號包含狀態,因此可以非同步方式使用,而不用象條件變數那樣要求獲取互斥鎖。但是,訊號的效率不如互斥鎖高。

預設情況下,如果有多個執行緒正在等待訊號,則解除阻塞的順序是不確定的。

訊號在使用前必須先初始化,但是訊號沒有屬性。

p -  1

v + 1

訊號量,PV操作

它從整型訊號量 記錄型訊號量,進而發展為 訊號量集 機制 訊號量集,就是訊號量的集合 現在要用的是記錄型訊號量 1,訊號量幹嘛用的?訊號量 解決程序間同步與互斥問題 2.訊號量的組成 訊號量 分很多種,在此寫記錄型訊號量 record semaphore 訊號量組成 每個訊號量s除乙個整數值s.va...

PV操作和訊號量

乙個程序被分為了 就緒 ready 執行 running 和 阻塞 blocking 三個工作狀態,當前用處理器的哪個程序是 執行 狀態,當前已經具備了使用處理器的條件而等待處理器的程序是處於就緒狀態的程序,當執行的程序由於某種原因無法繼續使用處理器的時候就停止他使用處理器使他進入 阻塞 狀態,當他...

PV操作和訊號量

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