(路徑名轉換成的文件所在磁盤(pán)地址的結果也可以保存緩存中以避免重復尋址)有圖形界面的操作系統被稱(chēng)為圖形用戶(hù)界面GUI基于文本命令行的通常稱(chēng)為Shell
帶有圖形界面的操作系統被稱(chēng)為 圖形用戶(hù)界面(Graphical User Interface, GUI),而基于文本、命令行的通常稱(chēng)為 Shell
https://m.toutiaocdn.com/i6790914684917645835/?app=news_article×tamp=1598778579&use_new_style=1&req_id=202008301709390101290480362483208E&group_id=6790914684917645835
操作系統
現代操作系統由一個(gè)或多個(gè)處理器、主存、打印機、鍵盤(pán)、鼠標、顯示器、網(wǎng)絡(luò )接口以及各種輸入/輸出設備構成。計算機操作系統是一個(gè)復雜的系統。
然而,程序員不會(huì )直接和這些硬件打交道,而且每位程序員不可能會(huì )掌握所有操作系統的細節,這樣我們就不用再編寫(xiě)代碼了,所以在硬件的基礎之上,計算機安裝了一層軟件,這層軟件能夠通過(guò)響應用戶(hù)輸入的指令達到控制硬件的效果,從而滿(mǎn)足用戶(hù)需求,這種軟件稱(chēng)之為 操作系統,它的任務(wù)就是為用戶(hù)程序提供一個(gè)更好、更簡(jiǎn)單、更清晰的計算機模型。
我們一般常見(jiàn)的操作系統主要有 Windows、Linux、FreeBSD 或 OS X ,這種帶有圖形界面的操作系統被稱(chēng)為 圖形用戶(hù)界面(Graphical User Interface, GUI),而基于文本、命令行的通常稱(chēng)為 Shell。下面是我們所要探討的操作系統的部件
這是一個(gè)操作系統的簡(jiǎn)化圖,最下面的是硬件,硬件包括芯片、電路板、磁盤(pán)、鍵盤(pán)、顯示器等我們上面提到的設備,在硬件之上是軟件。大部分計算機有兩種運行模式:內核態(tài) 和 用戶(hù)態(tài),軟件中最基礎的部分是操作系統,它運行在 內核態(tài) 中,內核態(tài)也稱(chēng)為 管態(tài) 和 核心態(tài),它們都是操作系統的運行狀態(tài),只不過(guò)是不同的叫法而已。操作系統具有硬件的訪(fǎng)問(wèn)權,可以執行機器能夠運行的任何指令。軟件的其余部分運行在 用戶(hù)態(tài) 下。
用戶(hù)接口程序(shell 或者 GUI)處于用戶(hù)態(tài)中,并且它們位于用戶(hù)態(tài)的最低層,允許用戶(hù)運行其他程序,例如 Web 瀏覽器、電子郵件閱讀器、音樂(lè )播放器等。而且,越靠近用戶(hù)態(tài)的應用程序越容易編寫(xiě),如果你不喜歡某個(gè)電子郵件閱讀器你可以重新寫(xiě)一個(gè)或者換一個(gè),但你不能自行寫(xiě)一個(gè)操作系統或者是中斷處理程序。這個(gè)程序由硬件保護,防止外部對其進(jìn)行修改。
操作系統與運行操作系統的內核硬件關(guān)系密切。操作系統擴展了計算機指令集并管理計算機的資源。因此,操作系統因此必須足夠了解硬件的運行,這里我們先簡(jiǎn)要介紹一下現代計算機中的計算機硬件。
從概念上來(lái)看,一臺簡(jiǎn)單的個(gè)人電腦可以被抽象為上面這種相似的模型,CPU、內存、I/O 設備都和總線(xiàn)串聯(lián)起來(lái)并通過(guò)總線(xiàn)與其他設備進(jìn)行通信?,F代操作系統有著(zhù)更為復雜的結構,會(huì )設計很多條總線(xiàn),我們稍后會(huì )看到。暫時(shí)來(lái)講,這個(gè)模型能夠滿(mǎn)足我們的討論。
CPU 是計算機的大腦,它主要和內存進(jìn)行交互,從內存中提取指令并執行它。一個(gè) CPU 的執行周期是從內存中提取第一條指令、解碼并決定它的類(lèi)型和操作數,執行,然后再提取、解碼執行后續的指令。重復該循環(huán)直到程序運行完畢。
每個(gè) CPU 都有一組可以執行的特定指令集。因此,x86 的 CPU 不能執行 ARM 的程序并且 ARM 的 CPU 也不能執行 x86 的程序。由于訪(fǎng)問(wèn)內存獲取執行或數據要比執行指令花費的時(shí)間長(cháng),因此所有的 CPU 內部都會(huì )包含一些寄存器來(lái)保存關(guān)鍵變量和臨時(shí)結果。因此,在指令集中通常會(huì )有一些指令用于把關(guān)鍵字從內存中加載到寄存器中,以及把關(guān)鍵字從寄存器存入到內存中。還有一些其他的指令會(huì )把來(lái)自寄存器和內存的操作數進(jìn)行組合,例如 add 操作就會(huì )把兩個(gè)操作數相加并把結果保存到內存中。
除了用于保存變量和臨時(shí)結果的通用寄存器外,大多數計算機還具有幾個(gè)特殊的寄存器,這些寄存器對于程序員是可見(jiàn)的。其中之一就是 程序計數器(program counter),程序計數器會(huì )指示下一條需要從內存提取指令的地址。提取指令后,程序計數器將更新為下一條需要提取的地址。
另一個(gè)寄存器是 堆棧指針(stack pointer),它指向內存中當前棧的頂端。堆棧指針會(huì )包含輸入過(guò)程中的有關(guān)參數、局部變量以及沒(méi)有保存在寄存器中的臨時(shí)變量。
還有一個(gè)寄存器是 PSW(Program Status Word) 程序狀態(tài)字寄存器,這個(gè)寄存器是由操作系統維護的8個(gè)字節(64位) long 類(lèi)型的數據集合。它會(huì )跟蹤當前系統的狀態(tài)。除非發(fā)生系統結束,否則我們可以忽略 PSW 。用戶(hù)程序通??梢宰x取整個(gè)PSW,但通常只能寫(xiě)入其某些字段。PSW 在系統調用和 I / O 中起著(zhù)重要作用。
操作系統必須了解所有的寄存器。在時(shí)間多路復用(time multiplexing) 的 CPU 中,操作系統往往停止運行一個(gè)程序轉而運行另外一個(gè)。每次當操作系統停止運行一個(gè)程序時(shí),操作系統會(huì )保存所有寄存器的值,以便于后續重新運行該程序。
為了提升性能, CPU 設計人員早就放棄了同時(shí)去讀取、解碼和執行一條簡(jiǎn)單的指令。許多現代的 CPU 都具有同時(shí)讀取多條指令的機制。例如,一個(gè) CPU 可能會(huì )有單獨訪(fǎng)問(wèn)、解碼和執行單元,所以,當 CPU 執行第 N 條指令時(shí),還可以對 N + 1 條指令解碼,還可以讀取 N + 2 條指令。像這樣的組織形式被稱(chēng)為 流水線(xiàn)(pipeline),
比流水線(xiàn)更先進(jìn)的設計是 超標量(superscalar)CPU,下面是超標量 CPU 的設計

