本文借鑒自深入理解計(jì)算機(jī)系統(tǒng)和南京大學(xué)的計(jì)算機(jī)系統(tǒng)基礎(chǔ),只作為學(xué)習(xí)總結(jié)用。
一 計(jì)算機(jī)基本原理
1.信息就是位+上下文
系統(tǒng)中的所有信息—包括磁盤文件 , 存儲(chǔ)器中的程序 ,存儲(chǔ)器中存放的用戶數(shù)據(jù), 網(wǎng)絡(luò)上傳送的數(shù)據(jù) 都只是一串bit表示的而已。區(qū)分 不同的數(shù)據(jù)對(duì)象的唯一方法是我們讀到這些數(shù)據(jù)對(duì)象的上下文。在不同的上下文中,同樣的字節(jié)序列可能表示為一個(gè)整數(shù)、浮點(diǎn)數(shù)、字符串或者機(jī)器指令。
只有ASCII字符構(gòu)成的文件稱為文本文件,所有其他文件都稱為二進(jìn)制文件。
2.程序被其他程序翻譯稱不同格式

預(yù)處理器,編譯器,匯編器,鏈接器一起構(gòu)成了 編譯系統(tǒng)(compliation system)
3.馮諾依曼結(jié)構(gòu)的主要思想:
- 計(jì)算機(jī)應(yīng)由運(yùn)算器、控制器、存儲(chǔ)器、輸入設(shè)備和輸出設(shè)備五個(gè)基本部件組成。
- 各基本部件的功能是:
? 存儲(chǔ)器不僅能存放數(shù)據(jù),而且也能存放指令,形式上兩者沒有區(qū)別,但計(jì)算機(jī)應(yīng)能區(qū)分?jǐn)?shù)據(jù)還是指令;
? 控制器應(yīng)能自動(dòng)取出指令來執(zhí)行;
? 運(yùn)算器應(yīng)能進(jìn)行加/減/乘/除四種基本算術(shù)運(yùn)算,并且也能進(jìn)行一些邏輯運(yùn)算和附加運(yùn)算;
? 操作人員可以通過輸入設(shè)備、輸出設(shè)備和主機(jī)進(jìn)行通信。 - 內(nèi)部以二進(jìn)制表示指令和數(shù)據(jù)。每條指令由操作碼和地址碼兩部分組成。操作碼指出操作類型,地址碼指出操作數(shù)的地址。由一串指令組成程序。
- 采用“存儲(chǔ)程序”工作方式。
4.計(jì)算機(jī)如何工作:

用做菜描述執(zhí)行過程:
第一步:從pc上取菜譜,比如5(根據(jù)PC從主存中取指令)
第二步:看菜譜(指令譯碼,分為操作碼和操作數(shù))
第三步:從架上或盤中取原材料(取操作數(shù),)
第四步:洗、切、炒等具體操作(指令執(zhí)行)
第五步:裝盤或直接送桌(回寫結(jié)果)
第六步:算出下一菜譜所在架子號(hào)6=5+1(修改PC的值)
繼續(xù)做下一道菜(執(zhí)行下一條指令)
5.重要概念匯總
CPU:由控制器,ALU和一些寄存器組成
ALU:算數(shù)邏輯部件,在ALU操作控制信號(hào)ALUop控制下,可以進(jìn)行各種算數(shù)和邏輯運(yùn)算
控制器:CU,自動(dòng)逐條取出指令并進(jìn)行譯碼的部件
通用寄存器:GPR,通用寄存器可用于傳送和暫存數(shù)據(jù),也可參與算術(shù)邏輯運(yùn)算,并保存運(yùn)算結(jié)果,組成通用寄存器組GPRS
程序計(jì)數(shù)器:pc,自動(dòng)計(jì)算出下一條指令的地址的地方(存放著計(jì)算機(jī)啟動(dòng)后的第一條指令的地址,之后不斷自增1)
指令寄存器:IR,從MDR中取指令后臨時(shí)存到IR
標(biāo)志寄存器:ALU運(yùn)算的結(jié)果會(huì)產(chǎn)生標(biāo)志信息,例如結(jié)果為0(零標(biāo)志ZF),為負(fù)數(shù)(符號(hào)標(biāo)志位),這些信息存放在標(biāo)志寄存器中
主存儲(chǔ)器(主存):用于存放指令和數(shù)據(jù),可以簡(jiǎn)單理解為內(nèi)存加高速緩存 (本文為簡(jiǎn)單起見,后續(xù)會(huì)補(bǔ)充高速緩存相關(guān)知識(shí))
以下是存儲(chǔ)器層次結(jié)構(gòu)示意圖:

