操作系統精髓與設計原理學習筆記三:進程描述和控制

一、什麼是進程:

開發操作系統是爲了給應用程序提供一個方便、安全和一致的接口。操作系統是計算機硬件和應用程序之間的一層軟件,對應用程序和工具提供支持。

目標:資源對多個應用程序是可用的;物理處理器在多個應用程序間切換以保障所有程序都在執行中;處理器和IO設備 能得到充分利用。

所有現代操作系統採用的方法都是依據對應於一個或多個進程存在的應用程序執行的一種模型。

進程的幾種定義:

一個正在執行中的程序;一個正在計算機上執行的程序實例;能分配給處理器並由處理器執行的實體。

進程的兩個基本元素是程序代碼(可能被執行相同程序的其他進程共享)和代碼相關的數據集。假設處理器開始執行這個程序代碼,且我們把這個執行實體稱爲進程。

在執行進程時,進程可以唯一的表徵爲以下元素:標示符,狀態,優先級,程序計數器,內存指針,上下文數據,IO狀態信息,記賬信息。

上述的列表信息被存放在一個稱爲進程控制塊的數據結構中,該控制塊由操作系統創建和管理。進程控制塊包含了充分的信息,這樣就可以中斷一個進程的執行,並且在後來恢復執行進程時就好像進程未被中斷過一樣。進程控制塊是操作系統能夠支持多進程和提供多重處理技術的關鍵工具。

當進程被中斷時,操作系統會把程序計數器和處理器寄存器(上下文數據)保存到進程控制塊中的相應位置,進程狀態也被改變爲其他的值,例如阻塞態或就緒態。現代操作系統可以自由的吧其他進程置爲運行態,把其他進程的程序計數器和進程上下文數據加載到處理器寄存器中,這樣其他進程就可以開始執行。

可以說,進程是由 程序代碼、 相關數據、進程控制塊組成的。


二、進程狀態:

對一個被執行的程序,操作系統會爲該程序創建一個進程或任務。從處理器的角度看,它在指令序列中按某種順序執行指令,這個順序根據程序計數器的寄存器中不斷變化的值來指示,程序計數器可能指向不同進程中不同部分的程序代碼。從程序自身角度看,它的執行涉及程序中的一系列指令。

1 兩狀態進程模型,

一個進程或者正在執行,或者沒有執行。

當操作系統創建一個新進程時,它將該進程以未運行態加入到系統中,操作系統指導這個進程是存在的,並且正在等待執行機會。當前正在運行的進程不時被中斷,操作系統中的分派器部分將選擇一個新的進程運行。

必須有一些與進程相關的信息,包括進程在內存中的當前狀態和位置,及進程控制塊。未運行的進程必須保持在某種類型的隊列中,並等待他們的執行時機。分派器從隊列中選擇一個進程來執行。

2 進程的創建和終止,

進程的生存期圍繞着進程的創建和終止。

可能創建進程的事件:在批處理環境中,作業提交時會創建進程;在交互環境中,當一個新用戶試圖登陸時會創建進程。操作系統會負責新進程的創建。

傳統的,操作系統創建進程的方式對用戶和應用程序都是透明的。但是,當操作系統爲另一個進程顯式請求創建一個進程時,這個動作稱爲進程派生。當一個進程派生另一個進程時,前一個稱爲父進程,被派生的進程稱爲子進程。在典型情況下,相關進程需要互相之間的通信合作。

3 五狀態模型

隊列是“先進先出”的表,對於可運行的進程,處理器以一種輪轉的方式操作(一次給隊列中的玫瑰進程一定的執行時間,然後進程返回隊列。阻塞情況除外)。

但是,存在着一些處於非運行態但已經就緒等待執行的進程,同時存在另外一些處於阻塞狀態等待IO操作的進程。因此如果使用單個隊列,分派器應該掃描隊列,查找那些未被阻塞且在隊列中時間最長的進程。

將允許狀態分爲兩個狀態:就緒和阻塞。

運行態:該進程正在執行

就緒態:進程做好了準備,只要有機會就開始執行

阻塞/等待態:進程在某些事件發生前不能執行,如IO操作完成

