1. 程式人生 > >2.學習作業系統之程序控制與同步

2.學習作業系統之程序控制與同步

1程序的概念

1.1程式的順序執行

一個程式通常由若干個程式段組成,這些程式段必須按照某種先後次序執行,只有在前一個程式段執行完成後,後面的程式段才能執行,這類計算過程就是程式的順序執行過程。
順序執行的特徵:

  1. 順序性。處理機嚴格按照程式所規定的順序執行;
  2. 封閉性。程式一旦開始執行,其執行結果不受外界因素的影響。因為程式執行時獨佔系統的各種資源,故這些資源的狀態(除初始狀態外)只有本程式才能改變。
  3. 可再現性。只要程式執行時的初始條件和執行環境相同,當程式重複執行時,都將獲得相同的結果。

1.2程式的併發執行

程式的併發執行是指若干個程式(或程式段)同時在系統中執行,這些程式(或程式段)的執行在時間上是重疊的,即一個程式(或程式段)的執行尚未結束,另一個程式(或程式段)的執行已經開始。
併發執行的特徵:

  1. 間斷性。程式併發執行時,由於需要共享資源或為完成同一項任務而相互合作,致使併發程式之間形成了相互制約的關係。這些相互制約的關係將導致併發程式具有“執行-暫停-執行”這種間斷性的活動規律。
  2. 失去封閉性。程式併發執行時,共享系統中的各種資源,這些資源的狀態將由多個程式來改變,這將致使程式的執行失去封閉性。
  3. 不可再現性。程式併發執行時,由於失去了封閉性,也將失去執行結果的可再現性。也就是說,對於同一個程式而言,即使其執行的初始條件相同,但當其重複執行時其執行結果可能不同。

1.3程序的定義與特徵

在多道程式的環境下,程式的併發執行代替了程式的順序執行,程式的活動不再處於封閉系統中,從而出現了許多新的特性。在這種情況下,程式這個靜態概念已經不能如實反映程式活動的動態特徵。為此人們引入了一個新的概念—-程序。

  1. 程序是程式在處理器上的一次執行過程。
  2. 程序是可以和別的計算並行執行的計算
  3. 程序是程式在一個數據集合上執行的過程,是系統進行資源分配和排程的一個獨立單位。
  4. 程序是一個具有一定功能的程式,是關於某個資料集合的一次執行活動。

程序的基本特徵:

  1. 動態性。程序是程式的一次執行過程,因而是動態的。動態性還表現在它因建立而產生,由排程而執行,因得不到資源而暫停執行,最後由撤銷而消亡。
  2. 併發性。引入程序的目的就是為了使程式能與其他程式併發執行,以提高資源利用率。
  3. 獨立性。程序是一個能獨立執行的基本單位,也是系統進行資源分配和排程的獨立單位。
  4. 非同步性。程序以各自獨立的,不可預知的速度向前推進。
  5. 結構特徵。為了描述和記錄程序的執行變化過程,並使之能正確執行,系統應為每個程序配置一個程序控制塊。這樣,從結構上看,每個程序都由程式段,資料段,程序控制塊三部分組成。

1.4程序狀態及其變化

程序執行時的動態特性決定了程序具有多種狀態。事實上,執行中的程序至少具有以下3種基本狀態。
(1)就緒狀態。程序已經獲得了除處理機以外的所有資源,一旦獲得處理機就可以立即執行。
(2)執行狀態。又稱執行狀態。當一個程序獲得必要的資源並正在處理機上執行時,此程序所處的狀態為執行狀態。
(3)阻塞狀態。又稱等待狀態或睡眠狀態。正在執行的程序,由於發生某事件而暫時無法繼續執行(如等待輸入/輸出完成),此時程序所處的狀態為阻塞狀態。
程序並非固定處於某一種狀態,其狀態會隨著自身的執行和外界條件的變化而發生變化。
這裡寫圖片描述

1.5程序控制塊

