[CSAPP] 01 計算機系統(tǒng)漫游

1 程序是如何存儲與執(zhí)行的

在這一節(jié)中濒持,將介紹:

  • 程序是如何保存在計算機中,
  • 并且如何轉(zhuǎn)換成計算機可識別、可執(zhí)行的信息不见,
  • 然后介紹計算機硬件中是如何一步步執(zhí)行程序的。

所以首先簡單介紹計算機的硬件組成崔步,以此作為基礎(chǔ)后脖祈,一步步介紹程序是如何存儲并執(zhí)行的。

1.1 計算機硬件簡介

典型的計算機硬件組成刷晋,可分為三部分:CPU盖高、RAM慎陵、I/O。

img

下面介紹比較重要的部分:

1.1.1 總線

總線是貫穿各個計算機硬件的橋梁喻奥。它攜帶信息席纽,并且負(fù)責(zé)將信息在各個部件之間進(jìn)行傳遞∽膊希總線通常被設(shè)計成傳送特定長度的字節(jié)塊润梯,稱為 字(Word)。這是一個基本的系統(tǒng)參數(shù)甥厦,不同系統(tǒng)中各不相同纺铭。

總線主要包含:

  • 數(shù)據(jù)總線:通常用來傳輸數(shù)據(jù)。如從主存RAM中傳輸數(shù)據(jù)到CPU中
  • 地址總線:主要用于傳輸?shù)刂返陡怼H鐝腞AM的地址1000處獲取數(shù)據(jù)舶赔,這里的1000就是通過地址總線進(jìn)行傳輸?shù)?/li>
  • 控制總線:主要傳輸控制、時序信息谦秧。如讀寫竟纳、中斷等

1.1.2 I/O設(shè)備

I/O設(shè)備:是系統(tǒng)和外部世界的聯(lián)系通道。

每個I/O設(shè)備都通過一個 控制器 或 適配器 與I/O總線相連疚鲤,負(fù)責(zé)I/O設(shè)備和I/O總線間的信息傳遞锥累。

控制器與適配器的區(qū)別Linux控制器(Controller)與適配器(Adapter)

  • 控制器(Controller):集成在CPU主板上,并可以將CPU發(fā)來的邏輯指令通過特定協(xié)議轉(zhuǎn)換為設(shè)備可以識別的控制信號集歇;

  • 適配器(Adapter):獨立的外部設(shè)備桶略,可以實現(xiàn)和控制器一樣的功能,如網(wǎng)卡等诲宇;

一般情況下删性,

  • 對于磁盤來說,控制數(shù)據(jù)/指令轉(zhuǎn)換的機制都是靠控制器來實現(xiàn)的焕窝;

  • 但是對于網(wǎng)卡蹬挺,USB等設(shè)備來說,則是靠適配器來實現(xiàn)的它掂。

1.1.3 主存(RAM)

是一個臨時存儲設(shè)備巴帮。

當(dāng)程序運行時,主要保存程序以及程序處理的數(shù)據(jù)虐秋¢偶耄基本單位是字節(jié)(Byte),從邏輯上看客给,對每個字節(jié)都指定了唯一的地址用押,這個地址從0開始。

1.1.4 處理器

中央處理器 (英語:Central Processing Unit靶剑,縮寫:CPU)蜻拨。功能主要是解釋計算機指令以及處理計算機軟件中的數(shù)據(jù)池充。

