程序間通訊(ipc,interprocess communication)是一組程式設計介面,讓程式設計師能夠協調不同的程序,使之能在乙個作業系統裡同時執行,並相互傳遞、交換資訊。這使得乙個程式能夠在同一時間裡處理許多使用者的要求。因為即使只有乙個使用者發出要求,也可能導致乙個作業系統中多個程序的執行,程序之間必須互相通話。ipc介面就提供了這種可能性。每個ipc方法均有它自己的優點和侷限性,一般,對於單個程式而言使用所有的ipc方法是不常見的。
資料傳輸:乙個程序需要將它的資料傳送給另乙個程序,傳送的資料量在乙個位元組到幾兆位元組之間。
共享資料:多個程序想要操作共享資料,乙個程序對共享資料的修改,別的程序應該立刻看到。
通知事件:乙個程序需要向另乙個或一組程序傳送訊息,通知它(它們)發生了某種事件(如程序終止時要通知父程序)。
資源共享:多個程序之間共享同樣的資源。為了作到這一點,需要核心提供鎖和同步機制。
程序控制:有些程序希望完全控制另乙個程序的執行(如debug程序),此時控制程序希望能夠攔截另乙個程序的所有陷入和異常,並能夠及時知道它的狀態改變。
程序間的通訊則不同,它的資料空間的獨立性決定了它的通訊相對比較複雜,需要通過作業系統。通訊機制主要有:管道、有名管道、訊息佇列、訊號量、共享空間、訊號、套接字(socket)。
它傳遞資料是單向性的,只能從一方流向另一方,也就是一種半雙工的通訊方式;只用於有親緣關係的程序間的通訊,親緣關係也就是 父子程序或兄弟程序;沒有名字並且大小受限,傳輸的是無格式的流,所以兩程序通訊時必須約定好資料通訊的格式。管道它就像乙個特殊的檔案,但這個檔案之存在於記憶體中,在建立管道時,系統為管道分配了乙個頁面作為資料緩衝區,程序對這個資料緩衝區進行讀寫,以此來完成通訊。其中乙個進 程只能讀乙個只能寫,所以叫半雙工通訊,為什麼乙個只能讀乙個只能寫呢?因為寫程序是在緩衝區的末尾寫入,讀程序是在緩衝區的頭部讀取,他們各自的資料結構不同,所以功能不同。
有名管道也是半雙工的通訊方式,但是它允許無親緣關係程序間的通訊。
例項:將另乙個程式當做乙個新的程序在當前程式程序中啟動,則它算是當前程式的子程序,這種方式我們成為高階管道方式。
訊息佇列是由訊息的鍊錶,存放在核心中並由訊息佇列識別符號標識。訊息佇列克服了訊號傳遞資訊少、管道只能承載無格式位元組流以及緩衝區大小受限等缺點。
訊號量是乙個計數器,可以用來控制多個程序對共享資源的訪問。它常作為一種鎖機制,防止某程序正在訪問共享資源時,其他程序也訪問該資源。因此,主要作為程序間以及同一程序內不同執行緒之間的同步手段。
訊號是一種比較複雜的通訊方式,用於通知接收程序某個事件已經發生。
共享記憶體就是對映一段能被其他程序所訪問的記憶體,這段共享記憶體由乙個程序建立,但多個程序都可以訪問。共享記憶體是最快的 ipc 方式,它是針對其他程序間通訊方式執行效率低而專門設計的。它往往與其他通訊機制,如訊號兩,配合使用,來實現程序間的同步和通訊。
套接字也是一種程序間通訊機制,與其他通訊機制不同的是,它可用於不同機器間的程序通訊。
由於多執行緒共享位址空間和資料空間,所以多個執行緒間的通訊是乙個執行緒的資料可以直接提供給其他執行緒使用,而不必通過作業系統。所以執行緒間通訊和同步的方式主要有鎖機制(包括互斥鎖、條件變數、讀寫鎖)、訊號機制(signal)、訊號量機制(semaphore)
程序間通訊和執行緒間通訊總結
死鎖的四個必要條件 資源有限 持有等待 不能搶占 迴圈等待條件 死鎖的應對方式 消除獨佔條件 即將資源無限增加或者變為共享 消除保持和請求條件 即乙個程序一次請求其所需要的所有資源,而不是請求一點資源做一點事情,但是這樣太過浪費。消除非搶占條件 即允許對資源進行搶占 消除迴圈等待條件 即產生迴圈等待...
程序間通訊ipc 執行緒間通訊
程序間通訊 ipc,inter process communication 指至少兩個程序或執行緒間傳送資料或訊號的一些技術或方法。程序是計算機系統分配資源的最小單位 嚴格說來是執行緒 每個程序都有自己的一部分獨立的系統資源,彼此是隔離的。為了能使不同的程序互相訪問資源並進行協調工作,才有了程序間通...
程序間通訊方式和執行緒間通訊方式
1.管道 pipe 管道是一種半雙工的通訊方式,資料只能單向流動,而且只能在具有親緣關係的程序間使用。程序的親緣關係通常是指父子程序關係。2.訊號量 semophore 訊號量是乙個計數器,可以用來控制多個程序對共享資源的訪問。它常作為一種鎖機制,防止某程序正在訪問共享資源時,其他程序也訪問該資源。...