主要思想就是上一層存儲(chǔ)器作為低一層存儲(chǔ)器的高速緩存,而L1級(jí)別的高速緩存就已經(jīng)跟寄存器速度差距不大了
總線:連接不同部件進(jìn)行信息傳輸?shù)慕橘|(zhì)稱為總線。而cpu與主存之間存取指令需要介質(zhì),功能上分為三種:地址,數(shù)據(jù),控制信息。邏輯上可以分為三條,但實(shí)際上現(xiàn)在總線只有一條就可以完成三條的功能。
主存地址寄存器MAR與主存數(shù)據(jù)寄存器MDR:CPU訪問主存時(shí),需要將主存地址,讀/寫命令分別送到總線的地址線和控制線,然后通過數(shù)據(jù)線發(fā)送或接收數(shù)據(jù)。CPU送到地址線的主存地址先放到MAR中,發(fā)送或從數(shù)據(jù)線取來的信息存放在MDR中。
指令:用01表示的一串序列,用來指示CPU完成一個(gè)特定的原子操作。例如常用的指令:取數(shù)指令(load)從主存單元中取出數(shù)據(jù)放到GPR中,存數(shù)指令(store)將GPR的內(nèi)容寫入主存單元,加法指令(add)將兩個(gè)GPR中的內(nèi)容相加后送入結(jié)果寄存器(這兩個(gè)中的一個(gè),根據(jù)指令先后順序決定,匯編部分會(huì)詳細(xì)解釋),傳送指令(mov)將一個(gè)GPR的內(nèi)容送到另一個(gè)GPR。
指令操作碼:指定指令的操作類型,如存取數(shù),加減,傳送,跳轉(zhuǎn)
地址碼字段:指出指令所處理的操作數(shù)的地址,如寄存器編號(hào),主存單元編號(hào)
顯然指令的長(zhǎng)度是不一定是定長(zhǎng)的,這也是精簡(jiǎn)指令集和復(fù)雜指令集最直觀的區(qū)別。它們之間具體的區(qū)別如下:

但在具體實(shí)現(xiàn)上,x86為代表的復(fù)雜指令集為了對(duì)指令集的前向兼容是不可以采用精簡(jiǎn)指令集的,考慮到效率的優(yōu)化,會(huì)將自己的指令由CISC翻譯為RISC后執(zhí)行,從軟件開發(fā)人員角度可以不必過于在意兩者的區(qū)別
(二)程序的開發(fā)和運(yùn)行
在此之前補(bǔ)充一下緩沖區(qū)的知識(shí):
1.緩沖區(qū)
緩沖區(qū)又稱為緩存,它是內(nèi)存空間的一部分。也就是說,在內(nèi)存空間中預(yù)留了一定的存儲(chǔ)空間,這些存儲(chǔ)空間用來緩沖輸入或輸出的數(shù)據(jù),這部分預(yù)留的空間就叫做緩沖區(qū)。緩沖區(qū)根據(jù)其對(duì)應(yīng)的是輸入設(shè)備還是輸出設(shè)備,分為輸入緩沖區(qū)和輸出緩沖區(qū)。
(1)為什么要引入緩沖區(qū)?例如,我們從磁盤里取信息,我們先把讀出的數(shù)據(jù)放在緩沖區(qū),計(jì)算機(jī)再直接從緩沖區(qū)中取數(shù)據(jù),等緩沖區(qū)的數(shù)據(jù)取完后再去磁盤中讀取,這樣就可以減少磁盤的讀寫次數(shù),再加上計(jì)算機(jī)對(duì)緩沖區(qū)的操作大大快于對(duì)磁盤的操作,故應(yīng)用緩沖區(qū)可大大提高計(jì)算機(jī)的運(yùn)行速度。又比如,我們使用打印機(jī)打印文檔,由于打印機(jī)的打印速度相對(duì)較慢,我們先把文檔輸出到打印機(jī)相應(yīng)的緩沖區(qū),打印機(jī)再自行逐步打印,這時(shí)我們的CPU可以處理別的事情。
所以緩沖區(qū)就是一塊內(nèi)存區(qū),它用在輸入輸出設(shè)備和CPU之間,用來緩存數(shù)據(jù)。它使得低速的輸入輸出設(shè)備和高速的CPU能夠協(xié)調(diào)工作,避免低速的輸入輸出設(shè)備占用CPU,解放出CPU,使其能夠高效率工作。
(2)緩沖區(qū)的類型緩沖區(qū)分為三種類型:全緩沖、行緩沖和不帶緩沖。
- 全緩沖在這種情況下,當(dāng)填滿標(biāo)準(zhǔn)I/O緩存后才進(jìn)行實(shí)際I/O操作。全緩沖的典型代表是對(duì)磁盤文件的讀寫。
- 行緩沖在這種情況下,當(dāng)在輸入和輸出中遇到換行符時(shí),執(zhí)行真正的I/O操作。這時(shí),我們輸入的字符先存放在緩沖區(qū),等按下回車鍵換行時(shí)才進(jìn)行實(shí)際的I/O操作。典型代表是標(biāo)準(zhǔn)輸入(stdin)和標(biāo)準(zhǔn)輸出(stdout)。
- 不帶緩沖也就是不進(jìn)行緩沖,標(biāo)準(zhǔn)出錯(cuò)情況stderr是典型代表,這使得出錯(cuò)信息可以直接盡快地顯示出來。
(3)緩沖區(qū)的大小如果我們沒有自己設(shè)置緩沖區(qū)的話,系統(tǒng)會(huì)默認(rèn)為標(biāo)準(zhǔn)輸入輸出設(shè)置一個(gè)緩沖區(qū),這個(gè)緩沖區(qū)的大小通常是512個(gè)字節(jié)的大小。緩沖區(qū)大小由 stdio.h 頭文件中的宏 BUFSIZ 定義,如果希望查看它的大小,包含頭文件,直接輸出它的值即可:printf("%d", BUFSIZ);緩沖區(qū)的大小是可以改變的,也可以將文件關(guān)聯(lián)到自定義的緩沖區(qū),詳情可以查看 setvbuf()和 setbuf() 函數(shù)。
(4)緩沖區(qū)的刷新(清空)下列情況會(huì)引發(fā)緩沖區(qū)的刷新:緩沖區(qū)滿時(shí);行緩沖區(qū)遇到回車時(shí);關(guān)閉文件;使用特定函數(shù)刷新緩沖區(qū)。
2.hello,world程序的執(zhí)行過程