新建態:剛剛創建的進程,操作系統還沒有把它加入到可執行進程組中。通常是進程控制塊已經創建但還沒有價值到內存中的新進程

退出態:操作系統從可執行進程組中釋放出的進程,或者因爲它自身停止了,或者因爲某種原因被取消。

(新建態:操作系統可能基於性能或內存侷限性的原因,限制系統中的進程數量。當進程處於新建態時,操作系統所需要的關於該進程的信息保存在內存的進程表中,但進程自身還未進入內存,就是即將執行的程序代碼不在內存中,也沒有爲與這個程序相關的數據分配空間。當進程處於新建態時,程序保留在外存中,通常是磁盤中。)

如果進程請求它不等待的某些事件,則進入阻塞態。

排隊規則:有兩個對立,就緒隊列和阻塞隊列。進入系統的每個進程被防止在就緒隊列中,當操作系統選擇另一個進程運行時,就將從就緒隊列中選擇。對於沒有優先級的方案,這可以使一個簡單的先進先出隊列。當一個正在運行的進程被移出處理器時,它根據情況或者被終止,或者被防止在就緒或阻塞隊列中。最後,當一個事件發生時,所有位於阻塞隊列中等待這個事件的進程都被轉換到就緒隊列中。

此外,擁有多個事件隊列會很有效。一個事件對應一個隊列。當事件發生時,相應隊列中的所有進程都轉換到就緒態。

4 被掛起的進程,

產生緣由:當一個進程正在等待時,處理器可以轉移到另一個進程,但是處理器比IO要快的多,以至於內存中所有的進程都在等待IO的情況很常見。

交換:包括把內存中某個進程的一部分或全部移到磁盤中。交換是一個IO操作,當內存中的所有進程都處於阻塞態時,操作系統可以把其中的一個進程至於“掛起態”,並將它轉移到磁盤中,內存中釋放的空間可被調入的另一個進程使用。

當操作系統已經執行了一個換出操作後,它可以有兩種將一個進程取到內存中的選擇:可以接納一個新近創建的進程,或調入一個以前被掛起的進程。

兩個考慮:進程是否在等待一個事件(阻塞與否),進程是否已經被換出內存(掛起與否)

就緒態:進程在內存中並可以執行

阻塞態:進程在內存中並等待一個事件

阻塞/掛起態:進程在外存中並等待一個事件

就緒/掛起態:進程在外存中,但是隻要被載入內存就可以執行

在虛擬內存方案中,可能會執行到只有一部分內容在內存中的進程,如果訪問的進程地址不在內存中,則進程的相應部分可以被調入內存。虛擬內存的使用看上去會消除顯示交換的需要,這是因爲通過處理器中的存儲管理硬件,任何期望的進程中的任何期望的地址都是可以移入或移出內存。

阻塞-》阻塞/掛起:如果沒有就緒進程,則至少一個阻塞進程被換出,爲另一個沒有阻塞的進程讓出空間。通常,操作系統更傾向於掛起阻塞態的進程而不是就緒態進程。

一個不在內存中的進程,不論它是否在等待一個時間,都不能立即執行。

父進程可能會希望掛起一個後代進程。掛起進程的活動都是由最初請求掛起的代理 請求的。


三、進程描述:

3.1操作系統的控制結構

操作系統控制計算機系統內部的事件,它爲處理器執行進程而進行調度分派,給進程分配資源,並響應用戶程序的基本服務請求。因此,我們可以把操作系統視爲管理系統資源的實體。

操作系統構造並維護它所管理的每個實體的信息表。操作系統維護着四種不透類型的表:內存,IO,文件和進程。

內存表:內存的某些部分爲操作系統保留,剩餘的部分是進程可以使用的,保存在外存中的進程使用某種類型的虛擬內存或簡單的交換機制。

IO表:操作系統使用IO表管理計算機系統中的IO設備和通道。在任何給定的時刻,一個IO設備或者是可用的,或者是已分配給某個特定的進程。

文件表:操作系統還維護着文件表,這些表提供關於文件是否存在。文件在外存中的位置、當前狀態和其他屬性信息。

