第3章 認識處理元
基本觀念 處理元(process)也有人翻譯成行程,是作業系統裡頭執行當中的程式 通常使用者在電腦的作業系統中可以下指令或是執行各種程式,結果就是產生一些處理元 假如作業系統中有許多使用者,則可能產生的處理元的數量就非常多,可是CPU的處理能力有限,所以作業系統必須安排好處理元的執行先後順序,這就是處理元的排程(process scheduling)
電腦系統中正在執行的程式 微軟Windows作業系統:透過[工作管理員]可以打開視窗,裡頭的處理程序就是我們這裡講的處理元。 UNIX類型的作業系統:可以使用ps指令,顯示目前執行當中的處理元。
記憶體中處理元的內容結構
處理元的內涵 執行的目標程式碼(object code)。 程式執行時所用到的資料。 程式執行時所需要的資源(resources)。 處理元執行時的狀態(status of execution)。
處理元的內涵與所處的環境
處理元描述資料(process descriptor) 處理元上回暫停(suspend)時,處理器暫存器內儲存的內容。 處理元在處理器內的狀態(即processor state)。 位址空間對應(address space mapping)的細節。 處理元使用的記憶體狀態(memory state)。 處理元堆疊的指標(stack pointer)。 已配置給處理元的資源。 處理元所需要的資源。
處理元的狀態圖
從作業系統的啟動程序觀察 處理元的衍生過程 電腦開機以後,CPU會開始從記憶體中所謂的開機始點(bootstrap entry point) ,擷取指令執行。這是系統開始執行的第一個程式,裡頭包括了一些最基本的作業,最後的目標當然是建立起作業系統執行的環境 一旦作業系統開始載入執行,馬上會控制電腦系統的硬體資源,同時產生所需要的資料結構與硬體設備的狀態(device state) 作業系統的啟動程序決定於第一個執行的處理元,這也是作業系統執行前唯一執行中的處理元
UNIX的啟動程序 UNIX系統開始是以單一使用者(single user)與多處理元(multiple process)的模式執行 單一使用者指superuser,UNIX系統的啟動程序中有一部分是執行/etc/rc檔案,rc代表run control,裡頭含有shell commands,將一些要先執行的程式執行起來, 通常rc執行的工作與系統的組態(configuration)有關
傳統的UNIX系統 傳統的UNIX系統供多人登入使用, 通常伺服器的每個序列埠(serial port)都會執行一個對應的getty程式 getty會呼叫login程式執行,讓使用者登入 使用者登入之後,所用的就是shell介面,使用者執行的shell有個別的資料與堆疊,使用者登出(logout)之後,shell結束,回到login程式,等待下一個使用者登入
系統呼叫(system call) 系統呼叫是作業系統和使用者程式(user program)之間的介面 不同的作業系統所提供的系統呼叫也不太一樣,但是觀念都十分類似 假如從電腦開始啟動的時候想起,我們可以發現最初執行的處理元不必太複雜,只要能把作業系統帶起來就行了 作業系統本身的功能複雜,有許多功能是借著系統呼叫再產生的,如此一來,系統就能在已有的基礎上發展出來
常見的幾種系統呼叫的類型 處理元管理的系統呼叫。 傳訊(Signaling) 的系統呼叫。 檔案管理的系統呼叫。 目錄管理的系統呼叫。 保護(protection) 的系統呼叫。 時間管理的系統呼叫。
UNIX中一些相關的系統呼叫
CPU執行的模式 Kernel mode。 User mode。
處理元在執行時被懸置(suspend) 的原因 為了空出記憶體空間。 作業系統認定該處理元有問題。 使用者請求懸置處理元。 處理元周期式地執行。 父處理元的請求。
作業系統中可能用到的控制表格
處理元的屬性 處理元的辨識資訊(process identification) 。 處理元的狀態(process state) 。 處理元的控制資訊(process control information) 。
程式獲取資料的方式
各種常見的應用程式介面
程式間交換資訊的方法
用pipe做程序間通訊(IPC) 的方法
處理元與執行緒 : 觀念的釐清 處理元(process)是一種電腦要完成的工作(task) 處理元在作業系統中是指執行中的程式,而且具有兩個明顯的特徵 : 處理元可以擁有資源,處理元要經由作業系統排程執行 從某些角度來看,這兩種特徵似乎是各自獨立的,作業系統可以分別處理,這種想法衍生出執行緒(thread)的觀念 執行緒算是一種輕量級的處理元(lightweight process) ,是執行分派(dispatching)的單位,處理元則是資源擁有的單位
處理元與執行緒的關係
執行緒的特徵 執行的狀態(execution state) 。 在沒有執行時與執行緒相關的資訊(thread context) 。 執行堆疊(execution stack) 。 每個執行緒存放區域變數(local variables)的靜態空間(static storage) 。 對於所屬處理元的記憶體與資源的使用要和其他的執行緒共享。
處理元的模型(process model)
執行緒的使用有什麼好處呢? 執行緒的產生需要的時間比處理元短,終止執行緒所需要的時間也比處理元短。 在同一個處理元中的執行緒之間切換(switch)很快。 不同處理元之間的溝通常需要作業系統核心(kernel)的參與,同一個處理元的執行緒之間的溝通就不需要讓kernel插手了,因此效率比較高。
執行緒的基本作業 產生(spawn) 阻絕(block) 阻絕解除(unblock) 完成(finish)
運用在RPC中的執行緒觀念
執行緒的種類 在執行緒的實作上,有兩個比較大的執行緒類別,即使用者層次的執行緒(user-level threads)與核心層次的執行緒(kernel-level threads) 在單純的使用者執行緒的環境中,執行緒的管理由應用本身負責,作業系統核心可以完全不管 應用系統使用threads library來處理跟執行緒相關的工作
執行緒的種類
Windows 2000處理元的主要特徵 Windows 2000的處理元以物件(objects)來表示。 一個處理元可能包含一個或多個執行緒。 處理元物件與執行緒物件。
Linux對於執行緒與處理元的管理 Linux中的處理元是以一個叫做task_struct的資料結構來表示的,系統記錄一個task表格,有指標指向目前定義的task_struct資料結構 Linux的處理元有一個比較特殊的Zombie狀態,這是當處理元已經終止(terminated) ,但是task_structure仍然存在於process table中 Linux沒有使用另外的結構來表示執行緒,所以Linux基本上沒有區分處理元與執行緒的觀念