一個CPU由若干部分組成:

  • 寄存器:通常為8位寄存器,用來保存一個字節(jié)的數(shù)據(jù)缎讼。

    CPU中有若干寄存器收夸,每個寄存器都有唯一的地址,用來保存CPU中臨時運算結(jié)果血崭。其中有兩個寄存器比較特殊:

    • 指令地址寄存器(程序計數(shù)器):保存當(dāng)前指令在內(nèi)存中的地址卧惜,每次執(zhí)行完一條指令后,會對該寄存器的值進(jìn)行修改夹纫,指向下一條指令的地址咽瓷。
    • 指令寄存器:保存當(dāng)前從主存中獲取的,需要執(zhí)行的指令舰讹。
  • 算術(shù)邏輯單元(ALU):主要用來處理CPU中的數(shù)學(xué)和邏輯運算茅姜。

    它包含兩個二進(jìn)制輸入,以及一個操作碼輸入跺涤,用來決定對兩個輸入進(jìn)行的算數(shù)邏輯操作。然后會輸出對應(yīng)的運算結(jié)果监透,以及具有各種標(biāo)志位桶错,比如結(jié)果是否為0、結(jié)果是否為負(fù)數(shù)等等胀蛮。

    它有一個算術(shù)單元(Arithmetic Unit)院刁,一個邏輯單元(Logic Unit)

    • 算術(shù)單元:負(fù)責(zé)計算機里的所有數(shù)字操作粪狼,比如加減法退腥、增量運算(給某個數(shù)字+1)等等。
    • 邏輯單元:執(zhí)行邏輯操作再榄,比如AND狡刘、OR和NOT操作,也能做簡單的數(shù)值測試困鸥,比如數(shù)字是不是負(fù)數(shù)嗅蔬。
  • 控制單元(CU):是一系列門控電路,<u>通過門控電路來判斷指令寄存器中保存的指令內(nèi)容</u>疾就,<u>然后調(diào)整控制 主存 和 寄存器 的讀寫數(shù)據(jù)和地址,以及使用ALU進(jìn)行運算</u>。

    簡單理解為:一系列門控電路贺嫂,然后根據(jù)你程序的指令來調(diào)控CPU中的各種資源悍缠。

<u>CPU中執(zhí)行指令的過程</u>:提取解碼姑荷、執(zhí)行寫回盒延。

  1. 提人趵蕖:首先,根據(jù)“指令地址寄存器”從內(nèi)存中獲取對應(yīng)地址的數(shù)據(jù)兰英;
  2. 解碼:然后撇叁,將其保存在“指令寄存器”中;
  3. 執(zhí)行:“控制單元”會對指令內(nèi)容進(jìn)行判斷畦贸,并調(diào)用寄存器陨闹、ALU等執(zhí)行指令內(nèi)容;
  4. 寫回:以一定格式將執(zhí)行階段的結(jié)果簡單的寫回薄坏。(運算結(jié)果經(jīng)常被寫進(jìn)CPU內(nèi)部的寄存器趋厉,以供隨后指令快速訪問。)
  5. 最后胶坠,更新“指令地址寄存器”君账,使其指向下一個要執(zhí)行的指令地址。

本小節(jié)參考內(nèi)容:

[深度人工智障:讀書筆記]《計算機科學(xué)速成課》—5 算術(shù)邏輯單元-ALU

[深度人工智障:讀書筆記]《計算機科學(xué)速成課》—6 寄存器和內(nèi)存

[深度人工智障:讀書筆記]《計算機科學(xué)速成課》—7 中央處理器CPU

1.2 程序存儲和執(zhí)行

以最簡單的C程序為例:

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

這段代碼需要保存在一個文件中沈善,稱為源文件乡数,這是這段程序生命周期的開始。然而計算機只認(rèn)識二進(jìn)制的0和1闻牡,它根本不認(rèn)識文本里面到底寫的什么净赴。

所以大部分的現(xiàn)代計算機系統(tǒng)都會使用ASCII標(biāo)準(zhǔn)來表示這些文本,簡單來說就是給每個字符都指定一個唯一的單字節(jié)大小的編號罩润,然后將文本中的字符都根據(jù)ASCII標(biāo)準(zhǔn)替換成對應(yīng)的編號后玖翅,就轉(zhuǎn)換成了字節(jié)序列,所以該源文件是以字節(jié)序列的形式保存在文件中的割以。

我們可以通過OD打印上面程序的所有字符的ASCII碼(方法演示)金度,結(jié)果如下所示:

PS D:\E\VSOCED> od -Ax -tcd1 .\test.c
000000   /   /       t   e   s   t   .   c  \r  \n   #   i   n   c   l
         47   47   32  116  101  115  116   46   99   13   10   35  105  110   99  108
000010   u   d   e       <   s   t   d   i   o   .   h   >  \r  \n   i
        117  100  101   32   60  115  116  100  105  111   46  104   62   13   10  105
