450 likes | 704 Views
Operating System Principles 作業系統原理 Chapter 3 行程. 著者 ABRAHAM SILBERSCHATZ Yale University PETER BAER GALVIN Corporate Technologies GREG GAGNE Westminster College 譯者 駱詩軒 駱詩富 鄧俊修. Chapter 3 行程觀念. 3.1 概觀 3.2 行程排班 3.3 行程的操作 3.4 行程間通訊 3.5 lPC系統的範例 3.6 客戶/伺服器的通信.
E N D
Operating System Principles作業系統原理Chapter 3 行程 著者 ABRAHAM SILBERSCHATZ Yale University PETER BAER GALVIN Corporate Technologies GREG GAGNE Westminster College 譯者 駱詩軒 駱詩富 鄧俊修
Chapter 3 行程觀念 • 3.1 概觀 • 3.2 行程排班 • 3.3 行程的操作 • 3.4 行程間通訊 • 3.5 lPC系統的範例 • 3.6 客戶/伺服器的通信
Chapter 3 行程觀念 • 早期的電腦系統在一段時間內只允許一個程式執行 • 這個程式對於系統有完全控制權 • 今日電腦系統允許許多程式載入記憶體中,並且同時地執行 • 系統必須對不同程式做更嚴謹的控制以及更精確的區分。 • 這項需求產生行程的觀念,行程就是一個執行的程式。現在的分時系統中,行程是基本的工作單元。 • 作業系統是由一組行程組成 • 執行系統程式碼的作業系統行程 • 執行使用者程式碼的使用者行程
3.1 概觀 • 討論作業系統的一個問題就是該如何稱呼CPU所有的運作項目。整批式系統執行工作 (jobs),而分時系統其有使用者程式(user programs),(或稱為任務,task)。 • 即使在單一使用者系統 (如Microsoft Windows)使用者仍可同時執行數個程式:一個文書處理程式、網頁瀏覽器、email套件程式。就算是使用者只能一次執行一個程式,作業系統仍須支援其內部一些工作,比方說是記憶體管理。從各方面看來,這些所有的事情都類似,所以我們就稱之為行程。
3.1.1 行程 • 行程指的是正在執行的程式。行程不只是程式碼 (有時也稱為本文區,text section)而已。它還包含代表目前運作的程式計數器 (Program counter)數值和處理器的暫存器內容。 • 一般而言,行程還包括存放暫用資料(譬如:副程式的參數、返回位址,以及暫時性變數)的行程堆疊 (stack),以及包含整體變數的資料區間(data section)。行程也包含堆積(heap),所謂堆積就是在行程執行期間動態配置的記憶體,行程記憶體結構如圖3.1。
3.1.1 行程 • 程式本身並非行程,是一向被動 (passive) 的個體 • 行程卻是一項主動的個體,具備程式計數器 (program counter) 來指明下一個執行的指令,以及一組相關的資源 • 雖然兩項行程可能執行同一個相同程式,但是他們仍然被視為兩組不相關的執行程序。 • 幾個使用者在執行同一個mail程式 (這個程式會拷貝好幾份) • 同一個使用者執行多份網頁瀏覽程式 (這個程式也會拷貝好幾份) • 雖然這些行程的本文區相同,但資料堆積、堆疊區域卻不相同。
3.1.2 行程狀態 • 行程在執行時會改變其狀態。行程的狀態 (state)部份是指該行程目前的動作,每一個行程可能會處於以下數種狀態之一: • 新產生 (new):該行程正在產生中。 • 執行 (running):指令正在執行。 • 等待(waiting):等待某件事件的發生(譬如輸出入完成或接收到一個信號)。 • 就緒 (ready):該行程正等待指定一個處理器。 • 結束 (terminated):該行程完成執行。
3.1.3 行程控制表 • 每一個行程在作業系統之中都對應著一個行程控制表 (Process control block, PCB)或稱任務控制表 (task control block),如圖3.3。行程控制表 (PCB)記載所代表的行程之相關資訊,包括: • 行程狀態:可以是new、ready、running、waiting或halted等。 • 程式計數器:指明該行程接著要執行的指令位址。
CPU暫存器:其數量和類別,完全因電腦架構而異。包括累加器 (accumulator)、索引暫存器 (index register)、堆疊指標 (stack pointer)以及一般用途暫存器 (general-purpose register)等,還有一些狀況代碼 (condition code)。當中斷發生時,這些狀態資訊以及程式執行計數器必須儲存起來,以便稍後利用這些儲存的資訊,使程式能於中斷之後順利地繼續執行 (如圖3.4)。 • CPU排班法則相關資訊:包括行程的優先順序 (priority)、排班佇列(scheduling queue)的指標以及其它的排班參數。 • 記憶體管理資訊:這些資訊包括如基底暫存器(base register)和限制暫存器(limit register),分頁表(page table)值的資訊統所使用的記憶系統區段表(segment table)。 • 會計資訊:包括了CPU和實際時間的使用數量、時限、帳號工作或行程號碼。 • 輸入/輸出狀態資訊:包括配置給行程的輸入/輸出裝置,包括開啟檔案的串列 等等。
3.2 行程排班 • 多元程式規劃系統的主要目的,是隨時保有一個行程在執行,藉以提高CPU的使用率。分時系統的目的是將CPU在不同行程之間不斷地轉換,以便讓使用者可以在自己的行程執行時與它交談。 • 為了達到這個目的,行程排班程式(process scheduler)為CPU上執行程式選擇一個可用的行程(可能由一組可用行程)。 • 在單一處理器系統裏,不可能有一個以上的行程同時執行。如果有多個行程,其它的都必須在旁邊等待一直到CPU有空,才可能重新排列。
3.2.1 排班佇列 當行程進入系統時,它們是放在工作佇列(job queue)之中,此佇列是由所有系統中的行程所組成。位於主記憶體中且就緒等待執行的行程是保存在一個所謂就緒佇列 (ready queue)的串列。這個佇列一般都是用鏈接串列的方式儲存。在就緒佇列前端保存著指向這個串列的第一個和最後一個PCB (Process Control Block),行程控制表)的指標。
一個新的行程最初是置於就緒佇列中。它就一直在就緒佇列中等待,直到選來執行或被分派 (dispatched)。一旦這個行程配置CPU並且進行執行,則會有若干事件之一可能發生: .行程可發出1/0要求,然後置於一個1/0佇列中。 .行程可產生出一個新的子行程並等待後者的結束。 .行程可強行地移離CPU(如用中斷的結果一樣),然後放回就緒佇列中。
3.2.2 排班程式 (scheduler) • 一個行程在它整個生命期裏將在各個不同的排班佇列間遷移。作業系統必須按排班次序從這些佇列選取行程。行程的選取將由適當的排班程式 (scheduler)來執行。 • 整批作業系統中,經常有多於電腦所能負荷的行程數目交付電腦執行,這些行程會先以spooling方式送到一個大型儲存裝置中 (一般是磁碟) ,等待稍後執行的工作。 • 長程排班程式 (long-term scheduler, 或稱 工作排班程式 job scheduler) 從行程中選出行程並將它們載入記憶體以便執行。 • 執行次數很少 • 短程排班程式 (short-term scheduler, 或稱 CPU scheduler) 從記憶體中選出一個已經準備就緒的行程,並將CPU分配給它 • 必須常為CPU選擇新的行程,最少每100毫秒執行一次。
長程排班程式控制著 多元程式規劃的程度 (degree of multiprogramming) • 多元程式規劃的程度是穩定的,進入系統的行程的平均到達速率就必須等於由系統出來的平均離開率。 • 必須讓長程排班程式能夠謹慎的做選擇,選擇一個適當的混合行程 • I/O 傾向行程 (I/O-bound process),做I/O的時間比做計算的時間還多。 • CPU 傾向行程 (CPU-bound process),做計算的時間比做I/O的時間還多。
有些系統,如分時系統,可能會採用一種額外的、間接方式來排班。這種稱為中程排班程式 (medium-term scheduler)背後的最主要觀念就是我們有時後可以將行程從記憶體中有效地移開(並且從對CPU的競爭中移開)、並減低多元程式規劃的程度。 • 稍後,再把該行程放回記憶體中並且放在它移開之前的位置繼續執行這種方法稱為置換 (swapping)。
3.2.3 內容轉換 • 中斷使作業系統改變CPU目前的工作而執行核心常式,這樣的作業常發生在一般用途系統上。當中斷發生時,系統需要儲存目前在CPU上執行行程的內容 (context),所以當作業完成時,它可以還原內容,本質就是暫停行程,再取回行程。 • 轉換 CPU至另一項行程時必須將舊行程的狀態儲存起來,然後再載入新行程的儲存狀態。這項任務稱為內容博換(context switch)。
3.2 行程的操作 • 系統中的各個行程可以並行地執行。而且也要能動態地產生或刪除。因此,作業系統必須提供行程產生和結束的功能。
3.3.1 行程的產生 • 在一個行程的執行期間,它可以利用產生行程的系統呼叫來產生數個新的行程。原先的行程就叫做父行程 (Parent process),而新的行程則叫做子行程(children process)。每一個新產生的行程可以再產生其它的行程,這可以形成一幅行程樹 (tree of processes)。
3.4 行程間通訊 • 在作業系統中的同時執行的行程可分為獨立行程及合作行程兩大類 • 獨立行程: 一個行程無法影響其他行程且不受其他的行程影響 • 合作行程: 一個行程能夠影響其他行程或受到其他的行程影響 • 作業系統之所以要提供環境,以供行程合作,有以下幾點理由 • 資訊共享: 因為數個使用者可能對相同的一項資訊(例如,公用檔案)有興 趣,因此我們必須提供一個環境允許使用者能同時使用這些資源。 • 加速運算: 如果我們希望某一特定工作執行快一點,則可以分成一些子工作, 每一個子工作都可以和其它子工作平行地執行。模組化: 我們可能希望以模組的方式來建立系統,把系統功能分配到數個行 程。 • 方便性:即使是單一使用者也可能同時執行數項工作。
合作行程必須要彼此間交換資料和訊息的行程間通訊 (interprocess communication, IPC) ,有兩個基本模式 • 共用計憶體 (shared memory) • 訊息傳遞 (message passing)
3.4.1共用記憶體系統 • 使用共用記憶體的行程間通訊需要通訊行程來建立共用記憶體區域 • 共用計憶體需要兩個以上行程同意解決限制,則他們能由共用區域中讀和寫資料本文交換資訊。 • 為了闡述合作行程的觀念,讓我們來看 “生產者-消費者。的問題,這個問題是合作行程常用的範例。生產者(producer)行程產生資訊,消費者(consumer)行程消耗掉這些資訊。 • 生產者-消費者使用共同計憶體問題的一個解決方法,必須有一個包含數個欄位的緩衝區。 • 無限緩衝區 (unbounded buffer) • 有限緩衝區 (bounded buffer) ,緩衝區空了,消費者必須等待,緩衝區滿了,生產者必須等待
有限緩衝區來行使共用記憶體 #define BUFFER_SIZE 10 Typedef struct { . . . } item; item buffer[BUFFER_SIZE]; int in = 0; int out = 0; • 指標 in 指向緩衝區的下一個空位,指標 out 指向緩衝區的第一個填滿的位址 • in = = out, 緩衝區空了,(in+1) % BUFFER_SIZE ) = = out ,緩衝區滿了 • Solution is correct, but can only use BUFFER_SIZE-1 elements
3.4.2 訊息傳遞系統 • 訊息傳遞提供了允許行程互相溝通和彼此同步不需要共享相同位址空間。 • 在分散式環境下,IPC特別有用 • 全球資訊網使用的chat程式的設計,以便聊天參加者藉由交換訊息彼此溝通。 • 訊息傳遞至少提供兩種操作 • send • Receive • 如果兩個行程P與Q要互相聯繫,必須存在一個通訊鏈,以下是一些邏輯上製作一個鏈與send /receive的操作方法 • 直接或間接聯繫 • 同步或非同步聯繫 • 自動或外在緩衝作用
3.4.2.1 命名 • 直接聯繫 (direct communication)方法中,每一個要傳送或接收訊息的行程必須先確定聯繫接收者或傳送者的名稱。在這個體系之中,send()與 receive()的基本運算定義如下: • send (P, message)傳送一個訊息(message)至行程P。 • receive (Q, message)自行程Q接收一個訊息(message)。 • 間接式聯繫(indirect communication)之中,需藉著信箱(mailbox,也叫作埠,port)來傳送與接收訊息。這種 Send()與 receive() 的基本運算之定義如下: • Send (A, message) 將訊息 (message)傳送至信箱A。 • Receive (A, message) 自信箱A接收一個訊息 (message)。
3.4.2.2 同步化 訊息傳遞可以是等待(blocking)或非等待(nonblocking),也稱為同步 (synchronous)和非同步 (asynchronous)。 • 等待傳送 (blocking send):傳送行程等待著,直到接收行程或信箱接收訊息。 • 非等待傳送 (nonblocking send):傳送行程送出訊息及重新操作。 • 等待接收 (blocking receive):接收者等待,直到有效訊息出現。 • 非等待接收 (nonblocking receive):接收者收到有效訊息或無效資料。
3.4.2.3 緩衝區 • 不論是直接或間接連繫,經由通訊行程交換的訊息是放在一個暫時的序列 • 零容量 • 有限的榮量 • 無限制的容量
3.5IPC 系統的範例 • 討論三個不同的IPC系統 • POSIX API 的共用記憶體 • Mach 作業系統的訊息傳遞 • Windows XP
3.5.1 POSIX 共用記憶體 • 首先必須利用shmget () 系統呼叫 (SHared Meomry GET) , 產生記憶體分段 • segment_id = shmget (IPC_PRIVATE, size, S_IRUSR | S_IWUSR) • 第一個參數: 識別碼,第二個參數: 共用記憶體分段大小,第三個參數: 參數識別模式 (讀、寫) • 成功呼叫下會傳回一個整數識別碼 • 行程希望存取共用記憶體分段,shmat (SHared Memory ATatch)連接到它們的位址 • shared_memory = (char *) shmat (id, NULL, 0); • Parameter 1: 共用記憶體分段整數識別碼, Parameter 2: 記憶體上的指標位址 (NULL: the OS selects the location on the user’s behalf), Parameter 3: 模式旗標 (0: 允許讀和寫) • 一旦共用記憶體區域連接到行程位地址空間,行程可以存取共用記憶體,利用shmat() 傳回的指標的常式記憶體存取 • Sprontf ( shared_mmory, “Writing to shared memory”)
當行程不在使需要存取共用記憶體分段時,由位址空間分離分段當行程不在使需要存取共用記憶體分段時,由位址空間分離分段 • shmdt ( shared_memory) • 最後共用記憶體分段以 shmctl() 系統呼叫移除,這個系統呼叫傳遞共用分段辨識碼和旗標 IPC-RMID
3.5.2 Mach • 在訊息式的作業系統例子中,我們接著考慮由Carnegie Mellon大學所發展出的Mach作業系統。Mach核心支援多元任務的產生和刪除,這些任務類似於行程,但具有多重的控制執行緒。 • Mach中大部份的通訊(包括大部份系統呼叫和所有任務之間的資訊)都是由訊息完成。訊息都是由信箱(在Mach中乃稱為埠,port)來傳送接收 • 每當一個任務產生時,核心 (Kernel )信箱及通知 (Notify)信箱也一起產生。 • 核心信箱是由核心與任務做通訊,送出事件發生的通知給通知埠 (Notify port) • 訊息傳送只需三個系統呼叫 • msg_send(): 傳送一個訊息給予信箱 • msg_receive(): 接收一個訊息 • msg_rps(): 遠程程序呼叫 (remote procedure call RPC) • port_allocation() 系統呼叫產生一個新信箱並為它的訊息佇列分配空間 (8個)
送出與接收的操作本身頗有彈性,當訊息送到一個信箱。信箱可能滿的,傳送執行緒有下列四種選擇送出與接收的操作本身頗有彈性,當訊息送到一個信箱。信箱可能滿的,傳送執行緒有下列四種選擇 • 不確定的等待直到信箱有空間 • 最多等待n毫秒 • 根本不等待,馬上返回 • 暫時保留訊息,可以送一個訊息給作業系統以便保持 • 伺服任務
3.5.3 Windows XP • Windows XP作業系統是現代設計的一個例子,它採用模組化設計以便增進功能和降低製作新特性所需的時間。Windows Xp 提供多元操作環境的支援,或是經由一個訊息傳遞的功能完成應用程式之連結的子系統(subsystem)。這些應用程式可以視為WindowsXP系統伺服器的委託人。 • 在Windows中的傳遞設備稱為 區域程序呼叫設備 (local procedure call facility, LPC) , 用來在相同機器中的兩個行程之間的通訊。 • 使用一個目的埠來設立和維持一條在兩個行程之間的連結。 • 使用兩種形式的埠: 連結埠及通訊埠 • 通訊工作如下 • 委託人開啟子系統的目的連接埠之控制訊號 • 委託人送出一個連結要求 • 伺服器產生兩個私人的通訊埠,並且回送控制訊號到兩個通訊埠之一再回送到委託人 • 委託人與伺服器使用相對的埠控制訊號來傳送訊號或對回應作回收與傾聽。
Windows XP 設立通道時,它使用兩種訊息傳遞技術在委託仁指令的埠 • 小訊號量: 使用埠的訊息佇列做為中間的儲存器 • 大量訊息: 經由目的區段 (section object) 傳遞訊息
3.6 客戶-伺服器的通信 • 3.6.1 插座(Socket) • 插座(Socket)定義成通信的終端。一組行程使用一對插座 (雙方各一個)在網路上通信。一個IP位址和一個埠號碼 (Port number)所組成。 • telnet 伺服器傾聽埠: 23, ftp: 21, http: 80 • 當一個客戶端的行程啟動一項連接要求,會被主電腦設定一個埠 • 大於1024的任意數字
Java 提供三種不同型態的插座 • 連接傾向插座 (connection-oriented (TCP) socket), 要用Socket類別製作 • 無連接傾向插座 (connectionless (UDP) sockets), 使用DatagramSocket 類別 • MulticastSocket 類別,它是DatagramSocket 類別的子類別,廣播插座允許資料被送到許多接受者。
RPC 被設定一種使用在以網路連接之系統間的程序呼叫方法,許多方面與IPC功能很相似,而且通常被建立在一個系統的上層。 • RPC 的語法允許客戶端對於遠端主機呼喚一個程序就如同呼叫本地的程序一樣 • RPC 系統藉由在客戶端提供 stub 完成這項工作 • 每一個獨立的遠程程序都存在一個個別的stub ,當客戶呼喚一個遠程程序時,RPC 的系統呼叫適當的 stub ,並傳遞給它要提供給遠程程序的參數。 • 關於伺服器與客戶通訊,客戶如何知道伺服器的埠號碼 • 固定埠位址 • 透過約會守護程式,要求它需要執行之RPC的埠位址 • 3.6.2 遠程程序呼叫(RPC)
遠程方法呼叫 (remote method invocation, RMI) 是類似的 Java 特性 • RMI 允許執行緒對一個遠程物件呼叫一個方法。 • 當物件位於不同的Java虛擬機器上就被視為遠程物件 • RMI 和 RPCs 之間有兩項基本差別 • RPCs 只支援程序性的程式撰寫,因此只有遠程程序或函數可以被呼叫,RMI 是物件為基礎,它支援呼叫遠程物件的方法 • 在RPC 裡傳給遠程程序的參數是一般的資料結構,在RMI可以傳遞物件 • 3.6.3 遠端方法呼叫(RMI)
參數 A 和 B 呼叫 someMethod () 會啟動遠程物件的stub • stub 將參數 A 和 B 以及伺服器的方法排列成包裹,送到伺服器 • 伺服器的skeleton展開參數並呼叫someMethod() • 完成之後skeleton就把從 someMethod 傳回的布林值排成包裹,並將此包裹送回客戶端 • 客戶端的 sub 展開傳回值,並將此值傳給客戶端執行緒