深入理解計算機系統(1)-----計算機系統漫遊

思維導圖:

 

引言:

    深入理解計算機系統系列是我看<<深入理解設計系統>>的讀書總結.本章既爲開篇的第一章-計算機系統漫遊.其主要內容是從整體上介紹什麼是計算機系統.例如:

  • 計算機系統由那些部分構成
  • 計算機系統是如何管理硬件的
  • 計算機系統是如何執行程序代碼的

一.計算機系統的組成

    計算機系統是由硬件和系統軟件組成的,他們共同工作來運行引用程序.

1.1 系統硬件

    計算機系統的硬件由以下幾類組成:

  • 總線:總線是貫穿整個系統的一組電子管道,它攜帶信息字節並負責在各個部件間傳遞.總線通常被設計爲傳遞定長的字節塊,也就是我們常說的字
  • I/O設備:I/O(s輸入/輸出)設備是系統與外部世界聯繫的通道.例如鍵盤和鼠標是輸入設備,顯示器是輸出設備.I/O設備會通過控制器或者適配器與總線相連.控制器和適配器的區別在於封裝方式.網絡通信也算是I/O設備的一種.
  • 主存:主存是一個臨時存儲設備,在處理器執行程序時,用來處理程序和程序處理的數據..
  • 處理器:中央處理單元(CPU),簡稱處理器.是解釋或執行儲存在主存中指令的引擎.處理器的核心是一個大小爲一個字的存儲設備(寄存器),稱爲程序計數器,它指向一條機器語言指令.

 1.2 系統軟件

    計算機的系統軟件是如何管理系統硬件的呢?這是由操作系統提供的服務.我們可以把操作系統看爲應用程序和硬件之間插入的一層軟件.

    操作系統的功能有以下兩點:

  • 防止硬件被失控的應用程序濫用
  • 嚮應用程序提供簡單一致的機制來控制複雜而又通常大不相同的低級硬件設備.

    系統通過基本的抽象概念實現了這兩個功能..

    系統實現的抽象概念如下:

  • 進程:進程是操作系統對一個正在運行的程序的抽象.一個計算機系統上可以同時運行多個進程,每個進程都好像在單獨的使用硬件.一個進程的指令是和另一個進程的執行交錯運行的.操作系統實現的這種交錯運行的機制稱爲上下文切換.
  • 線程:在現代操作系統中,一個進程實際上有多個稱爲線程的執行單元組成,每個線程都運行在進程的上下文中,並共享同樣的代碼和全局數據.
  • 虛擬內存:虛擬內存是一個抽象概念,他爲每個進程提供了一種假象,即每個進程都在獨佔的使用主存.每個進程看到的內存都是一致的,稱爲虛擬地址空間.

  • 文件:文件就是字節序列,僅此而已.他是每個I/O設備的抽象表示.

二.程序執行

    一個程序是如何在計算機系統中執行的呢,又會經過怎樣的執行步驟呢?

    我們以如下這個名爲hello.c的程序代碼爲例.

#include <stdio.h>

int main()
{
    printf("hello, world\n");
    return 0;
}

2.1 什麼是信息

    首先,我們需要知道,到底什麼是信息.信息其實就是位+上下文.以上程序代碼其實就是由值爲0和1組成的位(也稱爲比特)序列,他們8個位一組,稱爲字節.每個字節都可以表示某些文本字符.

    所有的信息都是有一串比特表示的,而區分他們的唯一方式就是讀到這些數據對象時的上下文..

2.2 編譯

    硬件是不認識C語言或其他高級語言的,硬件只會執行最基本的機器語言,所以,我們需要將上述程序代碼翻譯成機器語言代碼纔可供硬件執行,此時的文件稱之爲目標文件,也稱爲可執行目標文件.這就需要藉助於幾種中間程序,也就是我們的編譯系統.

  • 預處理階段:預處理器cpp會根據以#開頭的命令,修改原始的C程序.比如像我們的hello.c中第一行的 # include<stdio.h>命令告訴預處理器讀取系統頭文件中stdio.h的內容,並把它直接插入程序文本中.結果就得到了以.i爲擴展名的文件.
  • 編譯階段:編譯期ccl將文本文件hello.i翻譯成文本文件hello.s,它包含一個彙編語言程序.
  • 彙編階段:彙編器as會將hello.s翻譯成機器語言指令,把這些指令打包成一種叫可重定位目標程序的格式並將結果保存在hello.o中.
  • 鏈接階段:我們注意到,hello.c程序中調用了printf函數,這是每個C語言編譯期都提供的標準C庫中的一個函數.printf存在於一個名爲printf.o的單獨的預編譯好了的目標文件中,而這個文件必須以某種方式合併的我們的hello.o中.鏈接器ld就負責處理這種合併.最後就會生成一個可執行目標文件hello.

2.3 執行

    我們來看看當hello.c被編譯好以後是如何在計算機系統中執行的.

  • 1.我們在鍵盤上輸入字符串"./hello.c"後,shell程序將字符串足以讀入寄存器,在把它們存放到內存中.

  • 2.當我們敲下回車鍵後,shell程序知道我們已經結束的命令的輸入.然後shell程序執行一系列的指令來加載可執行的hello文件,這些指定會將hello代碼和數據從磁盤複製到主存中.

  • 3.一旦主存加載了hello文件的代碼和數據,處理器就會執行其中的main函數的代碼片段,然後將結果"hello,world"複製到寄存器文檔,然後從寄存器文檔複製到顯示設備,最終顯示在屏幕上.

 2.4 存儲層次

    從以上hello文件被執行的過程中可以看到,系統花費了大量的時間把信息從一個地方移動到另一個地方.爲了減少移動信息的時間開銷,同時也考慮到成本的節約.就形成了我們當前的存儲器層次結構.

 三.重要主題

    作爲本章的結尾,還需要介紹兩個貫穿整書的重要的概念.

3.1 Amdahl定律

    Amdahl定律用於衡量系統部分的加速效果對於系統整體的加速效果的影響.其中S表示加速比,用於衡量加速效果.a表示在舊系統中部分系統執行時間與系統整體執行時間的比例.k表示部分系統的加速效果.

3.2 併發和並行

  •     併發:併發是一個通用的概念,指一個同時具有多個活動的系統.
  •     並行:並行指用併發使一個系統運行的更快. 

    在瞭解了上述概念後,我們按照系統層次結構中由高到低的順序重點強調三個層次:

  • 線程級併發:構建在進程這個抽象之上,我們能夠設計出同時具有多個程序執行的系統,就導致了併發.使用線程,我們甚至能夠在一個進程中執行多個控制流.
  • 指令級並行:在較低的抽象層次上,現代處理器可以同時執行多條指令的屬性稱爲指令級並行.
  • 單指令,多數據並行:在最低層次上,許多現代處理器擁有特殊的硬件,允許一條指令產生多個可以並行執行的操作.這種方式稱爲單指令,多數據,即SIMD並行.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章