行程(Process)的基本概念
- 工作方面--批次系統(Batch System)。
- 使用者和任務方面--分時系統(Time shared systems)。
- 所謂的行程,就是程式在執行;而行程執行時,需要依照程式的順序來執行。
- 行程的組成部分可分為4項:
- 行程的程式碼,稱作為text section。
- 一些數據會暫時儲存在Stack裡面,執行完畢會刪除,如:Function parameters、return addresses等。
- 在數據中,包含了global variables。
- 在執行期間,有些動態的數據會被分配存在Heap裡面。
- 程式(Program)是「主動」儲存在硬碟裡;行程(Process)是「被動」儲存在硬碟中。
- 當在執行的檔案載入記憶體時,程式就成為行程。
- 如多個使用者可以同時一起使用相同的程式。
行程狀態
- new:新增行程。
- running:依照指令執行。
- wating:當有其他事件發生,屬於優先順序時,會進入暫停等待。
- ready:已經就緒,等待分配進入處理器。
- terminated:行程結束。
行程控制區塊(Process Control Block,PCB)
- PCB裡內含行程的基本資料,以及連結著每一個行程,所以也稱作為「任務控制區塊(task control block)」。
- 行程狀態(Process state):running、waiting等。
- 行程計數器(Process counter):表示下個指令位置在哪裡。
- CPU暫存器(CPU registers):當行程被插斷後,儲存在CPU暫存器的內容。
- CPU排程(CPU scheduling):選擇優先順序的行程。
- 記憶體(Memory):管理分配給行程的記憶體資料、打開了那些檔案。
- 紀錄(Accounting):紀錄CPU使用狀態、時間等。
- I/O狀態敘述(I/O status information):打開文件列表,將I/O裝置分配給行程。
執行緒(Threads)
- 每一行程都擁有單一執行緒去執行。
- 每一行程擁有多個程式計數器。
- 在執行當下,可以多個位置一起執行(平行執行)。
- 須有行程詳細的細節儲存,多個程式計數器儲存在PCB裡。
行程排程(Process Schedular)
- 目的:讓CPU使用效能能達到最大化。
- 選擇可執行、可使用的行程給CPU執行。
- 包含行程排程佇列:
- 工作佇列(Job Queue):組合所有行程到系統中。
- 就緒佇列(Ready Queue):組合所有行程在記憶體中,讓它們等待、就緒去執行。
- 裝置佇列(Device Queue):組合所有行程等待I/O裝置。
- 行程可移到多個佇列中。
排程(Sedular)
- 短期佇列(Short-term Schedular):
- 選擇在記憶體內的那些行程去控制CPU。
- 常使用,所以速度迅速(milliseconds)。
- 長期佇列(Long-term Schedular):
- 決定要把哪些行程放入記憶體裡。
- 決定要把行程搬離記憶體獲搬入記憶體。
- 決定多少行程在記憶體中。
4.不常使用,速度較慢(seconds,minutes)。
- 安排CPU的時間:
1.I/O-bound process:傾向於處理輸出入作業,如撥放影片。此時I/O週期長於CPU週期。
2.CPU-bond process:傾向於處理大量計算的工作,如何核電廠的模擬。此時CPU週期長於I/O週期。
中期排程(Medium Term Scheduling)
- swapping:當出現特定狀況或系統負荷量過大時,會另一部分的行程從記憶體中移出,降低負荷量。當一部分程式完成時,會再載入之前移出的行程,使其繼續進行工作。
移動系統中的多任務處理
- 某些移動系統中,允許只有一個行程執行,其餘的先暫停。
- 使用者介面會限制iOS提供:
- 單一前景行程:透過UI控制。
- 多個背景行程:在記憶體中執行,但不會顯示出來且有所限制。
- Andorid在執行前景和背景時,會有些許的限制:
- 背景行程使用Service去執行任務。
- 即便背景行程暫停,Service也可以持續執行。
- Service沒有UI只有使用少許記憶體。
執行環境改變
- 當CPU要改變環境時,會先儲存舊行程的狀態,再進行環境改變,將舊行程狀態載入新行程中。
- 由PCB表現行程的環境。
- 每個CPU可以暫存好多環境,當要使用時無須重新下載,直接使用可以使環境改變加快。
- 執行環境改變對系統來說是一個過大的負荷量,所以如果OS設計繁雜,將會使系統效能下降、耗時、CPU使用率降低。
行程新增
- 父行程會新增多個子行程,而這些行程將會成為一個樹狀結構。
- 透過process identifier(pid)辨識與管理行程。
- 父、子行程間的資源分配方式:
- 父、子行程間共享資源。
- 子行程共享父行程的部分資源。
3.父、子行程間不共享資源。
- 父行程新增重複子行程。
- 子行程的程式會下載進入位置空間。
- 使用系統呼叫--fork( )新增行程。
- 在使用fork( )之後,會使用exec( )方法,使新程式取代行程記憶體。
行程結束
- 當行程執行到最後一句時,會透過系統呼叫-exit( )將所得資源還回去,並告知OS行程已完成。
- 子行程會透過wait( )方式,將數據狀態傳回父行程。
- 父行程會透過系統呼叫-abort( )結束子行程,原因有以下這些:
- 避免子行程使用過多資源。
- 避免子行程無法自己結束,將會形成「孤兒」。
- 有些OS會不允許當父行程結束時,子行程未結束,所以會讓所有子行程都結束。
- 父行程可能會等待子行程使用wait( ),傳回狀態訊息;當狀態訊息回傳之後,行程的pid會終止。
- 當子行程結束,卻發現沒有父行程在等待,此子行程會變成「殭屍」(zombie)。
- 當父行程結束卻沒有使用wait( )等待子行程,此時,子行程會變成「孤兒」(orphan)。
多行程架構-Chrome Browser
- 當網頁當機時,瀏覽器可能會掛著或著崩潰。
- Browser行程管理UI、硬碟、I/O網路。
- Renderer行程給予網頁處理HTML、Java。