關於CPU的一些基本知識總結

關於CPU和程序的執行

CPU是計算機的大腦。算法

  1. 程序的運行過程,其實是程序涉及到的、未涉及到的一大堆的指令的執行過程
    當程序要執行的部分被裝載到內存後,CPU要從內存中取出指令,而後指令解碼(以便知道類型和操做數,簡單的理解爲CPU要知道這是什麼指令),而後執行該指令。再而後取下一個指令、解碼、執行,以此類推直到程序退出。
  2. 這個取指、解碼、執行三個過程構成一個CPU的基本週期。
  3. 每一個CPU都有一套本身能夠執行的專門的指令集(注意,這部分指令是CPU提供的,CPU-Z軟件可查看),指令集包含兩類指令:機器指令和彙編指令。
    正是由於不一樣CPU架構的指令集不一樣,使得x86處理器不能執行ARM程序,ARM程序也不能執行x86程序。(Intel和AMD都使用x86指令集,手機絕大多數使用ARM指令集)。
    注:指令集的軟硬件層次之分:硬件指令集是硬件層次上由CPU自身提供的可執行的指令集合。軟件指令集是指語言程序庫所提供的指令,只要安裝了該語言的程序庫,指令就能夠執行。
  4. 因爲CPU訪問內存以獲得指令或數據的時間要比執行指令花費的時間長不少,所以在CPU內部提供了一些用來保存關鍵變量、臨時數據等信息的通用寄存器
    因此,CPU須要提供 一些特定的指令,使得能夠從內存中讀取數據存入寄存器以及能夠將寄存器數據存入內存。
    此外還須要提供加法、減、not/and/or等基本運算指令,而乘除法運算都是推算出來的(支持的基本運算指令參見ALU Functions),因此乘除法的速度要慢的多。這也是算法裏在考慮時間複雜度時經常忽略加減法次數帶來的影響,而考慮乘除法的次數的緣由
  5. 除了通用寄存器,還有一些特殊的寄存器。典型的如:
    • PC:program counter,表示程序計數器,它保存了將要取出的下一條指令的內存地址,指令取出後,就會更新該寄存器指向下一條指令
    • 堆棧指針:指向內存當前棧的頂端,包含了每一個函數執行過程的棧幀,該棧幀中保存了該函數相關的輸入參數、局部變量、以及一些沒有保存在寄存器中的臨時變量。
    • PSW:program status word,表示程序狀態字,這個寄存器內保存了一些控制位,好比CPU的優先級、CPU的工做模式(用戶態仍是內核態模式)等。
  6. 在CPU進行進程切換的時候,須要將寄存器中和當前進程有關的狀態數據寫入內存對應的位置(內核中該進程的棧空間)保存起來,當切換回該進程時,須要從內存中拷貝回寄存器中。即上下文切換時,須要保護現場和恢復現場。
  7. 爲了改善性能,CPU已經不是單條取指-->解碼-->執行的路線,而是分別爲這3個過程分別提供獨立的取值單元,解碼單元以及執行單元。這樣就造成了流水線模式。
    例如,流水線的最後一個單元——執行單元正在執行第n條指令,而前一個單元能夠對第n+1條指令進行解碼,再前一個單元即取指單元能夠去讀取第n+2條指令。這是三階段的流水線,還可能會有更長的流水線模式。
  8. 更優化的CPU架構是superscalar架構(超標量架構)。這種架構將取指、解碼、執行單元分開,有大量的執行單元,而後每一個取指+解碼的部分都以並行的方式運行。好比有2個取指+解碼的並行工做線路,每一個工做線路都將解碼後的指令放入一個緩存緩衝區等待執行單元去取出執行。

  9. 除了嵌入式系統,多數CPU都有兩種工做模式:內核態和用戶態。這兩種工做模式是由PSW寄存器上的一個二進制位來控制的。
  10. 內核態的CPU,能夠執行指令集中的全部指令,並使用硬件的全部功能。
  11. 用戶態的CPU,只容許執行指令集中的部分指令。通常而言,IO相關和把內存保護相關的全部執行在用戶態下都是被禁止的,此外其它一些特權指令也是被禁止的,好比用戶態下不能將PSW的模式設置控制位設置成內核態。
  12. 用戶態CPU想要執行特權操做,須要發起系統調用來請求內核幫忙完成對應的操做。實際上是在發起系統調用後,CPU會執行trap指令陷入(trap)到內核。當特權操做完成後,須要執行一個指令讓CPU返回到用戶態。
  13. 除了系統調用會陷入內核,更多的是硬件會引發trap行爲陷入內核,由於全部的硬件均可以在須要的時候經過總線發送硬件中斷信號(也稱爲硬件異常,這個異常並不是真的表明硬件出了故障,而是表示一種須要儘快處理的事件),使得CPU控制權能夠回到操做系統,讓內核去處理該中斷。
  14. 中斷指的是打斷正常的執行流程,並在須要時恢復正常的執行流程,就像這個突發事件從沒有發生過同樣,但卻實實在在的處理過這個事件。因此,發生中斷時須要保證可以去處理中斷事件,還要保存中斷髮生時的正常執行流程,以便後續恢復正常執行流程。
    • 中斷是操做系統中很是重要的機制,分爲硬件中斷和軟件中斷。
    • 軟中斷能夠經過一些特殊的系統調用來實現,好比發生一些信號。
    • 每一個硬件都能在須要的時候經過總線發送硬件中斷信號,好比IO操做完成的時候,磁盤能夠發送磁盤IO中斷。
    • 同一時刻可能會有不少中斷事件的發生,因此中斷須要排隊,此外中斷也有優先級來決定哪一種中斷比較重要是須要儘快處理的。
    • 當接收到中斷後,CPU控制權交給內核,內核開始處理中斷,中斷處理的最後一個步驟是跳回中斷地點繼續向下執行,可是有可能在執行此步驟以前就退出了該執行流程,使得不會繼續向下執行。