在上面這個(gè)設計中,存在多個(gè)執行單元,例如,一個(gè)用來(lái)進(jìn)行整數運算、一個(gè)用來(lái)浮點(diǎn)數運算、一個(gè)用來(lái)布爾運算。兩個(gè)或者更多的指令被一次性取出、解碼并放入緩沖區中,直至它們執行完畢。只要一個(gè)執行單元空閑,就會(huì )去檢查緩沖區是否有可以執行的指令。如果有,就把指令從緩沖區中取出并執行。這種設計的含義是應用程序通常是無(wú)序執行的。在大多數情況下,硬件負責保證這種運算的結果與順序執行指令時(shí)的結果相同。
除了用在嵌入式系統中非常簡(jiǎn)單的 CPU 之外,多數 CPU 都有兩種模式,即前面已經(jīng)提到的內核態(tài)和用戶(hù)態(tài)。通常情況下,PSW 寄存器中的一個(gè)二進(jìn)制位會(huì )控制當前狀態(tài)是內核態(tài)還是用戶(hù)態(tài)。當運行在內核態(tài)時(shí),CPU 能夠執行任何指令集中的指令并且能夠使用硬件的功能。在臺式機和服務(wù)器上,操作系統通常以?xún)群四J竭\行,從而可以訪(fǎng)問(wèn)完整的硬件。在大多數嵌入式系統中,一部分運行在內核態(tài)下,剩下的一部分運行在用戶(hù)態(tài)下。
用戶(hù)應用程序通常運行在用戶(hù)態(tài)下,在用戶(hù)態(tài)下,CPU 只能執行指令集中的一部分并且只能訪(fǎng)問(wèn)硬件的一部分功能。一般情況下,在用戶(hù)態(tài)下,有關(guān) I/O 和內存保護的所有指令是禁止執行的。當然,設置 PSW 模式的二進(jìn)制位為內核態(tài)也是禁止的。
為了獲取操作系統的服務(wù),用戶(hù)程序必須使用 系統調用(system call),系統調用會(huì )轉換為內核態(tài)并且調用操作系統。TRAP 指令用于把用戶(hù)態(tài)切換為內核態(tài)并啟用操作系統。當有關(guān)工作完成之后,在系統調用后面的指令會(huì )把控制權交給用戶(hù)程序。我們會(huì )在后面探討操作系統的調用細節。
需要注意的是操作系統在進(jìn)行系統調用時(shí)會(huì )存在陷阱。大部分的陷阱會(huì )導致硬件發(fā)出警告,比如說(shuō)試圖被零除或浮點(diǎn)下溢等你。在所有的情況下,操作系統都能得到控制權并決定如何處理異常情況。有時(shí),由于出錯的原因,程序不得不停止。
Intel Pentinum 4也就是奔騰處理器引入了被稱(chēng)為多線(xiàn)程(multithreading) 或 超線(xiàn)程(hyperthreading, Intel 公司的命名) 的特性,x86 處理器和其他一些 CPU 芯片就是這樣做的。包括 SSPARC、Power5、Intel Xeon 和 Intel Core 系列 。近似地說(shuō),多線(xiàn)程允許 CPU 保持兩個(gè)不同的線(xiàn)程狀態(tài)并且在納秒級(nanosecond) 的時(shí)間完成切換。線(xiàn)程是一種輕量級的進(jìn)程,我們會(huì )在后面說(shuō)到。例如,如果一個(gè)進(jìn)程想要從內存中讀取指令(這通常會(huì )經(jīng)歷幾個(gè)時(shí)鐘周期),多線(xiàn)程 CPU 則可以切換至另一個(gè)線(xiàn)程。多線(xiàn)程不會(huì )提供真正的并行處理。在一個(gè)時(shí)刻只有一個(gè)進(jìn)程在運行。
對于操作系統來(lái)講,多線(xiàn)程是有意義的,因為每個(gè)線(xiàn)程對操作系統來(lái)說(shuō)都像是一個(gè)單個(gè)的 CPU。比如一個(gè)有兩個(gè) CPU 的操作系統,并且每個(gè) CPU 運行兩個(gè)線(xiàn)程,那么這對于操作系統來(lái)說(shuō)就可能是 4 個(gè) CPU。
除了多線(xiàn)程之外,現在許多 CPU 芯片上都具有四個(gè)、八個(gè)或更多完整的處理器或內核。多核芯片在其上有效地承載了四個(gè)微型芯片,每個(gè)微型芯片都有自己的獨立CPU。


