
第一篇 基礎原理篇



中斷是操作系統獲得計算機控制權的根本保證。若沒有中斷,很難想象操作系統能夠完成人們所賦予的任務。中斷的基本原理是:設備在完成自己的任務后向CPU發出中斷,CPU判斷優先級,然后確定是否
響應。如果響應,則執行中斷服務程序,並在中斷服務程序執行完后繼續執行原來的程序。

內核態和用戶態各有優勢:運行在內核態的程序可以訪問的資源多,但可靠性、安全性要求高,維護管理都較復雜;用戶態程序程序訪問的資源有限,但可靠性、安全性要求低,自然編寫維護起來比較簡單。一個程序到底應該運行在內核態還是用戶態則取決於其對資源和效率的需求。

系統調用按照功能可以划分為六大類:
●進程控制類。
●文件管理類。
●設備管理類。
●內存管理類。
●信息維護類。
●通信類。
系統調用分為三個階段,分別是:
●參數准備階段。
●系統調用識別階段。
●系統調用執行階段。
第二篇 進程原理篇

進程從根本上說是操作系統對CPU進行的抽象和裝扮。進程讓每個用戶感覺到自己獨占CPU。
進程出現的動機是人類渴望的並發。因為要並發,所以我們發明了進程。
進程的出現也讓操作系統的復雜性大為增加:由於需要對進程進行分離存儲而導致出現內存管理;由於需要讓不同進程有條不紊地往前推進而導致進程調度的出現。

進程管理、內存管理和文件管理是操作系統的三大核心功能。
進程就是進展中的程序,或者說進程是執行中的程序。就是說,一個程序加載到內存后就變為進程。即:
進程=程序+執行
人們發明進程是為了支持多道編程,而進行多道編程的目的則是提高計算機CPU的效率,或者說系統的吞吐量。

進程空間也稱為地址空間。地址空間就是進程要用的所有資源。
操作系統用於維護進程記錄的結構就是進程表或進程控制塊(Process Control Block, PCB)。

進程的缺點:
1、只能在一個時間做一件事情。如果想同時做兩件或多件事情,進程就不夠用了。
2、如果進程在執行的過程中阻塞,例如等待輸入,整個進程就將掛起(暫停),而無法繼續執行。
而為了解決上述兩個問題,人們就發明了線程。
第三篇 線程原理篇

從根本上說,線程是操作系統給進程模型提供並發能力的手段。

●線程之間如何通信?
●線程之間如何同步?
如何通信(溝通)和如何同步(協調)
並發既提高了系統的效率或者說吞吐率,又改善了用戶感覺到的響應時間。
雖然線程的優勢很明顯,但帶來的問題也是顯而易見的,那就是系統運行的不確定性。
那么如何在保持線程這個概念的同時,消除其執行結果的不確定性呢?答案是線程的同步。
線程之間的同步則對程序的正確運行至關重要。
同步就是讓所有線程按照一定的規則執行,使得其正確性和效率都有跡可尋。
協調的目的就是在任何時刻都只能有一個人在臨界區里,這稱為互斥(mutualexclusion)。互斥就是說一次只有一個人使用共享資源,其他人皆排除在外,並
且互斥不能違反前面給出的進程模型。因此,正確互斥需要滿足4個條件:
●不能有兩個進程同時在臨界區里面。
●進程能夠在任何數量和速度的CPU上正確執行。
●在互斥區域外不能阻止另一個進程的運行。
●進程不能無限制地等待進入臨界區。
一個程序調用sleep后將進入休眠狀態,將釋放其所占用的CPU。一個執行wakeup的程序將發送一個信號給指定的接收進程,
信號量(semphore)就是一個計數器,其取值為當前累積的信號數量。它支持兩個操作:加法操作up和減法操作down
鎖解決了同步問題,但帶來的是循環等待。為了消除循環等待,發明了睡覺與叫醒。但睡覺與叫醒又帶來了死鎖,因此發明了信號量。
如果能夠將信號量的這些組織工作交給一個專門的構造來負責,程序員不就解脫了嗎?於是發明了管程。管程的英文單詞是monitor,即監視器的意思。它監視的就是進程或線程的同步操作。
管程就是一組子程序、變量和數據結構的組合。言下之意,把需要同步的代碼用一個管程的構造框起來,即將需要保護的代碼置於begin monitor和endmonitor之間,即可獲得同步保護。在任何時候只能有一個線程活躍在管程里面。那誰來保證這一點呢?編譯器。編譯器在看到begin monitor和end monitor時知道其間的代碼需要同步保護,在翻譯成低級代碼時就會將需要的操作系統原語添上,使得兩個線程不能同時活躍於同一個管程內。
管程的中心思想是運行一個在管程里面睡覺的線程。但是在睡覺前需要把進入管程的鎖或信號量釋放,否則在其睡覺后別的線程將無法進入管程,就會造成死鎖。
實現鎖的釋放和睡覺這兩件事情必須是原子操作,即中間不能有空當,否則將造成兩個線程同時活躍在管程里,這樣就違反了關於管程的約定。
管程里面的兩個操作wait和signal的語義分別如下:
wait(x)以原子操作完成下述3個步驟:
1)釋放鎖。
2)將本線程掛在條件變量x的等待隊列上。
3)睡覺,等待被叫醒。
signal則與我們前面講過的一樣,將等在指定條件變量上面的第1個線程叫醒。在叫醒方面,管程還提供另外一個所謂的廣播(broadcast)原語,其語義是將指定條件變量上面的所有等待線程全部叫醒。
這里需要注意的是,在一個線程調用wait、signal或者broadcast之時,該線程必須持有與管程相連的鎖。
使用各種機制動態地調整每個線程獲取鎖的優先級。這種管程就稱為MESA管程。
MESA管程的signal處理方式如下:叫醒者在發出signal后釋放鎖;被叫醒者與叫醒者同時競爭這把鎖。誰先獲得鎖,誰先執行。
管程最大的問題是對編譯器的依賴。
消息傳遞是通過同步雙方經過互相收發消息來實現。它有兩個基本操作,發送send和接收receive。它們均是操作系統的系統調用,而且既可以是阻塞調用,也可以是非阻塞調用。
-send(destination,&message);
-receive(source,&message);
那么消息傳遞有什么問題沒有?有。最大的問題就是消息丟失和身份識別。使用消息傳遞的另外一個缺點就是效率。往返發送消息存在系統消耗。另外,數據傳輸也存在延遲。如果網絡速度很慢怎么辦呢?
柵欄(barrier)是本章最后要講的一個通信原語。顧名思義,柵欄就是一個障礙。到達柵欄的線程必須停止下來,直到除去柵欄后才能往前推進。該原語主要用來對一組線程進行協調。因為有時候一組進程協同完成一個問題,所以需要所有進程都到同一個地方匯合之后一起再向前推進。
線程使用資源的順序通常如下:
1)請求資源。
2)使用資源。
3)釋放資源。