為了管理和控制程序的執行,系統為每個程序定義了一個數據結構——程序控制塊(Process Control Block,PCB),用於記錄程序的屬性資訊。
當建立一個程序時,系統為該程序建立一個PCB;
當程序執行時,系統通過其PCB瞭解程序的現行狀態資訊,以便對其進行控制和管理;
當程序結束時,系統收回其PCB,該程序隨之消亡。
由此可見,系統根據PCB感知程序的存在,PCB是程序存在的唯一標誌。
不同的作業系統的PCB所包含的內容會有差異,但通常應該包含以下內容:

  1. 程序識別符號。每個程序都必須有唯一的識別符號,以區別於系統內部的其他程序。在程序建立時,由系統為程序分配唯一的程序識別符號。
  2. 程序當前狀態。說明程序的當前狀態,以作為程序排程程式分配CPU的依據。
  3. 程序佇列指標。用於記錄PCB佇列中下一個PCB的地址。為了查詢方便,系統中的PCB可能組織成多個佇列,如就緒佇列、阻塞佇列等。
  4. 程式和資料地址。指出程序的程式和資料所在的內(外)存地址。
  5. 程序優先順序。優先順序用於描述程序使用CPU的緊迫程度,是程序排程的一個依據。優先順序高的程序通常優先獲得CPU。
  6. CPU現場保護區。當程序因某種原因釋放CPU時,要將此時的CPU現場資訊(如指令暫存器、狀態暫存器、通用暫存器等)儲存在該區域中,以便程序重新獲得CPU時能恢復原來的CPU現場資訊而繼續執行。
  7. 通訊資訊。記錄程序在執行過程中與其他程序所發生的資訊交換情況。
  8. 家族關係。指明本程序的父程序、子程序等家族關係資訊(如本程序的子程序與父程序的識別符號)
  9. 佔有資源清單。列出程序所需資源及當前已獲得的資源。

在一個系統中,通常存在許多程序,為了對它們進行有效管理,應該用適當的方法將PCB組織起來。目前常用連結串列或表格將PCB組織起來。

2程序控制

程序控制的職責是對系統中的所有程序實施有效的管理。其功能包括:

  • 程序的建立
  • 程序的撤銷
  • 程序的阻塞與喚醒

這些功能一般由作業系統核心實現。

2.1核心態與使用者態

作業系統核心是基於硬體的第一次軟體擴充。在現代作業系統設計中,往往把一些與硬體緊密相關的模組、執行頻率較高的模組以及一些公用的基本操作安排在靠近硬體的軟體層次中,並使它們常駐記憶體,以提高作業系統的執行效率。
程序控制功能通過執行各種原語來實現。
原語是由若干條機器指令構成的、用以完成特定功能的一段程式。原語在執行期間不可分割,所以原語操作具有原子性。
為了防止作業系統及其關鍵資料(如PCB等)受到使用者程式有意或無意的破壞,通常將處理機的執行狀態分為兩種:

  • 核心態。又稱系統態,是作業系統管理程式執行時機器所處的狀態。它具有較高的許可權,能執行一切指令,訪問所有的暫存器和儲存區。
  • 使用者態。使用者程式執行時機器所處的狀態。它具有較低的許可權,只能執行規定的指令,訪問指定的暫存器和儲存區。

2.2程序建立

一個程序可以建立一個新的程序(子程序)。子程序又可以建立子程序,這樣就能夠構成一個程序間的家族關係。
建立原語的主要功能是為被建立程序形成一個PCB。其主要操作過程是:先向系統申請一個空閒PCB,併為子程序分配必要的資源,然後將子程序的PCB初始化,並將此PCB插入就緒佇列,最後返回一個程序標誌號。

2.3程序撤消

一個程序完成其任務後,應予以撤消,以便及時釋放它所佔用的各類資源。撤消程序可採用兩種撤消策略:一種策略是隻撤消指定程序,另一種策略是撤消指定程序及其子孫程序。
撤消原語的主要功能是收回被撤消程序所佔用的所有資源,並撤消它的程序控制塊。其主要操作過程是:先從PCB集合中找到被撤消程序的PCB,若被撤消程序正處於執行狀態,則立即停止該程序的執行,並設定重新排程標誌,以便程序撤消後將處理機分配給其他程序。對後一種撤消策略,若被撤消程序有子孫程序,還應將該程序的子孫程序予以撤消。對於被撤消程序所佔有的資源,或者歸還給父程序,或者歸還給系統。最後撤消其程序控制塊。

2.4程序阻塞與喚醒