在shell命令行輸入"./hello"后,屏幕打印hello,world,現(xiàn)在逐步分解各個(gè)步驟,看看到底其中發(fā)生了什么事。
用戶輸入命令:./指當(dāng)前目錄,hello指定文件名,./hello 字符串是存放在輸入緩沖區(qū)內(nèi),當(dāng)按下enter后才會(huì)真正執(zhí)行io操作。
shell程序會(huì)把這個(gè)字符串的每個(gè)字符逐個(gè)經(jīng)由總線讀入到寄存器中,然后保存到主存儲(chǔ)器中(圖中紅線標(biāo)記)。在./hello 字符串后是一個(gè)換行符enter時(shí),shell程序在io操作中獲取到命令后才真正開始執(zhí)行。首先shell將調(diào)出操作系統(tǒng)內(nèi)核中對(duì)應(yīng)的服務(wù),操作系統(tǒng)內(nèi)核加載完可執(zhí)行文件中的代碼及其所處理的數(shù)據(jù)(這里的數(shù)據(jù)是字符串"hello,world\n",對(duì)應(yīng)圖示藍(lán)線)后,將hello第一條指令的地址送到程序計(jì)數(shù)器PC中。處理器隨后開始執(zhí)行hello程序,將會(huì)把主存中的字符串"hello,world\n"加載到寄存器中,然后在屏幕上顯示出來(對(duì)應(yīng)綠線)。
由上面可以看出操作系統(tǒng)的重要性,任何用戶的程序都要依靠操作系統(tǒng)的支持才能順利執(zhí)行。
3.高級(jí)編程語言的開發(fā)環(huán)境和運(yùn)行環(huán)境:

(三)其他重要概念的補(bǔ)充
1.計(jì)算機(jī)抽象層次

2.計(jì)算機(jī)用戶層次