如果要說(shuō)在絕對核心數量方面,沒(méi)有什么能贏(yíng)過(guò)現代 GPU(Graphics Processing Unit),GPU 是指由成千上萬(wàn)個(gè)微核組成的處理器。它們擅長(cháng)處理大量并行的簡(jiǎn)單計算。
計算機中第二個(gè)主要的組件就是內存。理想情況下,內存應該非??焖?比執行一條指令要快,從而不會(huì )拖慢 CPU 執行效率),而且足夠大且便宜,但是目前的技術(shù)手段無(wú)法滿(mǎn)足三者的需求。于是采用了不同的處理方式,存儲器系統采用一種分層次的結構

頂層的存儲器速度最高,但是容量最小,成本非常高,層級結構越向下,其訪(fǎng)問(wèn)效率越慢,容量越大,但是造價(jià)也就越便宜。
存儲器的頂層是 CPU 中的寄存器,它們用和 CPU 一樣的材料制成,所以和 CPU 一樣快。程序必須在軟件中自行管理這些寄存器(即決定如何使用它們)
位于寄存器下面的是高速緩存,它多數由硬件控制。主存被分割成高速緩存行(cache lines) 為 64 字節,內存地址的 0 - 63 對應高速緩存行 0 ,地址 64 - 127 對應高速緩存行的 1,等等。使用最頻繁的高速緩存行保存在位于 CPU 內部或非??拷?CPU 的高速緩存中。當應用程序需要從內存中讀取關(guān)鍵詞的時(shí)候,高速緩存的硬件會(huì )檢查所需要的高速緩存行是否在高速緩存中。如果在的話(huà),那么這就是高速緩存命中(cache hit)。高速緩存滿(mǎn)足了該請求,并且沒(méi)有通過(guò)總線(xiàn)將內存請求發(fā)送到主內存。高速緩存命中通常需要花費兩個(gè)時(shí)鐘周期。緩存未命中需要從內存中提取,這會(huì )消耗大量的時(shí)間。高速緩存行會(huì )限制容量的大小因為它的造價(jià)非常昂貴。有一些機器會(huì )有兩個(gè)或者三個(gè)高速緩存級別,每一級高速緩存比前一級慢且容量更大。
緩存在計算機很多領(lǐng)域都扮演了非常重要的角色,不僅僅是 RAM 緩存行。
隨機存儲器(RAM): 內存中最重要的一種,表示既可以從中讀取數據,也可以寫(xiě)入數據。當機器關(guān)閉時(shí),內存中的信息會(huì ) 丟失。
大量的可用資源被劃分為小的部分,這些可用資源的一部分會(huì )獲得比其他資源更頻繁的使用權,緩存經(jīng)常用來(lái)提升性能。操作系統無(wú)時(shí)無(wú)刻的不在使用緩存。例如,大多數操作系統在主機內存中保留(部分)頻繁使用的文件,以避免重復從磁盤(pán)重復獲取。舉個(gè)例子,類(lèi)似于 /home/ast/projects/minix3/src/kernel/clock.c 這樣的場(chǎng)路徑名轉換成的文件所在磁盤(pán)地址的結果也可以保存緩存中,以避免重復尋址。另外,當一個(gè) Web 頁(yè)面(URL) 的地址轉換為網(wǎng)絡(luò )地址(IP地址)后,這個(gè)轉換結果也可以緩存起來(lái)供將來(lái)使用。
在任何緩存系統中,都會(huì )有下面這幾個(gè)噬需解決的問(wèn)題
并不是每個(gè)問(wèn)題都與每種緩存情況有關(guān)。對于 CPU 緩存中的主存緩存行,當有緩存未命中時(shí),就會(huì )調入新的內容。通常通過(guò)所引用內存地址的高位計算應該使用的緩存行。
緩存是解決問(wèn)題的一種好的方式,所以現代 CPU 設計了兩種緩存。第一級緩存或者說(shuō)是 L1 cache 總是位于 CPU 內部,用來(lái)將已解碼的指令調入 CPU 的執行引擎。對于那些頻繁使用的關(guān)鍵字,多數芯片有第二個(gè) L1 cache 。典型的 L1 cache 的大小為 16 KB。另外,往往還設有二級緩存,也就是 L2 cache,用來(lái)存放最近使用過(guò)的關(guān)鍵字,一般是兆字節為單位。L1 cache 和 L2 cache 最大的不同在于是否存在延遲。訪(fǎng)問(wèn) L1 cache 沒(méi)有任何的延遲,然而訪(fǎng)問(wèn) L2 cache 會(huì )有 1 - 2 個(gè)時(shí)鐘周期的延后。
什么是時(shí)鐘周期?計算機處理器或 CPU 的速度由時(shí)鐘周期來(lái)確定,該時(shí)鐘周期是振蕩器兩個(gè)脈沖之間的時(shí)間量。一般而言,每秒脈沖數越高,計算機處理器處理信息的速度就越快。 時(shí)鐘速度以 Hz 為單位測量,通常為兆赫(MHz)或千兆赫(GHz)。 例如,一個(gè)4 GHz處理器每秒執行4,000,000,000個(gè)時(shí)鐘周期。
計算機處理器可以在每個(gè)時(shí)鐘周期執行一條或多條指令,這具體取決于處理器的類(lèi)型。 早期的計算機處理器和較慢的 CPU 在每個(gè)時(shí)鐘周期只能執行一條指令,而現代處理器在每個(gè)時(shí)鐘周期可以執行多條指令。
在上面的層次結構中再下一層是主存,這是內存系統的主力軍,主存通常叫做 RAM(Random Access Memory),由于 1950 年代和 1960 年代的計算機使用微小的可磁化鐵氧體磁芯作為主存儲器,因此舊時(shí)有時(shí)將其稱(chēng)為核心存儲器。所有不能再高速緩存中得到滿(mǎn)足的內存訪(fǎng)問(wèn)請求都會(huì )轉往主存中。
除了主存之外,許多計算機還具有少量的非易失性隨機存取存儲器。它們與 RAM 不同,在電源斷電后,非易失性隨機訪(fǎng)問(wèn)存儲器并不會(huì )丟失內容。ROM(Read Only Memory) 中的內容一旦存儲后就不會(huì )再被修改。它非??於冶阋?。(如果有人問(wèn)你,有沒(méi)有什么又快又便宜的內存設備,那就是 ROM 了)在計算機中,用于啟動(dòng)計算機的引導加載模塊(也就是 bootstrap )就存放在 ROM 中。另外,一些 I/O 卡也采用 ROM 處理底層設備控制。
EEPROM(Electrically Erasable PROM,) 和 閃存(flash memory) 也是非易失性的,但是與 ROM 相反,它們可以擦除和重寫(xiě)。不過(guò)重寫(xiě)它們需要比寫(xiě)入 RAM 更多的時(shí)間,所以它們的使用方式與 ROM 相同,但是與 ROM 不同的是他們可以通過(guò)重寫(xiě)字段來(lái)糾正程序中出現的錯誤。
閃存也通常用來(lái)作為便攜性的存儲媒介。閃存是數碼相機中的膠卷,是便攜式音樂(lè )播放器的磁盤(pán)。閃存的速度介于 RAM 和磁盤(pán)之間。另外,與磁盤(pán)存儲器不同的是,如果閃存擦除的次數太多,會(huì )出現磨損。
還有一類(lèi)是 CMOS,它是易失性的。許多計算機都會(huì )使用 CMOS 存儲器保持當前時(shí)間和日期。
下一個(gè)層次是磁盤(pán)(硬盤(pán)),磁盤(pán)同 RAM 相比,每個(gè)二進(jìn)制位的成本低了兩個(gè)數量級,而且經(jīng)常也有兩個(gè)數量級大的容量。磁盤(pán)唯一的問(wèn)題是隨機訪(fǎng)問(wèn)數據時(shí)間大約慢了三個(gè)數量級。磁盤(pán)訪(fǎng)問(wèn)慢的原因是因為磁盤(pán)的構造不同