阻塞原語的作用是將程序由執行狀態轉為阻塞狀態,而喚醒原語的作用則是將程序由阻塞狀態變為就緒狀態。
當一個程序期待的某一事件尚未出現時,該程序呼叫阻塞原語將自己阻塞起來。阻塞原語的主要操作過程如下:在阻塞一個程序時,由於該程序正處於執行狀態,故應中斷處理機,儲存該程序的CPU現場,停止執行該程序,然後將該程序插入到相應時間的等待佇列,再從就緒佇列中選擇另外一個程序投入執行。
對處於阻塞狀態的程序,當該程序期待的事件出現時,由發現者程序呼叫喚醒原語將阻塞的程序喚醒,使其進入就緒狀態。喚醒原語的主要操作如下:將被喚醒程序從相應的等待佇列中移出,將狀態改為就緒並插入就緒佇列。
由此可見,一個程序由執行變為阻塞,是這個程序自己呼叫阻塞原語。由阻塞變為就緒,是另一個發現者程序呼叫喚醒原語實現。一般這個發現者程序與被喚醒程序是合作的併發程序。

3執行緒

3.1執行緒的概念

在作業系統中引入程序的目的是為了使多道程式併發執行,以改善資源利用率及提高系統吞吐量。
引入執行緒的目的是,為了減少程式併發執行時所付出的時空開銷,使作業系統具有更好的併發性。
執行緒的幾種描述:

  1. 執行緒是程序內的一個執行單元。
  2. 執行緒是程序內的一個可排程實體。
  3. 執行緒是程式(或程序)中相對獨立的一個控制流序列。
  4. 執行緒是執行的上下文,其含義是執行的現場資料和其他排程所需的資訊。
  5. 執行緒是程序內一個相對獨立的、可排程的執行單元。

執行緒自己基本上不擁有資源,只擁有在執行時必不可少的一點資源(如程式計數器、一組暫存器和棧),但它可以與同屬一個程序的其他執行緒共享程序擁有的全部資源。

3.2執行緒的實現

最自然的方式是由作業系統核心提供執行緒的控制機制,在只有程序概念的作業系統中可由使用者程式利用函式庫提供執行緒的控制機制,還有一種做法是同時在作業系統核心和使用者程式兩個層次上提供執行緒控制機制。
核心級執行緒是指依賴於核心,由作業系統核心完成建立和撤消的執行緒。在支援核心級執行緒的作業系統中,核心維護程序和執行緒的上下文資訊,並完成執行緒切換工作。
使用者級執行緒是指不依賴於作業系統核心,由應用程序利用執行緒庫提供建立、同步、排程和管理執行緒的函式來控制的執行緒。由於使用者級執行緒的維護由應用程序完成,不需要作業系統核心瞭解使用者級執行緒的存在,因此可用於不支援核心級執行緒的多程序作業系統,甚至是單使用者作業系統。
有些作業系統提供了上述兩種方法的組合實現。在這種系統中,核心支援多執行緒的建立、排程與管理;同時,系統中又提供使用執行緒庫的便利,允許使用者應用程式建立、排程和管理使用者級的執行緒。由於同時提供核心執行緒控制機制和使用者執行緒庫,因此可以很好地將核心級執行緒和使用者級執行緒的優點結合起來。

4.互斥與同步的基本概念

併發執行的程序之間存在著不同的相互制約關係,為了協調程序之間的相互制約關係,就需要實現程序的同步。

4.1臨界資源

有A、B兩個程序共享一臺印表機,若讓它們任意使用,則可能發生兩個程序輸出結果交織的情況。解決的辦法是程序A要使用印表機時應先提出申請,一旦系統把印表機分配給程序A,印表機就一直被程序A佔有,程序B若要使用該印表機,就必須等待,直到程序A用完並釋放印表機後,系統才能將該印表機分配給程序B使用。
雖然計算機系統中的多個程序可以共享系統中的各種資源,但是其中許多資源一次只能為一個程序所使用,我們把一次僅允許一個程序使用的資源稱為臨界資源。
在每個程序中,訪問臨界資源的那段程式稱為臨界區

4.2互斥

在作業系統中,當一個程序進入臨界區使用臨界資源時,另一個程序必須等待,當佔用臨界資源的程序退出臨界區後,另一個程序才允許去訪問此臨界資源,我們稱程序之間的這種相互制約關係為互斥。
可以採用軟體方法或同步機構來協調。但是,不論是軟體方法或是同步機構都應該遵循下述準則:
(1)空閒讓進。當沒有程序處於臨界區時,可以允許一個請求進入臨界區的程序立即進入臨界區。
(2)忙則等待。當已有程序進入臨界區時,其他試圖進入臨界區的程序必須等待。
(3)有限等待。對要求訪問臨界資源的程序,應保證能在有限時間內進入臨界區。
(4)讓權等待。當程序不能進入臨界區時,應釋放處理機。

4.3同步概念

