1. 程式人生 > >第一章 計算機系統漫遊

第一章 計算機系統漫遊

理解 匯編語言 方式 src 源程序 在屏幕上 避免 1.2 網絡

1.1 信息就是位+上下文

  位的理解:源程序如hello.c,實際上是由值0和1組成的位,8個位組成一組,成為字節,如00011000。每個字節表示程序中的某些文本字符,每個字節都有一個整數值。如‘\n’,它的整數值為10,即00001010。若文件由有ASCII字符構成,則稱之為文本文件,所有其他文件都稱為二進制文件。

  系統中所有的信息——包括磁盤文件、內存中的程序、內存中存放的用戶數據以及網絡上傳的數據,都是由一串比特表示的。上下文,可以理解為,一個同樣的字節序列,它可能表示一個整數、浮點數、字符串或者機器指令。

1.2程序被其他程序翻譯成不同的格式

  hello程序的生命周期是一個高級c 語言程序開始的,為了運行該程序,每條C語句都必須被其他程序轉化成一系列的低級機器語言指令,然後這些指令按照一種稱為可執行目標程序的格式打好包,並以二進制磁盤文件的形式存放起來。

技術分享圖片

預處理階段:預處理器根據以字符#開頭的命令,修改原始的C程序。如#include<stdio.h>命令告訴預處理器讀取系統頭文件stdio.h的內容,並把它直接插入程序文本中,這樣得到了hello.i文件。

編譯階段:編譯器將hello.i文件翻譯成hello.s文件,它包含了一個匯編語言程序,每條語句都以一種文本格式描述了一條低級機器語言指令。

匯編階段:匯編器將hello.s翻譯成機器指令,將這些指令打包成一種叫做可重定位目標程序格式,並將結果保存在hello.o中。

鏈接階段:hello程序中調用了prinf函數,prinf函數存在於一個名為prinf.o的單獨的預編譯好了的目標文件中,而這個文件必須以某種方式合並到我們的hello.o程序中。鏈接器負責處理這種合並,結果就得到hello文件,它是一個可執行目標文件。

1.3了解編譯系統如何工作是大有益處的

  1. 優化程序性能
  2. 理解鏈接時出現的錯誤
  3. 避免安全漏洞

1.4 處理器讀並解釋儲存在內存中的指令

  這個是指我們常用的運行命令的shell,hello程序被編譯成可執行目標文件,shell加載並運行輸出hello程序它的消息,然後等待下一個命令行。

1.4.1 系統的硬件組成

技術分享圖片

總線:貫穿整個系統;

I/O設備:輸入(鍵盤鼠標等)、輸出(顯示器等)

主存:臨時存儲設備,在處理器執行程序時,用來存放程序和程序處理的數據。物理上來說,主存是由一組動態隨機存取存儲器DRAM芯片組成。

處理器:解釋或執行存儲在主存中指令的引擎,其核心為程序計數器PC,它每次都指向主存中的某條機器語言指令。處理器從程序計數器指向的內存出讀取指令,解釋指令中的位,執行該指令指示的簡單操作,然後更新PC,使其指向下一條指令,而這條指令並不一定和在內存中剛剛執行的指令相鄰。
CPU可能執行的操作:

  加載:從主存復制一個字節或者一個字到寄存器;

  存儲:從寄存器復制一個字節或者一個字到主存的某個位置;

  操作:把兩個寄存器的內容復制到ALU,ALU對這兩個字做算術運算,並將結果存放到一個寄存器中,以覆蓋該寄存器原來的內容。

  跳轉:從指令本身中抽取一個字,並將這個字復制到PC中,以覆蓋PC原來的值。

1.4.2 hello 程序運行

最初,hello程序放在磁盤上;

程序加載時,從磁盤復制到主存

處理器運行時,將字節從主存復制到寄存器文件,再從寄存器文件復制到顯示設備,最終顯示在屏幕上。

這種,開始時在磁盤,然後被復制到主存,最後從主存上復制到顯示設備,復制來復制去的 是不是額外的開銷,是不是可以提升一下速度呢?(高速緩存)

1.5高速緩存至關重要

技術分享圖片

局部性原理:高速緩存裏存放可能經常訪問的數據,大部分的內存操作都能在快速的高速緩存中完成。

結論:高速緩存存儲器存在的應用程序員能夠利用高速緩存將程序的性能提高一個數量級

1.6存儲設備形成層次結構

在處理器和一個較大較慢的設備(主存)之間插入一個更小更快的存儲設備(高速緩存)的想法已經成為一個普遍的觀念

技術分享圖片

1.7 操作系統管理硬件

運行hello程序都沒有直接訪問鍵盤啊 鼠標顯示器這些的 它們依靠著操作系統提供服務

操作系統有兩個基本功能 一是防止硬件失控的應用程序濫用 二是 向應用程序提供簡單一致的機制來控制復雜又通常大不相同的低級硬件設備

技術分享圖片

如圖,文件是對IO設備的抽象,虛擬內存是對主存和磁盤I/O設備的抽象表示,進程是對處理器、主存和I/O設備的抽象表示;

1.7.1 進程

進程是操作系統對一個正在運行的程序的一種抽象

上下文:操作系統保持跟蹤進程運行所需的所有狀態信息,如PC,寄存器當前值,主存內容等;

上下文切換:保存當前進程的上下文,恢復新進程的上下文;

從一個進程到另一個進程的轉換是由操作系統內核管理的。比如,讀文件,應用程序會執行一條特殊的系統調用指令,將控制權傳遞給內核,然後內核執行被請求的操作並返回應用程序。

技術分享圖片

1.7.2 線程

線程:一個進程可以由多個稱為線程的執行單元組成,每個線程都運行在進程的上下文中,並共享同樣的代碼和全局數據。 多線程之間比多進程之間更容易共享數據,線程一般也比進程更高效。

1.7.3虛擬內存

虛擬內存:虛擬內存是一個抽象概念,它為每個進程提供了一個假象,即每個進程都在獨占地使用主存。每個進程看到的內存都是一樣的,稱為虛擬地址空間。

技術分享圖片

程序代碼和數據:用戶進程定義的代碼數據;
堆:運行時堆;
共享庫:C標準庫;

棧:函數調用;

內核虛擬內存:為內核保留,不允許應用程序讀寫這個區域內容;

1.8 系統之間利用網絡通信

網絡提供了計算機系統之間通信的手段。從特殊系統的角度來看,網絡就是一種I/O設備。

本地主機上的telnet客戶端連接遠程主機上的telnet服務器,具體過程如下:

技術分享圖片

1.9 重要主題

1.9.1 Amdahl定律:主要思想是當我們對系統的某個部分加速時,其對系統整體性能的影響取決於該部分的重要性和加速程度。

1.9.2 並發與並行:

  並發指一個同時具有多個活動的系統;並行指的是用並發來使一個系統運行的更快。

1.9.3 計算機系統中抽象的重要性

1.10 小結

  信息就是位+上下文;

  程序被其他程序翻譯成不同的格式:預處理器、編譯器、匯編器、鏈接器四個階段過程;

  處理器讀並解釋存儲在內存中的指令;

  存儲設備層次結構:CPU寄存器在頂部,接著是多層的硬件高速緩存存儲器,DRAM主存和磁盤存儲器;

  操作系統內核三個基本抽象:文件是對I/O設備的抽象;虛擬內存是對主存和磁盤的抽象;進程是處理器、主存和I/O設備的抽象;

網絡提供了計算機系統之間通信的手段。
  

第一章 計算機系統漫遊