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

2021-09-07 22:37:45 字數 3297 閱讀 2221

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

程序在multics作業系統出現之前被叫做工作(job),工作是ibm用於多道批處理程式設計中的概念。由於歷史原因,multics作業系統的研發人員不願意承用ibm發明的術語,於是將工作改為了程序(process)。

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

人們發明程序是為了支援多道程式設計,而進行多道程式設計的目的則是為了提高計算機cpu的利用率(或者說系統的吞吐量)。例如,如果乙個程序有20%的時間使用cpu進行計算,另外80%的時間用來進行i/o,則在單道程式設計下cpu的利用率只有20%。單如果同時執行兩個這樣的程序,即使用2道程式設計,則cpu只在兩個程序同時進行i/o時才會處於閒置狀態,因此cpu利用率將會提高到:1-0.8*0.8=0.36=>36%。同理,如果同時執行更多的程序,cpu利用率會逐步提高,直到某個臨界點為止。(ps:這裡的例子忽略了程序切換所需要的系統消耗)

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

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

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

(1)物理基礎:程序的物理基礎是程式,程式又執行在計算機上,因此計算機上要執行程式首先要解決程序的儲存:給程序分配記憶體,使其安身立命。由於多個程序可能同時並存,因此需要考慮如何讓多個程序共享同乙個物理記憶體而不發生衝突。os通過記憶體管理來解決這個問題。

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

乙個程序在執行過程中可以通過系統呼叫建立新的程序,這個新的程序就稱為子程序,而建立子程序的程序則被稱為父程序

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

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

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

ps:當然,上述闡述的3種典型狀態並不是唯一的分類方式,事實上,許多商業os的程序都不止3個,比如windows的程序就有7種狀態。

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

與乙個社會管理人的過程類似,os要管理程序就需要維護程序的一些資訊,os用於維護程序記錄的結構就是程序表或程序控制塊(process control block,pcb)。那麼程序表裡有什麼記錄呢?一般來說,維護的記錄應該包含:暫存器、程式計數器、狀態字、棧指標、優先順序、程序id、建立時間、所耗cpu時間、當前持有的各種控制代碼等等。

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

在不同的os中,建立程序的方法也不同,例如windows中是通過系統呼叫完成程序建立的,這個系統呼叫就是createprocess。

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

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

因此,為了解決上述兩個問題,人們發明了執行緒。

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

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

出處:

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

程序管理 記憶體管理和檔案管理是作業系統的三大核心功能,那麼什麼是程序呢?顧名思義,程序就是進展中的程式,或者說程序是執行中的程式。當乙個程式被載入到記憶體之後就變為了程序。因此,我們可以得到 程序 程式 執行。本篇將會對程序 程序模型 程序狀態以及程序的缺陷等進行學習,為後續學習程序排程與程序通訊...

作業系統核心原理 3 程序原理(下) 程序通訊

程序作為人類的發明,自然也免不了脫離人類的習性,也有通訊的需求。如果程序之間不進行任何通訊,那麼程序所能完成的任務就要大打折扣。人類的通訊方式無外乎對白 通過聲音溝通 打手勢 寫信 發電報 擁抱等方法。同理,程序也可以通過同樣的方式來進行通訊。本篇我們就來看看程序的這些互動方式。人們最常用的通訊手段...

作業系統核心原理 3 程序原理(中) 程序排程

ps 在多程序併發的環境裡,雖然從概念上看,有多個程序在同時執行,但在單個cpu下,在任何時刻只能有乙個程序處於執行狀態,而其他程序則處於非執行狀態。那麼問題來了,我們是如何確定在任意時刻到底由哪個程序執行,哪些不執行呢?這就涉及到程序管理的乙個重要組成部分 程序排程,跟隨本篇來一起複習下程序排程吧...