磁盤(pán)是一種機械裝置,在一個(gè)磁盤(pán)中有一個(gè)或多個(gè)金屬盤(pán)片,它們以 5400rpm、7200rpm、10800rpm 或更高的速度旋轉。從邊緣開(kāi)始有一個(gè)機械臂懸橫在盤(pán)面上,這類(lèi)似于老式播放塑料唱片 33 轉唱機上的拾音臂。信息會(huì )寫(xiě)在磁盤(pán)一系列的同心圓上。在任意一個(gè)給定臂的位置,每個(gè)磁頭可以讀取一段環(huán)形區域,稱(chēng)為磁道(track)。把一個(gè)給定臂的位置上的所有磁道合并起來(lái),組成了一個(gè)柱面(cylinder)。

每個(gè)磁道劃分若干扇區,扇區的值是 512 字節。在現代磁盤(pán)中,較外部的柱面比較內部的柱面有更多的扇區。機械臂從一個(gè)柱面移動(dòng)到相鄰的柱面大約需要 1ms。而隨機移到一個(gè)柱面的典型時(shí)間為 5ms 至 10ms,具體情況以驅動(dòng)器為準。一旦磁臂到達正確的磁道上,驅動(dòng)器必須等待所需的扇區旋轉到磁頭之下,就開(kāi)始讀寫(xiě),低端硬盤(pán)的速率是50MB/s,而高速磁盤(pán)的速率是 160MB/s。
需要注意,固態(tài)硬盤(pán)(Solid State Disk, SSD)不是磁盤(pán),固態(tài)硬盤(pán)并沒(méi)有可以移動(dòng)的部分,外形也不像唱片,并且數據是存儲在存儲器(閃存)中,與磁盤(pán)唯一的相似之處就是它也存儲了大量即使在電源關(guān)閉也不會(huì )丟失的數據。
許多計算機支持一種著(zhù)名的虛擬內存機制,這種機制使得期望運行的存儲空間大于實(shí)際的物理存儲空間。其方法是將程序放在磁盤(pán)上,而將主存作為一部分緩存,用來(lái)保存最頻繁使用的部分程序,這種機制需要快速映像內存地址,用來(lái)把程序生成的地址轉換為有關(guān)字節在 RAM 中的物理地址。這種映像由 CPU 中的一個(gè)稱(chēng)為 存儲器管理單元(Memory Management Unit, MMU) 的部件來(lái)完成。