關於CPU的基本組成

  1. CPU是用來運算的(加法運算+、乘法運算*、邏輯運算and not or等),例如c=a+b
  2. 運算操做涉及到數據輸入(input)、處理、數據輸出(output),a和b是輸入數據,加法運算是處理,c是輸出數據。
  3. CPU須要使用一個叫作存儲器(也就是各類寄存器)的東西保存輸入和輸出數據。如下是幾種常見的寄存器(前文也介紹了一些)
    • MAR: memory address register,保存將要被訪問數據在內存中哪一個地址處,保存的是地址值
    • MDR: memory data register,保存從內存讀取進來的數據或將要寫入內存的數據,保存的是數據值
    • AC: Accumulator,保存算術運算和邏輯運算的中間結果,保存的是數據值
    • PC: Program Counter,保存下一個將要被執行指令的地址,保存的是地址值
    • CIR: current instruction register,保存當前正在執行的指令
  4. CPU還要將一些經常使用的基本運算工具(如加法器)放進CPU,這部分負責運算,稱爲算術邏輯單元(ALU, Arithmetic Logic Unit)。
  5. CPU中還有一個控制器(CU, Control Unit),負責將存儲器中的數據送到ALU中去作運算,並將運算後的結果存回到存儲器中。
    • 控制器還包含了一些控制信號。
  6. 控制器之因此知道數據放哪裏、作什麼運算(好比是作加法仍是邏輯運算?)都是由指令告訴控制器的,每一個指令對應一個基本操做,好比加法運算對應一個指令。
  7. 例如,將兩個MDR寄存器(保存了來自內存的兩個數據)中的值拷貝到ALU中,而後根據指定的操做指令執行加法運算,將運算結果拷貝會一個MDR寄存器中,最後寫入到內存。
  8. 這就是馮諾依曼結構圖,也就是如今計算機的結構圖。

