第一章------計算機系統漫遊

第一章------計算機系統漫遊

1.gcc -o hello hello.c
       在這裏GCC編譯器驅動程序讀取源程序文件hello.c,並把它翻譯成一個可執行目標文件hello。這個翻譯過程可以分爲四個階段:
 1)預處理階段   2)編譯階段   3)彙編階段    4)鏈接階段

2.系統的硬件組成
1)總線
       貫穿整個系統的是一組電子管道,稱作總線,它攜帶信息字節並負責在各個部件間傳遞。通常被設計成傳送定長的字節快,也就是字。大多數機器字長要麼是4字節,要麼是8字節
2)I/O設備
       I/O(輸入/輸出)設備是系統與外部世界的聯繫通道。我們示例系統包括四個I/O設備:作爲用戶輸入的鍵盤和鼠標,作爲用戶輸出的顯示器以及長期存儲數據和程序的磁盤驅動器(簡單地說就是磁盤)。最開始,可執行程序hello就存放在磁盤上。

3)主存
       主存是一個臨時存儲設備,在處理器執行程序時,用來存放程序和程序處理的數據。從物理上來說,主存是一組動態隨機存取存儲器(DRAM)芯片組成的。從邏輯上來說,存儲器是一個線性的字節數組,每個字節都有其唯一的地址(數組索引),這些地址是從零開始的。
4)處理器
       中央處理單元(CPU),簡稱處理器,是解釋(或執行)存儲在主存中指令的引擎。處理器的核心是一個大小爲一個字的存儲設備(或寄存器),稱爲程序計數器(PC)。在任何時候,PC都指向主存中的某條機器語言指令(即含有該條指令的地址)。處理器從程序計數器指向的內存讀取指令,解釋指令的位,執行該指令指示的簡單操作,然後更新PC,使其指向下一條指令,而這條指令並不一定和在內存由剛剛執行的指令相鄰。
5)ALU
       算術邏輯單元(Arithmetic&logical Unit)中央處理器(CPU)的執行單元,能實現多組算術運算和邏輯運算的組合邏輯電路
3.運行hello程序
   初始時,shell程序執行它的指令,等待我們輸入一個命令,當我們在鍵盤輸入字符串"./hello"後,shell程序將字符逐一讀入寄存器,再把它放到內存中,如下圖

       當我們在鍵盤上敲回車鍵時,shell程序就知道我們已經結束了命令的輸入。然後shell執行一系列指令來加載可執行的hello文件,這些指令將hello目標文件中的代碼和數據從磁盤複製到主存。數據包括最終會被輸出的字符串“hello,world\n”。
       利用直接存儲器存取(DMA)技術,數據可以不通過處理器而直接從磁盤到達主存,如下圖

一旦目標文件hello中的代碼和數據被加載到主存,處理器就開始執行hello程序的main程序中的機器語言指令。這些指令將“hello, world\n”字符串中的字節從主存複製到寄存器文件,再從寄存器文件中複製到顯示設備,最終顯示在屏幕上。這個步驟如下圖所示:

DRAM(Dynamic Random Access Memory),即動態隨機存取存儲器,最爲常見的系統內存。DRAM 只能將數據保持很短的時間。爲了保持數據,DRAM使用電容存儲,所以必須隔一段時間刷新(refresh)一次,如果存儲單元沒有被刷新,存儲的信息就會丟失。 (關機就會丟失數據)
3.操作系統管理硬件
操作系統有兩個基本的功能:(1)防止硬件被失控的應用程序濫用;(2)嚮應用程序提供簡單一致的機制來控制複雜而又通常不相同的低級硬件設備操作系統通過幾個基本的抽象概念(進程、虛擬內存和文件)來實現這兩個功能。如下圖,文件是對I/O設備的抽象表示,虛擬內存是對主存和磁盤I/O設備的抽象表示,進程則是對處理器、主存和I/O設備的抽象表示。

