從概念上講,計算機的結構是總線型的:佈置一根總線將各類硬件設備掛在總線(Bus)上。編程
(1)全部的設備都有一個控制設備,外部設備經過控制器與CPU進行通訊。緩存
(2)全部的設備之間的通訊也須要經過總線。安全
爲了提升計算機的效率,人們又設計出了流水線結構:仿照工業流水裝配線,將計算機的功能部件分爲多個梯級,並將計算機的每條指令拆分爲一樣多個步驟,使每條指令在流水線上流動,到流水線最後一個梯級時指令執行完畢。數據結構
下圖展現了5個梯級的流水線結構,流水線上的每一個梯級均可以容納一條指令並同時執行。架構
在流水線的基礎之上,爲了進一步提升效率,人們又發明了多流水線、超標量計算和超長指令字等多指令發射機制。函數
除了指令執行單元外,計算機中的另外一個重要部件是指令的存放單元,被稱爲存儲架構。存儲架構包括了緩存、主存、磁盤、磁帶等。下圖展現了一個包括寄存器在內的5級存儲介質構成的存儲架構。spa
從寄存器到磁帶,每一級存儲媒介的訪問延遲和容量均依次增大,而價格卻依次下降。從圖中能夠看出,寄存器的訪問速度最快,容量最小,但成本卻最高;磁帶的訪問速度最慢,容量最大,可是成本卻最低。經過合理搭配,能夠造成一個性價比頗高的存儲架構。操作系統
中斷是計算機裏面的一個最爲重要的機制,它也是操做系統得到計算機控制權的根本保證。其基本原理是:設備在完成本身的任務後向CPU發出終端,CPU判斷優先級,而後肯定是否響應。若是響應,則執行中斷服務程序,並在中斷服務程序執行完後繼續執行原來的程序。下圖簡單地描述了中斷機制:翻譯
所謂抽象,就是在根本上存在但現實中不存在的東西。抽象來源於具體,但又超越具體。設計
操做系統提供的抽象來源於顯示,就是具體的計算機硬件,如CPU、內存、I/O設備等等。但又超出這些現實,給人提供了強於現實的東西,令人和應用軟件感受到更多、更好的硬件存在。
抽象不僅是操做系統提供給用戶的一個存在,它也存在於操做系統內部。操做系統內部分爲不一樣的功能模塊,而不一樣功能塊之間互相提供的也是抽象。想一想在咱們得實際開發中,是否是也遵循着這樣相似的原則?針對抽象編程?面向接口編程?依賴於抽象而不依賴於具體?
殘酷的現實:世界上的人並不是都是平等的,有些人生來佔有的資源就多,而有的人佔有的資源就不多。當有些人來了,其餘人就得讓出資源。程序亦是如此。
操做系統做爲計算機的管理者,享有着更多的方便或權限。爲了區分不一樣的程序的不一樣權限,人們發明了內核態和用戶態的概念。
內核態就是擁有資源多的狀態(或訪問資源多的狀態),也稱爲特權態。而用戶態則是非特權態,在用戶態下訪問的資源會受到限制。例如,要訪問OS的內核數據結構,如進程表等,則須要在特權態下才能作到。若是隻須要訪問用戶程序裏的數據,則在用戶態下就能夠了。
內核態:訪問資源多,但可靠性、安全性要求高,維護管理都比較複雜;
用戶態:訪問資源有限,但可靠性、安全性要求低,維護起來比較簡單;
那麼,一個程序到底應該運行在內核態仍是用戶態呢?這取決於其對資源和效率的需求;下圖展現了Windows操做系統的內核態與用戶態的界限,咱們能夠看到哪些須要在內核態下運行,哪些只在用戶態下運行。
計算機對於內核態和用戶態的識別是經過CPU的一個狀態位來實現的,這個狀態位是CPU狀態字裏面的一個字位。所謂的用戶態、內核態實際是CPU的一種狀態,而不是程序的狀態。經過設置該狀態字,可使CPU處於內核態、用戶態或者其餘的子態(有的CPU有更多種子態)。
換句話說:一個程序運行時,CPU是什麼態,這個程序就運行在什麼態。
那麼,知道了是怎麼實現的,那又是如何對用戶態的訪問進行限制的呢?在對用戶態下程序執行的每一條指令進行檢查,這種檢查又被稱爲地址翻譯,即對程序發出的每一條指令都要通過這個地址翻譯過程(你能夠將其理解爲咱們在實際開發中所做的權限管理,對用戶發出的每一個操做請求首先都通過一個Filter進行過濾),經過對翻譯的控制,就能夠限制程序對資源的訪問。
單一體結構是最先期的結構,這時整個OS是一個巨大的單一體,運行在內核態下,爲用戶提供服務,以下圖所示。
但單一體結構各功能塊之間關係複雜,修改困難,牽一髮而動全身,且容易造成循環調用形成死鎖,因而有了下面的層次關係。
將操做系統的功能分紅不一樣的層次,低層次的功能爲緊鄰其上一個層次的功能提供服務,而高層次的功能又爲更高一個層次的功能提供服務,以下圖所示。
從單一體和層次化結構的圖中能夠看出,操做系統的全部功能都在內核態下運行。可是,從用戶態轉爲內核態是有時間成本的,這樣就會形成OS的效率低下。因而,人們將操做系統的核心中的核心才放在內核態運行,其餘功能都遷移到用戶態運行,因而就有了下面的微內核結構。
進程是OS中的核心概念,它指的是一個運動中的程序。一個程序一旦在計算機裏運行起來,它就稱爲一個進程。進程與進程之間能夠進行通訊、同步、競爭,並在必定狀況下可能造成死鎖。
內存是另外一個核心概念,它是進程的存放場所。OS要作的就是對內存進行管理,使得數據讀寫高效、安全、簡單。
文件是操做系統提供的外部存儲設備的抽象,它是程序和數據的最終存放地點。OS要作的就是讓用戶的數據存放變得容易、方便和可靠。
操做系統是一個系統程序,即爲別的程序提供服務的程序。那麼,操做系統的服務是經過什麼方式提供的呢?答案就是:系統調用(System Call)。
所謂系統調用就是:操做系統提供的API,用戶經過調用這些API便可得到操做系統的服務。(想一想是否是跟咱們如今所做的什麼Web Service、WCF、WebAPI、開放API之類的一致?)例如,若是用戶程序須要進行讀磁盤的操做,在C程序代碼中可使用以下語句來操做:
result = read(fd, buffer, nbytes);
這個read函數是C語言提供的庫函數,而這個庫函數自己則是調用的操做系統的read系統調用。具體的系統調用過程不是咱們討論的重點,但咱們仍是能夠經過下圖來看看這個read系統調用的過程。
鄒恆明,《操做系統之哲學原理》,機械工業出版社