第一篇——計算機系統漫遊

第一篇——計算機系統漫遊

來自專欄深入理解計算機系統讀書筆記

前言:這是專欄的第一篇,一直想要閱讀《深入理解計算機系統》這本名聲在外的大部頭,開通這個專欄是想記錄和分享閱讀這本書的一些小結,督促自己認真讀完這本書,彌補自己基礎知識的不足,如果能夠給別人帶來一些幫助就再好不過了。

1、源程序的表示

/*hello.c*/#include <stdio.h>int main(){ printf("hello, world
"); return 0; }

源程序實際上是由0和1組成的位序列(比特),8個位為一個位元組,每個位元組表示程序中的某些文本字元。對於英語類語言文本通常用ASCII標準,也就是用一個唯一的單位元組大小的整數值來表示每個字元。

hello.c程序以位元組序列的方式存儲在文件中,每個文本行都是以一個看不見的換行符/n結束,它的ASCII碼對應的整數值為10。

hello.c的ASCII文本表示

系統中的所有信息都是由一串比特表示,區分不同數據對象的方法是我們讀取這些數據對象時的上下文,不同的上下文可能有不同的表示。

1.1源程序的編譯

想要讓機器讀懂我們寫的高級程序語言,需要編譯器將源程序編譯成低級機器語言指令,也就是編譯成可執行目標文件。

在linux系統中的編譯指令為:

stonebegin@stonebegin-Vostro-14-5480:~$ gcc -o hello hello.c//gcc是編譯器,hello是可執行目標文件名稱,hello.c是源程序名稱

編譯過程分為4個階段:

  • 預處理階段:預處理器(cpp)根據以字元#開頭的命令,修改原來的C程序。比如,在hello.c中,預處理器讀取系統頭文件stdio.h的內容,插入到程序中,就得到了另一個C程序,通常以 .i 作為文件擴展名。
  • 編譯階段:編譯器(ccl)將hello.i翻譯成hello.s,它包含一個彙編語言程序。
  • 彙編階段:彙編器(as)將hello.s翻譯成機器語言指令,結果保存在文件hello.o中,它是一個二進位文件。
  • 鏈接階段:在我們的這個hello程序中調用了標準C庫中的printf函數,而printf函數存在於名為printf.o的預編譯好的目標文件中,鏈接器(ld)負責合併。最終,得到了hello可執行文件,可以被載入到內存,由系統去執行。

1.2可執行文件的載入與執行

將文件名輸入到shell應用程序中:

stonebegin@stonebegin-Vostro-14-5480:~$ ./hellohello, world

shell是一種命令行解釋器,如果輸入的不是一個內置的shell命令,shell會假設它是一個可執行文件,並載入運行這個文件。

2、系統的硬體組成

典型系統硬體組成

  1. 匯流排:貫穿整個系統的一組電子管道,攜帶信息位元組並在各個部件間傳遞。通常匯流排被設計成傳送定長位元組塊,4位元組(32位),8位元組(64位)
  2. I/O輸入設備:鍵盤,滑鼠,顯示器,磁碟驅動器等
  3. 主存:在處理器執行程序時,用來存放程序和程序處理的數據。物理上,主存由一組動態隨機存取存儲器(DRAM)晶元組成。邏輯上,存儲器是一個線性的位元組數組,每個位元組都有其唯一的地址
  4. 處理器:是執行存儲在主存中指令的引擎,CPU的核心是一個大小為一個字的存儲設備,稱為程序計數器(PC),PC指向主存中含有某條機器指令的地址。圖中的寄存器文件由一些單個字長的寄存器組成,每個寄存器都有唯一的名字和對應的作用,ALU(算術邏輯單元)負責計算新的數據和地址值

看幾張流程圖,理解hello程序運行過程:

從磁碟讀取hello命令

利用DMA(直接存儲器存取)技術,可以直接從磁碟載入數據到主存

DMA示意圖

處理器從寄存器文件(幾百位元組的信息)讀取數據要比從主存(幾十億位元組)中讀取要快100倍,針對這種差異,在CPU晶元組中加入了高速緩存存儲器(cache memory),作為暫時集結區域,存放處理器近期可能會需要的信息。

含有高速緩存的CPU

這裡有一個存儲器結構層次圖,這個結構圖中,從上至下,設備訪問速度越來越慢,容量越來越大,每位元組價格相應降低,寄存器文件在結構層次最頂部,為L0

3、操作系統管理硬體

操作系統兩個基本功能:

(1):防止硬體被失控的應用程序濫用

(2):嚮應用程序提供簡單一致的機制來控制複雜由不同的低級硬體設備

操作系統通過進程、虛擬內存和文件這幾個抽象概念來實現以上功能。

進程是對處理器、主存和I/O設備的抽象,虛擬內存是對主存和磁碟的抽象,文件是對I/O設備的抽象

幾個基本概念:

進程:進程是操作系統對一個正在運行的程序的一種抽象。操作系統保持跟蹤進程運行所需要的所有狀態信息,就是上下文。任何時刻,單處理器系統都只能執行一個進程的代碼,當操作系統進行進程切換的時候,上下文也會跟著切換,即保存當前進程的上下文,恢復新進程的上下文。

線程:一個進程可以由多個線程的執行單元組成,每個線程都運行在進程的上下文中,並享有同樣的代碼和全局數據。

虛擬內存:它使得應用程序認為它擁有連續可用的內存(一個連續完整的地址空間),而實際上,它通常是被分隔成多個物理內存碎片,還有部分暫時存儲在外部磁碟存儲器上,在需要時進行數據交換。

並發:一個同時具有多個活動的系統,也就是一個處理器同時處理多個任務

並行:多個處理器或者是多核的處理器同時處理多個不同的任務,為的是使系統運行的更快

感謝作者Randal E. Bryant和David R. OHallaron

如有錯漏之處望指出,推薦親自閱讀《深入理解計算機系統》


推薦閱讀:

電腦是由哪些零部件組成的?
【大學】要勇於承認自己的無知--高德納
第一場CTF模擬賽賽後感想
從開掛與硬體廠商的狂歡看 一款遊戲的影響到底有多大?
電腦小白需要收藏的7個電腦小知識

TAG:計算機科學 | 計算機系統 | 計算機 |