緩存和 MMU 的出現是對系統的性能有很重要的影響,在多道程序系統中,從一個(gè)程序切換到另一個(gè)程序的機制稱(chēng)為 上下文切換(context switch),對來(lái)自緩存中的資源進(jìn)行修改并把其寫(xiě)回磁盤(pán)是很有必要的。
CPU 和存儲器不是操作系統需要管理的全部,I/O 設備也與操作系統關(guān)系密切??梢詤⒖忌厦孢@個(gè)圖片,I/O 設備一般包括兩個(gè)部分:設備控制器和設備本身??刂破鞅旧硎且粔K芯片或者一組芯片,它能夠控制物理設備。它能夠接收操作系統的指令,例如,從設備中讀取數據并完成數據的處理。
在許多情況下,實(shí)際控制設備的過(guò)程是非常復雜而且存在諸多細節。因此控制器的工作就是為操作系統提供一個(gè)更簡(jiǎn)單(但仍然非常復雜)的接口。也就是屏蔽物理細節。任何復雜的東西都可以加一層代理來(lái)解決,這是計算機或者人類(lèi)社會(huì )很普世的一個(gè)解決方案
I/O 設備另一部分是設備本身,設備本身有一個(gè)相對簡(jiǎn)單的接口,這是因為接口既不能做很多工作,而且也已經(jīng)被標準化了。例如,標準化后任何一個(gè) SATA 磁盤(pán)控制器就可以適配任意一種 SATA 磁盤(pán),所以標準化是必要的。ATA 代表 高級技術(shù)附件(AT Attachment),而 SATA 表示串行高級技術(shù)附件(Serial ATA)。
AT 是啥?它是 IBM 公司的第二代個(gè)人計算機的高級技術(shù)成果,使用 1984 年推出的 6MHz 80286 處理器,這個(gè)處理器是當時(shí)最強大的。
像是高級這種詞匯應該慎用,否則 20 年后再回首很可能會(huì )被無(wú)情打臉。
現在 SATA 是很多計算機的標準硬盤(pán)接口。由于實(shí)際的設備接口隱藏在控制器中,所以操作系統看到的是對控制器的接口,這個(gè)接口和設備接口有很大區別。
每種類(lèi)型的設備控制器都是不同的,所以需要不同的軟件進(jìn)行控制。專(zhuān)門(mén)與控制器進(jìn)行信息交流,發(fā)出命令處理指令接收響應的軟件,稱(chēng)為 設備驅動(dòng)程序(device driver)。 每個(gè)控制器廠(chǎng)家都應該針對不同的操作系統提供不同的設備驅動(dòng)程序。
為了使設備驅動(dòng)程序能夠工作,必須把它安裝在操作系統中,這樣能夠使它在內核態(tài)中運行。要將設備驅動(dòng)程序裝入操作系統,一般有三個(gè)途徑
每個(gè)設備控制器都有少量用于通信的寄存器,例如,一個(gè)最小的磁盤(pán)控制器也會(huì )有用于指定磁盤(pán)地址、內存地址、扇區計數的寄存器。要激活控制器,設備驅動(dòng)程序回從操作系統獲取一條指令,然后翻譯成對應的值,并寫(xiě)入設備寄存器中,所有設備寄存器的結合構成了 I/O 端口空間 。
在一些計算機中,設備寄存器會(huì )被映射到操作系統的可用地址空間,使他們能夠向內存一樣完成讀寫(xiě)操作。在這種計算機中,不需要專(zhuān)門(mén)的 I/O 指令,用戶(hù)程序可以被硬件阻擋在外,防止其接觸這些存儲器地址(例如,采用基址寄存器和變址寄存器)。在另一些計算機中,設備寄存器被放入一個(gè)專(zhuān)門(mén)的 I/O 端口空間,每個(gè)寄存器都有一個(gè)端口地址。在這些計算機中,特殊的 IN 和 OUT 指令會(huì )在內核態(tài)下啟用,它能夠允許設備驅動(dòng)程序和寄存器進(jìn)行讀寫(xiě)。前面第一種方式會(huì )限制特殊的 I/O 指令但是允許一些地址空間;后者不需要地址空間但是需要特殊的指令,這兩種應用都很廣泛。
實(shí)現輸入和輸出的方式有三種。
在操作系統中,中斷是非常重要的,所以這需要更加細致的討論一下。

如上圖所示,這是一個(gè)三步的 I/O 過(guò)程,第一步,設備驅動(dòng)程序會(huì )通過(guò)寫(xiě)入設備寄存器告訴控制器應該做什么。然后,控制器啟動(dòng)設備。當控制器完成讀取或寫(xiě)入被告知需要傳輸的字節后,它會(huì )在步驟 2 中使用某些總線(xiàn)向中斷控制器發(fā)送信號。如果中斷控制器準備好了接收中斷信號(如果正忙于一個(gè)優(yōu)先級較高的中斷,則可能不會(huì )接收),那么它就會(huì )在 CPU 的一個(gè)引腳上面聲明。這就是步驟3