進程表:操作系統爲例管理進程必須維護進程表。內存、IO和文件時代表進程而被管理的,因此進程表中必須有對這些資源的直接或間接引用。

3.2進程控制結構

操作系統在管理和控制進程時,首先必須知道進程的位置,然後它必須知道在管理時所必須的進程屬性(如進程ID、進程狀態)

進程的物理表示:進程最少必須包括一個或一組被執行的程序,與這些程序相關聯的是局部變量、全局變量和任何已定義常量的數據單元。

進程映像中的典型元素:

1)用戶數據:用戶空間中的可修改部分,可以包括程序數據、用戶棧區域和可修改的程序

2)用戶程序:將被執行的程序

3)系統棧:每個進程都有一個或多個後進先出(LIFO)系統棧,棧用於保存參數、過程調用地址和系統調用地址

4)進程控制塊:操作系統控制進程所需要的數據(進程標識信息、進程狀態信息、進程控制信息)

當進程互相之間進行通信時,進程標識符可用於通知操作系統某一特定通信的目標;當允許進程創建其他進程時,標識符可用於致命每個進程的父親進程和後代進程。

進程控制塊是操作系統中最重要的數據結構。每個進程控制塊包含操作系統所需要的關於進程的所有信息。操作系統中的很多例程都需要訪問進程控制塊中的信息,直接訪問這些表並不難,每個進程都有一個唯一的ID號,可用做進程控制塊指針表的索引。


四、進程控制:

4.1兩種執行模式

非特權態常稱爲用戶態,這是因爲用戶程序通常在該模式下運行

特權態可稱爲系統態或內核態

使用兩種模式的原因是很顯然的,它可以保護操作系統和重要的操作系統表(如進程控制塊)不受用戶程序的干涉。在內核態下,軟件具有對處理器及所有指令、寄存器和內存的控制能力

程序狀態字中有一位表示執行模式,這一位應某些事件的要求而改變。在典型情況下,當用戶調用一個操作系統服務或 中斷 觸發 系統例程 的執行時,執行模式被設置成內核態;當從系統服務返回到用戶進程時,執行模式被設置爲用戶態。

4.2進程創建

一旦操作系統基於某種原因創建一個新進程:給新進程分配一個唯一的進程標識符-》給進程分配空間-》初始化進程控制塊-》設置正確的連接-》創建或擴充其他數據結構

4.3進程切換
進程切換的功能:在某一時刻,一個正在運行的進程被中斷,操作系統指定另一個進程爲運行態,並把控制權交給這個進程。

進程切換可以再操作系統從當前正在運行的進程中活動控制權的任何時刻發生。

操作系統中兩種類型的系統中斷:

1)中斷,與 當前正在運行的 進程無關的 某種類型的 外部事件相關(如完成一次IO操作)。控制首先轉移給中斷處理器,它做一些基本的輔助工作,然後轉移到與已經發生的特定類型的中斷相關的操作系統例程。

2)陷阱,與 當前正在運行的進程 所產生的錯誤或異常條件相關。操作系統確定錯誤或異常條件是否是致命的。如果是,當前正在運行的進程被轉換到退出態,併發生進程切換;如果不是,操作系統的動作取決於錯誤種類和操作系統的設計(試圖恢復或通知用戶),操作系統 可能會進行一次進程切換或者繼續執行當前正在運行的進程。

模式切換與進程切換:發生模式切換可以不改變正處於運行態的進程狀態,在這種情況下,保存上下文環境和以後恢復上下文環境之需要很少的開銷。但是,如果當前正在運行的進程被轉換到另一個狀態(就緒,阻塞等),則操作系統必須使其環境產生實質性的變化。因此,進程切換涉及狀態變化,因而比模式切換需要做更多的工作。


五、操作系統的執行

操作系統與普通的計算機軟件以同樣的方式運行,也就是說,它也是由處理器執行的一個程序。操作系統經常釋放控制權,並且依賴於處理器恢復控制權。

5.1無進程內核

操作系統可以完成保存進程環境的功能,並繼續調度和分派另一個進程。

其關鍵點是,進程的概念僅使用於用戶程序,操作系統代碼作爲一個在特權模式下工作的獨立實體被執行。

