進程的創建
進程本身是一個動態的實體,所以它本身在運行期間也通過創建進程系統調用,并且可以創建多個新進程,對于這句話我同樣使用圖解的方式來做個簡單說明:
當一個進程創建一個新進程時,會存在兩種可能的方式執行:
1. 父進程(繼續執行)和子進程并行的執行;
2. 父進程等待部分或者全部子進程終止執行;
而新進程的地址空間也存在兩種可能:
1. 子進程是父進程的一個COPY了;
2. 載入一個程序來運行;
到這里就有點感覺Erlang的進程思想端倪了(開始我咋看感覺有點象,但是越深入后就覺得確實就是到這個思想才形成了Erlang程序語言的意義本質,個人揣度啊,哈哈)既然有那么點思想的感覺,那我們就開始進入探討階段了。也正是下面即將要講到的問題才印證一句話:技術的本質還存留在簡單事物之上(個人總結,哈哈)。
進程間通信
進程間通信有兩種本質的方式:
1. 共享緩沖區提供通信;
2. 消息傳遞;
大家有沒有認真看到上面的四個字“消息傳遞”,對沒錯就是消息傳遞!那這里我就感覺是否就是這里和Erlang的語言所談到的消息傳遞呢?盡管一個處于操作系統級別,而另一處于語言級別,但是初看給我的感覺是原理是否一致呢?呵呵,那就讓我們來看看OS級別的進程間通信本質起了。
消息傳遞系統
消息系統的功能是允許進程與其他進程之間通訊不必借助共享數據,他們各自獨立。而這里要說到一個概念,什么是IPC?
如果我們先不看它定義,而了解具體做法,看是一個什么效果。
到這里為止是不是感覺又和我們說的Erlang非常類似呢?真的沒錯。。。那就繼續往下看看它到底如何而做了。有以下幾種方法實現和Send/Receive操作的方法:
u 直接或者間接通信
u 對稱或不對稱通信
u 自動或手動緩沖
u 發送copy或者引用
u 定長消息或者變長消息
為了更好的說明上面各自的特征是如何引入和體現的,使用兩個典型的進程p,q作為兩個進程之間的通訊來加以演示。
直接通信:
這里就是兩個非常赤裸的而且是非常利索的通信了:
u send(P,message) P發送一個消息給進程Q;
u receive(Q,message) 從進程Q中接收一個消息
特點:
1. 每對需要通信的進程之間自動建立一條鏈路,進程只需要知道彼此的進程標識符(Pid);
2. 一個連接就只連接到這兩個進程;
因此這種機制在尋址上是對稱的;發送者與接收者進程都必須要指明通信一方。不過這里要談到它的一種特例:發送者需要知道接收者,但是接收者不需要知道發送者,其原語定義為:
Send(P,Message) 發送一個消息給P;
Receive(id,Message)從任意進程中接受一個消息;
由于通信是一種交互行為,所以一般情況來說我們有發送自然希望存在一個回復的交互動作,而像這種特例就無法知道它的這種情形,因此這種情況也是我們不希望所見的。
間接通信
間接通信中消息發送和接收則是通過郵箱(實際中更多的是端口方式,這里為了更好理解我們比作郵箱方式)進行的。若把郵箱看成一個對象,進程就可以把消息郵寄(放置)在其中,顯而易見既然能夠放入自然也就可以從郵箱中取出了。而每一個郵箱都有一個唯一的地址(標識符),進程可以通過不同的郵箱和其它進程通信了。兩個進程只有共享一個郵箱才可以進程通信。因此基本構建和原語定義圖示如下:
Send(A,M):發送消息(Message)給郵箱A;
Receive(A,M):從郵箱A接收到消息(M);
特點:
1. 只有在兩個進程間有一個共享郵件箱下才能兩者建立一個連接;
2. 一條鏈路可以連接兩個或者更多的進程;
3. 每對通信進程之間可以同時存在多個不同的鏈路,而且每條鏈路對應一個郵箱;
那我們來看看直接通信和間接通信最大的區別是什么?沒錯,其實間接通信存在中間一個共享的郵箱,而正是這種方式才在以后的應用中得到廣泛利用。這里就聯想到Erlang語法的:Pid!M是否感覺很相似(注:M消息通知標示符為Pid的進程操作事件,而且具體在接受中也存在得到一個receive來獲取消化了),在我看來它就是典型使用到了這個原理機制。這里來看一道例題:假如有兩個進程P1,P2和P3都存在共享郵箱A,而且P2與P3正是從A中接收。那么誰 接收到P1發送來的消息呢?圖示:
這里我們就需要具體討論問題的實質了:
對照上面說講到的間接通信特點,我們知道一條鏈路最多連接兩個進程,同時最多允許任意選擇進程來接收消息(現在這個例子中只存在P2,P3),所以他們兩者只允許單獨接收消息而不是同時接收消息。至于消息會發送給誰,這就需要系統本身來確定接收者了。因此,一個郵箱可能為一個進程或者操作系統所有,不難看出這個例子存在以下情況:
一旦擁有郵箱
A的
進程終止時,郵箱也就同時要消失,隨后向該郵箱發送消息的進程就會被告知郵箱不存在。這里需要強調的是作為操作系統本身來說擁有一個郵箱是獨立的不依賴于任何進程。所以操作系統有必要提供一種機制允許一個進程來專門做這個工作了,那是什么工作呢?具體有以下特征:
u 創建一個新郵箱;
u 通過這個郵箱發送和接收信息;
u 刪除一個郵箱;
接下來就開始單獨討論所謂的這個“郵箱”的單獨機制能夠引發的一些線索了。
進程同步
通過消息傳送來進程通信,這個是它本質所在。但是消息傳送可能有阻塞或者無阻塞——同步和異步。所以這里就存在對于發送者和接收者的阻塞或無阻塞現象的討論了,對于他們有一下特點:
1. 發送進程阻塞:發送進程被阻塞,直到接收進程接收消息;
2. 發送進程無阻塞:發送進程發送消息并且立刻恢復執行;
3. 接收進程阻塞:接收進程被阻塞,知道一個消息為有效;
4. 接收進程無阻塞:接收進程獲取一個有效或空消息;
以上的方式還可以組合形成。
既然有阻塞和無阻塞現象,那立刻可以聯想到我們的郵箱擴展成一種管道方式呢?沒錯這里就需要講解下面的定義形成。
緩沖
這里只想對于三個定義了解:
u 零長度:無緩沖消息系統;
u 限定長度:
自動緩沖
u 無限長度:
這里單獨把限定長度和無限長度提取出來定義:
限定長度:消息隊列中存在N個消息,發送者在發送未滿的隊列中無阻塞。一旦隊列滿則阻塞直到出現空閑空間。
無線長度:消息隊列有無限個消息,也不會阻塞發送者。
下面我們就要通過這些概念擴展到程序開發中經常會遇到的實例。
(待續。。。。。。)
posted on 2008-12-14 12:42
葉澍成 閱讀(1218)
評論(0) 編輯 收藏 所屬分類:
計算機系統