這一節的內容有些枯燥,不少內容都是文字描述。可是對於後續的學習是有幫助的,一些概念提早有個簡單的瞭解多少會有些幫助。程序員
這一節的學習內容都是一些概念和知識的簡要介紹,沒有過多地深刻,旨在爲後續學習作個鋪墊。shell
上文最後部分提到,計算機內部運行程序時,用到了不少複製的操做,此處爲連接。從程序員的角度來講,這些複製操做就是開銷,佔用了程序運行的一部分時間。所以,系統設計者的一個主要目標就是減小這些複製操做所用的時間。
緩存
根據機械原理,容量大的設備要比容量小的設備運行速度慢。磁盤可能比主存大1000倍,但就處理器而言,對主存存取數據的時間開銷要比對磁盤小1000萬倍。主存和寄存器之間也有相似的結論。因而人們想出一種方法:在處理器和一個又大又慢的設備(例如主存)之間插入一個更小更快的存儲設備(主要是高速緩存)。實際上,每一個計算機系統中的存儲設備都被組織成了一個存儲器層次結構。以下圖所示網絡
在這個結構中,從上到下,設備容量愈來愈大,運行速度愈來愈慢,同時造價也愈來愈便宜。
存儲器層次結構的主要思想是上一層的存儲器做爲下一層存儲器的高速緩存。上圖中頂層的寄存器是L1的高速緩存,L1是L2的高速緩存,以此類推。
從這個角度講,程序員能夠利用對整個存儲器層次結構的理解來提升程序的性能。併發
計算機系統的分層視圖以下所示函數
可見,是操做系統進行對硬件的管理,並與應用程序進行交互。
性能
以hello程序爲例,當shell加載和運行hello world程序,以及由該程序輸出消息時,shell和hello程序都沒有直接訪問鍵盤、內存和磁盤、顯示器。它們只是使用了操做系統提供的服務。操做系統是應用程序和硬件的「中間人」,負責管理硬件,並給應用程序提供接口,全部應用程序對硬件的操做嘗試都要通過操做系統。
操做系統有兩個基本功能:學習
防止硬件被失控的應用程序濫用;spa
嚮應用程序提供簡單一致的機制來控制複雜的低級硬件設備。操作系統
操做系統經過幾個抽象的基本概念(進程、虛擬存儲器和文件)來實現以上兩個基本功能。以下圖所示,
圖中,文件是對I/O設備的抽象表示,虛擬存儲器是對主存和磁盤I/O設備的抽象表示,進程是對處理器、主存和I/O設備的抽象表示。(再高一級就是虛擬機,把操做系統也進行了抽象表示)
下面分別介紹這幾個基本概念。
像hello這樣的程序在現代操做系統上運行時,操做系統會提供一種假象,即好像操做系統上只有這個程序在運行,只有這個程序在使用處理器、主存和I/O設備。這種假象是經過進程的概念來實現的。
進程是操做系統對正在運行的程序的一種抽象。一個系統上能夠同時運行多個進程,每一個進程好像獨佔的使用硬件。所謂併發,是說一個進程的指令和另外一個進程的指令交錯執行。操做系統實現這種交錯執行的機制稱爲上下文切換。
操做系統跟蹤進程運行所需的全部狀態信息(也就是上下文),任何一個時刻,處理器只能運行一個進程。當操做系統決定要把控制權從當前進程轉移到一個新進程時,就要進行上下文切換,即保存當前進程的上下文,恢復新進程的上下文,而後將控制權轉交給新進程,新進程就從上次中止的地方開始執行。以hello程序爲例,併發的過程以下所示
圖中有兩個併發的進程:shell(進程A)和hello程序(進程B)。起初只有shell程序在運行,等待命令輸入;當咱們讓它運行hello程序時,shell經過調用一個專門的函數(系統調用)來執行咱們的請求;系統調用將控制權交給操做系統,操做系統保存shell進程的上下文,建立hello進程及其上下文,而後將控制權轉交給hello進程;hello進程終止後,操做系統回覆shell進程的上下文,把控制權轉交給它,而後shell進程繼續等待下一條命令輸入。
在現代操做系統中,一個進程能夠由多個稱爲線程的執行單元組成。每一個線程都運行在進程的上下文中,並共享一樣的代碼和全局數據。後續會詳細討論。
虛擬存儲器爲每一個進程提供了一個假象,好像每一個進程在獨佔的使用內存。每一個進程看到的是一致的存儲器,稱爲 虛擬地址空間。如圖所示爲Linux進程的虛擬地址空間,
圖中地址從下往上是增大的。這裏先簡單瞭解一下每一個區(從下往上)。
程序代碼和數據:對於全部的進程來講,代碼是從同一固定地址開始,緊接着的是和C全局變量對應的數據位置。代碼和數據區是直接按照可執行目標文件的可執行內容進行初始化的,這裏 也就是hello程序。
堆 :代碼和數據區後緊隨着運行時堆。代碼和數據區是在進程一開始運行時就固定了大小,而堆能夠在運行時動態地擴展和收縮。
共享庫 :大約在地址空間的中間位置放置像C標準庫和數學庫等共享庫的代碼和數據。
棧 :位於用戶虛擬地址空間頂部的是用戶棧,編譯器用它來實現系統調用。與堆同樣,運行時棧的大小可動態地擴展收縮。
內核虛擬存儲器:內核老是駐留在內存中,是操做系統的一部分。
文件就是字節序列。每一個I/O設備均可以視爲文件。
從單個系統來看,網絡就至關於一個I/O設備。以下圖所示
系統從主存複製一些字節到網絡適配器,數據流通過網絡到達另外一臺機器。類似地,系統也能夠讀取其餘機器的數據,複製到本身的主存上去。
以hello程序爲例,利用telnet經過網絡遠程運行hello程序的過程,以下圖所示
以上就是本次的學習總結,後面的記錄將會更加深刻的學習每一部分。