操作系統——進程

整理自《操作系統概念第七版》

進程概念

進程是系統進行資源分配和調度的基本單位,程序本身不是進程。
不只包括程序代碼,還包括以進程計數器的值和處理器寄存器的內容表示的當前活動。另外,進程通常還包括堆棧段(臨時數據如函數參數、返回地址和局部變量)和數據段(全局變量)。進程還可能包括(在進程運行期間動態分配的內存)。

進程狀態

1.新的(創建):進程正在被創建
2.運行:指令正在被執行
3.等待(阻塞):進程等待某個事件的發生(如I/O完成或收到信號)
4.就緒:進程等待分配處理器
5.終止:進程完成執行

進程控制塊(PCB)包括:進程狀態、程序計數器、CPU寄存器、CPU調度信息、內存管理信息、記賬信息、I/O狀態信息。


進程調度

進程進入系統時,會被加到作業隊列中,該隊列包括系統中的所有進程。駐留在內存中就緒的、等待運行的進程保存在就緒隊列中。該隊列通常用鏈表來實現,其頭節點指向鏈表的第一個和最後一個PCB塊的指針。每個PCB包括一個指向就緒隊列的下一個PCB的指針域。
圖源:《操作系統概念》
進程被放到大容量存儲設備(磁盤)的緩衝池中,長期調度程序/作業調度程序從該池中選擇進程,並裝入內存以準備執行。短期調度程序/CPU調度程序從準備執行的進程中選擇進程,爲之分配CPU。
主要區別:執行的頻率。
長期調度程序控制多道程序設計的程度(內存中的進程數量),必須仔細選擇進程(I/O爲主或CPU爲主)。
中期調度程序的核心思想是將進程從內存(或從CPU競爭)中移出。該方案被稱爲交換

上下文切換:當發生一箇中斷時,系統需要保存當前運行在CPU中進程的上下文,從而在其處理完之後能恢復上下文。上下文切換時間是額外開銷。


進程操作

進程創建

大多數操作系統根據一個唯一的進程標識符來識別進程,pid(process identifier,pid)通常是一個整數值。

在一個進程創建子進程時,子進程可能從操作系統直接獲得資源,或從其父進程獲得資源。父進程可能必須在其子進程之間分配或共享資源。限制子進程只能使用父進程的資源,防止創建過多的進程帶來系統超載。

以UNIX操作系統爲例。fork()創建新進程(複製原來進程的地址空間形成),子進程的返回值爲0,父進程的返回值非0;exec()用新進程取代進程的內存空間,兩個進程能相互通信,並能按各自的方法執行;wait()等待子進程的完成。
以WINDOWS爲例,採用CreateProcess(),fork繼承了父進程的地址空間,而這個函數則需要將一個特殊程序裝入子進程的地址控件。fork不需要傳參,該函數需要至少傳遞10個參數。其中STARTUPINFO指的是新進程的特性如窗口大小、標準輸入輸出等;PROCESS_INFORMATION包含一個句柄以及新的生成進程和線程的標識。ZeroMemory()爲每個結構清空內存。

進程終止

原因:
1.子進程使用了超過它所分配到的資源
2.分配給子進程的任務不需要
3.父進程退出

有些系統具有級聯終止現象,父進程終止,所有的子進程都將終止。有些系統的子進程會以init進程重新作爲父進程。


進程間通信

模式:共享內存/消息傳遞
共享內存:建立一塊供協作進程共享的內存區域,進程通過向此共享區域讀或寫入數據來交換信息。允許以最快的速度進行通信,可以達到內存的速度。不需要相比於信息傳遞的內核介入的時間消耗。
信息傳遞:通過在協作進程間交換信息來實現通信。不需要避免衝突,比共享內存更容易實現。

生產者——消費者模型

生產者進程產生信息以供消費者進程消費。採用共享內存是解決生產者——消費者模型的一種方法。爲了允許生產者進程和消費進程能併發執行,必須有一個緩存來被生產者填充並被消費者使用。此緩衝駐留在生產者進程和消費者進程的共享內存區域內,當消費者使用一項時,生產者能產生另一項。
通過循環數組和兩個邏輯指針實現:in和out。
in = out 緩衝爲空
(in+1)%BUFFER_SIZE = out 緩衝爲滿

