天天看點

作業系統核心原理-3.程序原理(上):程序概要

作業系統核心原理-3.程式原理(上):程式概要

程序管理、記憶體管理和檔案管理是作業系統的三大核心功能,那麼什麼是程序呢?顧名思義,程序就是進展中的程式,或者說程序是執行中的程式。當一個程式被加載到記憶體之後就變為了程序。是以,我們可以得到:程序=程式+執行。本篇将會對程序、程序模型、程序狀态以及程序的缺陷等進行學習,為後續學習程序排程與程序通信打下堅實基礎。

一、程序是什麼鬼?

1.1 從工作到程序

  程序在Multics作業系統出現之前被叫做工作(Job),工作是IBM用于多道批處理程式設計中的概念。由于曆史原因,Multics作業系統的研發人員不願意承用IBM發明的術語,于是将工作改為了程序(Process)。

1.2 實作CPU的多道程式設計

  在計算機發展的初期,單一操作員單一控制終端,CPU使用率很低。為了提高CPU使用率,人們想要将多個程式同時加載到計算裡并發執行。于是,這些同時存在于計算機記憶體中的程式就被稱為程序。程序的出現,讓每個使用者感覺到自己在獨占CPU。是以,可以說程序就是為了在CPU上實作多道程式設計而出現的概念,如下圖所示。

作業系統核心原理-3.程式原理(上):程式概要

  人們發明程序是為了支援多道程式設計,而進行多道程式設計的目的則是為了提高計算機CPU的使用率(或者說系統的吞吐量)。例如,如果一個程序有20%的時間使用CPU進行計算,另外80%的時間用來進行I/O,則在單道程式設計下CPU的使用率隻有20%。單如果同時運作兩個這樣的程序,即使用2道程式設計,則CPU隻在兩個程序同時進行I/O時才會處于閑置狀态,是以CPU使用率将會提高到:1-0.8*0.8=0.36=>36%。同理,如果同時運作更多的程序,CPU使用率會逐漸提高,直到某個臨界點為止。(PS:這裡的例子忽略了程序切換所需要的系統消耗)

作業系統核心原理-3.程式原理(上):程式概要

二、程序模型

2.1 三個視角看程序模型

作業系統核心原理-3.程式原理(上):程式概要

  (1)實體視角:從實體記憶體的配置設定來看,每個程序占用一片記憶體空間,從這點上看,程序其實就是記憶體的某片空間。由于在任意時刻,一個CPU隻能執行一條指令,是以任意時刻在CPU上執行的程序隻有一個,而到底執行哪條指令是由實體程式計數器指定。是以,在實體層面,所有程序共用一個程式計數器,隻是CPU在不停地做程序切換。

  (2)邏輯視角:從邏輯層面來看,每個程序都可以執行,也可以暫時挂起讓别的程序執行,之後又可以接着執行。是以,程序需要想辦法保持狀态才能在下次接着執行時從正确的地點開始。是以,每個程序都有自己的計數器,記錄其下一條指令所在的位置。(從邏輯上來說,程式計數器可以有多個)

  (3)時序視角:從時間來看,每個程序都必須往前推進。在運作一定時間後,程序都應該完成了一定的工作量。換句話說,每次程序傳回,它都處在上次傳回點之後。哲學家有雲:“一個人不能兩次踏入同一條河流”。

2.2 程序模型如何實作

  (1)實體基礎:程序的實體基礎是程式,程式又運作在計算機上,是以計算機上要運作程式首先要解決程序的存儲:給程序配置設定記憶體,使其安身立命。由于多個程序可能同時并存,是以需要考慮如何讓多個程序共享同一個實體記憶體而不發生沖突。OS通過記憶體管理來解決這個問題。

  (2)程序切換:程序運作實際上是指程序在CPU上執行,那麼如何将CPU在多個程序之間進行切換也是一個問題。OS通過程序排程來解決這個問題。所謂程序排程,就是決定在什麼時候讓什麼程序來使用CPU。

三、程序的層次與狀态

3.1 程序的層次結構

  一個程序在執行過程中可以通過系統調用建立新的程序,這個新的程序就稱為子程序,而建立子程序的程序則被稱為父程序。

  子程序又可以再建立子程序,于是這樣子子孫孫地建立下去就形成了所謂的程序樹。

3.2 程序的狀态轉換

  基本的程序狀态主要有3種:執行、阻塞和就緒,如下圖所示:

作業系統核心原理-3.程式原理(上):程式概要

  那麼,程序被挂起阻塞有哪些原因呢?首先是一個程序在運作過程中執行了某種阻塞操作,例如讀寫磁盤。(由于阻塞操作需要等待結果後才能繼續執行,是以OS将把這個程序挂起,讓其他程序運轉)其次是一個程序執行的時間太長了,為了公平,OS将其挂起進而讓其他程序也有機會執行。

PS:當然,上述闡述的3種典型狀态并不是唯一的分類方式,事實上,許多商業OS的程序都不止3個,比如Windows的程序就有7種狀态。

四、程序管理概要

4.1 需要的手段

首先看看一個人的出生對一個社會來說意味着什麼?在一個人出生後,醫院需要為其建立記錄,該記錄包括諸如姓名、性别、體重、父母資訊、何時何地出生等資訊,然後會通過該記錄來登記戶口,辦理身份證等等。辦完手續之後,這個人就正式存在,稱為一個公民。當然,我們得goverment就可以對這個人進行各種管理了,比如你不能亂說話,不能亂遊行等等。

  與一個社會管理人的過程類似,OS要管理程序就需要維護程序的一些資訊,OS用于維護程序記錄的結構就是程序表或程序控制塊(Process Control Block,PCB)。那麼程序表裡有什麼記錄呢?一般來說,維護的記錄應該包含:寄存器、程式計數器、狀态字、棧指針、優先級、程序ID、建立時間、所耗CPU時間、目前持有的各種句柄等等。

4.2 建立的過程

  一般來說,OS建立程序的步驟如下圖所示:

作業系統核心原理-3.程式原理(上):程式概要

  在不同的OS中,建立程序的方法也不同,例如Windows中是通過系統調用完成程序建立的,這個系統調用就是CreateProcess。

4.3 處理的問題

  人類社會最大的問題就是資源配置設定,程序管理的最大問題也是如此。雖然程序沒有自我意識,但我們的本性還是追求公平的。除了公平,還需要考慮:效率。于是,公平與效率就成了程序管理中永恒的主題。

4.4 程序的缺陷

  假定有兩部都很好地島國愛情動作片,都隻放映一次,以後就再也不放映了。而且,這兩部片子還是同時放映(狗血劇情啊!),還在兩個不同的小房間放映。而你在同一時間隻能做一件事情,是以你不得不放棄另外一部。程序亦是如此,這也是程序的缺點,如果想要同時做兩件或多件事情,程序就不夠用了。并且,如果程序在執行的過程中發生阻塞,例如等待輸入,整個程序就将被挂起(暫停),而無法繼續執行。這樣,即使程序裡面有部分工作不依賴于輸入資料,也無法推進。

  是以,為了解決上述兩個問題,人們發明了線程。

  

作業系統核心原理-3.程式原理(上):程式概要

  欲知後事如何,還聽下回分解。

參考資料

作業系統核心原理-3.程式原理(上):程式概要

鄒恒明,《作業系統之哲學原理》,機械工業出版社

作者:周旭龍

出處:http://edisonchou.cnblogs.com

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連結。

繼續閱讀