一般來說,一個程序相對於另一程序的執行速度是不確定的,但是相互合作的幾個程序需要在某些確定點上協調它們的工作。所謂程序同步是指多個相互合作的程序,在一些關鍵點上可能需要互相等待或互相交換資訊,這種相互制約關係成為程序同步。
例如,系統中有兩個合作的程序,它們共用一個單緩衝去。這兩個程序一個為計算程序,完成對資料的計算工作;另一個為列印程序,負責列印計算結果。當計算程序對資料的計算尚未完成時,計算的結果沒有送入緩衝區,列印程序不能執行列印操作。一旦計算程序把計算結果送入緩衝區後,就應給列印程序傳送一個訊號,列印程序收到訊號後,便可以從緩衝區中取出計算結果進行列印。在列印程序尚未把緩衝區中的計算結果取出列印之前,計算程序也不能把下一次的計算結果送入緩衝區。只有在列印程序取出緩衝區中的內容,給計算程序發出一個訊號後,計算程序才能將下一次的計算結果送入緩衝區。計算程序和列印程序之間就是用這種發訊號的方式實現同步的。

5.利用硬體方法解決互斥問題

用軟體方法解決互斥問題既困難又複雜,目前已很少使用。

5.1 中斷遮蔽方法

 當一個程序正在使用處理機執行它的臨界區程式碼時,要防止其他程序再進入其臨界區訪問的最簡單方法是**禁止一切中斷髮生**,或稱之為遮蔽中斷、關中斷。因為CPU只在發生中斷時引起程序切換,這樣遮蔽中斷就能保證當前執行程序將臨界區程式碼順利地執行完,從而保證了互斥的正確實現,然後再開中斷。
                            ... 
                            關中斷;
                            臨界區;
                            開中斷;
                            ...

採用開/關中斷的方法實現程序互斥既簡單又有效,但同時也存在一些不足,如這種方法限制了處理機交替執行程式的能力,因此執行的效率會明顯下降,對於核心來說,當它在執行更新變數或列表的幾條指令期間將中斷關閉是很方便的,但將關中斷的權利交給使用者程序是很不明智的,若一個程序關中斷後不再開中斷,則系統很可能會因此終止。

5.2硬體指令方法

許多計算機中都提供了專門的硬體指令,完成對一個字或位元組中內容進行檢查和修改或交換兩個子或位元組內容的功能,利用這些指令可以解決臨界區互斥問題。在多道程式環境中,當多個程序共同訪問或修改同一個共享變數時,由於中斷的原因,使得一個程序對一個共享變數的檢查和修改不能作為一個整體來執行,在這兩個動作(通常要2-3條指令來完成)之間,可以插入其他程序對此共享變數的訪問和修改,從而破壞了此共享變數資料的完整性和正確性。現在我們用一條指令來完成檢查和修改兩個功能,這樣中斷就不可能發生,所以不會影響次共享變數資料的完整性。
實現這種功能的硬體指令有兩種:
(1)TS(Test and Set)指令。該指令的功能是讀出指令標誌後把該標誌設定為真。TS指令的功能描述如下:

boolean TS(boolean *lock)
{
    boolean old;
    old=*lock;
    *lock=true;
    return old;
}

為了實現多個程序對臨界資源的互斥訪問,可以為每個臨界資源設定一個共享布林變數lock,表示資源的兩種狀態:true表示正被佔用,false表示空閒,初值為false。在程序訪問臨界資源之前,利用TS檢查和修改lock;若有程序在臨界區,則重複檢查,直到程序退出。利用TS指令實現互斥的演算法描述如下:

while TS(&lock);
程序臨界區程式碼
lock = false;
程序的其他程式碼

(2)Swap指令。該指令的功能是交換兩個字(位元組)的內容。Swap指令的功能描述是:

Swap(boolean *a,boolean *b)
{
    boolean temp;
    temp = *a;
    *a = *b;
    *b = temp;
}

利用Swap指令實現程序互斥時,應為每個臨界資源設定一個共享布林變數lock,初值為false;在每個程序中再設定一個區域性布林變數key,用於與lock交換資訊。在進入臨界區之前利用Swap指令交換lock和key的內容,然後檢查key的狀態;有程序在臨界區時,重複交換和檢查過程,直到程序退出。利用Swap指令實現程序互斥的演算法描述如下:

key = true;
while(k!=false)Swap(&lock,&key);
程序的臨界區程式碼
lock=false;
程序的其他程式碼

6.訊號量

6.1訊號量及P、V操作

