文章來源于Java建設者?,作者cxuan
首先,操作系統(tǒng)也是一種軟件,但是操作系統(tǒng)是一種非常復雜的軟件。操作系統(tǒng)提供了幾種抽象模型:
文件:對 I/O 設備的抽象
虛擬內(nèi)存:對程序存儲器的抽象
進程:對一個正在運行程序的抽象
虛擬機:對整個操作系統(tǒng)的抽象
這些抽象和我們的日常開發(fā)息息相關。搞清楚了操作系統(tǒng)是如何抽象的,才能培養(yǎng)我們的抽象性思維和開發(fā)思路。
很多問題都和操作系統(tǒng)相關,操作系統(tǒng)是解決這些問題的基礎。如果你不學習操作系統(tǒng),可能會想著從框架層面來解決,那是你了解的還不夠深入,當你學習了操作系統(tǒng)后,能夠培養(yǎng)你的全局性思維。
學習操作系統(tǒng)我們能夠有效的解決并發(fā)問題,并發(fā)幾乎是互聯(lián)網(wǎng)的重中之重了,這也從側(cè)面說明了學習操作系統(tǒng)的重要性。
學習操作系統(tǒng)的重點不是讓你從頭制造一個操作系統(tǒng),而是告訴你「操作系統(tǒng)是如何工作的」,能夠讓你對計算機底層有所了解,打?qū)嵞愕幕A。
相信你一定清楚什么是編程
「Data structures + Algorithms = Programming」
操作系統(tǒng)內(nèi)部會涉及到眾多的數(shù)據(jù)結(jié)構(gòu)和算法描述,能夠讓你了解算法的基礎上,讓你編寫更優(yōu)秀的程序。
我認為可以把計算機比作一棟樓
計算機的底層相當于就是樓的根基,計算機應用相當于就是樓的外形,而操作系統(tǒng)就相當于是告訴你大樓的構(gòu)造原理,編寫高質(zhì)量的軟件就相當于是告訴你構(gòu)建一個穩(wěn)定的房子。
認識操作系統(tǒng)
在了解操作系統(tǒng)前,你需要先知道一下什么是計算機系統(tǒng):現(xiàn)代計算機系統(tǒng)由「一個或多個處理器、主存、打印機、鍵盤、鼠標、顯示器、網(wǎng)絡接口以及各種輸入/輸出設備構(gòu)成的系統(tǒng)」。這些都屬于硬件的范疇。我們程序員不會直接和這些硬件打交道,并且每位程序員不可能會掌握所有計算機系統(tǒng)的細節(jié)。
所以計算機科學家在硬件的基礎之上,安裝了一層軟件,這層軟件能夠根據(jù)用戶輸入的指令達到控制硬件的效果,從而滿足用戶的需求,這樣的軟件稱為?操作系統(tǒng),它的任務就是為用戶程序提供一個更好、更簡單、更清晰的計算機模型。也就是說,操作系統(tǒng)相當于是一個中間層,為用戶層和硬件提供各自的借口,屏蔽了不同應用和硬件之間的差異,達到統(tǒng)一標準的作用。
上面一個操作系統(tǒng)的簡化圖,最底層是硬件,硬件包括「芯片、電路板、磁盤、鍵盤、顯示器」等我們上面提到的設備,在硬件之上是軟件。大部分計算機有兩種運行模式:內(nèi)核態(tài)?和?用戶態(tài),軟件中最基礎的部分是操作系統(tǒng),它運行在?內(nèi)核態(tài)中。操作系統(tǒng)具有硬件的訪問權(quán),可以執(zhí)行機器能夠運行的任何指令。軟件的其余部分運行在?用戶態(tài)?下。
在大概了解到操作系統(tǒng)之后,我們先來認識一下硬件都有哪些
計算機硬件
計算機硬件是計算機的重要組成部分,其中包含了 5 個重要的組成部分:
「運算器、控制器、存儲器、輸入設備、輸出設備」。
運算器:運算器最主要的功能是對數(shù)據(jù)和信息進行加工和運算。它是計算機中執(zhí)行算數(shù)和各種邏輯運算的部件。運算器的基本運算包括加、減、乘、除、移位等操作,這些是由?算術(shù)邏輯單元(Arithmetic&logical Unit)?實現(xiàn)的。而運算器主要由算數(shù)邏輯單元和寄存器構(gòu)成。
控制器:指按照指定順序改變主電路或控制電路的部件,它主要起到了控制命令執(zhí)行的作用,完成協(xié)調(diào)和指揮整個計算機系統(tǒng)的操作??刂破魇怯沙绦蛴嫈?shù)器、指令寄存器、解碼譯碼器等構(gòu)成。
?
運算器和控制器共同組成了 CPU
?
存儲器:存儲器就是計算機的記憶設備,顧名思義,存儲器可以保存信息。存儲器分為兩種,一種是主存,也就是內(nèi)存,它是 CPU 主要交互對象,還有一種是外存,比如硬盤軟盤等。下面是現(xiàn)代計算機系統(tǒng)的存儲架構(gòu)
輸入設備:輸入設備是給計算機獲取外部信息的設備,它主要包括鍵盤和鼠標。
輸出設備:輸出設備是給用戶呈現(xiàn)根據(jù)輸入設備獲取的信息經(jīng)過一系列的計算后得到顯示的設備,它主要包括顯示器、打印機等。
這五部分也是馮諾伊曼的體系結(jié)構(gòu),它認為計算機必須具有如下功能:
把需要的程序和數(shù)據(jù)送至計算機中。必須具有長期記憶程序、數(shù)據(jù)、中間結(jié)果及最終運算結(jié)果的能力。能夠完成各種算術(shù)、邏輯運算和數(shù)據(jù)傳送等數(shù)據(jù)加工處理的能力。能夠根據(jù)需要控制程序走向,并能根據(jù)指令控制機器的各部件協(xié)調(diào)操作。能夠按照要求將處理結(jié)果輸出給用戶。
下面是一張 intel 家族產(chǎn)品圖,是一個詳細的計算機硬件分類,我們在根據(jù)圖中涉及到硬件進行介紹
總線(Buses):在整個系統(tǒng)中運行的是稱為總線的電氣管道的集合,這些總線在組件之間來回傳輸字節(jié)信息。通??偩€被設計成傳送定長的字節(jié)塊,也就是?字(word)。字中的字節(jié)數(shù)(字長)是一個基本的系統(tǒng)參數(shù),各個系統(tǒng)中都不盡相同?,F(xiàn)在大部分的字都是 4 個字節(jié)(32 位)或者 8 個字節(jié)(64 位)。
I/O 設備(I/O Devices):Input/Output 設備是系統(tǒng)和外部世界的連接。上圖中有四類 I/O 設備:用于用戶輸入的鍵盤和鼠標,用于用戶輸出的顯示器,一個磁盤驅(qū)動用來長時間的保存數(shù)據(jù)和程序。剛開始的時候,可執(zhí)行程序就保存在磁盤上。
每個I/O 設備連接 I/O 總線都被稱為控制器(controller)?或者是?適配器(Adapter)。控制器和適配器之間的主要區(qū)別在于封裝方式??刂破魇?I/O 設備本身或者系統(tǒng)的主印制板電路(通常稱作主板)上的芯片組。而適配器則是一塊插在主板插槽上的卡。無論組織形式如何,它們的最終目的都是彼此交換信息。
主存(Main Memory),主存是一個臨時存儲設備,而不是永久性存儲,磁盤是?永久性存儲?的設備。主存既保存程序,又保存處理器執(zhí)行流程所處理的數(shù)據(jù)。從物理組成上說,主存是由一系列?DRAM(dynamic random access memory)動態(tài)隨機存儲構(gòu)成的集合。邏輯上說,內(nèi)存就是一個線性的字節(jié)數(shù)組,有它唯一的地址編號,從 0 開始。一般來說,組成程序的每條機器指令都由不同數(shù)量的字節(jié)構(gòu)成,C 程序變量相對應的數(shù)據(jù)項的大小根據(jù)類型進行變化。比如,在 Linux 的 x86-64 機器上,short 類型的數(shù)據(jù)需要 2 個字節(jié),int 和 float 需要 4 個字節(jié),而 long 和 double 需要 8 個字節(jié)。
處理器(Processor),CPU(central processing unit)?或者簡單的處理器,是解釋(并執(zhí)行)存儲在主存儲器中的指令的引擎。處理器的核心大小為一個字的存儲設備(或寄存器),稱為程序計數(shù)器(PC)。在任何時刻,PC 都指向主存中的某條機器語言指令(即含有該條指令的地址)。
從系統(tǒng)通電開始,直到系統(tǒng)斷電,處理器一直在不斷地執(zhí)行程序計數(shù)器指向的指令,再更新程序計數(shù)器,使其指向下一條指令。處理器根據(jù)其指令集體系結(jié)構(gòu)定義的指令模型進行操作。在這個模型中,指令按照嚴格的順序執(zhí)行,執(zhí)行一條指令涉及執(zhí)行一系列的步驟。處理器從程序計數(shù)器指向的內(nèi)存中讀取指令,解釋指令中的位,執(zhí)行該指令指示的一些簡單操作,然后更新程序計數(shù)器以指向下一條指令。指令與指令之間可能連續(xù),可能不連續(xù)(比如 jmp 指令就不會順序讀?。?/p>
下面是 CPU 可能執(zhí)行簡單操作的幾個步驟:
加載(Load):從主存中拷貝一個字節(jié)或者一個字到內(nèi)存中,覆蓋寄存器先前的內(nèi)容
存儲(Store):將寄存器中的字節(jié)或字復制到主存儲器中的某個位置,從而覆蓋該位置的先前內(nèi)容
操作(Operate):把兩個寄存器的內(nèi)容復制到?ALU(Arithmetic logic unit)。把兩個字進行算術(shù)運算,并把結(jié)果存儲在寄存器中,重寫寄存器先前的內(nèi)容。
?
算術(shù)邏輯單元(ALU)是對數(shù)字二進制數(shù)執(zhí)行算術(shù)和按位運算的組合數(shù)字電子電路。
?
跳轉(zhuǎn)(jump):從指令中抽取一個字,把這個字復制到程序計數(shù)器(PC)?中,覆蓋原來的值