概述
本文是介紹操作系統文章的第一篇,主要介紹計算機的硬件和軟件構成,以及軟硬件是如何配合工作的,操作系統在其中扮演的角色,本系列文章主要介紹操作系統的幾個核心的問題,比如操作系統的內存管理,文件系統,進程調度等,由於我並不是一個專業的操作系統工程師,😄,所以寫作的時候不會寫很多書面語言,會使用通俗易懂的方式講解。
計算機組成
概括的說計算機是由硬件和軟件組成的,軟件是運行在硬件上的,就像人的靈魂需要依托於人的身體一樣,所以要想搞明白操作系統這個系統軟件的作用,就要先了解一下計算機的硬件,下面就先介紹一下經典計算機的基本硬件組成。
計算機硬件
下圖是個人計算機的一些基本組成部分。
(圖片來源:現代操作系統)
圖中的硬件可以划分為如下幾個部分:
- CPU
- 內存
- io設備
- 總線
下面就逐一簡單介紹一下上面的幾個部分
CPU
cpu是計算機的“大腦”,就像人的大腦一樣,我們都希望我們的腦子轉的快一點,cpu也是如此,我們希望cpu運行的越快越好,這樣當我們讓cpu去運行一個程序的時候就可以更快的完成,為了讓cpu更塊的運行程序,計算機科學家們做了如下的工作。
- 采用“流水線”工作模型。要了解流水線方式,我們先說一下非流水線的方式,cpu的運行方式是從內存中取出一條指令,之后經過解碼、之后再執行,也就是說要經過三步,如果把cpu比作一個加工廠,那這個加工廠必須要一個步驟一個步驟去做,在取指令的時候,無法進行解碼和執行操作,流水線的方式就是相當於cpu中有3個模塊,可以類比三個工廠,同時做這三件事,就是說cpu可以同時取出多條指令,然后進行解碼,就是說執行不用等待了,前面兩個工廠會源源不斷的生產解好碼的程序,這樣就高效很多,所以叫做流水線的方式。
- 提高cpu頻率。這個就是我們在很多地方經常聽到的“摩爾定律”,這個定律說芯片中晶體管的數量每18個月翻一翻,摩爾是因特爾公司的聯合創始人。在過去的幾十年中cpu的速率從幾十KHz到現在的4GHz,提升了數10萬倍,但是從2004年之后,摩爾定律基本就失效了,cpu的頻率再也沒有發生質的提升。
- 多個cpu一起執行。既然單核cpu的頻率無法獲得大的提升了,那就搞多核一起處理,相信大家都聽說過我們國家的天河一號,超級計算機,下面我貼一下天河一號所使用核數。
(數據來源:百度百科)
- 使用多級緩存。現在的cpu單核頻率達到4GHz,內存的速度遠遠跟不上cpu的速度,所以就在cpu中搞了很多的寄存器和高速緩存,cpu運行的時候先去高速緩存中查看有沒有自己需要指令和數據,如果有就直接使用高速緩存的,如果沒有再去內存中獲取,這個下一部分講內存的時候還會詳細介紹。
除了非常簡單的cpu之外,多數cpu都有兩種模式,即內核態和用戶態,運行在內核態模式的cpu可以運行所有的cpu指令和訪問計算機所有的硬件,相反,運行在用戶態時只允許訪問所有指令集的子集和訪問所有功能的子集,一般情況下,用戶態時訪問i/o和內存保護的所有指令時禁止的,在個人電腦和服務器上操作系統運行在內核態。
用戶態到內核態的切換
上面介紹了cpu的兩種模式,那在用戶態模式下如何切換到內核態,下面就逐一介紹。
- 系統調用:當應用程序在用戶態運行時,由於本身的特權級別比較低,所以很多功能不能自己完成,這個時候就需要調用操作系統暴露的接口,為什么要調用操作系統的接口,因為操作系統運行在內核態,可以執行所有的功能,舉例,如果程序中執行printf("hello world")這條指令,處於用戶態的程序就會發生系統調用,操作系統會打印hello world。
- 異常:處於用戶態的程序運行過程中出現了自己無法處理的異常,就需要處於內核態的操作系統去處理,操作系統怎么處理呢,操作系統會kill掉程序,比如程序中執行了int a = 1/0;這種操作系統就會執行kill掉用戶程序,如果發生了缺頁異常(對於什么時缺頁異常不是很明白的胖友不用着急,這個是操作系統內存管理方面的知識,后續會講解),操作系統會處理缺頁異常,當處理成功之后會讓程序繼續執行。
- 中斷:當外圍設備完成用戶請求之后,就會對操作系統發起一個中斷,由於中斷是一個優先級比較高的操作,所以操作系統會先暫停當前用戶態正在執行的程序,而優先處理中斷,舉例:比如當有個用戶態的程序去讀取磁盤上的文件,由於讀取比較耗時,操作系統一般都會去讓別的程序執行,但是一旦讀取文件完成,磁盤就會向操作系統發出一個中斷操作,操作系統會先暫停當前正在運行的程序優先處理這個。
內存
內存是我們日常生活中的叫法,其實平時我們說的我的電腦內存8G,指定是主存,除了主存之外還有很多的緩存,看下面的計算機存儲層次結構
(圖片來源:現代操作系統)
理想情況下,我們都希望我們的存儲設備越快越好,而且價格便宜,但是現實世界往往是魚和熊掌不可兼得,往往比較快的緩存價格就越貴,所以就有了分層的存儲體系結構,下面就逐一介紹一下上面的各層級緩存。
- 寄存器:使用和cpu相同的材料制作,速度和cpu相同,但是價格昂貴,寄存器可分為通用寄存器,專用寄存器,控制寄存器。這里舉幾個例子,說明每種寄存器中保存的是什么數據。cpu用來保存關鍵變量和臨時結果的寄存器使用的是通用寄存器;用來記錄程序執行到什么地方的程序計數器保存在專用寄存器中。
- 高速緩存:由於寄存器和主存的速度差的還是太多,所以在寄存器和主存之間又高了個高速緩存。在現代cpu中,很多都實現了多級高速緩存,比如itel i7,就使用了3級高速緩存,L1緩存(可分為L1 d cache:緩存數據。L1 i cache:緩存指令),L2緩存,L3緩存,下面我貼一下itel緩存圖。
- 主存:我們在平時使用計算機時,運行的軟件都是需要先從磁盤加載到內存中才可以運行的,現在使用的內存基本上都是8G,或者16G等,但是在早期的計算機中內存只有幾百kb,如何有效的利用內存,以及內存滿了之后如何處理,早期的計算機科學家在這方面做了很多的工作,操作系統有一個很重要的功能就是內存管理。
- 磁盤緩存:如果內存需要每一個數據都訪問一次磁盤,那效率太低了,因為磁盤對於隨機讀寫的效率非常低,這是由磁盤的工作方式導致,所以就搞了一個磁盤緩存,在從磁盤讀取數據時,根據局部性原理把目標數據附近的數據都讀取出來放入磁盤緩存中,寫的時候也是一樣。
I/O設備
所謂的I/O設備,其實就是輸入輸出設備,可以與計算機進行數據傳輸的硬件,包括鍵盤,鼠標,打印機,磁盤等。I/O設備分為電子部分和設備部分,其中設備部分就是硬件,電子部分就是控制設備的軟件,簡稱I/O控制器或者適配器。在我們使用顯卡等程序的時候,都需要安裝顯卡驅動,這個其實就是一種驅動程序,驅動程序是和I/O控制器進行交互的,由於I/O控制器有多種,所以每個不同的I/O控制器就需要不同的設備驅動器來與之對話,通常設備驅動器都是裝在操作系統,在內核態運行,因為這個是需要操作硬件的權限。
以上介紹了I/O硬件,I/O軟件,也就是I/O控制器,還有與控制器交互的設備驅動器,有了上面3個東東,那怎么實現輸入和輸出,一般來說有下面三種方式。
- 忙等待:用戶程序發起一個系統調用,然后設備驅動器啟動I/O,並啟動一個死循環檢測該設備的響應,當I/O結束時,設備驅動器把數據放入特定的地方並返回,之后操作系統將控制權交給控制程序。
- 中斷:在上面的忙等待中設備驅動器啟動了一個死循環一直去檢測,這很浪費CPU資源,而中斷就是為了解決這種問題,具體的做法就是當設備驅動器啟動I/O之后,操作系統就會安排別的進程進行執行,把當前進程掛起,當I/O完成時設備會發起一個中斷,這時設備驅動器會返回,操作系統就會知道I/O完成了。
- 直接存儲器訪問(DMA):CPU直接存取I/O設備過於浪費時間,於是引入DMA方便處理,它就像CPU的小助手,獨立於CPU,可以實現對幾乎所有I/O設備的訪問,讀寫。很多時候,都是主板自帶一個DMA控制器,這樣CPU直接訪問它就可以了。
磁盤是一種很重要的I/O設備,這里單獨介紹一下。
幾個概念解釋一下:
盤片:磁盤並不是一個盤,而是很多個盤片。
磁頭:每個磁盤分為上下兩面,都可以存數據,而磁頭就是從磁盤讀數據的,類似於那種老式的留聲機,一個盤片有兩個磁頭。
磁道:每個盤片同心圓半徑相同的圓形。
扇區:將磁道划分為若干個小的區域,稱為扇區
柱面:所有磁片中半徑相同的同心磁道構成“柱面",意思是這一系列的磁道垂直疊在一起,就形成一個柱面的形狀。簡單地理解,柱面就是磁道。
存儲容量 = 磁頭數 × 磁道(柱面)數 × 每道扇區數 × 每扇區字節數
磁盤尋址方式:×× 磁道(柱面),×× 磁頭,×× 扇區
尋址時間:1.尋道時間。2.旋轉延遲。3.數據傳輸時間。尋址時間主要取決於前兩個。
詳細信息參考:磁盤、柱面、磁道、磁頭、扇區
總線
總線,英文為bus,也就是公共汽車,用於在計算機中傳輸數據。在傳統的設計方式中,采用南北橋的架構,架構圖如下:
(圖片來源:程序員的自我修養)
北橋芯片:由於3D游戲和多媒體的發展,導致圖形芯片(就是我們常用的顯卡芯片)需要和cpu,內存進行大規模的通信,慢的io總線無法滿足這種需求,所以就設計出來高速處理的北橋芯片,協調內存,cpu,顯卡。
南橋芯片:由於像鼠標,鍵盤等I/O設備運行較慢,直接連接到北橋芯片,這樣北橋芯片又要處理高速設備,又要處理低速設備,比較復雜,所以就設計出來南橋芯片,鼠標,鍵盤,磁盤連接到南橋芯片,之后南橋芯片將他們匯總連接到北橋芯片,早期系統總線采用PCI結構,而低速設備采用ISA總線。
現代的計算機已經不再采用上面的結構,而是下面的結構
(圖片來源:知乎)
在最新的架構中,已經不再分南北橋,而是將南北橋合並稱為I/O橋。
操作系統扮演的角色
上面介紹了CPU,內存,硬盤等硬件,而且大致介紹了下這些硬件的功能,那操作系統在其中扮演什么角色呢?事實上,操作系統把cpu抽象成了進程,把內存抽象成了虛擬地址,把硬盤抽象成文件系統,那相應的就會衍生出如下功能。
- 進程調度:cpu的資源有限,怎么有效的調度各個進程,讓cpu盡可能處於忙碌狀態,盡快完成各個任務就變成一個很重要的問題。
- 虛擬地址(內存)管理:內存資源有限,怎么合理的分配內存資源給各個進程就變的尤為重要,並且確保進程之間的內存資源隔離防止出現混亂也同樣重要。
- 文件管理:如何有效的組織文件系統,可以更快的尋找到所需的文件,合理的利用磁盤資源都是操作系統要做的事情。
總結
這篇文章作為操作系統的第一篇,寫的有點虎頭蛇尾,因為操作系統依賴於硬件,所以需要先介紹一下硬件,由於操作系統本身很復雜,在第一篇文章中不能過多涉及具體的內容,所以看上去有些虎頭蛇尾。由於我本身不是科班出身,在大學時沒有學過操作系統,在實際的工作中,已經和鎖,信號量,LRU算法,數據庫索引結構,臟頁刷新等這些打過交道,但是並不知道,這些東西在操作系統中早就講過,覺得很神奇,所以要打好基礎很重要。要不然就顯得很無知。
參考:
《現代操作系統》
《程序員的自我修養》