訊號量是一個確定的二元組(S、Q),其中S是一個具有非負初值的整型變數,Q是一個初始狀態為空的佇列。整形變數S表示系統中某類資源的數目,當其值大於0時,表示系統中當前可用資源的數目;當其值小於0時,其絕對值表示系統中因請求該類資源而被阻塞的程序數目。除訊號量的初值外,訊號量的值僅能由P操作(wait操作)和V操作(signal操作)改變。
一個訊號量的建立必須經過說明,即應該準確說明S的意義和初值,每個訊號量都有相應的一個佇列,在建立訊號量時,佇列為空。
P、V操作以原語方式實現,訊號量的值僅能由這兩條原語加以改變。P、V操作的定義如下:

  • P操作。P操作記為P(S),其中S為一個訊號量,它執行時主要完成下述動作:

    • S=S-1
    • 若S≥0,則程序繼續執行;否則,S<0,阻塞該程序,並將它插入該訊號量的等待佇列。
  • V操作。V操作記為V(S),S為一個訊號量,它執行時主要完成下述動作:

    • S=S+1
    • 若S>0,則程序繼續執行;若S≤0,從訊號量等待佇列中移出第一個程序,使其變為就緒狀態,並插入就緒佇列,然後再返回原程序繼續執行。

6.2利用訊號量實現互斥

設S為兩個程序P1、P2實現互斥的訊號量,由於每次只允許一個程序進入臨界區,所以S的初始值應該為1(即可用資源數目為1)。只需要把臨界區置於P(S)和V(S)之間,即可以實現兩個程序的互斥。互斥訪問臨界區的描述如下:

main()
{
    semaphore S=1;
    cobegin;
    P1();
    P2();
    coend;
}

P1()
{
    ......
    P(S);
    程序P1的臨界區
    V(S);
    ......
}
P2()
{
    ......
    P(S);
    程序P2的臨界區
    V(S);
    ......
}

6.3利用P、V操作描述前趨關係

若干程序為了完成一個共同任務而併發執行。而這些併發程序之間根據邏輯上的需要,有的操作可以沒有時間上的先後次序,有的操作要有一定的先後次序(也就是說必須要遵循一定的同步規則,只有這樣,併發執行的最後結果才是正確的)。
例如,P1,P2,P3,P4,P5,P6為一組合作程序,其前趨圖如下,試用P,V操作實現這6個程序的同步。
這裡寫圖片描述
任務啟動後P1先執行,當它結束後P2,P3可以開始執行,P2完成後,P4,P5可以開始執行,僅當P3,P4,P5執行完後,P6才能開始執行。為了確保這一執行順序,設定5個同步訊號量f1、f2、f3、f4、f5分別表示P1,P2,P3,P4,P5是否執行完成,其初值均為0。這6個程序的同步描述如下:

semaphore f1=0;
semaphore f2=0;
semaphore f3=0;
semaphore f4=0;
semaphore f5=0;
mian()
{
    cobegin
    P1();
    P2();
    P3();
    P4();
    P5();
    P6();
    coend
}

p1()
{
    ......
    v(f1);
    v(f1);//通知P2、P3可以執行了
}
p2()
{
    P(f1);//等待P1執行完
    ......
    v(f2);
    v(f2);//通知P4,P5可以執行了
}
p3()
{
    p(f1);//等待P1執行完
    ......
    v(f3);//通知P6
}
p4()
{
    p(f2);//等待P2執行完
    ......
    v(f4);//通知P6
}
p5()
{
    p(f2);//等待P2執行完
    ......
    v(f5);//通知P6
}
p6()
{
    p(f3);
    p(f4);
    p(f5);
}

6.4生產者-消費者問題

生產者與消費者共享一個有界緩衝區,生產者向其中投放產品,消費者從中取得產品。生產者消費者問題是許多相互合作程序的一種抽象,例如,在輸入時,輸入程序是生產者,計算程序是消費者;在輸出時,計算程序是生產者,列印程序是消費者。
把一個長度為n的有界緩衝區(n>0)與一群生產者程序P1P2......Pm和一群消費者程序C1,C2......Ck聯絡起來。假定這些生產者和消費者是互相等效的。只要緩衝區未滿,生產者就可以把產品送入緩衝區,類似地,只要緩衝區未空,消費者就可以從緩衝區取走產品。生產者和消費者的同步關係將禁止生產者向滿的緩衝區中輸送產品,也禁止消費者從空的緩衝區中提取產品。

