天天看點

《現代作業系統》讀書筆記之程序一

工作幾年,越來越感覺到作業系統的重要性,記得在上課時老師說過一句話。工作幾年後,必須得傳回來看看作業系統,會有與學生時代不一樣的了解。看到别人都在寫寫部落格,自己也手癢想嘗試下。僅僅代表自己的了解,如有錯誤之處,敬請指出。

1:程序

在該書中對程序的定義:在程序模型中,計算機上所有可以運作的軟體,通常也包括作業系統,被組織成若幹順序程序,簡稱為程序。一個程序就是一個正在執行程式的執行個體,包括程式計數器,寄存器和變量的目前值。

程序模型的核心思想就是:一個程序是某種類型的一個活動,它有程式,輸入,輸出以及狀态。單個處理器可以被若幹程序共享,它使用某種排程算法決定何時停止一個程序的工作,并轉而為另一個程序提供服務。

一個CPU在同一時間隻能真正一次運作一個程序,是以在單核時代多程序其實就是每個程序擁有一個虛拟CPU,并不是嚴格上的多程序,隻有擁有兩個核或者以上,才能真正實作多程序。

每個程序負責管理自己的資源,比如程式計數器,記憶體等資訊,而實際上在實體上隻有一個。

2:建立程序

在我做實際項目中,有些在應用系統中其實隻運作一個應用程序(比如華為S系列交換機,其實内在隻是啟動了一個vos.o,進而避免了複雜的程序互動,較少程序切換,增加實時性),将程序的建立放在系統啟動。

該書指出一般程序的建立主要有四種方法:

1:系統初始化

2:執行了正在運作的程序所調用的程序建立系統調用(syscall)

3:使用者請求建立一個新程序

4:一個批處理作業的初始化。

其中在系統啟動時,建立程序,一般都是稱之為守護進行(daemon).

新的程序也可以後建立。一個正在運作的程序實際上會經常發出系統調用,以建立一個或多個新程序進行協助其工作。在所要從事的工作可以容易地劃分成若幹相關的但沒有互相作用的程序,建立新的程序就特别效果。在參加的一個交換機多核項目中,就利用了該書的這種方法,為了提高交換機上處理協定的能力,專門在一個cpu的進行資料的收發,然後交給其他cpu進行業務上的處理。

在有些互動式系統中,輸入一個指令或者輕按兩下也可以啟動一個程序。

最後一種,一般在大型機上用到。

從上面可以看出,新程序一般都是由于一個已存在的進行執行了建立程序的系統調用而建立。在linux系統中一般都是調用fork(後面将會開專題并結合實驗來講)。它會将所有父程序的資源做一個相同的副本,存儲映像。檔案描述符等完全一樣。通常,子程序接着執行execue等,以修改其其存儲映像并運作一個新的程序。

3:程序終止

在該書中指出,程序終止主要由以下幾種情況:

1:正常退出(自願的)

2:出錯退出(自願的)

3:嚴重錯誤(非自願的)

4:被其他程序殺死(非自願的)

正常退出:程序正常完成其工作而終止。

出錯退出:比如使用者輸入指令行時,輸入一個錯誤參數等。

嚴重錯誤:程式記憶體時, 出現非法指令,引用不存在的記憶體,除數為零時,段錯誤(page fault)等等。

被其他程序殺死:其讓他程序通過調用系統調用,kill掉程序。

4:程序狀态

每個程序在任意時刻都有自己的狀态。

一般在作業系統中,程序主要有三種狀态:就緒,運作,堵塞。

《現代作業系統》讀書筆記之程式一

在該書中,狀态1, 2, 3 ,4标注的不是很好。我将按照自己的了解,從程序建立開始來講。

當新的程序被建立完成時,就會處于就緒狀态,等待系統排程器 被調到。如果該程序被作業系統排程到将會處于運作狀态,即就是圖中的3轉換過程。

當程序處于運作狀态時,如果在程序中調用了堵塞函數,比如一個程序可以執行諸如pause的系統調用來程序堵塞狀态, 或者從一個裝置檔案中讀取資料時,沒有資料輸入,都會進入堵塞狀态。就是狀态1.

在程式處于運作狀态時,作業系統認為一個運作程序占用處理器的實際過長(時間輪轉片算法),就會有排程器決定,讓出cpu使用權,使其他程序運作。這時程序将會從運作态進入到就緒态。就是狀态2. 如果系統時按照優先級搶占式的,該程序将會被一個高優先級的進行搶占,進而進入到就緒态。

處于堵塞态的進行,如果所等待的外部事件發生,比如使用者輸入資料,該程序将會進入就緒态,即是4,等待排程器對該程序的排程。

下一節将會講叙fork,以及做些小實驗對其程序了解。

繼續閱讀