操做系統學習(二)--進程描述和執行

這是操做系統系列第 2 篇。spa

若是你想知道操做系統天天都在作些什麼,那就打開你的資源監視器:操作系統

file
資源監視器截圖,Windows 10線程

單獨經過這一張圖,咱們就可以總結出操做系統的幾個重要功能:設計

  • 進程管理
  • 線程管理
  • 內存管理
  • I/O 管理(包含了磁盤調度)
  • 文件管理,這一功能在圖裏沒有表現出來,但我相信每一個使用計算機的人都知道它。

爲何我要從進程開始講起呢?指針

緣由很簡單,咱們天天使用計算機,包括手機和電腦,本質上是使用運行在其操做系統上的應用程序。對於咱們來說,操做系統最爲直觀的功能就是進程管理,因此,讓咱們從進程管理入手,由表及裏,一步步深挖操做系統的本質。blog

進程是什麼?

我在第一篇文章裏簡單提到了進程這一律念,這裏再詳細講一下,加深理解。隊列

操做系統的設計從根本上來講是爲了迎合用戶需求,對我的用戶來講,需求就是在一臺計算機上運行多個應用程序,以知足生活和工做的須要。但應用程序這麼多,不可能讓每個程序佔用一個 CPU 核心啊,由於 CPU 核心是有限的,人的需求是無限的。進程

因此操做系統就須要將無限(誇張一下)的應用程序,分配到有限的 CPU 上去。內存

當咱們打開一堆程序時,這些程序就會被加載到內存上,爲了讓這些運行的程序與沒有打開的程序做區分,咱們創造了進程(Process)這個名詞。因此,進程就是對運行的程序的一種抽象,具備動態性。進程管理其實就是操做系統經過某種方式,管理咱們已經打開的程序。資源

注:爲了簡化後面的討論,咱們假設所說的計算機是單核的。

進程的狀態有哪幾種?

講到進程,咱們必然須要瞭解進程狀態,想要了解進程的狀態,咱們就得從進程的角度,看一看進程的一輩子會發生什麼。

首先,用戶打開某個應用程序,這個程序就處於新建態(New),這個時候操做系統尚未爲這個程序作好準備工做,這個進程自身尚未進入內存,可能還留在磁盤裏。

等到這個進程被加載進內存,就表明它已經準備好運行了,但由於 CPU 資源正被別的進程佔用,它只能等待操做系統爲它分配 CPU。這個狀態稱爲就緒態(Ready)。

在就緒態一段時間後,總會分配到 CPU 資源,一旦進程開始執行,它就進入了運行態(Running)。

有的進程可能會執行某些阻塞操做,就拿 I/O 操做來舉例子,執行操做後,進程須要等待 I/O 操做完成,第一篇文章講過,進程在這段時間內是沒法使用 CPU 的,若是讓它繼續佔用 CPU,就形成了資源浪費。因此操做系統會剝奪它的 CPU 使用權,並把它放在阻塞態。等到 I/O 操做結束後,再將其放入就緒態。

還有最後一種狀態——退出態,顧名思義,進程終止後,就會進入退出態,這個進程可能尚未從內存中清理出去。等到進程徹底退出內存,進程的一輩子就完全結束了。

綜合以上的討論,咱們獲得了進程的 5 種狀態:
file

細心的讀者可能會發現,運行態到阻塞態,以及阻塞態到就緒態之間的箭頭是單向的。爲何?

先來看看運行態和阻塞態。回憶一下,一個進程處於阻塞態表明什麼?(但願你看到這確實停下來思考了)

一個進程處於阻塞態,表明進程執行了某個阻塞操做,正在等待操做的結果。也就是說,處於阻塞態的進程沒有使用 CPU 的能力,因此即便給了它 CPU 它也沒辦法運行,天然沒法進入執行狀態。因此從阻塞態是沒法直接跳到運行態的。

再來講說就緒態和阻塞態。若是一個進程位於就緒態,說明它如今沒有使用 CPU,因此更不可能執行阻塞操做。所以從就緒態也不能直接跳轉到阻塞態。

結合剛剛的解釋,咱們來看看一個簡單的進程的排隊模型:
file

圖中的 ABCDEF 表明了進程

要注意的是,就緒態,運行態和阻塞態提供了一種描述進程行爲的系統方法,指導了操做系統的實現,許多實際的操做系統都是按照這樣的三種狀態進行具體構造的。但這不表明就沒有其餘狀態的立錐之地了,在一些實現中(實際上是主流實現,但因爲牽扯到虛擬內存的概念,因此留到之後講解),還有掛起態等狀態。但無論哪一種狀態,他們都是爲了操做系統可以最大化利用計算機資源而抽象出來的。

留幾個小問題作思考:

  1. 爲何只有從運行態才能轉換到退出態?
  2. 你能看懂上圖排隊模型嗎?

PCB 是什麼東西?

操做系統在管理和控制進程的時候,首先必須知道進程的位置(即進程被加載到哪一塊內存了),其次,它還須要知道進程的屬性,如進程 ID,進程狀態等,因此咱們就得有一個結構可以保存這些信息。

進程控制塊(Process Control Block)就是這麼一個結構。進程控制塊會在程序啓動時就被建立出來。
file

進程控制塊的主要內容及內存映像(字醜勿怪)

咱們能夠看到,PCB 中存儲着進程 ID,寄存器狀態,棧指針等重要信息,這些信息如今看來很是陌生,但之後隨着你對操做系統理解的加深,你就會理解這些信息的含義和做用。

圖中還有一個信息,那就是 PCB 存儲在內核空間——代表只有操做系統有權利更改 PCB 裏面的內容。由於 PCB 過重要了,若是其內部信息被惡意修改,將形成進程意外終止,甚至可能致使操做系統的崩潰。

總結

讓咱們來串一下今天的內容:

若是一個程序開始運行,那麼操做系統就會爲其建立一個進程控制塊,並將其加載到內存中,進程控制塊內的「進程狀態」信息會更改成就緒態,並將進程放入就緒隊列等待分配 CPU。一旦分得 CPU,進程就進入運行態,根據實際狀況,還可能由於執行阻塞操做而進入阻塞態,等到程序運行完畢,進程就被操做系統清出內存,而後刪除其進程控制塊。

若是看完上一段,對黑體字的概念還很模糊,那我建議你再慢慢看一遍文章,並且必定要帶上本身的思考,沒有通過思考的閱讀的效率是很低的。

但願你在看完文章以後有所收穫。感謝你的閱讀,咱們後會有期!

聲明:原創文章,未經受權,禁止轉載

相關文章
相關標籤/搜索