一、
同步互斥關係
在這條南北雙向的國家公路和共享單車道的隧道上,存在如下的同步互斥關係:
1、同乙個車道上,前面的車沒有前進,則後面的車不能前進; 2、
對於每一輛將進入隧道的車,只有沒有迎面而來的汽車時才能使用隧道。
因此,設定
6個感測器和
2個訊號燈,如下圖所示:
感測器a、b
、c和d
、e、f
分別用於獲取南、北車道上的資訊。a和
d感測器通過arrive函式向訊號控制系統傳遞汽車執行的方向引數以記錄到達入口的車;b和
e感測器通過pass函式向訊號控制系統傳遞進入隧道的汽車的執行引數;c和
f感測器通過depart函式向訊號控制系統傳遞汽車離開隧道的執行引數。
當隧道上有從北至南的汽車時,南訊號燈為紅色,南入口車道上的車進入等待;當隧道上無車,或者有從南至北的汽車,但南入口上的汽車比北入口上的汽車晚到,南訊號燈為紅色,南入口上的汽車進入等待;當隧道上無車,或者有從南至北的汽車並且此時南入口上的汽車比北入口上的車早到,則南訊號燈為綠色,南入口車道上的這輛車可以行進。同樣的情況也適用於北訊號燈,此處不再贅述。
二、
軟體框架
1、
訊號量的定義
typedef int semph;
semphsmutex=1;//
用於控制南車道上的汽車的訊號量
semphnmutex=1;//
用於控制北車道上的汽車的訊號量
semphcmutex=1;//
用於防止某一車道上的汽車等待時間過長的訊號量
intgo2north=0;//
用於記錄正在從南向北行駛的汽車的數量
intgo2south=0;//
用於記錄正在從北向南行駛的汽車的數量
colornorthlight=green;//
用於同步南訊號燈的顏色
colorsouthlight=green; //
用於同步北訊號燈的顏色 2、
往北走的汽車
while (true)
v(smutex);/*
恢復南訊號量*/
v(cmutex);/*
恢復控制訊號量*/
pass(south,north);/*
南入口汽車正常進入隧道*/
p(smutex);/*
對南訊號量進行
p操作,以保持同步並記錄車數量*/
depart(south,north);/*depart
函式使go2north
減1*/
if (go2north == 0)/*
若南入口上已經沒有汽車了*/
v(smutex);/*
恢復南訊號量*/
}3、往南走的汽車
while (true)
v(nmutex);/*
恢復北訊號量*/
v(cmutex);/*
恢復控制訊號量*/
pass(north,south);/*
北入口汽車正常進入隧道*/
p(nmutex);/*
對北訊號量進行
p操作,以保持同步並記錄車數量*/
depart(north,south);/*depart
函式使go2south
減1*/
if (go2south == 0)
/*若北入口上已經沒有汽車了*/
v(nmutex);/*
恢復北訊號量*/
}由於作業系統在實現控制訊號量
cmutex
的過程中,
p操作阻塞的程序會按照「先進先出」的順序被喚醒,從而保證了汽車進入隧道的有序性。因此,當一輛汽車到達時,不管現在隧道裡行進的是什麼方向的汽車,它總是要根據先到達的汽車而等待或者行進。
三、
死鎖問題
本機制規定了南訊號燈顏色的改變由往南走的執行緒控制,北訊號燈顏色的改變由往北走的執行緒控制。於是,一輛汽車要進入隧道時先將要去的方向上的訊號燈置為紅色,對面的車就開始等待;當這輛汽車通過隧道後就將它行駛方向上的訊號燈置為綠色,則相反方向的車可以行駛。同時,
cmutex
訊號量的作用,使汽車進入隧道具有一定的順序,因此不存在乙個等待環,即死鎖不會發生。
當兩輛不同方向的汽車同時到達隧道入口時,由於控制系統使用乙個單核多執行緒的
cpu作處理器,可以設定處理器先接受南入口感測器傳來的請求。
假定一輛汽車經過隧道需要
3個時間單位,考慮如下情景:
在時刻1,南側車道有一輛汽車到達南入口,準備過隧道,記為s1;
在時刻3,北側車道有一輛汽車到達北入口,準備過隧道,記為n1;
在時刻5,南側車道有一輛汽車到達南入口,準備過隧道,記為s2;
在時刻7,南側車道有一輛汽車到達南入口,準備過隧道,記為s3;
在時刻9,北側車道有一輛汽車到達北入口,準備過隧道,記為n2;
畫出執行模擬圖如下:
執行模擬圖
當隧道中有反向的車在行駛時,汽車要進入等待。但汽車進入隧道的順序和它們到達隧道入口的順序是相同的,於是避免了某乙個方向的汽車等待過長,最大限度地防止「飢餓」的發生,也解決了死鎖問題,同時還體現了「公平」的原則。
程序同步與互斥
程序同步與互斥 首先,我們看乙個例子 程序p1 p2公用乙個變數count,初始值為0 p1 p2兩個程序的執行順序是隨機的,p1 p2可能順序執行或交錯執行。由圖可見,不同的執行順序,count值會不同,這是不允許的。在多道程式系統中,由於資源共享或程序合作,使程序間形成間接相互制約和直接相互制約...
程序同步與互斥
為什麼要引入程序同步的概念?多道程式環境下的程序併發執行,它們相互之間存在著不同的制約關係,為了理解和協調這種制約的關係,引入了程序同步的概念。臨界資源是一次只能為乙個程序使用的資源。由於臨界資源的特性,就決定了 對它的訪問必須是互斥的。在每個程序中,訪問臨界資源的那段 稱為臨界區。為了保證臨界資源...
經典程序同步與互斥問題
1.1 簡單的 生產者 消費者 問題 設程序a b是兩個相互合作的程序,它們共享乙個緩衝區,程序a向其中寫入資料,程序b從中讀出資料。producer 生產者程序,consumer 消費者程序。當緩衝區不空時,消費者便可以讀資料 當緩衝區為空時,生產者便可以寫資料。設定訊號量 full 表示有資料緩...