000020   n   t       m   a   i   n   (   )  \r  \n   {  \r  \n
        110  116   32  109   97  105  110   40   41   13   10  123   13   10   32   32
000030           p   r   i   n   t   f   (   "   h   e   l   l   o    
         32   32  112  114  105  110  116  102   40   34  104  101  108  108  111   32
000040   w   o   r   l   d   \   n   "   )   ;  \r  \n
        119  111  114  108  100   92  110   34   41   59   13   10   32   32   32   32
000050   r   e   t   u   r   n       0   ;  \r  \n   }
        114  101  116  117  114  110   32   48   59   13   10  125
00005c

從上面可知,<u>系統(tǒng)中的所有信息都是由一串比特表示的严沥,區(qū)分不同數(shù)據(jù)對象的唯一方法就是上下文猜极。</u>比如:

  • 在一串?dāng)?shù)字中,0x90表示154
  • 在一串機器碼中消玄,0x90表示nop指令
  • 在 一串字符串中魔吐,0x90表示一個特殊的字符

為了人們能夠讀懂程序的功能,所以使用了高級語言如c寫了這段程序莱找。但是對于機器而言酬姆,它只能執(zhí)行指令集中包含的指令。所以奥溺,為了機器能夠在系統(tǒng)中運行這段程序辞色,我們:

  • 首先,需要將每句c語句都轉(zhuǎn)換成一系列的低級機器語言指令浮定;
  • 然后相满,將這些指令按照可執(zhí)行目標(biāo)程序的格式打包好后层亿,以二進(jìn)制磁盤文件形式保存起來,該文件稱為目標(biāo)文件立美。

