在學習Erlang程序過程中,總覺得對于進程還是沒有很好的把握。所以自己對于進程的再次提及讓我不得不重溫操作系統這門看似抽象的課程了。但是總覺得如果單一講解進程或許略顯抽象不夠理解,自己就想把某些經驗和知識片段有個很好的系統聯系起來,我想這樣可以讓自己更好加強記憶理解。長話短說,我們進入主題,既然在Erlang的學習中始終圍繞著進程一詞來深入研究,我們就從進程這個話題談起。
進程概念
1. 進程是運行中的程序。這里我們就可以稍微延伸下以便幫助我們記憶理解了:
在這里我們只要抓住“運動”詞匯,就不然發現進程是個動態的實體,與之對應的是我們常說的程序,程序而是一個靜態實體了。(bw:這里突然想到以前對于認識EJB2中也有一個對應的概念就是EntityBean與SessionBean,它們與之對應的就是一個典型的名詞和動詞概念了,哈哈啰嗦了,轉回正題)。那我們會想是什么來體現我們說的進程為一個動態實體呢?立刻會聯系產生接下來的一個特點了。
2. 進程不僅僅是程序代碼,它包含了當前狀態。而這種狀態由兩個方面來表示:
u 程序計數器(program counter)
u cpu中的寄存器(registers)
就是由于進程中有程序計數器—指明下一條要執行的指令而且擁有一組相關的資源。這里又要繼續反問:到底是一個什么資源呢?那就要看下面會講到的PCB的概念了。
3. 進程還包含進程棧(process stack)。
例如:方法參數(method parameters);返回地址與本地變量等
4. 兩個進程可能會關聯到同樣的程序,剛才我們說到了所謂程序是一個靜態實體。顧名思義就是兩個進程允許使用同樣的代碼段,只是在參數不同而已。但是仍然認為這兩個進程是獨立執行的序列。例如:幾個用戶可能會同事運行主程序的不同拷貝一樣。
進程狀態
注:上面就是一個完整的進程狀態圖了。這里沒有必要多說什么了,圖表給了我們一個輪廓。
進程控制塊(PCB)
這里就是我們要講到的進程控制塊了,對于操作系統都是需要通過PCB來表示進程的。有些資料上也稱作為:任務控制塊。對于PCB的整體描述我們還是以圖表的方式來說明(這也是本人最喜歡也覺得最直觀的一種理解方式了):
Pointer(指針)
|
Process state(進程狀態)
|
Process number(進程序列號)
|
Program counter(程序計數器)
|
Register(寄存器)
|
Memory limits(主存中受限說明)
|
List of open files
|
。。。(這里其實還有很多,就不再一一列舉了)
|
PCB描述圖
既然是操作系統都需要通過進程控制塊來調用進程過程,那我們在這里舉例說明下如果有兩個進程結合PCB是如何在CPU之中切換使用進程的。為了更加清晰了解它們的過程,還是老規矩使用一個圖表來展示兩個進程分別為P1,P2怎么運行的。
(這個圖在自己的筆記本上已經用筆畫出來了,可就是找不到一個好的工具,暫時放置在這,待續畫圖了)
進程調度
由于我們目前接觸的其實多半都是以分時系統為主的,其目標也是為了在進程之間頻繁轉換cpu以便由于用戶與運行的程序來交互。
1. 進程進入系統后,都被放在隊列中了,我們稱這個隊列為:作業隊列(也有些書上不是這么稱呼的),所有的進程都在這個其中。
2. 處于就緒進程都被保留在一個列表中——就緒列表
3. 一旦進程獲得了CPU并且執行,就可能發生一下某個事件存在:
u 進程可能發出一個I/O請求,然后被放置在I/O隊列中;
u 進程也可能創建一個新的子進程并且等待它終止;
u 有時候發生一個中斷,導致進程強行從CPU里移除并返回就緒隊列;
調度程序
這里需要了解兩個主要的概念:
1. 長程調度(操作系統調度程序):從一個池中選擇進程并其載入內存中。
注:咋看不是很了解,可能這里需要了解虛擬存儲過程對于這個概念就比較好理解。這里大致說明下。由于過去我們所使用的內存(主存儲器)空間非常有限,在搶占的進程志愿中如果都想放入內存中顯然是不夠科學,而對于我們的后備動力輔助存儲器——磁盤(這里我們說是硬盤,當然也有3.5英寸的小磁盤了,呵呵)來說,就可以充分考慮到使用它來做個過度動態的存儲器。所以這樣一來我們就不需要把一個進程中所有的信息都裝載到內存中,而是在需要是再來考慮換入;而與之相反的就是不需要時就換出了(bw:這里的換入/換出如果比較頻繁也就證明我們的內耗比較嚴重,一般稱作這個叫:抖動現象。大家有時候感興趣的可以觀察我們主機的硬盤燈如果在頻繁的閃動就表示資源在不斷換入換出了,呵呵)。而這也就是虛擬存儲的一個本質過程,當然中間需要通過邏輯轉換表來過度,在這里我們就不再具體復述了。有興趣的可以去看看相關OS方面的書籍。
2. 近程調度(CPU調度程序):從這些進程中選擇就緒進程并為其某個分配CPU
注:說白了這里就是我們的cpu直接通過緩沖通道來調用就緒的程序進入運行。
上下文轉換
前面我們也談到了進程是在CPU中來回切換運行的,既然是一種來回切換運行那勢必需要讓CPU知道我們切換到下一個狀態執行的地址或者說切入點在哪了。這個就是為什么需要一個程序計數器的功效了。那我們把這種來回切換狀態,同時需要保存當前運行進程狀態信息給記錄下來以便下一次能夠定位到的方式稱作是——上下文轉換。
就上面的這樣一次轉換表述在一定程度上需要耗的硬件資源非常大(這里又要我強調下,更多的信息需要你還了解一些計算機組成體系結構了。希望有時間自己也總結一篇關于一個簡單程序在體系中運行過程)。因此上下文轉換在很大程度上就取決于硬件的支持了。
接下來要講到的應該是最核心的也是對以后我們無論是寫程序好還是學習一門新語言好,都需要很好理解的部分了。在這里也盡可能表述清楚。
(待續......)
posted on 2008-12-14 00:25
葉澍成 閱讀(1425)
評論(0) 編輯 收藏 所屬分類:
計算機系統