5.2 在用戶進程中執行

常見的方法實際上是在用戶進程的上下文中執行幾乎所有操作系統軟件。

其觀點是,操作系統從根本上說是用戶調用的一組例程,在用戶進程環境中執行,用於實現各種功能。操作系統代碼和數據位於共享地址空間中,被所有的用戶進程共享。

當發生一箇中斷、陷阱或系統調用時,處理器被至於內核態,控制權交給操作系統。爲了將控制權從用戶程序轉交給操作系統,需要保存模式想下午環境並進行模式切換,然後切換到一個操作系統例程,但此時仍然是在當前用戶進程中繼續執行。因此,不需要執行進程切換,僅在同一個進程中進行模式切換。如果操作系統完成其操作後,確定需要繼續運行當前進程,則進行一次模式切換,在當前進程中恢復被中斷的程序。如果確定需要發生進程切換二不是反話到先前執行的程序,則控制權被轉換給進程切換例程。

在用戶進程中執行的代碼是共享的操作系統代碼。基於用戶態和內核態的概念,及時操作系統例程在用戶進程環境中執行,用戶也不能篡改或干涉操作系統例程。

在一個進程中,用戶程序和操作系統程序都有可能執行。而在不同用戶進程中執行的操作系統程序是相同的。

5.3 基於進程的操作系統

即把操作系統作爲一組系統進程來實現。主要的內核函數被組織成獨立的進程,同樣,還可能有一些在任何進程之外執行的程序切換代碼。

把操作系統作爲一組進程實現,在多處理器或多計算機環境中都是十分有用的,這時一些操作系統服務可以傳送到專用處理器中執行,以提高性能。


六、安全問題

操作系統對於每個進程都關聯了一套權限。這些權限規定了進程可以獲取哪些資源,包括內存區域、文件和特權系統指令等。典型的是,一個進程的運行代表着一個用戶擁有操作系統認證的權限。


七、UNIX SVR4進程管理

UNIX區分內存中運行就緒態和被搶佔態這兩個狀態。

只有當進程準備從內核態移動到用戶態時纔可能發生搶佔,進程在內核態下運行時是不會被搶佔的。

UNIX中有兩個獨特的進程。進程0是一個特殊的進程,是在系統啓動時創建的。實際上,這是預定義的一個數據結構,在啓動時刻被加載,是交換進程。此外進程0產生進程1,稱爲出事進程,進程1是系統中所有其他進程的祖先。當新的交互用戶登陸到系統時,進程1爲該用戶創建一個用戶進程。隨後,用戶進程可以創建子進程,從而構成一棵分支樹。因此,任何程序都是由一組相關進程組成的。

進程描述:用戶級上下文,寄存器上下文,系統級上下文。

進程控制:UNIX中的進程創建時通過內核系統調用fork()實現的


八、總結:

現代操作系統中最基本的構建是進程,操作系統的基本功能是創建、管理和終止進程。當進程處於活躍狀態時,操作系統必須設法使美國進程都分配到處理器執行時間,並協調他們的活動,管理有衝突的請求,給進程分配系統資源。

爲執行進程管理功能,操作系統維護着對每個進程的描述,或者成爲進程映像,它包括執行進程的地址空間和一個進程控制塊。進程控制塊含有操作系統管理進程所需要的所有信息,包括它的當前狀態、分配給它的資源、優先級及其他相關數據。

在整個生命週期中,進程總是在一些狀態之間轉換。最重要的狀態有就緒態、運行態和阻塞態。一個就緒態進程是指當前沒有執行但已做好執行準備的進程,只要操作系統調度到它就可以立即執行;運行態進程是指當前正在被處理器執行的進程,在多處理器系統中,會有多個進程處於這種狀態;阻塞態進程正在等待某一事件的完成,如一次IO操作。

一個正在運行的進程可被一個在進程外發生且被處理器是被的中斷事件打斷,或者被執行操作系統的系統調用打斷。不論哪種情況,處理器都執行一次模式切換,把控制轉交給操作系統例程。操作系統在完成必須的操作後,可以恢復被中斷的進程或切換到別的進程。


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