這種匿又,從源文件 ——》目標(biāo)文件 的過程由編譯器驅(qū)動。該過程主要分為4階段:(也可參考:Linux編譯過程

[圖片上傳失敗...(image-2aaec1-1615278288264)]

1.2.1 預(yù)處理階段

*.c ——》*.i

C預(yù)處理器主要負(fù)責(zé):文本替換(text substitution)建蹄、注釋剝離(stripping comments)碌更、文件包含(file inclusive)。

  • 在我們的源代碼中使用預(yù)處理指令來請求 文本替換 和 文件包含洞慎。在代碼中使用#來表示這是預(yù)處理指令痛单。

    • 第一個是頭文件stdio.h,他是包含在源文件中的劲腿。(文件包含)旭绒,即將#include <stdio.h>替換成頭文件stdio.h中的內(nèi)容。
    • 第二個是字符串替換焦人。(文本替換)

1.2.2 編譯階段

*.i ——》*.s

在這個階段中挥吵,Gcc首先要檢查代碼的規(guī)范性、是否有語法錯誤等花椭,以確定代碼的實際要做的工作忽匈,在檢查無誤后,Gcc把代碼翻譯成匯編語言个从。

這樣做的好處在于脉幢,通過為不同語言 不同系統(tǒng)上配置 不同的編譯器歪沃,能夠提供通用的匯編語言嗦锐,這樣對于相同的語言,就能兼容不同的操作系統(tǒng)沪曙,而對于同一個系統(tǒng)上奕污,通過安裝不同語言的編譯器,也能運行不同語言寫的程序了液走。

而匯編語言相對C語言更加低級碳默,它對機器碼進(jìn)行了修飾,為每一個操作碼提供了更加簡單缘眶、容易記的助記符嘱根,并且提供了很多機器碼不具有的功能,比如自動解析JUMP指令地址等等巷懈。該語言的編寫和底層硬件連接很密切该抒,程序員仍需要思考使用什么寄存器和內(nèi)存地址。

我們這里使用指令集架構(gòu)來提供對實際處理器硬件的抽象顶燕,這樣機器代碼就好像運行在一個一次只執(zhí)行一條指令的處理器上凑保。

可參考:[深度人工智障:讀書筆記]《計算機科學(xué)速成課》—11 編程語言發(fā)展史

1.2.3 匯編階段

*.s——》*.o

匯編階段是把編譯階段生成的匯編代碼文件”*.s”轉(zhuǎn)成二進(jìn)制目標(biāo)代碼(機器可讀的機器語言)冈爹。

1.2.4 鏈接階段

鏈接是產(chǎn)生可執(zhí)行程序文件或 可與其他目標(biāo)文件結(jié)合產(chǎn)生可執(zhí)行文件的最后階段。

我們寫代碼時通常會使用C標(biāo)準(zhǔn)庫中提供的函數(shù)欧引,但是我們代碼中并沒有這些函數(shù)的具體實現(xiàn)频伤,所以就需要在鏈接階段將該函數(shù)的具體實現(xiàn)合并到我們的hello.o。比如我們程序中使用了printf函數(shù)芝此,而該函數(shù)存在于一個單獨預(yù)編譯好的目標(biāo)文件printf.o中憋肖,所以我們只需要將該文件合并到我們的hello.o中,就能正確使用該函數(shù)了癌蓖。

最終得到的hello文件就是可執(zhí)行目標(biāo)文件瞬哼,可以被加載到內(nèi)存中,由系統(tǒng)執(zhí)行租副。

1.2.5 執(zhí)行 可執(zhí)行程序

通過以上的編譯過程坐慰,我們從由C語言的源文件hello.c編譯得到了可執(zhí)行目標(biāo)文件hello,接下來我們就可以運行該目標(biāo)文件了

  1. shell讀入我們輸入的字符./hello后用僧,將其逐一讀入到CPU的寄存器中结胀,然后再將其存放到主存中
  2. 輸入回車后责循,shell執(zhí)行一系列指令將hello目標(biāo)文件中的代碼和數(shù)據(jù)從磁盤復(fù)制到主存糟港。
  3. CPU開始執(zhí)行hello的main程序中的機器指令,它將hello, world\n字符串中的字節(jié)從主存復(fù)制到CPU寄存器院仿,再從CPU寄存器復(fù)制到顯示設(shè)備秸抚。

通過以上過程,我們就完成了程序的保存和執(zhí)行的完整過程歹垫。

可參考:[深度人工智障:讀書筆記]《計算機科學(xué)速成課》—7 中央處理器CPU

2 高速緩存

在運行程序的過程中剥汤,發(fā)現(xiàn)一個很重要的問題:系統(tǒng)花費了大量的時間把信息從一個地方挪到另一個地方。

在上面實例中:test程序的機器指令開始是放在磁盤上

  • 程序加載時排惨,它們被復(fù)制到主存(從磁盤到內(nèi)存)
  • 程序運行時吭敢,它們被復(fù)制到處理器(從內(nèi)存到處理器)

"hello, world\n"數(shù)據(jù)最開始在磁盤,后來復(fù)制到內(nèi)存暮芭,然后是顯示設(shè)備鹿驼。

這些復(fù)制就是開銷,減緩了程序的工作辕宏。怎么才能使這些復(fù)制工作盡快完成呢畜晰?

答:處理器和內(nèi)存的速度差異非常大,系統(tǒng)設(shè)計者系統(tǒng)設(shè)計者采用了更小瑞筐、更快的存儲設(shè)備凄鼻,即高速緩存存儲器(簡稱高速緩存),作為暫時的集結(jié)區(qū)域,用來存放處理器近期可能會需要的信息野宜。

[圖片上傳失敗...(image-682d6f-1615278288264)]

在單處理器系統(tǒng)中扫步,一般含有二級緩存,最小的L1高速緩存速度幾乎和訪問存儲器相當(dāng)匈子,大一些的L2高速緩存通過特殊總線連接到處理器河胎,雖然比L1高速緩存慢,但是還是比直接訪問主存來的快虎敦。在多核處理器中游岳,還有一個L3高速緩存,用來共享多個核之間的數(shù)據(jù)其徙。

問:為什么需要n級緩存呢胚迫?

答:因為系統(tǒng)可以獲得一個很大的存儲器,同時訪問速度也很快唾那,原因是利用了高速緩存的局部性原理访锻,即程序具有訪問局部區(qū)域里的數(shù)據(jù)和代碼的趨勢。通過讓高速緩存里存放可能經(jīng)常訪問的數(shù)據(jù)的方法闹获,大部分的存儲器操作都能在快速的高速緩存中完成期犬。

一般利用了高速緩存的程序會比沒有使用高速緩存的程序的性能提高一個數(shù)量級。

3 存儲器層次結(jié)構(gòu)

實際上避诽,每個計算機系統(tǒng)中的存儲設(shè)備都被組織成了一個存儲器層次結(jié)構(gòu)龟虎,下圖所示:

img

存儲器層次結(jié)構(gòu)的主要思想是一層上的存儲器作為低一層存儲器的高速緩存。因此:

  • 寄存器文件就是L1的高速緩存沙庐,
  • L1是L2的高速緩存鲤妥,
  • L2是L3的高速緩存,
  • L3是主存的高速緩存拱雏,
  • 而主存又是磁盤的高速緩存棉安。
  • 在某些具有分布式文件系統(tǒng)的網(wǎng)絡(luò)系統(tǒng)中,本地磁盤就是存儲在其他系統(tǒng)中磁盤上的數(shù)據(jù)的高速緩存古涧。

4 操作系統(tǒng)管理硬件

操作系統(tǒng)的出現(xiàn)避免了程序員直接去操作硬件(主存垂券、處理器花盐、I/O設(shè)備)羡滑,它可以看成是應(yīng)用程序和硬件之間的一層軟件。

給程序員提供硬件的抽象:

  • 比如將正在運行的程序抽象為進(jìn)程算芯;
  • 將程序操作的主存抽象為虛擬內(nèi)存柒昏;
  • 將各種I/O設(shè)備抽象為文件的形式,讓程序員能夠直接通過這層軟件很好地調(diào)用硬件熙揍,避免了過多的硬件細(xì)節(jié)职祷。

接下來將簡單介紹這三層抽象。

4.1 進(jìn)程

進(jìn)程是操作系統(tǒng)對一個正在運行的程序的一種抽象。

計算機執(zhí)行程序時有梆,需要將程序?qū)?yīng)的指令保存在內(nèi)存中是尖,并且使用CPU和I/O設(shè)備,但是單核計算機一個時刻只能處理一個程序泥耀。但是從我們的視角來看饺汹,計算機像在同時處理好多程序,比如你可以在shell中運行hello痰催,此時就運行了shell程序和hello程序兜辞。

