經典程序同步問題
程序通訊
一次僅允許乙個程序使用的資源稱為臨界資源。
對臨界資源進行訪問的那段**稱為臨界區。
同步:多個程序因為合作產生的直接制約關係,使得程序有一定的先後執行關係。
互斥:多個程序在同一時刻只有乙個程序能進入臨界區。
程序之間經常會存在互斥和同步兩種關係.為了有效的處理這兩種情況,提出了訊號量 (semaphore)和pv操作。
訊號量是乙個整形變數,可以對其執行pv操作。
pv操作被設計成原語,不可分割。
如果訊號量的取值只能為0或1,那麼就成為了互斥量。
問題描述
使用乙個緩衝區來存放物品,只有緩衝區沒有滿,生產者才可以放入物品;只有緩衝區不為空,消費者才可以拿走物品。
解釋
緩衝區處於臨界資源,因此,需要乙個互斥量mutex來控制緩衝區的互斥訪問。
為了同步生產者和消費者的行為,需要記錄緩衝區中物品的數量。數量可以用訊號量來統計,需要兩個訊號量:empty記錄空緩衝區的數量,full記錄滿緩衝區的數量。
empty訊號量是在生產者程序中使用,當empty不為零時,生產者才能放入物品;
full訊號量是在消費者程序中使用的,方full訊號量不為0時,消費者才可以取走物品。
注意
不能對緩衝區先進行加鎖再測試訊號量。即不能先p(mutex)再p(empty)。否則可能會出現如下情況。
生產者對緩衝區加鎖,執行p(mutex)在執行p(empty)操作,發現empty=0,此時生產者睡眠。
消費者不能進入臨界區,因為生產者對緩衝區加鎖了,消費者就無法執行v(empty)操作,empty永遠都是0,導致生產者永遠等待,不釋放鎖,消費者也因此永遠等待。
#define n 100
typedef
int semaphore;
semaphore mutex =1;
semaphore empty = n;
semaphore full =0;
void
producer()
}void
consumer()
}
描述允許多個程序同時對資料進行讀操作,但是不允許讀和寫以及寫和寫同時發生。
解決
typedef
int semaphore;
semaphore count_mutex =1;
semaphore data_mutex =1;
int count =0;
void
reader()
}void
writer()
}
管道是通過呼叫 pipe 函式建立的,pipefd[0] 用於讀,pipefd[1] 用於寫。
#include
intpipe
(int pipefd[2]
);
呼叫pipe函式,會在核心中開闢出一塊緩衝區用來進行程序間通訊,這塊緩衝區稱為管道,它有乙個讀端和乙個寫端。
可以通過read(pipefd [0]);或者write(pipefd [1]) 操作管道
通訊步驟
父程序建立管道,pipefd指向管道的兩端
利用fork函式建立出子程序,子程序的pipefd指向同一管道
父程序關閉讀端(pipe[0]),子程序關閉寫端pipe[1],則此時父程序可以往管道中進行寫操作,子程序可以從管道中讀,從而實現了通過管道的程序間通訊。
特點
匿名管道,由於沒有名字,只能用於親緣關係的程序間通訊。為了克服這個缺點,提出了命名管道(fifo)。
命名管道不同於匿名管道之處在於它提供了乙個路徑名與之關聯,以命名管道的檔案形式存在於檔案系統中,這樣,即使與命名管道的建立程序不存在親緣關係的程序,只要可以訪問該路徑,就能夠彼此通過命名管道相互通訊,因此,通過命名管道不相關的程序也能交換資料。
命名管道遵循先進先出原則,對匿名管道及命名管道的讀總是從開始處返回資料,對它們的寫則把資料新增到末尾。命名管道的名字存在於檔案系統中,內容存放在記憶體中。
訊號是linux系統中用於程序間互相通訊或者操作的一種機制,訊號可以在任何時候發給某一程序,而無需知道該程序的狀態。
訊號量本質上是乙個計數器,用於多程序對共享資料物件的讀取,它和管道有所不同,它不以傳送資料為主要目的,它主要是用來保護共享資源,使得資源在乙個時刻只有乙個程序獨享。
借助套接字,要進行通訊的程序,可以在本地單機上進行,也可以跨網路進行。
它可以讓不在同一臺計算機但通過網路連線計算機上的程序進行通訊。
作業系統 程序同步和通訊
死鎖 程序間爭奪資源而相互等待,以至於程序無法執行 要想讓任務中的併發成分能夠併發執行,通常有如下三種方法 併發執行的實現還 依賴作業系統的程序或執行緒機制。作業系統提供程序或執行緒建立 結束和同步等系統呼叫,用來支援併發程式的執行。unix中支援併發執行,與程序相關的幾個系統呼叫 程序之間的制約關...
作業系統 程序同步
臨界資源 critical resouce 臨界區 critical section 硬體同步機制 訊號量機制 訊號量的應用 管程3使用多道批處理系統不僅能有效的改善資源的利用率,還可以顯著地提高系統的吞吐量,但同時會使系統變得更加複雜,會使程式的執行結果存在不確定性。所以必須引入程序同步機制從而保...
作業系統 程序同步
引入程序 提高了資源的利用率和系統的吞吐量 程序的非同步性 會給系統造成混亂 程序同步基本概念 1,兩種形式的制約關係 a 間接相互制約 ab兩程序爭用一台印表機 b 直接相互制約 a程序放資料 緩衝區 b程序從緩衝區取資料 2,臨界資源 硬體臨界資源 軟體臨界資源 印表機,磁帶機,緩衝區。3,臨界...