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

駿馬金龍發表於2019-07-06

關於CPU和程式的執行

CPU是計算機的大腦。

  1. 程式的執行過程,實際上是程式涉及到的、未涉及到的一大堆的指令的執行過程
    當程式要執行的部分被裝載到記憶體後,CPU要從記憶體中取出指令,然後指令解碼(以便知道型別和運算元,簡單的理解為CPU要知道這是什麼指令),然後執行該指令。再然後取下一個指令、解碼、執行,以此類推直到程式退出。
  2. 這個取指、解碼、執行三個過程構成一個CPU的基本週期。
  3. 每個CPU都有一套自己可以執行的專門的指令集(注意,這部分指令是CPU提供的,CPU-Z軟體可檢視)。
    正是因為不同CPU架構的指令集不同,使得x86處理器不能執行ARM程式,ARM程式也不能執行x86程式。
    注:指令集的軟硬體層次之分:硬體指令集是硬體層次上由CPU自身提供的可執行的指令集合。軟體指令集是指語言程式庫所提供的指令,只要安裝了該語言的程式庫,指令就可以執行。

  4. 由於CPU訪問記憶體以得到指令或資料的時間要比執行指令花費的時間長很多,因此在CPU內部提供了一些用來儲存關鍵變數、臨時資料等資訊的通用暫存器
    所以,CPU需要提供 一些特定的指令,使得可以從記憶體中讀取資料存入暫存器以及可以將暫存器資料存入記憶體。
  5. 除了通用暫存器,還有一些特殊的暫存器。典型的如:
    • PC:program counter,表示程式計數器,它儲存了將要取出的下一條指令的記憶體地址,指令取出後,就會更新該暫存器指向下一條指令
    • 堆疊指標:指向記憶體當前棧的頂端,包含了每個函式執行過程的棧幀,該棧幀中儲存了該函式相關的輸入引數、區域性變數、以及一些沒有儲存在暫存器中的臨時變數。
    • PSW:program status word,表示程式狀態字,這個暫存器內儲存了一些控制位,比如CPU的優先順序、CPU的工作模式(使用者態還是核心態模式)等。
  6. 在CPU進行程式切換的時候,需要將暫存器中和當前程式有關的狀態資料寫入記憶體對應的位置(核心中該程式的棧空間)儲存起來,當切換回該程式時,需要從記憶體中拷貝回暫存器中。即上下文切換時,需要保護現場和恢復現場。
  7. 為了改善效能,CPU已經不是單條取指-->解碼-->執行的路線,而是分別為這3個過程分別提供獨立的取值單元,解碼單元以及執行單元。這樣就形成了流水線模式。
    例如,流水線的最後一個單元——執行單元正在執行第n條指令,而前一個單元可以對第n+1條指令進行解碼,再前一個單元即取指單元可以去讀取第n+2條指令。這是三階段的流水線,還可能會有更長的流水線模式。
  8. 更優化的CPU架構是superscalar架構(超標量架構)。這種架構將取指、解碼、執行單元分開,有大量的執行單元,然後每個取指+解碼的部分都以並行的方式執行。比如有2個取指+解碼的並行工作線路,每個工作線路都將解碼後的指令放入一個快取緩衝區等待執行單元去取出執行。
    總結關於CPU的一些基本知識
  9. 除了嵌入式系統,多數CPU都有兩種工作模式:核心態和使用者態。這兩種工作模式是由PSW暫存器上的一個二進位制位來控制的。
  10. 核心態的CPU,可以執行指令集中的所有指令,並使用硬體的所有功能。
  11. 使用者態的CPU,只允許執行指令集中的部分指令。一般而言,IO相關和把記憶體保護相關的所有執行在使用者態下都是被禁止的,此外其它一些特權指令也是被禁止的,比如使用者態下不能將PSW的模式設定控制位設定成核心態。
  12. 使用者態CPU想要執行特權操作,需要發起系統呼叫來請求核心幫忙完成對應的操作。其實是在發起系統呼叫後,CPU會執行trap指令陷入(trap)到核心。當特權操作完成後,需要執行一個指令讓CPU返回到使用者態。
  13. 除了系統呼叫會陷入核心,更多的是硬體會引起trap行為陷入核心,使得CPU控制權可以回到作業系統,以便作業系統去決定如何處理硬體異常。

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

關於CPU的多核和多執行緒

  1. CPU的物理個數由主機板上的插槽數量決定,每個CPU可以有多核心,每核心可能會有多執行緒。
  2. 多核CPU的每核(每核都是一個小晶片),在OS看來都是一個獨立的CPU
  3. 對於超執行緒CPU來說,每核CPU可以有多個執行緒(數量是兩個,比如1核雙執行緒,2核4執行緒,4核8執行緒),每個執行緒都是一個虛擬的邏輯CPU(比如windows下是以邏輯處理器的名稱稱呼的),而每個執行緒在OS看來也是獨立的CPU
    這是欺騙作業系統的行為,在物理上仍然只有1核,只不過在超執行緒CPU的角度上看,它認為它的超執行緒會加速程式的執行。
    總結關於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的一些基本知識

CPU上的快取記憶體

  1. 最高速的快取是CPU的暫存器,它們和CPU的材料相同,最靠近CPU或最接近CPU,訪問它們沒有時延(<1ns)。但容量很小,小於1kb。
    • 32bit:32*32位元=128位元組
    • 64bit:64*64位元=512位元組
  2. 暫存器之下,是CPU的快取記憶體。分為L1快取、L2快取、L3快取,每層速度按數量級遞減、容量也越來越大。
    總結關於CPU的一些基本知識
  3. 每核心都有一個自己的L1快取。L1快取分兩種:L1指令快取(L1-icache)和L1資料快取(L1-dcache)。L1指令快取用來存放已解碼指令,L1資料快取用來放訪問非常頻繁的資料。
  4. L2快取用來存放近期使用過的記憶體資料。更嚴格地說,存放的是很可能將來會被CPU使用的資料。
  5. Intel的CPU是多核共享L2快取

相關文章