為了方便對運行程序時所需的硬件進(jìn)行操作,操作系統(tǒng)對正在運行的程序提供了一種抽象——進(jìn)程夸溶。

提供了一種錯覺:一個系統(tǒng)上可以同時運行多個進(jìn)程逸吵,而每個進(jìn)程好像在獨占地使用硬件。這樣程序員就無需考慮程序之間切換所需操作的硬件缝裁,這些由操作系統(tǒng)的內(nèi)核進(jìn)行管理扫皱。

內(nèi)核:操作系統(tǒng)常駐內(nèi)存的部分,不是一個獨立的進(jìn)程捷绑,而是管理全部進(jìn)程所用代碼和數(shù)據(jù)結(jié)構(gòu)的集合啸罢。

并發(fā)運行:操作系統(tǒng)通過交錯執(zhí)行若干個程序的指令,不斷地在進(jìn)程間進(jìn)行切換來提供這種錯覺胎食,這個稱為并發(fā)運行扰才。

4.1.1 上下文切換

首先,當(dāng)進(jìn)程A要切換到進(jìn)程B時厕怜,進(jìn)程A通過系統(tǒng)調(diào)用衩匣,將控制權(quán)遞給操作系統(tǒng),然后操作系統(tǒng)會保存進(jìn)程A所需的所有狀態(tài)信息粥航,稱為上下文琅捏,比如寄存器以及內(nèi)存內(nèi)容,然后創(chuàng)建進(jìn)程B及其上下文递雀,然后將控制權(quán)遞給進(jìn)程B柄延。當(dāng)進(jìn)程B終止后,操作系統(tǒng)就會恢復(fù)進(jìn)程A的上下文缀程,并將控制權(quán)還給進(jìn)程A搜吧,這樣進(jìn)程A就能從斷點處繼續(xù)執(zhí)行。這個過程都是由操作系統(tǒng)的內(nèi)容進(jìn)行控制的杨凑。