4.進程
1)概念:進程是操作系統對於一個正在運行的程序的一種抽象。在一個系統上可以運行多個進程,而每個進程都好像在獨佔的使用硬件,而併發運行,則是指一個進程的指令和另一個進程的指令是交錯執行的。
2)進程的上下文切換
從一個進程切換到另一個進程的轉換是由操作系統內核管理的。內核是操作系統代碼常駐主存的部分。當應用程序需要操作系統的某些操作時,比如讀寫文件,它就執行一條特殊的系統調用指令,將控制權傳遞給內核。然而內核執行被請求的操作並返回應用程序。逐一內核不是一個獨立的進程。相反,它是系統管理全部進程所用代碼和數據結構的集合。

5.線程
儘管通常我們認爲一個進程只有單一的控制流,但是現代系統中,一個進程實際上可以由多個稱爲線程的執行單元組成,每個線程都運行在進程的上下文中,並共享同樣的代碼和全局數據。
6.虛擬內存
虛擬內存是一個抽象概念,它爲每個進程提供一個假象,即每個進程都在獨佔的使用主存,每個進程看到的內存都是一致的,稱爲虛擬地址空間,如圖所示,在Linux中,地址空間最上面的區域是保留給操作系統中的代碼和數據的,這對所有進程來說都是一樣。地址空間的底部區域存放用戶進程定義的代碼和護具。圖中的地址是從下往上增大的。

程序代碼和數據對所有的進程來說,代碼是從同一固定地址開始,緊接着是和C全局變量相對應的數據位置。代碼和數據區是直接按照可執行目標文件的內容初始化的,在示例終究是可執行文hello
堆。代碼和數據區後緊隨着的是運行時堆。代碼和數據區在進程一開始運行時就被指定了大小,與此不同,當調用像malloc和free這樣的C標準庫函數時,堆可以在運行時動態的擴展和收縮。
●共享庫。大約在地址空間的中間部分是一塊用來存放像C標準庫和數學庫這樣的共享庫的代碼和數據的區域。
棧。位於用戶虛擬地址空間頂部的用戶棧,編譯器用它來實現函數調用。和堆一樣,用戶棧在程序執行期間可以動態地擴展和收縮。特別地,每次我們調用一個函數時,棧就會增長;從一個函數返回時,棧就會收縮
內核虛擬內存。地址空間頂部的區域是爲內核保留的。不允許應用程序讀寫這個區域的內容或者直接調用內核代碼定義的函數。相反,它們必須調用內核來執行這些操作。
虛擬內存的運作需要硬件和操作系統軟件之間精密複雜的交互,包括對處理器生成的每個地址的硬件翻譯。基本思想是吧一個進程虛擬內存的內容存儲在磁盤上,然後用主存作爲磁盤的高速緩存。
7.系統之間利用網絡通信
如圖所示,當系統從主存複製一串字節到網絡適配器時,數據流經過網絡到達另一臺機器,而不是比如說到達本地磁盤驅動器。相似地,系統可以讀取從其他機器發送來的數據,並把數據複製到自己的主存。

8.併發和並行
1)線程級併發
如下圖所示典型的多核處理器,其中微處理器芯片有四個CPU核,每個核都有自己的L1和L2高速緩存,其中的L1高速緩存分爲兩個部分----一個保存最近取到的指令,另一個存放數據。這些核共享更高層次的高速緩存,以及到主存的接口。工業界的專家預言他們能夠將幾十個、最終會是上百個核做到一個芯片上。

超線程有時稱爲同時多線程,是一項允許一個CPU執行多個控制流的技術。假設一個線程必須等到某些數據被裝載到高速緩存中,那麼CPU就可以繼續曲直性另一個線程。舉例來說,Intel Core i7處理器可以讓每個核執行兩個線程,所以一個4核的系統實際上可以並行地執行8個線程。多處理器的使用可以從兩方面提高系統性能。首先,它減少了在執行多個任務時模擬併發的需要,另外一個他可以是應用程序運行得更快。
2)指令級並行
在較低的抽象層次上,現代處理器可以同時執行多條指令的屬性稱爲指令級並行。早期的微處理器,如1987年的Intel 8086,需要多個(通常是3~10個)時鐘週期來執行一條指令。最近的處理器可以保持每個時鐘週期2~4條指令的執行效率。
3)單指令、多數據併發
在較低的層次上,許多現代處理器擁有特殊的硬件,允許指令產生多個可以並行執行的操作,這種方式稱爲單指令、多數據,即SIMD並行。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章