在第四步中,中斷控制器把該設備的編號放在總線(xiàn)上,這樣 CPU 可以讀取總線(xiàn),并且知道哪個(gè)設備完成了操作(可能同時(shí)有多個(gè)設備同時(shí)運行)。
一旦 CPU 決定去實(shí)施中斷后,程序計數器和 PSW 就會(huì )被壓入到當前堆棧中并且 CPU 會(huì )切換到內核態(tài)。設備編號可以作為內存的一個(gè)引用,用來(lái)尋找該設備中斷處理程序的地址。這部分內存稱(chēng)作中斷向量(interrupt vector)。一旦中斷處理程序(中斷設備的設備驅動(dòng)程序的一部分)開(kāi)始后,它會(huì )移除棧中的程序計數器和 PSW 寄存器,并把它們進(jìn)行保存,然后查詢(xún)設備的狀態(tài)。在中斷處理程序全部完成后,它會(huì )返回到先前用戶(hù)程序尚未執行的第一條指令,這個(gè)過(guò)程如下

當另一個(gè)中斷處理程序正在運行時(shí),中斷可能(并且經(jīng)常)發(fā)生在不合宜的時(shí)間。 因此,CPU 可以禁用中斷,并且可以在之后重啟中斷。在 CPU 關(guān)閉中斷后,任何已經(jīng)發(fā)出中斷的設備,可以繼續保持其中斷信號處理,但是 CPU 不會(huì )中斷,直至中斷再次啟用為止。如果在關(guān)閉中斷時(shí),已經(jīng)有多個(gè)設備發(fā)出了中斷信號,中斷控制器將決定優(yōu)先處理哪個(gè)中斷,通常這取決于事先賦予每個(gè)設備的優(yōu)先級,最高優(yōu)先級的設備優(yōu)先贏(yíng)得中斷權,其他設備則必須等待。
上面的結構(簡(jiǎn)單個(gè)人計算機的組件圖)在小型計算機已經(jīng)使用了多年,并用在早期的 IBM PC 中。然而,隨著(zhù)處理器核內存變得越來(lái)越快,單個(gè)總線(xiàn)處理所有請求的能力也達到了上線(xiàn),其中也包括 IBM PC 總線(xiàn)。必須放棄使用這種模式。其結果導致了其他總線(xiàn)的出現,它們處理 I/O 設備以及 CPU 到存儲器的速度都更快。這種演變的結果導致了下面這種結構的出現。

