操做系統
現代操做系統由一個或多個處理器、主存、打印機、鍵盤、鼠標、顯示器、網絡接口以及各類輸入/輸出設備構成。計算機操做系統是一個複雜的系統。git
然而,程序員不會直接和這些硬件打交道,並且每位程序員不可能會掌握全部操做系統的細節,這樣咱們就不用再編寫代碼了,因此在硬件的基礎之上,計算機安裝了一層軟件,這層軟件可以經過響應用戶輸入的指令達到控制硬件的效果,從而知足用戶需求,這種軟件稱之爲 操做系統
,它的任務就是爲用戶程序提供一個更好、更簡單、更清晰的計算機模型。程序員
咱們通常常見的操做系統主要有 Windows、Linux、FreeBSD 或 OS X ,這種帶有圖形界面的操做系統被稱爲 圖形用戶界面(Graphical User Interface, GUI)
,而基於文本、命令行的一般稱爲 Shell
。下面是咱們所要探討的操做系統的部件shell
這是一個操做系統的簡化圖,最下面的是硬件,硬件包括芯片、電路板、磁盤、鍵盤、顯示器等咱們上面提到的設備,在硬件之上是軟件。大部分計算機有兩種運行模式:內核態
和 用戶態
,軟件中最基礎的部分是操做系統
,它運行在 內核態
中,內核態也稱爲 管態
和 核心態
,它們都是操做系統的運行狀態,只不過是不一樣的叫法而已。操做系統具備硬件的訪問權,能夠執行機器可以運行的任何指令。軟件的其他部分運行在 用戶態
下。bootstrap
用戶接口程序(shell 或者 GUI)
處於用戶態中,而且它們位於用戶態的最低層,容許用戶運行其餘程序,例如 Web 瀏覽器、電子郵件閱讀器、音樂播放器等。並且,越靠近用戶態的應用程序越容易編寫,若是你不喜歡某個電子郵件閱讀器你能夠從新寫一個或者換一個,但你不能自行寫一個操做系統或者是中斷處理程序。這個程序由硬件保護,防止外部對其進行修改。瀏覽器
計算機硬件簡介
操做系統與運行操做系統的內核硬件關係密切。操做系統擴展了計算機指令集並管理計算機的資源。所以,操做系統所以必須足夠了解硬件的運行,這裏咱們先簡要介紹一下現代計算機中的計算機硬件。緩存
從概念上來看,一臺簡單的我的電腦能夠被抽象爲上面這種類似的模型,CPU、內存、I/O 設備都和總線串聯起來並經過總線與其餘設備進行通訊。現代操做系統有着更爲複雜的結構,會設計不少條總線,咱們稍後會看到。暫時來說,這個模型可以知足咱們的討論。服務器
CPU
CPU 是計算機的大腦,它主要和內存進行交互,從內存中提取指令並執行它。一個 CPU 的執行週期是從內存中提取第一條指令、解碼並決定它的類型和操做數,執行,而後再提取、解碼執行後續的指令。重複該循環直到程序運行完畢。網絡
每一個 CPU 都有一組能夠執行的特定指令集。所以,x86 的 CPU 不能執行 ARM 的程序而且 ARM 的 CPU 也不能執行 x86 的程序。因爲訪問內存獲取執行或數據要比執行指令花費的時間長,所以全部的 CPU 內部都會包含一些寄存器
來保存關鍵變量和臨時結果。所以,在指令集中一般會有一些指令用於把關鍵字從內存中加載到寄存器中,以及把關鍵字從寄存器存入到內存中。還有一些其餘的指令會把來自寄存器和內存的操做數進行組合,例如 add 操做就會把兩個操做數相加並把結果保存到內存中。多線程
除了用於保存變量和臨時結果的通用寄存器外,大多數計算機還具備幾個特殊的寄存器,這些寄存器對於程序員是可見的。其中之一就是 程序計數器(program counter)
,程序計數器會指示下一條須要從內存提取指令的地址。提取指令後,程序計數器將更新爲下一條須要提取的地址。架構
另外一個寄存器是 堆棧指針(stack pointer)
,它指向內存中當前棧的頂端。堆棧指針會包含輸入過程當中的有關參數、局部變量以及沒有保存在寄存器中的臨時變量。
還有一個寄存器是 PSW(Program Status Word)
程序狀態字寄存器,這個寄存器是由操做系統維護的8個字節(64位) long 類型的數據集合。它會跟蹤當前系統的狀態。除非發生系統結束,不然咱們能夠忽略 PSW 。用戶程序一般能夠讀取整個PSW,但一般只能寫入其某些字段。PSW 在系統調用和 I / O 中起着重要做用。
操做系統必須瞭解全部的寄存器。在時間多路複用(time multiplexing)
的 CPU 中,操做系統每每中止運行一個程序轉而運行另一個。每次當操做系統中止運行一個程序時,操做系統會保存全部寄存器的值,以便於後續從新運行該程序。
爲了提高性能, CPU 設計人員早就放棄了同時去讀取、解碼和執行一條簡單的指令。許多現代的 CPU 都具備同時讀取多條指令的機制。例如,一個 CPU 可能會有單獨訪問、解碼和執行單元,因此,當 CPU 執行第 N 條指令時,還能夠對 N + 1 條指令解碼,還能夠讀取 N + 2 條指令。像這樣的組織形式被稱爲 流水線(pipeline)
,
比流水線更先進的設計是 超標量(superscalar)
CPU,下面是超標量 CPU 的設計
在上面這個設計中,存在多個執行單元,例如,一個用來進行整數運算、一個用來浮點數運算、一個用來布爾運算。兩個或者更多的指令被一次性取出、解碼並放入緩衝區中,直至它們執行完畢。只要一個執行單元空閒,就會去檢查緩衝區是否有能夠執行的指令。若是有,就把指令從緩衝區中取出並執行。這種設計的含義是應用程序一般是無序執行的。在大多數狀況下,硬件負責保證這種運算的結果與順序執行指令時的結果相同。
除了用在嵌入式系統中很是簡單的 CPU 以外,多數 CPU 都有兩種模式
,即前面已經提到的內核態和用戶態。一般狀況下,PSW 寄存器
中的一個二進制位會控制當前狀態是內核態仍是用戶態。當運行在內核態時,CPU 可以執行任何指令集中的指令而且可以使用硬件的功能。在臺式機和服務器上,操做系統一般之內核模式運行,從而能夠訪問完整的硬件。在大多數嵌入式系統中,一部分運行在內核態下,剩下的一部分運行在用戶態下。
用戶應用程序一般運行在用戶態下,在用戶態下,CPU 只能執行指令集中的一部分而且只能訪問硬件的一部分功能。通常狀況下,在用戶態下,有關 I/O 和內存保護的全部指令是禁止執行的。固然,設置 PSW 模式的二進制位爲內核態也是禁止的。
爲了獲取操做系統的服務,用戶程序必須使用 系統調用(system call)
,系統調用會轉換爲內核態而且調用操做系統。TRAP
指令用於把用戶態切換爲內核態並啓用操做系統。當有關工做完成以後,在系統調用後面的指令會把控制權交給用戶程序。咱們會在後面探討操做系統的調用細節。
須要注意的是操做系統在進行系統調用時會存在陷阱。大部分的陷阱會致使硬件發出警告,好比說試圖被零除或浮點下溢等你。在全部的狀況下,操做系統都能獲得控制權並決定如何處理異常狀況。有時,因爲出錯的緣由,程序不得不中止。
多線程和多核芯片
Intel Pentinum 4也就是奔騰處理器引入了被稱爲多線程(multithreading)
或 超線程(hyperthreading, Intel 公司的命名)
的特性,x86 處理器和其餘一些 CPU 芯片就是這樣作的。包括 SSPARC、Power五、Intel Xeon 和 Intel Core 系列 。近似地說,多線程容許 CPU 保持兩個不一樣的線程狀態而且在納秒級(nanosecond)
的時間完成切換。線程是一種輕量級的進程,咱們會在後面說到。例如,若是一個進程想要從內存中讀取指令(這一般會經歷幾個時鐘週期),多線程 CPU 則能夠切換至另外一個線程。多線程不會提供真正的並行處理。在一個時刻只有一個進程在運行。
對於操做系統來說,多線程是有意義的,由於每一個線程對操做系統來講都像是一個單個的 CPU。好比一個有兩個 CPU 的操做系統,而且每一個 CPU 運行兩個線程,那麼這對於操做系統來講就多是 4 個 CPU。
除了多線程以外,如今許多 CPU 芯片上都具備四個、八個或更多完整的處理器或內核。多核芯片在其上有效地承載了四個微型芯片,每一個微型芯片都有本身的獨立CPU。
若是要說在絕對核心數量方面,沒有什麼能贏過現代 GPU(Graphics Processing Unit)
,GPU 是指由成千上萬個微核組成的處理器。它們擅長處理大量並行的簡單計算。
內存
計算機中第二個主要的組件就是內存。理想狀況下,內存應該很是快速(比執行一條指令要快,從而不會拖慢 CPU 執行效率),並且足夠大且便宜,可是目前的技術手段沒法知足三者的需求。因而採用了不一樣的處理方式,存儲器系統採用一種分層次的結構
頂層的存儲器速度最高,可是容量最小,成本很是高,層級結構越向下,其訪問效率越慢,容量越大,可是造價也就越便宜。
寄存器
存儲器的頂層是 CPU 中的寄存器
,它們用和 CPU 同樣的材料製成,因此和 CPU 同樣快。程序必須在軟件中自行管理這些寄存器(即決定如何使用它們)
高速緩存
位於寄存器下面的是高速緩存
,它多數由硬件控制。主存被分割成高速緩存行(cache lines)
爲 64 字節,內存地址的 0 - 63 對應高速緩存行 0 ,地址 64 - 127 對應高速緩存行的 1,等等。使用最頻繁的高速緩存行保存在位於 CPU 內部或很是靠近 CPU 的高速緩存中。當應用程序須要從內存中讀取關鍵詞的時候,高速緩存的硬件會檢查所須要的高速緩存行是否在高速緩存中。若是在的話,那麼這就是高速緩存命中(cache hit)
。高速緩存知足了該請求,而且沒有經過總線將內存請求發送到主內存。高速緩存命中一般須要花費兩個時鐘週期。緩存未命中須要從內存中提取,這會消耗大量的時間。高速緩存行會限制容量的大小由於它的造價很是昂貴。有一些機器會有兩個或者三個高速緩存級別,每一級高速緩存比前一級慢且容量更大。
緩存在計算機不少領域都扮演了很是重要的角色,不只僅是 RAM 緩存行。
隨機存儲器(RAM): 內存中最重要的一種,表示既能夠從中讀取數據,也能夠寫入數據。當機器關閉時,內存中的信息會
丟失
。
大量的可用資源被劃分爲小的部分,這些可用資源的一部分會得到比其餘資源更頻繁的使用權,緩存常常用來提高性能。操做系統無時無刻的不在使用緩存。例如,大多數操做系統在主機內存中保留(部分)頻繁使用的文件,以免重複從磁盤重複獲取。舉個例子,相似於 /home/ast/projects/minix3/src/kernel/clock.c
這樣的場路徑名轉換成的文件所在磁盤地址的結果也能夠保存緩存中,以免重複尋址。另外,當一個 Web 頁面(URL) 的地址轉換爲網絡地址(IP地址)後,這個轉換結果也能夠緩存起來供未來使用。
在任何緩存系統中,都會有下面這幾個噬需解決的問題
- 什麼時候把新的內容放進緩存
- 把新的內容應該放在緩存的哪一行
- 在須要空閒空間時,應該把哪塊內容從緩存中移除
- 應該把移除的內容放在某個較大存儲器的何處
並非每一個問題都與每種緩存狀況有關。對於 CPU 緩存中的主存緩存行,當有緩存未命中時,就會調入新的內容。一般經過所引用內存地址的高位計算應該使用的緩存行。
緩存是解決問題的一種好的方式,因此現代 CPU 設計了兩種緩存。第一級緩存或者說是 L1 cache
老是位於 CPU 內部,用來將已解碼的指令調入 CPU 的執行引擎。對於那些頻繁使用的關鍵字,多數芯片有第二個 L1 cache 。典型的 L1 cache 的大小爲 16 KB。另外,每每還設有二級緩存,也就是 L2 cache
,用來存放最近使用過的關鍵字,通常是兆字節爲單位。L1 cache 和 L2 cache 最大的不一樣在因而否存在延遲。訪問 L1 cache 沒有任何的延遲,然而訪問 L2 cache 會有 1 - 2 個時鐘週期的延後。
什麼是時鐘週期?計算機處理器或 CPU 的速度由時鐘週期來肯定,該時鐘週期是振盪器兩個脈衝之間的時間量。通常而言,每秒脈衝數越高,計算機處理器處理信息的速度就越快。 時鐘速度以 Hz 爲單位測量,一般爲兆赫(MHz)或千兆赫(GHz)。 例如,一個4 GHz處理器每秒執行4,000,000,000個時鐘週期。
計算機處理器能夠在每一個時鐘週期執行一條或多條指令,這具體取決於處理器的類型。 早期的計算機處理器和較慢的 CPU 在每一個時鐘週期只能執行一條指令,而現代處理器在每一個時鐘週期能夠執行多條指令。
主存
在上面的層次結構中再下一層是主存
,這是內存系統的主力軍,主存一般叫作 RAM(Random Access Memory)
,因爲 1950 年代和 1960 年代的計算機使用微小的可磁化鐵氧體磁芯做爲主存儲器,所以舊時有時將其稱爲核心存儲器。全部不能再高速緩存中獲得知足的內存訪問請求都會轉往主存中。
除了主存以外,許多計算機還具備少許的非易失性隨機存取存儲器。它們與 RAM 不一樣,在電源斷電後,非易失性隨機訪問存儲器並不會丟失內容。ROM(Read Only Memory)
中的內容一旦存儲後就不會再被修改。它很是快並且便宜。(若是有人問你,有沒有什麼又快又便宜的內存設備,那就是 ROM 了)在計算機中,用於啓動計算機的引導加載模塊(也就是 bootstrap )就存放在 ROM 中。另外,一些 I/O 卡也採用 ROM 處理底層設備控制。
EEPROM(Electrically Erasable PROM,)
和 閃存(flash memory)
也是非易失性的,可是與 ROM 相反,它們能夠擦除和重寫。不太重寫它們須要比寫入 RAM 更多的時間,因此它們的使用方式與 ROM 相同,可是與 ROM 不一樣的是他們能夠經過重寫字段來糾正程序中出現的錯誤。
閃存也一般用來做爲便攜性的存儲媒介。閃存是數碼相機中的膠捲,是便攜式音樂播放器的磁盤。閃存的速度介於 RAM 和磁盤之間。另外,與磁盤存儲器不一樣的是,若是閃存擦除的次數太多,會出現磨損。
還有一類是 CMOS,它是易失性的。許多計算機都會使用 CMOS 存儲器保持當前時間和日期。
磁盤
下一個層次是磁盤(硬盤)
,磁盤同 RAM 相比,每一個二進制位的成本低了兩個數量級,並且常常也有兩個數量級大的容量。磁盤惟一的問題是隨機訪問數據時間大約慢了三個數量級。磁盤訪問慢的緣由是由於磁盤的構造不一樣
磁盤是一種機械裝置,在一個磁盤中有一個或多個金屬盤片,它們以 5400rpm、7200rpm、10800rpm 或更高的速度旋轉。從邊緣開始有一個機械臂懸橫在盤面上,這相似於老式播放塑料唱片 33 轉唱機上的拾音臂。信息會寫在磁盤一系列的同心圓上。在任意一個給定臂的位置,每一個磁頭能夠讀取一段環形區域,稱爲磁道(track)
。把一個給定臂的位置上的全部磁道合併起來,組成了一個柱面(cylinder)
。
每一個磁道劃分若干扇區,扇區的值是 512 字節。在現代磁盤中,較外部的柱面比較內部的柱面有更多的扇區。機械臂從一個柱面移動到相鄰的柱面大約須要 1ms。而隨機移到一個柱面的典型時間爲 5ms 至 10ms,具體狀況以驅動器爲準。一旦磁臂到達正確的磁道上,驅動器必須等待所需的扇區旋轉到磁頭之下,就開始讀寫,低端硬盤的速率是50MB/s
,而高速磁盤的速率是 160MB/s
。
須要注意,
固態硬盤(Solid State Disk, SSD)
不是磁盤,固態硬盤並無能夠移動的部分,外形也不像唱片,而且數據是存儲在存儲器(閃存)
中,與磁盤惟一的類似之處就是它也存儲了大量即便在電源關閉也不會丟失的數據。
許多計算機支持一種著名的虛擬內存
機制,這種機制使得指望運行的存儲空間大於實際的物理存儲空間。其方法是將程序放在磁盤上,而將主存做爲一部分緩存,用來保存最頻繁使用的部分程序,這種機制須要快速映像內存地址,用來把程序生成的地址轉換爲有關字節在 RAM 中的物理地址。這種映像由 CPU 中的一個稱爲 存儲器管理單元(Memory Management Unit, MMU)
的部件來完成。
緩存和 MMU 的出現是對系統的性能有很重要的影響,在多道程序系統中,從一個程序切換到另外一個程序的機制稱爲 上下文切換(context switch)
,對來自緩存中的資源進行修改並把其寫回磁盤是頗有必要的。
I/O 設備
CPU 和存儲器不是操做系統須要管理的所有,I/O
設備也與操做系統關係密切。能夠參考上面這個圖片,I/O 設備通常包括兩個部分:設備控制器和設備自己。控制器自己是一塊芯片或者一組芯片,它可以控制物理設備。它可以接收操做系統的指令,例如,從設備中讀取數據並完成數據的處理。
在許多狀況下,實際控制設備的過程是很是複雜並且存在諸多細節。所以控制器的工做就是爲操做系統提供一個更簡單(但仍然很是複雜)的接口。也就是屏蔽物理細節。任何複雜的東西均可以加一層代理來解決,這是計算機或者人類社會很普世的一個解決方案
I/O 設備另外一部分是設備自己,設備自己有一個相對簡單的接口,這是由於接口既不能作不少工做,並且也已經被標準化了。例如,標準化後任何一個 SATA 磁盤控制器就能夠適配任意一種 SATA 磁盤,因此標準化是必要的。ATA
表明 高級技術附件(AT Attachment)
,而 SATA 表示串行高級技術附件(Serial ATA)
。
AT 是啥?它是 IBM 公司的第二代我的計算機的
高級
技術成果,使用 1984 年推出的 6MHz 80286 處理器,這個處理器是當時最強大的。
像是高級這種詞彙應該慎用,不然 20 年後再回首極可能會被無情打臉。
如今 SATA 是不少計算機的標準硬盤接口。因爲實際的設備接口隱藏在控制器中,因此操做系統看到的是對控制器的接口,這個接口和設備接口有很大區別。
每種類型的設備控制器都是不一樣的,因此須要不一樣的軟件進行控制。專門與控制器進行信息交流,發出命令處理指令接收響應的軟件,稱爲 設備驅動程序(device driver)
。 每一個控制器廠家都應該針對不一樣的操做系統提供不一樣的設備驅動程序。
爲了使設備驅動程序可以工做,必須把它安裝在操做系統中,這樣可以使它在內核態中運行。要將設備驅動程序裝入操做系統,通常有三個途徑
- 第一個途徑是將內核與設備啓動程序從新鏈接,而後重啓系統。這是
UNIX
系統採用的工做方式 - 第二個途徑是在一個操做系統文件中設置一個入口,通知該文件須要一個設備驅動程序,而後從新啓動系統。在從新系統時,操做系統回尋找有關的設備啓動程序並把它裝載,這是
Windows
採用的工做方式 - 第三個途徑是操做系統可以在運行時接收新的設備驅動程序並馬上安裝,無需重啓操做系統,這種方式採用的少,可是正變得普及起來。熱插拔設備,好比 USB 和 IEEE 1394 都須要動態可裝載的設備驅動程序。
每一個設備控制器都有少許用於通訊的寄存器,例如,一個最小的磁盤控制器也會有用於指定磁盤地址、內存地址、扇區計數的寄存器。要激活控制器,設備驅動程序回從操做系統獲取一條指令,而後翻譯成對應的值,並寫入設備寄存器中,全部設備寄存器的結合構成了 I/O 端口空間
。
在一些計算機中,設備寄存器會被映射到操做系統的可用地址空間,使他們可以向內存同樣完成讀寫操做。在這種計算機中,不須要專門的 I/O 指令,用戶程序能夠被硬件阻擋在外,防止其接觸這些存儲器地址(例如,採用基址寄存器和變址寄存器)。在另外一些計算機中,設備寄存器被放入一個專門的 I/O 端口空間,每一個寄存器都有一個端口地址。在這些計算機中,特殊的 IN
和 OUT
指令會在內核態下啓用,它可以容許設備驅動程序和寄存器進行讀寫。前面第一種方式會限制特殊的 I/O 指令可是容許一些地址空間;後者不須要地址空間可是須要特殊的指令,這兩種應用都很普遍。
實現輸入和輸出的方式有三種。
- 在最簡單的方式中,用戶程序會發起系統調用,內核會將其轉換爲相應驅動程序的程序調用,而後設備驅動程序啓動 I/O 並循環檢查該設備,看該設備是否完成了工做(通常會有一些二進制位用來指示設備仍在忙碌中)。當 I/O 調用完成後,設備驅動程序把數據送到指定的地方並返回。而後操做系統會將控制權交給調用者。這種方式稱爲
忙等待(busy waiting)
,這種方式的缺點是要一直佔據 CPU,CPU 會一直輪詢 I/O 設備直到 I/O 操做完成。 - 第二種方式是設備驅動程序啓動設備而且讓該設備在操做完成時發生中斷。設備驅動程序在這個時刻返回。操做系統接着在須要時阻塞調用者並安排其餘工做進行。當設備驅動程序檢測到該設備操做完成時,它發出一個
中斷
通知操做完成。
在操做系統中,中斷是很是重要的,因此這須要更加細緻的討論一下。
如上圖所示,這是一個三步的 I/O 過程,第一步,設備驅動程序會經過寫入設備寄存器告訴控制器應該作什麼。而後,控制器啓動設備。當控制器完成讀取或寫入被告知須要傳輸的字節後,它會在步驟 2 中使用某些總線向中斷控制器發送信號。若是中斷控制器準備好了接收中斷信號(若是正忙於一個優先級較高的中斷,則可能不會接收),那麼它就會在 CPU 的一個引腳上面聲明。這就是步驟3
在第四步中,中斷控制器把該設備的編號放在總線上,這樣 CPU 能夠讀取總線,而且知道哪一個設備完成了操做(可能同時有多個設備同時運行)。
一旦 CPU 決定去實施中斷後,程序計數器和 PSW 就會被壓入到當前堆棧中而且 CPU 會切換到內核態。設備編號能夠做爲內存的一個引用,用來尋找該設備中斷處理程序的地址。這部份內存稱做中斷向量(interrupt vector)
。一旦中斷處理程序(中斷設備的設備驅動程序的一部分)開始後,它會移除棧中的程序計數器和 PSW 寄存器,並把它們進行保存,而後查詢設備的狀態。在中斷處理程序所有完成後,它會返回到先前用戶程序還沒有執行的第一條指令,這個過程以下
- 實現 I/O 的第三種方式是使用特殊的硬件:
直接存儲器訪問(Direct Memory Access, DMA)
芯片。它能夠控制內存和某些控制器之間的位流,而無需 CPU 的干預。CPU 會對 DMA 芯片進行設置,說明須要傳送的字節數,有關的設備和內存地址以及操做方向。當 DMA 芯片完成後,會形成中斷,中斷過程就像上面描述的那樣。咱們會在後面具體討論中斷過程
當另外一箇中斷處理程序正在運行時,中斷可能(而且常常)發生在不合宜的時間。 所以,CPU 能夠禁用中斷,而且能夠在以後重啓中斷。在 CPU 關閉中斷後,任何已經發出中斷的設備,能夠繼續保持其中斷信號處理,可是 CPU 不會中斷,直至中斷再次啓用爲止。若是在關閉中斷時,已經有多個設備發出了中斷信號,中斷控制器將決定優先處理哪一個中斷,一般這取決於事先賦予每一個設備的優先級,最高優先級的設備優先贏得中斷權,其餘設備則必須等待。
總線
上面的結構(簡單我的計算機的組件圖)在小型計算機已經使用了多年,並用在早期的 IBM PC 中。然而,隨着處理器核內存變得愈來愈快,單個總線處理全部請求的能力也達到了上線,其中也包括 IBM PC 總線。必須放棄使用這種模式。其結果致使了其餘總線的出現,它們處理 I/O 設備以及 CPU 到存儲器的速度都更快。這種演變的結果致使了下面這種結構的出現。
上圖中的 x86 系統包含不少總線,高速緩存、內存、PCIe、PCI、USB、SATA 和 DMI,每條總線都有不一樣的傳輸速率和功能。操做系統必須瞭解全部的總線配置和管理。其中最主要的總線是 PCIe(Peripheral Component Interconnect Express)
總線。
Intel 發明的 PCIe 總線也是做爲以前古老的 PCI 總線的繼承者,而古老的 PCI 總線也是爲了取代古董級別的 ISA(Industry Standard Architecture)
總線而設立的。數十 Gb/s 的傳輸能力使得 PCIe 比它的前身快不少,並且它們本質上也十分不一樣。直到發明 PCIe 的 2004 年,大多數總線都是並行且共享的。共享總線架構(shared bus architeture)
表示多個設備使用一些相同的電線傳輸數據。所以,當多個設備同時發送數據時,此時你須要一個決策者來決定誰可以使用總線。而 PCIe 則不同,它使用專門的端到端鏈路。傳統 PCI 中使用的並行總線架構(parallel bus architecture)
表示經過多條電線發送相同的數據字。例如,在傳統的 PCI 總線上,一個 32 位數據經過 32 條並行的電線發送。而 PCIe 則不一樣,它選用了串行總線架構(serial bus architecture)
,並經過單個鏈接(稱爲通道)發送消息中的全部比特數據,就像網絡數據包同樣。這樣作會簡化不少,由於再也不確保全部 32 位數據在同一時刻準確到達相同的目的地。經過將多個數據通路並行起來,並行性仍能夠有效利用。例如,可使用 32 條數據通道並行傳輸 32 條消息。
在上圖結構中,CPU 經過 DDR3 總線與內存對話,經過 PCIe 總線與外圍圖形設備 (GPU)對話,經過 DMI(Direct Media Interface)
總線經集成中心與全部其餘設備對話。而集成控制中心經過串行總線與 USB 設備對話,經過 SATA 總線與硬盤和 DVD 驅動器對話,經過 PCIe 傳輸以太網絡幀。
不只如此,每個核
USB(Univversal Serial Bus)
是用來將全部慢速 I/O 設備(好比鍵盤和鼠標)與計算機相連的設備。USB 1.0 能夠處理總計 12 Mb/s 的負載,而 USB 2.0 將總線速度提升到 480Mb/s ,而 USB 3.0 能達到不小於 5Gb/s 的速率。全部的 USB 設備均可以直接鏈接到計算機並可以馬上開始工做,而不像以前那樣要求重啓計算機。
SCSI(Small Computer System Interface)
總線是一種高速總線,用在高速硬盤,掃描儀和其餘須要較大帶寬的設備上。如今,它們主要用在服務器和工做站中,速度能夠達到 640MB/s 。
計算機啓動過程
那麼有了上面一些硬件再加上操做系統的支持,咱們的計算機就能夠開始工做了,那麼計算機的啓動過程是怎樣的呢?下面只是一個簡要版的啓動過程
在每臺計算機上有一塊雙親板,也就是母板,母板也就是主板,它是計算機最基本也就是最重要的部件之一。主板通常爲矩形電路板,上面安裝了組成計算機的主要電路系統,通常有 BIOS 芯片、I/O 控制芯片、鍵盤和麪板控制開關接口、指示燈插接件、擴充插槽、主板及插卡的直流電源供電接插件等元件。
在母板上有一個稱爲 基本輸入輸出系統(Basic Input Output System, BIOS)
的程序。在 BIOS 內有底層 I/O 軟件,包括讀鍵盤、寫屏幕、磁盤I/O 以及其餘過程。現在,它被保存在閃存中,它是非易失性的,可是當BIOS 中發現錯誤時,能夠由操做系統進行更新。
在計算機啓動(booted)
時,BIOS 開啓,它會首先檢查所安裝的 RAM 的數量,鍵盤和其餘基礎設備是否已安裝而且正常響應。接着,它開始掃描 PCIe 和 PCI 總線並找出連在上面的全部設備。即插即用的設備也會被記錄下來。若是現有的設備和系統上一次啓動時的設備不一樣,則新的設備將被從新配置。
藍後,BIOS 經過嘗試存儲在 CMOS
存儲器中的設備清單嘗試啓動設備
CMOS是
Complementary Metal Oxide Semiconductor(互補金屬氧化物半導體)
的縮寫。它是指製造大規模集成電路芯片用的一種技術或用這種技術製造出來的芯片,是電腦主板上的一塊可讀寫的 RAM 芯片。由於可讀寫的特性,因此在電腦主板上用來保存 BIOS 設置完電腦硬件參數後的數據,這個芯片僅僅是用來存放數據的。而對 BIOS 中各項參數的設定要經過專門的程序。BIOS 設置程序通常都被廠商整合在芯片中,在開機時經過特定的按鍵就可進入 BIOS 設置程序,方便地對系統進行設置。所以 BIOS 設置有時也被叫作 CMOS 設置。
用戶能夠在系統啓動後進入一個 BIOS 配置程序,對設備清單進行修改。而後,判斷是否可以從外部 CD-ROM
和 USB 驅動程序啓動,若是啓動失敗的話(也就是沒有),系統將從硬盤啓動,boots 設備中的第一個扇區被讀入內存並執行。該扇區包含一個程序,該程序一般在引導扇區末尾檢查分區表以肯定哪一個分區處於活動狀態。而後從該分區讀入第二個啓動加載程序,該加載器從活動分區中讀取操做系統並啓動它。
而後操做系統會詢問 BIOS 獲取配置信息。對於每一個設備來講,會檢查是否有設備驅動程序。若是沒有,則會向用戶詢問是否須要插入 CD-ROM
驅動(由設備製造商提供)或者從 Internet 上下載。一旦有了設備驅動程序,操做系統會把它們加載到內核中,而後初始化表,建立所需的後臺進程,並啓動登陸程序或GUI。
操做系統博物館
操做系統已經存在了大半個世紀,在這段時期內,出現了各類類型的操做系統,但並非全部的操做系統都很出名,下面就羅列一些比較出名的操做系統
大型機操做系統
高端一些的操做系統是大型機操做系統,這些大型操做系統可在大型公司的數據中心找到。這些計算機的 I/O 容量與我的計算機不一樣。一個大型計算機有 1000 個磁盤和數百萬 G 字節的容量是很正常,若是有這樣一臺我的計算機朋友會很羨慕。大型機也在高端 Web 服務器、大型電子商務服務站點上。
服務器操做系統
下一個層次是服務器操做系統。它們運行在服務器上,服務器能夠是大型我的計算機、工做站甚至是大型機。它們經過網絡爲若干用戶服務,而且容許用戶共享硬件和軟件資源。服務器可提供打印服務、文件服務或 Web 服務。Internet 服務商運行着許多臺服務器機器,爲用戶提供支持,使 Web 站點保存 Web 頁面並處理進來的請求。典型的服務器操做系統有 Solaris、FreeBSD、Linux 和 Windows Server 201x
多處理器操做系統
得到大型計算能力的一種愈來愈廣泛的方式是將多個 CPU 鏈接到一個系統中。依據它們鏈接方式和共享方式的不一樣,這些系統稱爲並行計算機,多計算機或多處理器。他們須要專門的操做系統,不過一般採用的操做系統是配有通訊、鏈接和一致性等專門功能的服務器操做系統的變體。
我的計算機中近來出現了多核芯片,因此常規的臺式機和筆記本電腦操做系統也開始與小規模多處理器打交道,而核的數量正在與時俱進。許多主流操做系統好比 Windows 和 Linux 均可以運行在多核處理器上。
我的計算機系統
接下來一類是我的計算機操做系統。現代我的計算機操做系統支持多道處理程序。在啓動時,一般有幾十個程序開始運行,它們的功能是爲單個用戶提供良好的支持。這類系統普遍用於字處理、電子表格、遊戲和 Internet 訪問。常見的例子是 Linux、FreeBSD、Windows 七、Windows 8 和蘋果公司的 OS X 。
掌上計算機操做系統
隨着硬件愈來愈小化,咱們看到了平板電腦、智能手機和其餘掌上計算機系統。掌上計算機或者 PDA(Personal Digital Assistant),我的數字助理
是一種能夠握在手中操做的小型計算機。這部分市場已經被谷歌的 Android
系統和蘋果的 IOS
主導。
嵌入式操做系統
嵌入式操做系統用來控制設備的計算機中運行,這種設備不是通常意義上的計算機,而且不容許用戶安裝軟件。典型的例子有微波爐、汽車、DVD 刻錄機、移動電話以及 MP3 播放器一類的設備。全部的軟件都運行在 ROM 中,這意味着應用程序之間不存在保護,從而得到某種簡化。主要的嵌入式系統有 Linux、QNX 和 VxWorks
傳感器節點操做系統呢
有許多用途須要配置微小傳感器節點網絡。這些節點是一種能夠彼此通訊而且使用無線通訊基站的微型計算機。這類傳感器網絡能夠用於建築物周邊保護、國土邊界保衛、森林火災探測、氣象預測用的溫度和降水測量等。
每一個傳感器節點是一個配有 CPU、RAM、ROM 以及一個或多個環境傳感器的實實在在的計算機。節點上運行一個小型可是真是的操做系統,一般這個操做系統是事件驅動的,能夠響應外部事件。
實時操做系統
另外一類操做系統是實時操做系統,這些系統的特徵是將時間做爲關鍵參數。例如,在工業過程控制系統中,工廠中的實時計算機必須收集生產過程的數據並用有關數據控制機器。若是某個動做必需要在規定的時刻發生,這就是硬實時系統
。能夠在工業控制、民用航空、軍事以及相似應用中看到不少這樣的系統。另外一類系統是 軟實時系統
,在這種系統中,雖然不但願偶爾違反最終時限,但仍能夠接受,並不會引發任何永久性損害。數字音頻或多媒體系統就是這類系統。智能手機也是軟實時系統。
智能卡操做系統
最小的操做系統運行在智能卡上。智能卡是一種包含一塊 CPU 芯片的信用卡。它有很是嚴格的運行能耗和存儲空間的限制。有些卡具備單項功能,如電子支付;有些智能卡是面向 Java 的。這意味着在智能卡的 ROM 中有一個 Java 虛擬機(Java Virtual Machine, JVM)解釋器。
操做系統概念
大部分操做系統提供了特定的基礎概念和抽象,例如進程、地址空間、文件等,它們是須要理解的核心內容。下面咱們會簡要介紹一些基本概念,爲了說明這些概念,咱們會不時的從 UNIX
中提出示例,相同的示例也會存在於其餘系統中,咱們後面會進行介紹。
文章參考:
《現代操做系統》第四版
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