信號量與管程

基本同步方法:
在這裏插入圖片描述

信號量和管程是操作系統提供的兩種同步方法
多線程併發導致了資源競爭這樣的併發問題,這時候需要協調多線程對共享數據的訪問,要求任何時刻只能有一個線程執行臨界區代碼,也就是同步。確保同步正確的方法有底層硬件上的實現和高層次的編程抽象,信號量和管程就是其中兩個高層次的編程方法。

信號量(semaphore):(由Dijkstra提出)
信號量是操作系統提供的一種協調共享資源訪問的方法
軟件同步是平等線程間的一種同步協商機制
OS是管理者,地位高於進程,由OS來進行資源的協調分配
用信號量表示系統資源的數量

信號是一種抽象數據類型
1.由一個整形(sem)變量和兩個原子操作組成
—P()(P操作(Prolaag)(荷蘭語嘗試減少))
sem減1
如果sem<0,進入等待,否則繼續
—V()(V操作(Verhoog)(荷蘭語增加))
sem加1
如果sem<=0,喚醒一個等待進程

信號量的特性:
1.信號量是被保護的整數變量
初始化完成後,只能通過P()和V()操作修改該整數變量
由操作系統保證,PV操作是原子操作
2.P()可能阻塞,V()不會阻塞
3.通常假定信號量是“公平的”
線程不會被無限期阻塞在P()操作
假定信號量等待按先進先出排隊

信號量的實現:
在這裏插入圖片描述

信號量的使用:
信號量可以分爲兩類:
1.二進制信號量:資源數目爲0或1
2.資源信號量:資源數目爲任何非負數
信號量的使用也可以分爲兩種:
1.互斥訪問(臨界區的互斥訪問控制)
每類資源設置一個信號量,其初值爲1
mutex = new Semaphore(1);
mutex->P();
Critical Section;
Mutex->V();
注意:必須成對使用PV操作,次序不能顛倒
2.條件同步(線程間的事件等待)
條件同步設置一個信號量,其初值爲0
condition = new Semaphore(0);
假設A完成執行需要以B的執行結果爲條件 ,那麼
在線程A中進行P操作,線程B中進行V操作
當線程B執行完成後,A才能拿到資源進行執行,若B未進行V操作,線程A因爲拿不到資源,條件不滿足,所以無法完成執行。

生產者消費者問題:
在這裏插入圖片描述
問題分析:
任何時刻只有一個線程操作緩衝區(互斥訪問)
緩衝區空時,消費者必須等待生產者(條件同步)
緩衝區滿時,生產者必須等待消費者(條件同步)
用信號量描述每個約束
二進制信號量mutex
資源信號量fullBuffers
資源信號量emptyBuffers
在這裏插入圖片描述

管程:
改進信號量處理臨界區時的麻煩,PV操作配對比較麻煩,把配對的PV操作集中到一起,就出現了管程。
一種併發程序的編程方法。
管程(Monitor)是一種用於多線程互斥訪問共享資源的程序結構。採用面向對象的方法,簡化了線程間的同步控制,任何一個時刻最多隻有一個線程執行管程代碼,正在管程中的線程可臨時放棄管程的互斥訪問,等待事件出現時再恢復(和臨界區的區別)
管程的使用:再對象/模塊中,收集相關共享數據;定義訪問共享數據的方法

管程的組成:
一個鎖:控制管程代碼的互斥訪問
0個或多個條件變量:管理共享數據的併發訪問
在這裏插入圖片描述
條件變量(Condition Variable):
條件變量是管程內的等待機制。進入管程內因資源被佔用而進入等待狀態,就等待在這個條件變量上;每個條件變量表示一種等待原因,對應一個等待隊列
Wait()操作:將自己阻塞在等待隊列中,喚醒一個等待者或釋放管程的互斥訪問
signal()操作:將等待隊列中的一個線程喚醒;如果等待隊列爲空,則等同於空操作
條件變量實現:
在這裏插入圖片描述

哲學家就餐問題:
在這裏插入圖片描述
問題描述:5個哲學家圍繞一張圓桌而坐,桌子上放着5支筷子,每兩個哲學家之間放一支;哲學家的動作有思考和就餐,就餐時同時拿起左右兩邊的筷子,思考時將兩支筷子放回原處。
如何讓保證哲學家們的動作有序進行?
用信號量來解決,方法如下:
在這裏插入圖片描述

讀寫者問題:
問題描述:共享數據的兩類使用者;讀者:只修改數據,不修改;寫者:讀取和修改數據
同一時刻允許多個讀者同時讀
沒有寫者時才能讀,沒有讀者時才能寫
同一時刻不允許多個寫着同時寫
(讀讀允許,讀寫互斥,寫寫互斥)

用信號量解決讀寫者問題:
用信號量描述每個約束:
信號量WriteMutex:控制讀寫操作的互斥;初始化爲1
讀者計數Rcount:正在讀的讀者個數,初始化爲0
信號量:CountMutex:控制對Rcount的互斥修改,初始化爲1
在這裏插入圖片描述
以上解決方法是讀者優先的,只要有讀者正在讀,後來的讀者都能直接進入。如果讀者持續不斷進入,則寫着就處於飢餓狀態。(當然也有寫者優先)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章