消息傳遞機制

消息傳遞工具提供至少兩種操作:發送send(消息)和接收receive(消息)。
邏輯實現的幾個問題:直接或間接?同步或異步?自動或顯式?
直接通信每個進程明確命名通信的接收者和發送者
1.對稱尋址
send(P,message)發送消息到P
receive(Q,message)接收來自Q的消息
2.非對稱尋址
send(P,message)發送信息到進程P
receive(id,message)接收來自任何進程的消息,id設置成與其通信的進程名稱
間接通信
通過郵箱或接口來發送和接收信息。進程或操作系統可以擁有郵箱。
send(A,message)發送消息到郵箱A
receive(A,message)接收從郵箱A的信息

同步/異步 阻塞/非阻塞
阻塞send:發送進程阻塞,直到消息被接收(對方收了才繼續發)
非阻塞send:發送進程發送消息並再繼續操作(一直髮)
阻塞receive:接收者阻塞,直到有消息可用(有消息才收)
非阻塞receive:接收者收到一個有效消息或空消息(一直收)
如果都阻塞,則在發送者和接收者之間會有一個集合點。如果都非阻塞,則生產者消費者模型無意義。

緩衝
通信進程所交換的信息都駐留在臨時隊列中。零容量被稱爲“沒有緩衝”,其他均爲“自動緩衝”。
零容量:最大容量爲0,不允許消息處於等待狀態。
有限容量:最大長度爲有限n。
無限容量:隊列長度無限,從不阻塞發送者。


客戶機——服務器系統通信

Socket

Socket(套接字)可以定義爲通信的端點,由IP地址和一個端口號連接組成。通常,Socket採用客戶機——服務器結構。服務器通過監聽指定端口來等待進來的客戶請求。所有低於1024的服務器端口都被認爲是衆所周知的,用來實現標準服務。
以JAVA爲例,提供了TCP(面向連接)、UDP(無連接)和多點傳送Socket類三種不同類型的Socket。

遠程過程調用(RPC)

RPC設計成抽象過程調用機制,用於通過網絡連接系統。每個消息傳遞給位於遠程系統上監聽端口號的RPC服務器,每個都包含要執行函數的名稱和傳遞給函數的參數。該函數根據請求而執行,任何結果通過另一個消息送回給請求者。
通過在客戶端提供存根,RPC系統隱藏了允許通信發生的必要細節。
問題一:處理客戶機和服務器系統的數據表示的差別
在客戶機端參數編組涉及將機器有關數據在被髮送到服務器之前編組成XDR(外部數據表示)。在服務器端,XDR數據重新轉換成服務器所用的機器有關表示。
問題二:調用的語義(RPC可能會失敗或多次重複執行)
操作系統確保消息剛好執行一次,需要消除服務器從未收到消息的風險。如爲“最多一次”,則可以通過爲每個消息附加時間戳做到。
問題三:客戶機與服務器的通信問題
方法一:綁定信息以固定端口地址形式預先固定;方法二:綁定通過集合點機制動態進行
在這裏插入圖片描述

遠程方法調用(RMI)

類似於RPC的Java特性。RMI允許線程調用遠程對象的方法。如果對象位於不同的JVM上,那麼就認爲它是遠程的。
區別:RPC支持子程序編程,只能調用遠程的子程序或函數;RMI基於對象,它支持調用遠程對象的方法。RPC的參數是普通數據結構,RMI可以將對象作爲參數傳遞給遠程方法。
RMI採用存根和骨幹實現遠程對象。存根爲遠程對象的代理,駐留在客戶機中。骨幹負責重新編排參數並調用服務器上索要執行的方法。
參數傳遞的規則:
如果編排參數是本地對象,那麼通過對象串行化的技術來複制傳遞。如果參數也是遠程對象,可通過引用傳遞。如果本地對象需要作爲參數傳遞給遠程對象,必須實現接口java.io.Serializable。對象串行化允許將對象狀態寫入字節流。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章