操做系統是將咱們的硬件CPU、內存和各類外部的IO設備進行抽象和調用給上層應用程序的操做平臺。緩存
若是沒有操做系統,某一個應用程序要想在這個主機或着說硬件上運行,那麼他須要本身去管理CPU調用、內存的使用以及IO設備的使用,從哪兒都數據?數據輸出的時候寫到哪兒去?都須要進程本身進行管理。這太麻煩不是嗎?任何一我的本身開發一個應用程序,都這這麼寫,並且也不方便讓多個應用同時進行工做,爲何呢?由於你們看見的CPU和內存都是所有的,在相互運行的時候必定會形成資源爭用,必定會相互打架。因此基於這樣需求,就出現了這樣的一個東西,資源管理層,他什麼也不幹,主要工做就是將咱們的硬件資源進行一次抽象。這麼抽象呢?把全部硬件資源的使用都虛擬成了系統調用,術語叫作System Call。網絡
因此有了這個東西以後呢,咱們的應用程序須要用到的內存以及但凡須要跟硬件打交道,都須要進過操做系統的System Call。好比說我須要調用CPU,應用程序會向操做系統發起系統調用,在操做系統當中,有一個系統調用是向CPU進行抽象調用的,操做系統會使用該調用將CPU的資源分配給該應用程序使用。因此咱們的應用程序只要要用到硬件資源,它只須要向操做系統的內核發起系統調用便可,這就是爲何咱們在進行系統性能調優和監控的時候,會發現咱們系統的某一進程會不斷的向操做系統發起系統調用。這大大的方便了應用程序。ide
隨着操做系統的發展,操做系統又將多個不一樣的系統調用按照某種機制分配到不一樣的進程上去,從而使得咱們的應用程序具有多種的功能。操做系統在這裏其實也是相似於一種進程監控器的存在,是一個特殊組件。咱們能夠稱之爲Process Monitor。它可以監控着每個進程的運行。進程運行在操做系統之上,他看到的僅僅是操做系統,或着是操做系統分配給他的CPU時間片,內存存儲空間以及IO設備,他可以或得某一個IO設備的使用權的時候,就意味着他佔用了這個IO的總線,咱們姑且能夠這樣理解。咱們的IO設備真正的要跟CPU通信,跟應用程序通訊,那就意味着IO設備會使用總線跟CPU或着內存進行通訊。性能
由此,操做系統負責其上運行的應用程序的每個對硬件資源的申請,因此使得第一個進程在使用CPU的時候,第二個進程就只能等待,假設咱們的電腦就一顆CPU。可是好在咱們的CPU速度很是快,而進程自己所須要的CPU時間有很是短,所以對於不少用戶看來,咱們的多個應用程序是並行進行的。事實上若是隻有一顆CPU的狀況下並非並行的並且也沒法並行。同時,每個進程在運行的時候都須要一段內存空間,並且這段內存是連續且平滑的。從低端內存地址到高端內存地址,高端地址是棧,低端地址的代碼段、數據段,BSS段等等。可是咱們的內存老是有限的,不可能沒一個應用程序都給它所須要的那麼多的內存空間,由於一個應用程序雖說須要那麼多的地址,可是在實際運行的時候。實際上是用不到那麼可能是空間地址的。極可能只須要一點就足夠了。由此,操做系統提供了一種管理機制,或者說結合CPU完成了一種管理機制。將每個進程所使用的線性地址空間轉換成物理地址空間,這種映射是按照頁面的方式進行映射的,其實進程所使用的地址,分爲rss常駐內存級、Page Cache,以及anon Page匿名頁,頁緩存等等,那麼什麼是rss常駐內存級呢?就是咱們的進程啓動的時候這段地址必須是位於物理內存空間的地址。是絕對不能夠被交換出去的。那麼什麼是頁緩存呢?頁緩存就是咱們打開的文件,這些文件一般都保存在咱們的Page Cache中,Page Cache能夠交換到交換分區當中,也能夠被清除出去,由於他就是緩存,沒有的時候咱們再打開一次文件不就完了嘛。上面匿名頁?匿名頁就是咱們的進程在運行過程當中所產生的一些中間數據,好比咱們堆中的數據,一般都是匿名頁或着說有一部分是匿名頁。因此,當第一個進行打開了文件,佔據了很大的內存空間,第二個進程須要在使用內存的時候內存空間不夠了,那怎麼辦呢?把第一個文件打開的文件都通通的清除出去,就騰出空間給第二個進程打開文件所須要的空間了。這時若是第一個進程發現打開的文件沒了咋辦?這個時候就會產生一個東西,名叫缺頁中斷。然後,系統會重新將第一個進程所打開的文件重新調用回來。要想完成線性地址都物理地址的轉換,須要使用到一個技術,名叫MMU。可是MMU沒一次轉換都須要實現一級頁面的查找,二級頁面的查找,而後在實現平移,在實現中斷,纔可以獲得內存空間。這是很是麻煩的。爲了加速這個過程,因而有了一個技術,叫TLB。spa
還有,IO設備是怎麼實現和CPU交互的,CPU怎麼知道他那一次是和哪個IO設備打交道的呢?當前系統中咱們可能存在不少的IO設備,可是咱們的總線是否是隻有一個,處理機制也只有一個。IO設備在啓動的時候必需要向整個系統註冊他本身的IO端口,在操做系統當中,IO設備的端口也是連續的,一個IO設備可使用一片連續的IO設備端口。端口通常也是從0-65535這個範圍內。那麼若是某一個端口被其實IO設備註冊使用了,那麼別的IO設備在註冊的時候就只能使用剩餘的其餘端口了。可是通常來說咱們的端口是用不完的。同時,爲了讓CPU知道在哪個時刻IO設備產生了那些事件,每一個IO設備還須要向CPU註冊中斷,必需要註冊使用中斷號。因此CPU只須要知道那個IO端口註冊使用的是哪個IO設備,就麼就能實現IO設備和CPU之間的準確交互。而中斷是IO設備和CPU之間創建的緊急溝通平臺。就比如說中美關係,在正常狀況下都是經過管理外部事務的部門進行官方之間的信息溝通,可是在狀況比較緊急的狀況下,領導人與領導人之間須要有專線進行緊急事件的溝通,以免緊急事件照成誤判而發生戰爭或者其餘影響。有了中斷,一旦某個IO設備向CPU來了一個IO中斷信息,好比說網卡,有人ping過來了一個報文,你們知道這個報文在計算機的底層其實表現的就是一電信號,報文不當即處理的話就會當即消失的。這個報文保存在內存的網絡緩存區中。若是是磁盤IO發送過來的中斷信息呢?要把他讀進來放在磁盤緩存區當中,因此操做系統中,每一個設備都會有緩存區的。通常來說,一旦某個IO設備產生中斷了,意味着這個事件比當前運行的進程更緊急,因此操做系統對於中斷的處理應該是很優先的。那麼咱們的系統在上面時候纔會產生中斷呢?容許中斷呢?在任何一個時鐘中斷到來以前,可以實現對CPU的搶佔。所以當咱們的系統有一個設備接入進來的時候,該設備會向中斷控制器發起一箇中斷請求,中斷控制器產生請求以後,CPU立刻就可以意識到有設備進來了,那麼CPU是怎麼意識到的呢?CPU裏面有一種東西叫作針腳,這個針腳一旦有了電壓,CPU立刻就意識到了。CPU一旦產生中斷,CPU就會告訴內核中斷產生,這個時候內核必需要完成模式切換,而這個時候內核可能正在運行着一個進程,那這個進行就會被清除出去的。讓內核處理該中斷,將信息讀進內存當中。操作系統
若是咱們須要從磁盤上讀取不少文件進來,咱們的CPU必需要一個一個的指揮着,那這樣的話,咱們的CPU大量的時間都消耗在數據交換上了,爲了不這種狀況,CPU能夠在內存中開闢一段空間,來存儲這段數據,然後CPU吧這個控制權交給這個設備的DMA,由DMA負載取數據。數據取完以後放到內存裏面,DMA告訴CPU數據取完了。DMA是怎麼告訴CPU呢?又是一次中斷。綜合來講就是一個外部的硬件須要和CPU打交道的時候,必需要經過中斷來完成。CPU必需要知道沒一次的中斷都是什麼,他的IO端口是什麼。而後才能當前的這些動做和IO設備關聯起來,而且在須要的時候將這個IO設備附加到進程上面。進程