[圖片上傳失敗...(image-591cb7-1615278288264)]

4.1.2 線程

現(xiàn)代系統(tǒng)中滤奈,一個進(jìn)程中可以并發(fā)多個線程,每條線程并行執(zhí)行不同的任務(wù)撩满,線程是操作系統(tǒng)能夠進(jìn)行運算調(diào)動的最小單位蜒程,是進(jìn)程中的實際運作單位绅你。每個線程運行在進(jìn)程的上下文中,并共享相同的代碼和全局?jǐn)?shù)據(jù)昭躺。

優(yōu)點:多線程之間比多進(jìn)程之間更容易共享數(shù)據(jù)忌锯,并且效率更高。

4.2 虛擬內(nèi)存

虛擬存儲器(虛擬內(nèi)存)是一個抽象概念领炫,它為每個進(jìn)程提供了一個假象汉规,即每個進(jìn)程都在獨占地使用主存。

每個進(jìn)程看到的是一致的存儲器驹吮,稱為虛擬地址空間针史。

計算機會將多個程序的指令和數(shù)據(jù)保存在內(nèi)存中。當(dāng)某個程序的數(shù)據(jù)增加時碟狞,可能不會保存在內(nèi)存的連續(xù)地址中啄枕,這就使得代碼需要對這些在內(nèi)存中非連續(xù)存儲的數(shù)據(jù)進(jìn)行讀取,會造成很大困難族沃。如何解決频祝?

答:為了解決這個問題,操作系統(tǒng)對內(nèi)存和I/O設(shè)備進(jìn)行抽象——虛擬內(nèi)存脆淹。它提供了一種錯覺:程序運行在從0開始的連續(xù)虛擬內(nèi)存空間中常空,而操作系統(tǒng)負(fù)責(zé)將程序的虛擬內(nèi)存地址投影到對應(yīng)的真實物理內(nèi)存中。這樣使得程序員能直接對連續(xù)的空間地址進(jìn)行操作盖溺,而無需考慮非連續(xù)的物理內(nèi)存地址漓糙。

操作系統(tǒng)將進(jìn)程的虛擬內(nèi)存劃分為多個區(qū)域,每個區(qū)域都有自己的功能烘嘱,接下來從最低的地址開始介紹:

  • 程序代碼和數(shù)據(jù):對所有進(jìn)程來說昆禽,代碼都是從同一固定地址開始(如下圖的“固定地址”就是程序開始的地方),然后是C全局變量蝇庭。<u>這部分在進(jìn)程一開始運行時就被指定大小了</u>醉鳖。
  • :當(dāng)調(diào)用類似C中的mallocfree標(biāo)準(zhǔn)庫函數(shù)時,堆會在進(jìn)程運行時動態(tài)擴展和伸縮哮内。
  • 共享庫:用來存放像C標(biāo)準(zhǔn)庫和數(shù)學(xué)庫這樣公共庫的代碼和數(shù)據(jù)的區(qū)域盗棵。
  • 棧:位于用戶虛擬內(nèi)存頂部,編譯器用來實現(xiàn)函數(shù)調(diào)用北发,當(dāng)調(diào)用函數(shù)時纹因,棧就增長,當(dāng)返回一個函數(shù)時鲫竞,棧就縮小辐怕。
  • 內(nèi)核虛擬內(nèi)存:地址空間頂部的區(qū)域為內(nèi)核保留逼蒙,不允許應(yīng)用程序讀寫這個區(qū)域的內(nèi)容或者直接調(diào)用內(nèi)核代碼定義的函數(shù)从绘。
img

4.3 文件

操作系統(tǒng)將所有I/O設(shè)備看成是文件,而文件是字節(jié)序列,這樣系統(tǒng)中的所有輸入輸出都可以調(diào)用系統(tǒng)函數(shù)來讀寫文件實現(xiàn)僵井,簡化了對各種各樣的I/O設(shè)備的操作陕截。