上圖中的 x86 系統包含很多總線(xiàn),高速緩存、內存、PCIe、PCI、USB、SATA 和 DMI,每條總線(xiàn)都有不同的傳輸速率和功能。操作系統必須了解所有的總線(xiàn)配置和管理。其中最主要的總線(xiàn)是 PCIe(Peripheral Component Interconnect Express) 總線(xiàn)。
Intel 發(fā)明的 PCIe 總線(xiàn)也是作為之前古老的 PCI 總線(xiàn)的繼承者,而古老的 PCI 總線(xiàn)也是為了取代古董級別的 ISA(Industry Standard Architecture) 總線(xiàn)而設立的。數十 Gb/s 的傳輸能力使得 PCIe 比它的前身快很多,而且它們本質(zhì)上也十分不同。直到發(fā)明 PCIe 的 2004 年,大多數總線(xiàn)都是并行且共享的。共享總線(xiàn)架構(shared bus architeture) 表示多個(gè)設備使用一些相同的電線(xiàn)傳輸數據。因此,當多個(gè)設備同時(shí)發(fā)送數據時(shí),此時(shí)你需要一個(gè)決策者來(lái)決定誰(shuí)能夠使用總線(xiàn)。而 PCIe 則不一樣,它使用專(zhuān)門(mén)的端到端鏈路。傳統 PCI 中使用的并行總線(xiàn)架構(parallel bus architecture) 表示通過(guò)多條電線(xiàn)發(fā)送相同的數據字。例如,在傳統的 PCI 總線(xiàn)上,一個(gè) 32 位數據通過(guò) 32 條并行的電線(xiàn)發(fā)送。而 PCIe 則不同,它選用了串行總線(xiàn)架構(serial bus architecture),并通過(guò)單個(gè)連接(稱(chēng)為通道)發(fā)送消息中的所有比特數據,就像網(wǎng)絡(luò )數據包一樣。這樣做會(huì )簡(jiǎn)化很多,因為不再確保所有 32 位數據在同一時(shí)刻準確到達相同的目的地。通過(guò)將多個(gè)數據通路并行起來(lái),并行性仍可以有效利用。例如,可以使用 32 條數據通道并行傳輸 32 條消息。
在上圖結構中,CPU 通過(guò) DDR3 總線(xiàn)與內存對話(huà),通過(guò) PCIe 總線(xiàn)與外圍圖形設備 (GPU)對話(huà),通過(guò) DMI(Direct Media Interface)總線(xiàn)經(jīng)集成中心與所有其他設備對話(huà)。而集成控制中心通過(guò)串行總線(xiàn)與 USB 設備對話(huà),通過(guò) SATA 總線(xiàn)與硬盤(pán)和 DVD 驅動(dòng)器對話(huà),通過(guò) PCIe 傳輸以太網(wǎng)絡(luò )幀。
不僅如此,每一個(gè)核
USB(Univversal Serial Bus) 是用來(lái)將所有慢速 I/O 設備(比如鍵盤(pán)和鼠標)與計算機相連的設備。USB 1.0 可以處理總計 12 Mb/s 的負載,而 USB 2.0 將總線(xiàn)速度提高到 480Mb/s ,而 USB 3.0 能達到不小于 5Gb/s 的速率。所有的 USB 設備都可以直接連接到計算機并能夠立刻開(kāi)始工作,而不像之前那樣要求重啟計算機。
SCSI(Small Computer System Interface) 總線(xiàn)是一種高速總線(xiàn),用在高速硬盤(pán),掃描儀和其他需要較大帶寬的設備上?,F在,它們主要用在服務(wù)器和工作站中,速度可以達到 640MB/s 。
那么有了上面一些硬件再加上操作系統的支持,我們的計算機就可以開(kāi)始工作了,那么計算機的啟動(dòng)過(guò)程是怎樣的呢?下面只是一個(gè)簡(jiǎn)要版的啟動(dòng)過(guò)程
在每臺計算機上有一塊雙親板,也就是母板,母板也就是主板,它是計算機最基本也就是最重要的部件之一。主板一般為矩形電路板,上面安裝了組成計算機的主要電路系統,一般有 BIOS 芯片、I/O 控制芯片、鍵盤(pán)和面板控制開(kāi)關(guān)接口、指示燈插接件、擴充插槽、主板及插卡的直流電源供電接插件等元件。
在母板上有一個(gè)稱(chēng)為 基本輸入輸出系統(Basic Input Output System, BIOS)的程序。在 BIOS 內有底層 I/O 軟件,包括讀鍵盤(pán)、寫(xiě)屏幕、磁盤(pán)I/O 以及其他過(guò)程。如今,它被保存在閃存中,它是非易失性的,但是當BIOS 中發(fā)現錯誤時(shí),可以由操作系統進(jìn)行更新。
在計算機啟動(dòng)(booted)時(shí),BIOS 開(kāi)啟,它會(huì )首先檢查所安裝的 RAM 的數量,鍵盤(pán)和其他基礎設備是否已安裝并且正常響應。接著(zhù),它開(kāi)始掃描 PCIe 和 PCI 總線(xiàn)并找出連在上面的所有設備。即插即用的設備也會(huì )被記錄下來(lái)。如果現有的設備和系統上一次啟動(dòng)時(shí)的設備不同,則新的設備將被重新配置。
藍后,BIOS 通過(guò)嘗試存儲在 CMOS 存儲器中的設備清單嘗試啟動(dòng)設備
CMOS是 Complementary Metal Oxide Semiconductor(互補金屬氧化物半導體)的縮寫(xiě)。它是指制造大規模集成電路芯片用的一種技術(shù)或用這種技術(shù)制造出來(lái)的芯片,是電腦主板上的一塊可讀寫(xiě)的 RAM 芯片。因為可讀寫(xiě)的特性,所以在電腦主板上用來(lái)保存 BIOS 設置完電腦硬件參數后的數據,這個(gè)芯片僅僅是用來(lái)存放數據的。
而對 BIOS 中各項參數的設定要通過(guò)專(zhuān)門(mén)的程序。BIOS 設置程序一般都被廠(chǎng)商整合在芯片中,在開(kāi)機時(shí)通過(guò)特定的按鍵就可進(jìn)入 BIOS 設置程序,方便地對系統進(jìn)行設置。因此 BIOS 設置有時(shí)也被叫做 CMOS 設置。
用戶(hù)可以在系統啟動(dòng)后進(jìn)入一個(gè) BIOS 配置程序,對設備清單進(jìn)行修改。然后,判斷是否能夠從外部 CD-ROM 和 USB 驅動(dòng)程序啟動(dòng),如果啟動(dòng)失敗的話(huà)(也就是沒(méi)有),系統將從硬盤(pán)啟動(dòng),boots 設備中的第一個(gè)扇區被讀入內存并執行。該扇區包含一個(gè)程序,該程序通常在引導扇區末尾檢查分區表以確定哪個(gè)分區處于活動(dòng)狀態(tài)。然后從該分區讀入第二個(gè)啟動(dòng)加載程序,該加載器從活動(dòng)分區中讀取操作系統并啟動(dòng)它。
然后操作系統會(huì )詢(xún)問(wèn) BIOS 獲取配置信息。對于每個(gè)設備來(lái)說(shuō),會(huì )檢查是否有設備驅動(dòng)程序。如果沒(méi)有,則會(huì )向用戶(hù)詢(xún)問(wèn)是否需要插入 CD-ROM 驅動(dòng)(由設備制造商提供)或者從 Internet 上下載。一旦有了設備驅動(dòng)程序,操作系統會(huì )把它們加載到內核中,然后初始化表,創(chuàng )建所需的后臺進(jìn)程,并啟動(dòng)登錄程序或GUI。
操作系統已經(jīng)存在了大半個(gè)世紀,在這段時(shí)期內,出現了各種類(lèi)型的操作系統,但并不是所有的操作系統都很出名,下面就羅列一些比較出名的操作系統
高端一些的操作系統是大型機操作系統,這些大型操作系統可在大型公司的數據中心找到。這些計算機的 I/O 容量與個(gè)人計算機不同。一個(gè)大型計算機有 1000 個(gè)磁盤(pán)和數百萬(wàn) G 字節的容量是很正常,如果有這樣一臺個(gè)人計算機朋友會(huì )很羨慕。大型機也在高端 Web 服務(wù)器、大型電子商務(wù)服務(wù)站點(diǎn)上。
下一個(gè)層次是服務(wù)器操作系統。它們運行在服務(wù)器上,服務(wù)器可以是大型個(gè)人計算機、工作站甚至是大型機。它們通過(guò)網(wǎng)絡(luò )為若干用戶(hù)服務(wù),并且允許用戶(hù)共享硬件和軟件資源。服務(wù)器可提供打印服務(wù)、文件服務(wù)或 Web 服務(wù)。Internet 服務(wù)商運行著(zhù)許多臺服務(wù)器機器,為用戶(hù)提供支持,使 Web 站點(diǎn)保存 Web 頁(yè)面并處理進(jìn)來(lái)的請求。典型的服務(wù)器操作系統有 Solaris、FreeBSD、Linux 和 Windows Server 201x
獲得大型計算能力的一種越來(lái)越普遍的方式是將多個(gè) CPU 連接到一個(gè)系統中。依據它們連接方式和共享方式的不同,這些系統稱(chēng)為并行計算機,多計算機或多處理器。他們需要專(zhuān)門(mén)的操作系統,不過(guò)通常采用的操作系統是配有通信、連接和一致性等專(zhuān)門(mén)功能的服務(wù)器操作系統的變體。
個(gè)人計算機中近來(lái)出現了多核芯片,所以常規的臺式機和筆記本電腦操作系統也開(kāi)始與小規模多處理器打交道,而核的數量正在與時(shí)俱進(jìn)。許多主流操作系統比如 Windows 和 Linux 都可以運行在多核處理器上。
接下來(lái)一類(lèi)是個(gè)人計算機操作系統?,F代個(gè)人計算機操作系統支持多道處理程序。在啟動(dòng)時(shí),通常有幾十個(gè)程序開(kāi)始運行,它們的功能是為單個(gè)用戶(hù)提供良好的支持。這類(lèi)系統廣泛用于字處理、電子表格、游戲和 Internet 訪(fǎng)問(wèn)。常見(jiàn)的例子是 Linux、FreeBSD、Windows 7、Windows 8 和蘋(píng)果公司的 OS X 。
隨著(zhù)硬件越來(lái)越小化,我們看到了平板電腦、智能手機和其他掌上計算機系統。掌上計算機或者 PDA(Personal Digital Assistant),個(gè)人數字助理 是一種可以握在手中操作的小型計算機。這部分市場(chǎng)已經(jīng)被谷歌的 Android 系統和蘋(píng)果的 IOS主導。
嵌入式操作系統用來(lái)控制設備的計算機中運行,這種設備不是一般意義上的計算機,并且不允許用戶(hù)安裝軟件。典型的例子有微波爐、汽車(chē)、DVD 刻錄機、移動(dòng)電話(huà)以及 MP3 播放器一類(lèi)的設備。所有的軟件都運行在 ROM 中,這意味著(zhù)應用程序之間不存在保護,從而獲得某種簡(jiǎn)化。主要的嵌入式系統有 Linux、QNX 和 VxWorks
有許多用途需要配置微小傳感器節點(diǎn)網(wǎng)絡(luò )。這些節點(diǎn)是一種可以彼此通信并且使用無(wú)線(xiàn)通信基站的微型計算機。這類(lèi)傳感器網(wǎng)絡(luò )可以用于建筑物周邊保護、國土邊界保衛、森林火災探測、氣象預測用的溫度和降水測量等。
每個(gè)傳感器節點(diǎn)是一個(gè)配有 CPU、RAM、ROM 以及一個(gè)或多個(gè)環(huán)境傳感器的實(shí)實(shí)在在的計算機。節點(diǎn)上運行一個(gè)小型但是真是的操作系統,通常這個(gè)操作系統是事件驅動(dòng)的,可以響應外部事件。
另一類(lèi)操作系統是實(shí)時(shí)操作系統,這些系統的特征是將時(shí)間作為關(guān)鍵參數。例如,在工業(yè)過(guò)程控制系統中,工廠(chǎng)中的實(shí)時(shí)計算機必須收集生產(chǎn)過(guò)程的數據并用有關(guān)數據控制機器。如果某個(gè)動(dòng)作必須要在規定的時(shí)刻發(fā)生,這就是硬實(shí)時(shí)系統??梢栽诠I(yè)控制、民用航空、軍事以及類(lèi)似應用中看到很多這樣的系統。另一類(lèi)系統是 軟實(shí)時(shí)系統,在這種系統中,雖然不希望偶爾違反最終時(shí)限,但仍可以接受,并不會(huì )引起任何永久性損害。數字音頻或多媒體系統就是這類(lèi)系統。智能手機也是軟實(shí)時(shí)系統。
最小的操作系統運行在智能卡上。智能卡是一種包含一塊 CPU 芯片的信用卡。它有非常嚴格的運行能耗和存儲空間的限制。有些卡具有單項功能,如電子支付;有些智能卡是面向 Java 的。這意味著(zhù)在智能卡的 ROM 中有一個(gè) Java 虛擬機(Java Virtual Machine, JVM)解釋器。
大部分操作系統提供了特定的基礎概念和抽象,例如進(jìn)程、地址空間、文件等,它們是需要理解的核心內容。下面我們會(huì )簡(jiǎn)要介紹一些基本概念,為了說(shuō)明這些概念,我們會(huì )不時(shí)的從 UNIX 中提出示例,相同的示例也會(huì )存在于其他系統中,我們后面會(huì )進(jìn)行介紹。
文章參考:
《現代操作系統》第四版
https://baike.baidu.com/item/操作系統/192?fr=aladdin
《Modern Operating System》forth edition
http://faculty.cs.niu.edu/~hutchins/csci360/hchnotes/psw.htm
https://www.computerhope.com/jargon/c/clockcyc.htm
《B站-操作系統》
https://www.bilibili.com/video/av9555596?from=search&seid=8107077283516919308
聯(lián)系客服