3.計(jì)算機(jī)性能評(píng)估
1.衡量計(jì)算機(jī)性能的兩個(gè)重要指標(biāo)
吞吐率:表示單位時(shí)間內(nèi)完成的工作量
響應(yīng)時(shí)間:表示從作業(yè)提交到作業(yè)完成所花費(fèi)的時(shí)間,
2.CPU的幾個(gè)性能指標(biāo)
時(shí)鐘周期,時(shí)鐘頻率(也稱主頻,是前者倒數(shù),頻率越高時(shí)鐘周期越短),CPI(表示執(zhí)行一條指令所需時(shí)鐘周期數(shù),對(duì)特定指令是具體數(shù)值,對(duì)程序或機(jī)器是所有指令CPI的平均值)
上述三者是相互制約的,但并不能僅僅通過比較兩臺(tái)計(jì)算機(jī)三項(xiàng)指標(biāo)的數(shù)值來完全斷定孰優(yōu)孰劣。
MIPS指平均每秒執(zhí)行多少百萬條指令。雖然可以絕對(duì)的衡量指令的條數(shù)執(zhí)行快慢,但相同程序在不同機(jī)器上指令條數(shù)千差萬別,所以這也不能作為絕對(duì)的衡量標(biāo)準(zhǔn)。
基準(zhǔn)程序性能評(píng)估是現(xiàn)在最為廣泛采用的一種方式。絕大多數(shù)情況下,一個(gè)優(yōu)秀的基準(zhǔn)程序是能對(duì)機(jī)器的性能做出比較客觀的判斷的。
4.對(duì)于操作系統(tǒng)的一些認(rèn)識(shí)
操作系統(tǒng)兩個(gè)基本功能:
(1)防止硬件被失控的應(yīng)用程序?yàn)E用
(2)向應(yīng)用程序提供簡(jiǎn)單一致的機(jī)制來控制復(fù)雜而又大相徑庭的低級(jí)硬件設(shè)備。
操作系統(tǒng)通過幾個(gè)基本的抽象概念(進(jìn)程, 虛擬存儲(chǔ)器, 文件 )來實(shí)現(xiàn)這兩個(gè)功能:
文件:是對(duì)I/O設(shè)備的抽象表示(這部分會(huì)在之后具體講解)
虛擬存儲(chǔ)器:是對(duì)主存和磁盤I/O設(shè)備的抽象表示
進(jìn)程:是對(duì)處理器,主存和I/O設(shè)備的抽象表示。(這部分內(nèi)容較多,單獨(dú)列為一節(jié))
虛擬內(nèi)存
虛擬內(nèi)存是一個(gè)抽象的概念,它為每個(gè)進(jìn)程提供了一個(gè)假象,即每個(gè)進(jìn)程獨(dú)占地使用主存。
每個(gè)進(jìn)程看到的內(nèi)存都是一致的,稱為虛擬地址空間。
地址空間最上面的區(qū)域?yàn)椴僮飨到y(tǒng)的代碼和數(shù)據(jù)保留的,這對(duì)所有進(jìn)程都是一樣的。
地址空間的底部區(qū)域存放用戶進(jìn)程定義的代碼和數(shù)據(jù)。
程序代碼和數(shù)據(jù):對(duì)于所有進(jìn)程來說,代碼從一固定地址開始,緊接和C全局變量相對(duì)應(yīng)的數(shù)據(jù)位置。
堆 :代碼和數(shù)據(jù)區(qū)緊隨著運(yùn)行時(shí)堆。代碼和數(shù)據(jù)區(qū)是在進(jìn)程一開始就被規(guī)定了大小,而堆不一樣,通過調(diào)用malloc和free,堆可以動(dòng)態(tài)擴(kuò)展和收縮。
共享庫:地址空間的中間部分存放C標(biāo)準(zhǔn)庫和數(shù)學(xué)庫這樣共享庫代碼和數(shù)據(jù)的區(qū)域。
棧: 用戶虛擬地址頂部的是用戶棧,編譯器用它來實(shí)現(xiàn)函數(shù)調(diào)用。和堆一樣,在執(zhí)行時(shí)動(dòng)態(tài)的擴(kuò)展和收縮。每當(dāng)調(diào)用一個(gè)函數(shù),棧就會(huì)增長(zhǎng),而函數(shù)返回時(shí),棧就會(huì)收縮。
內(nèi)核虛擬內(nèi)存: 地址空間頂部區(qū)域是為內(nèi)核保留的。
5.線程與進(jìn)程相關(guān)知識(shí)
進(jìn)程與線程
進(jìn)程是操作系統(tǒng)對(duì)一個(gè)正在運(yùn)行的程序的一種抽象。
進(jìn)程數(shù)都是多于可以運(yùn)行他們的CPU個(gè)數(shù)的。傳統(tǒng)系統(tǒng)在一個(gè)時(shí)刻只能執(zhí)行一個(gè)程序,而先進(jìn)的多核處理器能夠執(zhí)行多個(gè)程序,無論實(shí)在單核還是多核系統(tǒng),一個(gè)CPU看上去都像是在并發(fā)地執(zhí)行多個(gè)進(jìn)程。
并發(fā)運(yùn)行,是說一個(gè)進(jìn)程的指令和另外一個(gè)進(jìn)程的指令是交錯(cuò)執(zhí)行的。這是通過處理器在進(jìn)程間切換來實(shí)現(xiàn)的。 操作系統(tǒng)實(shí)現(xiàn)這種交錯(cuò)執(zhí)行的機(jī)制稱為上下文切換
操作系統(tǒng)保持跟蹤進(jìn)程運(yùn)行的所有狀態(tài)信息。這種狀態(tài),也就是上下文。包含PC和寄存器文件的當(dāng)前值。
在任何一個(gè)時(shí)刻,單處理器系統(tǒng)都只能執(zhí)行一個(gè)進(jìn)程的代碼。當(dāng)操作系統(tǒng)決定把控制權(quán)從當(dāng)前進(jìn)程轉(zhuǎn)移到新進(jìn)程時(shí),就會(huì)進(jìn)行上下文切換,即保存當(dāng)前上下文,恢復(fù)新進(jìn)程上下文??刂茩?quán)傳遞到新進(jìn)程。
進(jìn)程的進(jìn)階概念就是線程
一個(gè)進(jìn)程實(shí)際可以由多個(gè)稱為線程的執(zhí)行單元完成。線程間共享同樣的代碼和全局變量。
由于網(wǎng)絡(luò)服務(wù)器對(duì)并行處理的需求,線程成為越來越重要的編程模型。
多線程比多進(jìn)程更容易共享數(shù)據(jù)。
有多處理器的時(shí)候,多線程也是一種使程序更快運(yùn)行的方法。
進(jìn)程和線程的關(guān)系:
一個(gè)進(jìn)程不僅僅可能包含多個(gè)線程,進(jìn)程還包含著:被操作系統(tǒng)分配的資源空間,比如操作系統(tǒng)在內(nèi)存中分配給它的棧,數(shù)據(jù)區(qū)域等。這些資源空間被多個(gè)線程所共享。比如你和朋友們一次聚餐,這就很像一個(gè)進(jìn)程。桌子上那些飯菜就是資源,你們每個(gè)人都是一個(gè)線程,每個(gè)人每次伸手去夾菜就是在使用這個(gè)共享的資源。
并發(fā)(Concurreny)與并行(Parallelism):
并發(fā) = 小明可以一邊玩手機(jī)一邊看電視。
但是在事實(shí)上,他的眼睛在看電視的時(shí)候不能看手機(jī),他在看手機(jī)沒法盯著電視屏幕。
他的眼睛飛快在兩個(gè)屏幕上切換。所以實(shí)際上他玩一下手機(jī),暫停,去看電視,看一下電視,暫停,繼續(xù)玩手機(jī),循環(huán)下去,給人以他同時(shí)玩手機(jī)和看電視的感覺。
這不是真正意義上的同時(shí)進(jìn)行,但又是客觀存在同時(shí)進(jìn)行兩件事,這叫并發(fā)。所以我們說:
并發(fā) = 小明在玩一下手機(jī)再看一下電視 (不是真正意義上同時(shí)進(jìn)行)
并行 = 小明可以一邊坐公交一邊聽音樂。
這兩件事同時(shí)進(jìn)行互不干擾,做到真正意義的同步同時(shí)進(jìn)行,這叫并行。
并行 = 小明在 “一心兩用”(真正的同時(shí)進(jìn)行)
幾個(gè)重要概念
1.線程級(jí)并發(fā):
在多核處理器誕生之前,并發(fā)只是通過計(jì)算機(jī)在當(dāng)前執(zhí)行的多個(gè)進(jìn)程間快速切換實(shí)現(xiàn)的,像是一個(gè)雜耍演員在拋接空中的小球一樣。在1967年IBM將這樣的系統(tǒng)開發(fā)出來后稱為單處理系統(tǒng)。工作原理示意:

但在多核處理器誕生并普遍進(jìn)入市場(chǎng)后,有了以下改變:
2.線程級(jí)并行:
雖然IBM實(shí)現(xiàn)了并發(fā),但這對(duì)CPU而言并不是真正意義上的同時(shí)進(jìn)行,只是讓它的效率更高而已。因此人們期望能同時(shí)處理多個(gè)線程,實(shí)現(xiàn)線程的并行。自從1980年開始,系統(tǒng)開發(fā)人員也就已經(jīng)發(fā)出了多處理系統(tǒng)(Multiprpcessor system),由單一的操作系統(tǒng)核心控制的多進(jìn)程的系統(tǒng)。
與此同時(shí),CPU的晶體管也遵循摩爾定律高速發(fā)展。但問題是:依舊不能同時(shí)處理多個(gè)線程,僅僅提高單核芯片的速度會(huì)產(chǎn)生過多熱量且無法帶來相應(yīng)的性能改善,也永遠(yuǎn)不能實(shí)現(xiàn)真正意義上的同時(shí)處理多任務(wù)。還只不過像是是玩雜耍的小球的那個(gè)例子。
芯片大廠英特爾和AMD也都意識(shí)到,當(dāng)主頻接近4GHz時(shí),速度也會(huì)遇到自己的極限:那就是單靠主頻提升,已經(jīng)無法明顯提升系統(tǒng)整體性能。因此迫切需要一個(gè)能支持同時(shí)處理2個(gè)線程以上的處理器,來提升CPU的瓶頸。需求推動(dòng)了技術(shù),線程級(jí)并行應(yīng)運(yùn)而生。主要由下面兩種技術(shù)的支撐:
多核技術(shù):

超線程:

在1960s 通過操作系統(tǒng)已經(jīng)實(shí)現(xiàn)了線程級(jí)并發(fā),雖然那個(gè)時(shí)候還沒建立線程的概念。這種方式依賴操作系統(tǒng),頻繁的上下文切換意味損失了CPU的處理效率。但直到2000年隨著CPU的技術(shù)突破以后,從1960s到2000s年前后花了50多年的時(shí)間,才實(shí)現(xiàn)和更高級(jí)的線程級(jí)并行。
使用了以上技術(shù),可以在一個(gè)核上運(yùn)行多個(gè)線程,多個(gè)線程共享執(zhí)行單元,從而提高部件的利用率和吞吐量。使用了這樣的技術(shù)的系統(tǒng)稱為多處理系統(tǒng)。
總結(jié)一下線程級(jí)并行的好處:
(1)當(dāng)運(yùn)行多任務(wù)時(shí),它減少了之前的模擬出來的并發(fā),那么用戶進(jìn)行多任務(wù)處理時(shí)可以運(yùn)行更多的程序進(jìn)行并發(fā)了。
(2)它可以使單個(gè)程序運(yùn)行更快。(僅當(dāng)該程序有大量線程可以并行處理時(shí))
3.指令集并行(具體原理之后章節(jié)講解)
指令集的是更低層次的概念,是一種隱式并行。計(jì)算機(jī)處理問題是通過指令實(shí)現(xiàn)的,每個(gè)指令都是交給CPU執(zhí)行。在1978年的 Intel 8086 處理器都只能一次執(zhí)行單指令。直到 Intel首次在486芯片中開始使用一種指令流水線技術(shù),原理是:當(dāng)指令之間不存在相關(guān)時(shí),它們?cè)诹魉€中是可以重疊起來并行執(zhí)行。此外還有超標(biāo)量亂序執(zhí)行技術(shù),分支預(yù)測(cè)技術(shù)。通過以上技術(shù),使得一個(gè)程序的指令序列多條同時(shí)亂序運(yùn)行,順序提交,可有效提高程序的運(yùn)行速度。
如果一個(gè)處理器在一個(gè)時(shí)鐘周期內(nèi)能執(zhí)行完一條以上指令,就被稱為超標(biāo)量處理器。
4.數(shù)據(jù)級(jí)并行
數(shù)據(jù)級(jí)并行是一種顯式并行,主要指單指令多數(shù)據(jù)流技術(shù)(SIMD),比如a,b和c都是相同大小的數(shù)組
進(jìn)行的計(jì)算是a的每一個(gè)元素與b的相應(yīng)元素進(jìn)行運(yùn)算,結(jié)果放入c的對(duì)應(yīng)元素中。如果沒有
SIMD,就需要循環(huán)執(zhí)行一條指令多次來完成,而SIMD中一條指令就可以并行地執(zhí)行運(yùn)算。
SIMD指令集可以提供更快的圖像,聲音,視頻數(shù)據(jù)等運(yùn)行速度。
在看一個(gè)更簡(jiǎn)單的例子:
我們考慮下面這個(gè)計(jì)算式子:(a+b)*(c+d)該計(jì)算過程被分解為三步:
- e = a +b
- f = c +d
- m = e * f
要知道:早期的計(jì)算機(jī)一次只能處理一條指令,它要先算步驟1(加法操作),再算步驟2(加法操作),最后算3(乘法操作)。需要三步(花費(fèi)三個(gè)指令)得到答案。但是我們觀察到:3的結(jié)果依賴于1和2,而1和2都單純的加法操作,所以開始想辦法讓1和2同時(shí)計(jì)算,那么CPU只要兩步得到答案,步驟1和2一次算出來的結(jié)果,直接進(jìn)行乘法運(yùn)算。
此時(shí)步驟1和2作為一步,運(yùn)用了SIMD技術(shù)。一個(gè)指令執(zhí)行了(a,b,c,d) 4個(gè)操作數(shù)。