關於CPU的多核和多線程

  1. CPU的物理個數由主板上的插槽數量決定,每一個CPU能夠有多核心,每核心可能會有多線程。
  2. 多核CPU的每核(每核都是一個小芯片),在OS看來都是一個獨立的CPU
  3. 對於超線程CPU來講,每核CPU能夠有多個線程(數量是兩個,好比1核雙線程,2核4線程,4核8線程),每一個線程都是一個虛擬的邏輯CPU(好比windows下是以邏輯處理器的名稱稱呼的),而每一個線程在OS看來也是獨立的CPU
    這是欺騙操做系統的行爲,在物理上仍然只有1核,只不過在超線程CPU的角度上看,它認爲它的超線程會加速程序的運行。

  4. 要發揮超線程優點,須要操做系統對超線程有專門的優化。
  5. 多線程的CPU在能力上,比非多線程的CPU核心要更強,但每一個線程不足以與獨立的CPU核心能力相比較。
  6. 每核上的多線程CPU都共享該核的CPU資源
    例如,假設每核CPU都只有一個"發動機"資源,那麼線程1這個虛擬CPU使用了這個"發動機"後,線程2就無法使用,只能等待。
    因此,超線程技術的主要目的是爲了增長流水線(參見前文對流水線的解釋)上更多個獨立的指令,這樣線程1和線程2在流水線上就儘可能不會爭搶該核CPU資源。因此,超線程技術利用了superscalar(超標量)架構的優勢。
  7. 多線程意味着每核能夠有多個線程的狀態。好比某核的線程1空閒,線程2運行。
  8. 多線程沒有提供真正意義上的並行處理,每核CPU在某一時刻仍然只能運行一個進程,由於線程1和線程2是共享某核CPU資源的。能夠簡單的認爲每核CPU在獨立執行進程的能力上,有一個資源是惟一的,線程1獲取了該資源,線程2就無法獲取
    可是,線程1和線程2在不少方面上是能夠並行執行的。好比能夠並行取指、並行解碼、並行執行指令等。因此雖然單核在同一時間只能執行一個進程,但線程1和線程2能夠互相幫助,加速進程的執行。
    而且,若是線程1在某一時刻獲取了該核執行進程的能力,假設此刻該進程發出了IO請求,因而線程1掌握的執行進程的能力,就能夠被線程2獲取,即切換到線程2。這是在執行線程間的切換,是很是輕量級的。(WIKI: if resources for one process are not available, then another process can continue if its resources are available)
  9. 多線程可能會出現一種現象:假如2核4線程CPU,有兩個進程要被調度,那麼只有兩個線程會處於運行狀態,若是這兩個線程是在同一核上,則另外一核徹底空轉,處於浪費狀態。更指望的結果是每核上都有一個CPU分別調度這兩個進程。

關於CPU上的高速緩存

  1. 最高速的緩存是CPU的寄存器,它們和CPU的材料相同,最靠近CPU或最接近CPU,訪問它們沒有時延(<1ns)。但容量很小,小於1kb。
    • 32bit:32*32比特=128字節
    • 64bit:64*64比特=512字節
  2. 寄存器之下,是CPU的高速緩存。分爲L1緩存、L2緩存、L3緩存,每層速度按數量級遞減、容量也愈來愈大。

  3. 每核心都有一個本身的L1緩存。L1緩存分兩種:L1指令緩存(L1-icache)和L1數據緩存(L1-dcache)。L1指令緩存用來存放已解碼指令,L1數據緩存用來放訪問很是頻繁的數據。
  4. L2緩存用來存放近期使用過的內存數據。更嚴格地說,存放的是極可能未來會被CPU使用的數據。
  5. 多數多核CPU的各核都各自擁有一個L2緩存,但也有多核共享L2緩存的設計。不管如何,L1是各核私有的(但對某核內的多線程是共享的)
相關文章
相關標籤/搜索