死鎖的發生必須滿足4個條件:
條件1:死鎖發生的必要條件是資源有限。
條件2:持有等待。即一個線程在請求新的資源時,其已經獲得的資源並不釋放,而是繼續持有。
條件3:不能搶占。
條件4:循環等待條件。
第四篇 內存原理篇
內存管理從根本上說是操作系統對存儲設備進行的抽象和裝扮。
通過虛擬內存這種機制,操作系統為程序員或用戶提供了4種抽象:
●程序的地址獨立性
●地址空間的保護
●內存空量的巨量或無限擴大
●內存訪問速度的大幅度提升
操作系統為實現虛擬內存而使用的“原料”卻很簡單:一點點緩存,一些主存和便宜的磁盤;其采用的機制也簡單至極:動態地址翻譯!

在這個內存的現實架構中,緩存的特點是低容量(相對主存來說)、高速度、高價格;主存的特點則是中容量、中速度和中價格;磁盤則屬於大容量、低速度、低成本的存儲媒介;磁帶則通常更持久但速度更慢。
內存管理要達到的目標:
●地址保護:一個程序不能訪問另一個程序地址空間。
●地址獨立:程序發出的地址應與物理主存地址無關。
虛擬內存的中心思想是將物理主存擴大到便宜、大容量的磁盤上,即將磁盤空間看做主存空間的一部分。
虛擬內存是操作系統發展歷史上的一個革命性突破(它也是使操作系統變得更加復雜的一個主要因素)。因為有了虛擬內存,我們編寫的程序從此不再受尺寸的限制(當然還受制於虛地址空間大小的限制)。
11.4 操作系統在內存中的位置
從根本上來說,計算機里面運轉的程序有兩種:管理計算機的程序和使用計算機的程序。
內存管理的第一個問題是操作系統本身在內存中的存放位置。應該將哪一部分的內存空間用來存放操作系統呢?或者說,我們如何將內存空間在操作系統和用戶程序之間進行分配呢?
多道編程的代價是什么呢?當然是操作系統的復雜性。因為多道編程的情況下,無法將程序總是加到固定的內存地址上,也就是無法使用靜態地址翻譯。這樣我們就必須在程序加載完畢后才能計算物理地址,也就是在程序運行時進行地址翻譯,這種翻譯稱為動態地址翻譯。

那么多道編程的內存管理是如何進行動態地址翻譯的呢?那得看內存管理的策略。多道編程下的內存管理策略有兩種:固定分區和非固定分區。
在管理內存的時候,操作系統需要知道內存空間有多少空閑。如何才能知道有哪些空閑呢?這就必須跟蹤內存的使用。跟蹤的辦法有兩種:第1種辦法是給每個分配單元賦予一個字位,用來記錄該分配單元是否閑置。
例如,字位取值0表示分配單元閑置,字位取值1則表示該分配單元已被占用。這種表示法就是所謂的位圖表示法

另外一種辦法是將分配單元按是否閑置鏈接起來,這種辦法稱為鏈表表示法。

位圖表示和鏈表表示各有優缺點。如果程序數量很少,那么鏈表比較好,因為鏈表的表項數量少。位圖表示法的空間成本是固定的,它不依賴於內存中程序的數量。
從可靠性上看,位圖表示法沒有容錯能力。
從時間成本上,位圖表示法在修改分配單元狀態時,操作很簡單,直接修改其位圖值即可,而鏈表表示法則需要對前后空間進行檢查以便做出相應的合並。
第八篇 操作系統設計篇
●保證操作系統本身運行正確。
●提供盡可能多的功能。
●盡量提高系統的效率。
●在追求效率的基礎上盡量顧及公平。

操作系統設計的第1條哲學原理:層次架構
第2條哲學原理:沒有對錯
第3條哲學原理:懶人哲學
第4條哲學原理:讓困於人
第5條哲學原理:留有余地
第6條哲學原理:子虛烏有——海市蜃樓之美
第7條哲學原理:時空轉換——滄海桑田之變
第8條哲學原理:策機分離與權利分離
第9條哲學原理:簡單為美——求於至簡,歸於永恆
第10條哲學原理:適可而止
操作系統本身並無對錯之分,只有好壞之分。
越簡單的架構效率越高。而且其正確性也比較容易確認。而復雜的東西,要證明其正確則通常頗費周折。
操作系統中策略與權力分離主要不是為了公平,而是為了實現的靈活性。