為了解決生產者-消費者問題,應該設定兩個同步訊號量,一個說明空緩衝單元的數目,用empty表示,其初值為有界緩衝區的大小n,另一個說明滿緩衝單元的數目,用full表示,其初值為0.
本例中生產者程序P1P2......Pm和消費者程序C1,C2......Ck,在執行生產和消費活動中要對有界緩衝區進行操作,而有界緩衝區是一個臨界資源,必須互斥使用,因此,另外還需要設定一個互斥訊號量mutex,其初值為1.生產者-消費者問題的同步描述如下:

semaphore full = 0;
semaphore empty = n;
semaphore mutex = 1;
main()
{   
    cobegin
        producer();
        consumer();
    coend
}
producer()
{   
    while(true)
    {
        生產一個產品
        p(empty);
        p(mutex);
        將一個產品送入緩衝區;
        v(mutex);
        v(full);
    }
}

consumer()
{   
    while(true)
    {
        p(full);
        p(mutex);
        從緩衝區取出一個產品
        v(mutex);
        v(empty);
        消費一個產品
    }
}

7.管程

管程定義了一個數據結構和能為併發程序所執行的一組操作,這組操作能使程序同步和改變管程中的資料。
管程由三部分組成:

  1. 區域性於管程的共享變數說明
  2. 對該資料結構進行操作的一組過程
  3. 對區域性於管程的資料設定初始值的語句

管程有以下基本特性:

  1. 區域性於管程的資料只能被區域性於管程內的過程所訪問
  2. 一個程序只有通過呼叫管程內的過程才能進入管程訪問共享資料
  3. 每次僅允許一個程序在管程內執行某個內部過程。即程序互斥地通過呼叫內部過程進入管程。當某程序在管程內執行時,其他想進入管程的程序必須等待。

因為管程是一個語言成分,所以管程的互斥訪問完全由編譯程式在編譯時自動新增,無需程式設計師關注,而且保證正確。

為了實現程序間的同步,管程還必須包含若干用於同步的設施:

  1. 侷限於管程並僅能從管程內進行訪問的若干條件變數,用於區別各種不同的等待原因。
  2. 在條件變數上進行操作的兩個函式過程Cwait和Csignal。Cwait(c)將呼叫此函式的程序阻塞在與該條件變數相關的佇列中,並使管程成為可用,即允許其他程序進入管程。Csignal(c)喚醒在該條件變數上阻塞的程序,如果有多個這樣的程序則選擇其中的一個程序喚醒,如果該條件變數上沒有阻塞程序,則什麼也不做。

8.程序通訊

程序間的資訊交換稱為程序通訊。
前面的互斥與同步就是一種程序間的通訊方式。由於程序互斥與同步交換的資訊量較少且效率較低,因此稱這兩種通訊方式為低階程序通訊方式,相應地也將P,V原語稱為兩條低階程序通訊原語。
高階通訊方式是指程序之間以較高的效率傳送大量資料。目前高階程序通訊方式分為三大類:

  • 共享儲存器系統
    為了傳輸大量資料,在儲存器中劃出一塊共享儲存區,諸程序可以通過對共享儲存區進行讀或寫來實現通訊。程序在通訊前,應向系統申請建立一個共享儲存區,並指定該共享儲存區的關鍵字;若該共享儲存區已經建立,則將該共享儲存區的描述符返回給申請者。然後,申請者把獲得的共享儲存區附接到本程序的地址空間上;這樣,程序便可以像讀寫普通儲存器一樣地讀寫共享儲存區。
  • 訊息傳遞系統
    在訊息傳遞系統中,程序間的資料交換以訊息為單位,程式設計師直接利用系統提供的一組通訊命令(原語)來實現通訊。作業系統隱藏了通訊的實現細節,大大簡化了通訊程式編制的複雜性,因而獲得了廣泛的應用。
    訊息傳遞系統因其實現方式不同,又可以分為:

    • 直接通訊方式。傳送程序直接把訊息傳送給接收程序,並將它掛在接收程序的訊息緩衝佇列上,接收程序從訊息緩衝佇列中取得訊息。
    • 間接通訊方式。傳送程序把訊息傳送到某個中間實體中,接收程序從中間實體中取得訊息。這種中間實體一般稱為信箱,故這種通訊方式也稱為信箱通訊方式。
  • 管道通訊系統
    管道是用於連線讀程序和寫程序以實現它們之間通訊的共享檔案,向管道提供輸入的傳送進(即寫程序)以字元流形式將大量的資料送入管道,而接收管道輸出的接收程序(即讀程序)可以從管道中接收資料。