1. 程式人生 > >作業系統基礎(二)程序通訊與程序同步

作業系統基礎(二)程序通訊與程序同步

多個程序可以共享系統中的各種資源,但是許多資源一次只能為一個程序使用,我們把一次僅能允許一個程序使用的資源稱為臨界資源,如印表機等。

對臨界資源的訪問,必須互斥的進行,在每個程序中,訪問臨界資源的那段程式碼稱為臨界區(critical section)

程序通訊與同步有如下一些目的:

1)資料傳輸:一個程序需要將它的資料傳送給另一個程序;

2)共享資料:多個程序想要操作共享資料,一個程序對共享資料的修改,別的程序應該立刻看到;

3)通知事件:一個程序需要向另一個或一組程序傳送訊息,通知它傳送的某種事情(如程序終止時需要通知父程序)

4)資源共享:多個程序之間共享同樣的資源。需要核心提供鎖和同步機制

5)程序控制:有些程序希望完全控制另一個程序的執行,此時控制程序想能夠攔截另一個程序所有陷入和異常,並能夠及時知道它的狀態改變;

Linux下程序間通訊的集中主要手段:

1)管道(Pipe)及有名管道(named pipe):管道可用於具有親緣關係程序間的通訊,有名管道客服了沒有名字的限制,因此,除了具有管道所具有的功能外,還能允許無親緣關係程序間的通訊;

2)訊號(Signal):訊號是比較複雜的通訊方式,用於通知接受程序有某種時間發生,除了用於程序間通訊外,程序還可以傳送訊號給程序本身;Linux除了支援UNIX早期訊號函式sigal外,還支援語義符合Posix.1標準的訊號函式sigaction

3)Message(訊息佇列):訊息佇列是訊息的連結串列,包括Posix訊息佇列 System V訊息佇列。有足夠許可權的程序可以向佇列中新增訊息,被賦予讀許可權的程序則可以讀走佇列中的訊息。訊息佇列客服了訊號承載資訊量少,管道只能承載無格式位元組流以及緩衝區大小搜限制等缺點。

4)共享記憶體:使多個程序可以訪問同一塊記憶體空間,是最快的可用IPC形式。是針對其他通訊機制執行效率較低而設計的。往往與其他通訊機制,如訊號量結合使用,來達到程序間的同步及互斥;

5)訊號量(semaphore):作為程序間以及同一程序不同執行緒之間的同步手段;

6)套介面(Socket):更為一般的程序間通訊機制,可用於不同機器之間的程序間通訊。起初是由UNIX系統的BSD分支開發出來的,但現在一般可以移植到其他類UNIX系統上:LINUX和SystemV的變種都支援套接字;

Linux 執行緒間通訊:

互斥體(互斥量),訊號量,條件變數;

windows程序間通訊:

管道、共享記憶體、訊息佇列、訊號量、socket;

windowss執行緒間通訊:

臨界區、互斥量、訊號量、時間;