程序互斥(mutex):進入臨界區的程序只能有乙個,當然前提是這些程序有共同的臨界區。
程序同步:有邏輯關聯的程序先後執行,比如b只有等a執行完了才能執行,a沒執行完程序b只能掛起。這實際上是一種約束,更是一種通訊。需要同步的程序之間不一定有共享臨界區。
1)禁用硬體中斷和基於硬體的原子操作(testandset以及exchange)單純實現了程序互斥;
2)基於軟體(peterson演算法以及麵包店演算法)肯定實現了互斥,同時實現了同步;
3)訊號量可以但不一定實現互斥(不是說不能,一種情況是不存在共享臨界區,談不上互斥,另一種情況是允許共同進入臨界區,比如讀操作),肯定實現了同步。
1)訊號量(sem)是乙個整型數字,程式開始需要給它乙個初值,這裡我們假設初值為org,其意義我們在後面根據訊號量型別分開討論。
sem=new semaphore(org);
2)訊號量有兩個原子操作:p操作和v操作,具體意義也要分訊號量型別的情況
·p() : sem減1
·v() : sem加1
1)二進位制訊號量
此時訊號量的org初值只能是0和1。
2)一般/計數訊號量
此時訊號量的org初值可以是任意非負數。顯然,其包含二進位制訊號量。
以下僅談初值:
這是乙個極簡的程序同步例子,不牽扯互斥。當然單獨實現這種操作不一定用訊號量(訊號量本質上還是乙個類),隨便定義變數賦任何值都可以對沒有共享臨界區的程序實現相同功能,只是訊號量為0時恰好可以實現這種極簡同步罷了。除了這一點外和其他訊號量沒有什麼不同。
但訊號量自有的掛起,喚醒機制使其不存在忙等狀態。
pv過程中訊號量大於0和小於0時,其代表的意義是不同的,這正是訊號量的精妙所在。
當訊號量≥0時,其表示還有sem個程序被允許進入臨界區(某區域中還有sem個資源可以被獲得),此時在臨界區中的程序數目為org-sem(被取走的資源數目)。
當訊號量<0時,表示有 |訊號量| 個程序之前請求進入但不被允許後掛起的程序數目(想獲得資源但目前給不了的程序數目),此時臨界區中的程序數目為org(被拿走的資源數目),總的已經進入和即將進入的程序數目為org+|sem|(資源的總需求數目)。
允許多個執行緒進入的臨界區限流?和快取區資源的獲取是訊號量應用的兩個主要方面。
lock只能完成互斥要求,難以完成同步約束。消費者取不到東西會形成自旋,此時使用訊號量主要使用其排程功能(何時掛起?何時喚醒?)。
v操作不會引起阻塞掛起,因此順序可換,p操作會引起阻塞掛起,調換順序可能引起死鎖。
pv操作都是原子指令。
訊號量的雙用途:互斥與同步
訊號量的優點:無忙等
訊號量這塊本來就錯綜複雜,各種概念交織,總結成這樣盡力了,就這樣吧。。。。
參考:清華大學chen yu老師《作業系統原理》
uTenux實驗 訊號量
訊號量 semaphore 是乙個用來指示可用的資源並將可用資源的數量以數值的形式表示出來的物件。當使用一組資源時,訊號量用來實現互斥控制和同步。utenux 提供了訊號量出來的 api,可以很方便地使用訊號量。utenux 中,訊號量包含乙個資源計數 用來指示是否存在相應的資源以及資源的數量 和乙...
訊號量的實現與應用
本實驗需要完成兩個任務 1 在 ubuntu 下編寫程式,用訊號量解決生產者 消費者問題 2 在 linux 0.11 中實現訊號量,用生產者 消費者程式檢驗之。訊號量,英文為 semaphore,最早由荷蘭科學家 圖靈獎獲得者 e.w.dijkstra 設計,任何作業系統教科書的 程序同步 部分都...
訊號量和訊號的區別
1.訊號 signal 是一種處理非同步事件的方式。訊號是比較複雜的通訊方式,用於通知接受程序有某種事件發生,除了用於程序外,還可以傳送訊號給程序本身。2.訊號量 semaphore 程序間通訊處理同步互斥的機制。是在多執行緒環境下使用的一種設施,它負責協調各個執行緒,以保證它們能夠正確 合理的使用...