5. 網(wǎng)絡(luò)

從一個單獨的系統(tǒng)來看,網(wǎng)絡(luò)可以看成一個I/O設(shè)備批什,當(dāng)系統(tǒng)從主存復(fù)制一串字節(jié)到網(wǎng)絡(luò)適配器時农曲,計算機就會自動將其發(fā)送到另一臺機器。在后續(xù)的課程會詳細(xì)介紹驻债。

6 并發(fā)與并行

并發(fā)(Concurrency)指一個同時具有多個活動的系統(tǒng)乳规。并行(Paralleism)指的是用并發(fā)來時一個系統(tǒng)運行得更快。并行可以在計算機系統(tǒng)的多個抽象層次上運用合呐。

  • 線程級并發(fā):單處理器系統(tǒng)暮的,一個CPU,進(jìn)程間快速切換的方式實現(xiàn)淌实;

  • 多處理器系統(tǒng):多個CPU,要求程序運行更快冻辩,就需程序多線程 超線程,允許一個CPU執(zhí)行多個控制流的技術(shù)拆祈;

  • 指令集并行:處理器可以同時執(zhí)行多條指令恨闪;( 超標(biāo)量處理器:處理器可以達(dá)到比一個周期一條指令更快的執(zhí)行速率)。

    參考:[深度人工智障:讀書筆記]《計算機科學(xué)速成課》—9 高級CPU設(shè)計

  • 單指令放坏,多數(shù)據(jù)并行:許多現(xiàn)代處理器擁有特殊的硬件咙咽,允許一條指令產(chǎn)生多個可以并行執(zhí)行的操作,這種方式稱為單指令淤年、多數(shù)據(jù) 犁珠,即SIMD并行。

7 抽象 [補充]

計算機系統(tǒng)中的抽象: 如圖:

[圖片上傳失敗...(image-fd54c8-1615278288264)]

  • 文件是對I/O的抽象
  • 虛擬存儲器(虛擬內(nèi)存)是對程序存儲器的抽象
  • 進(jìn)程是對一個正在運行程序的抽象
  • 虛擬機是對整個計算機的抽象

相關(guān)文章

  1. https://zhuanlan.zhihu.com/p/103969274

  2. https://github.com/xxg1413/CSAPP/blob/master/Chapter01/1.0.md

  3. 控制器互亮、適配器:https://blog.csdn.net/u014753393/article/details/50259207

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末犁享,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子豹休,更是在濱河造成了極大的恐慌炊昆,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件威根,死亡現(xiàn)場離奇詭異凤巨,居然都是意外死亡,警方通過查閱死者的電腦和手機洛搀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門敢茁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人留美,你說我怎么就攤上這事彰檬∩烊校” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵逢倍,是天一觀的道長捧颅。 經(jīng)常有香客問我,道長较雕,這世上最難降的妖魔是什么碉哑? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮亮蒋,結(jié)果婚禮上扣典,老公的妹妹穿的比我還像新娘。我一直安慰自己慎玖,他們只是感情好激捏,可當(dāng)我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著凄吏,像睡著了一般远舅。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上痕钢,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天图柏,我揣著相機與錄音,去河邊找鬼任连。 笑死蚤吹,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的随抠。 我是一名探鬼主播裁着,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼拱她!你這毒婦竟也來了二驰?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤秉沼,失蹤者是張志新(化名)和其女友劉穎桶雀,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體唬复,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡矗积,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了敞咧。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片棘捣。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖休建,靈堂內(nèi)的尸體忽然破棺而出乍恐,到底是詐尸還是另有隱情评疗,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布禁熏,位于F島的核電站壤巷,受9級特大地震影響邑彪,放射性物質(zhì)發(fā)生泄漏瞧毙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一寄症、第九天 我趴在偏房一處隱蔽的房頂上張望宙彪。 院中可真熱鬧,春花似錦有巧、人聲如沸释漆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽男图。三九已至,卻和暖如春甜橱,著一層夾襖步出監(jiān)牢的瞬間逊笆,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工岂傲, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留难裆,地道東北人。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓镊掖,卻偏偏與公主長得像乃戈,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子亩进,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容