计算机原理结构
本文目錄
- 1.現代計算機理論模型與工作原理
- 2.計算機五大核心組成部分
- 3.現代計算機基本硬件結構
- 4.CPU內部結構劃分
- 1.控制單元
- 2.運算單元
- 3.存儲單元
- 5.計算機硬件多CPU架構
- 1.多CPU
- 2.CPU多核
- 3.CPU寄存器
- 4.CPU緩存
- 5.內存
- 1.CPU讀取存儲器數據過程
- 2.多線程環境下存在的問題
- 1.緩存一致性問題
- 2.指令重排序問題
- 6.CPU計算完成后,何時將數據同步回內存中
- 7.案例分析
1.現代計算機理論模型與工作原理
??現代計算機模型是基于馮.諾依曼計算機模型。
??計算機在運行時,先從內存中取出第一條指令,通過控制器的譯碼,按指令的要求,從存儲器中取出數據進行指定的運算和邏輯操作等加工,然后再按地址把結果送到內存中去。接下來,再取出第二條指令,在控制器的指揮下完成規定操作,依此進行下去,直至遇到停止指令。
計算機大致流程:CPU→讀取→存儲;CPU計算完成后,再將數據存回→存儲
??程序與數據一樣存儲,按程序編排的順序,一步一步地取出指令,自動地完成指令規定的操作,是計算機最基本的工作模型。這一原理最初是由美籍匈牙利數學家馮.諾依曼于1945年提出來的,故稱為馮.諾依曼計算機模型。
2.計算機五大核心組成部分
重點了解:控制器、運算器、存儲器
3.現代計算機基本硬件結構
??CPU、存儲器、硬盤、內存條,都是單獨物件的存在,它們之間都是通過一條IO總線進行通信的。程序在CPU中計算,通過I/O總線去獲取到內存中的數據/指令,然后把它load到CPU上的緩存(L1、L2、L3三級緩存,先L3再L2后L1一級一級來)中,然后load加載到 CPU中,在CPU中進行計算
?
??計算機內存條,頻率為幾百M/Hz,內存條速度是遠遠跟不上CPU的計算速度的。如果CPU沒有多級緩存架構的話,就會嚴重拖慢CPU的運算效率。【如果沒有多級緩存,CPU會直接去內存條獲取數據,速度遠遠跟不上CPU的計算速度】
?
??L1、L2、L3 即高速緩沖存儲器,是位于CPU與主內存間的一種容量較小但速度很高的存儲器。 由于 CPU的計算速度遠高于主內存,CPU直接從內存中存取數據要等待一定時間周期,L1、L2、L3緩存中保存著CPU剛用過或循環使用的一部分數據,當CPU再次使用該部分數據時,就可以直接從三級緩存中來取數據, 減少CPU的等待時間,提高效率。
?
運行速度:寄存器 > L1 > L2 > L3 > 內存條
4.CPU內部結構劃分
- 控制單元
- 運算單元
- 存儲單元
1.控制單元
??控制單元是整個CPU的指揮控制中心,由指令寄存器IR(Instruction Register)、指令譯碼器ID(Instruction Decoder)和 操作控制器OC(Operation Controller) 等組成,對協調整個電腦有序工作極為重要。它根據用戶預先編好的程序,依次從存儲器中取出各條指令,放在指令寄存器IR中,通過指令譯碼(分析)確定應該進行什么操作,然后通過操作控制器OC,按確定的時序,向相應的部件發出微操作控制信號。操作控制器OC中主要包括:節拍脈沖發生器、控制矩陣、時鐘脈沖發生器、復位電路和啟停電路等控制邏輯。
2.運算單元
??運算單元是運算器的核心,可以執行算術運算(包括加減乘數等基本運算及其附加運算)和邏輯運算(包括移位、邏輯測試或兩個值比較)。相對控制單元而言,運算器接受控制單元的命令而進行動作,即運算單元所進行的全部操作都是由控制單元發出的控制信號來指揮的,所以它是執行部件。
3.存儲單元
??存儲單元包括 CPU 片內緩存Cache和寄存器組,是 CPU 中暫時存放數據的地方,里面保存著那些等待處理的數據,或已經處理過的數據,CPU 訪問寄存器所用的時間要比訪問內存的時間短。 寄存器是CPU內部的元件,寄存器擁有非常高的讀寫速度,所以在寄存器之間的數據傳送非常快。采用寄存器,可以減少 CPU 訪問內存的次數,從而提高了 CPU 的工作速度。寄存器組可分為專用寄存器和通用寄存器。專用寄存器的作用是固定的,分別寄存相應的數據;而通用寄存器用途廣泛并可由程序員規定其用途。
5.計算機硬件多CPU架構
1.多CPU
??一個現代計算機通常由兩個或者多個CPU,如果要運行多個程序(進程)的話,假如只有一個CPU的話,就意味著要經常進行進程上下文切換,因為單CPU即便是多核的,也只是多個處理器核心,其他設備都是共用的,所以多個進程就必然要經常進行進程上下文切換,這個代價是很高的。
2.CPU多核
??一個現代CPU除了處理器核心之外還包括:寄存器、L1L2L3緩存這些存儲設備、浮點運算單元、整數運算單元等一些輔助運算設備以及內部總線等。一個多核的CPU也就是一個CPU上有多個處理器核心,這樣有什么好處呢?比如說現在我們要在一臺計算機上跑一個多線程的程序,因為是一個進程里的線程,所以需要共享一些存儲變量,如果這臺計算機都是單核單線程CPU的話,就意味著這個程序的不同線程需要經常在CPU之間的外部總線上通信,同時還要處理不同CPU之間不同緩存導致數據不一致的問題,所以在這種場景下多核單CPU的架構就能發揮很大的優勢,通信都在內部總線,共用同一個緩存。
3.CPU寄存器
??每個CPU都包含一系列的寄存器,它們是CPU內內存的基礎。CPU在寄存器上執行操作的速度遠大于在主存上執行的速度。這是因為CPU訪問寄存器的速度遠大于主存。
4.CPU緩存
??即高速緩沖存儲器,是位于CPU與主內存間的一種容量較小但速度很高的存儲器。由于CPU的速度遠高于主內存,CPU直接從內存中存取數據要等待一定時間周期,Cache中保存著CPU剛用過或循環使用的一部分數據,當CPU再次使用該部分數據時可從Cache中直接調用,減少CPU的等待時間,提高了系統的效率。
- 一級Cache(L1 Cache)
- 二級Cache(L2 Cache)
- 三級Cache(L3 Cache)
L1 Cache 又分為 L1 指令緩存、L1 數據緩存,如下圖所示。
5.內存
??一個計算機還包含一個主存(內存條)。所有的CPU都可以訪問主存。主存通常比CPU中的緩存大得多。
1.CPU讀取存儲器數據過程
- CPU要取寄存器中地址為 xxx 的值,只需要一步:直接讀取。
- CPU要取L1 cache的某個值,需要1-3步(或者更多):把cache行鎖住,把某個數據拿來,解鎖,load 到 CPU 中進行計算。
- CPU要取L2 cache的某個值,先要到L1 cache里取,L1當中不存在,再去 L2 里取,L2開始加鎖,加鎖以后,把L2里的數據復制到L1,再執行讀L1的過程,L1加鎖,讀取后,再解鎖,再從 L1 到 CPU。
- CPU取L3 cache的也是一樣,只不過先由L3復制到L2,從L2復制到L1,從L1到CPU。
- CPU取內存則最復雜,通知內存控制器占用總線帶寬,通知內存加鎖,發起內存讀請求, 等待響應,響應后,將數據保存到L3,再從L3、L2到L1,再從L1到CPU,之后解除總線鎖定
這就是CPU為什么要去設計三級緩存的原因,就是圖快快快!
2.多線程環境下存在的問題
1.緩存一致性問題
??在多處理器系統中,每個處理器都有自己的高速緩存,而它們又共享同一主內存(MainMemory)。基于高速緩存的存儲交互很好地解決了處理器與內存的速度矛盾,但是也引入了新的問題:緩存一致性(CacheCoherence)。
??當多個處理器的運算任務都涉及同一塊主內存區域時,將可能導致各自的緩存數據不一致的情況,如果真的發生這種情況,那同步回到主內存時以誰的緩存數據為準呢?為了解決一致性的問題,需要各個處理器訪問緩存時都遵循一些協議,在讀寫時要根據協議來進行操作,這類協議有MSI、MESI、MOSI、Synapse、Firefly及DragonProtocol,等等
2.指令重排序問題
??為了使得處理器內部的運算單元能盡量被充分利用,處理器可能會對輸入代碼進行亂序執行(Out-Of-Order Execution)優化,處理器會在計算之后將亂序執行的結果重組,保證該結果與順序執行的結果是一致的,但并不保證程序中各個語句計算的先后順序與輸入代碼中的順序一致。因此,如果存在一個計算任務依賴另一個計算任務的中間結果,那么其順序性并不能靠代碼的先后順序來保證。與處理器的亂序執行優化類似,Java虛擬機的即時編譯器(JIT)中也有類似的指令重排序(Instruction Reorder)優化
6.CPU計算完成后,何時將數據同步回內存中
??CPU在計算完成后,并不會立即將數據同步到內存中。CPU只會在空閑時才將最新數據刷回內存中,這個時間點并不可控。有什么辦法,在計算完成后,強制讓數據刷回內存中呢?
??就是匯編指令中的一個 LOCK 信號。CPU硬件層面怎么解決這個問題呢?針對該問題,提出了 MESI 緩存一致性協議。通過MESI協議,能夠保證將最新數據立馬同步回去。
7.案例分析
場景:
??服務器有2個線程t1、t2在跑。都對 x=1 分別+1,期望最終結果:x = 3
?
問題分析:
??首先會將 x=1 加載到主內存中,然后 t1線程,會獲取到 x=1 的內存地址,然后在寄存器、CPU緩存(L1、L2、L3)中是否存在(L1最優先,L2中如果有,則copy一份到L1,最后加載到寄存器進行計算),如果都沒有則會去主內存中獲取,然后一次加載,并copy到L3→L2→L1,最后寫入寄存器進行計算,一級一級進行緩存。
?
實際結果:
??同一時刻兩個線程同時運行,則會在各自線程中的 CPU 緩存中,同時有兩份 x=1 的副本,然后兩個線程都 +1 后,再同步寫入到主內存中,此時兩個線程最終結果應該為 1+1+1=3,但是預期結果會是2(t1線程寫入后,t2也寫入,都是1+1,寫入的都是2),會導致結果和預期的不一致。
?
解決方案:
??為了保證運算結果的一致性,在CPU中設計了兩種解決方式:①總線鎖? ②MESI緩存一致性協議
2021-11-14,接下來將持續更新《并發編程》硬核內容,如有需要,請持續關注!!!
并發目錄:
??1.計算機原理結構
??2.MESI 緩存一致性協議
??3.提起線程,你不了解的那些事
??4.JMM內存模型 & 多線程三大特性
??5.synchronized 原理、使用、鎖升級過程,寫到我要吐血了
??6.JUC全家桶系列,一鍵三連就完事了
??7.可重入讀寫鎖:ReentrantReadWriteLock
??8.Java并發工具類:CountDownLatch、Semaphore、CyclicBarrier、Exchanger
??9.Atomic原子類
??10.JUC阻塞隊列
??11.Java線程池創建,全部考點都在這里了
??12.為什么阿里巴巴要禁用Executors創建線程池?
??13.ThreadLocal,你想了解的都在這里(進來瞧瞧不后悔)
??14.Java多線程的六種狀態
??15.Java實現多線程的三種方式
??16.線程的生命周期包括哪幾個階段?
??17.有三個線程 t1,t2,t3,怎么確保它們按順序執行?
??18.JUC 之 Condition 使用 + 原理分析
??19.多線程異步調用實現方式:CompletableFuture
2021-11-15 已更新《并發編程》第二篇:MESI 緩存一致性協議
博主寫作不易,加個關注唄
求關注、求點贊,加個關注不迷路 ヾ(?°?°?)ノ゙
我不能保證所寫的內容都正確,但是可以保證不復制、不粘貼。保證每一句話、每一行代碼都是親手敲過的,錯誤也請指出,望輕噴 Thanks?(・ω・)ノ
總結
- 上一篇: 软件项目管理师复习指南四:法律法规标准化
- 下一篇: 美国诚实签经验——不要抢答,两个人一起签