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

来源:https://www.cnblogs.com/f-ck-need-u/archive/2019/07/06/11141636.html
-Advertisement-
Play Games

關於CPU和程式的執行 CPU是電腦的大腦。 1. 程式的運行過程,實際上是程式涉及到的、未涉及到的一大堆的指令的執行過程 。 當程式要執行的部分被裝載到記憶體後,CPU要從記憶體中取出指令,然後指令解碼(以便知道類型和操作數,簡單的理解為CPU要知道這是什麼指令),然後執行該指令。再然後取下一個指令 ...


關於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個取指+解碼的並行工作線路,每個工作線路都將解碼後的指令放入一個緩存緩衝區等待執行單元去取出執行。

  9. 除了嵌入式系統,多數CPU都有兩種工作模式:內核態和用戶態。這兩種工作模式是由PSW寄存器上的一個二進位位來控制的。
  10. 內核態的CPU,可以執行指令集中的所有指令,並使用硬體的所有功能。
  11. 用戶態的CPU,只允許執行指令集中的部分指令。一般而言,IO相關和把記憶體保護相關的所有執行在用戶態下都是被禁止的,此外其它一些特權指令也是被禁止的,比如用戶態下不能將PSW的模式設置控制位設置成內核態。
  12. 用戶態CPU想要執行特權操作,需要發起系統調用來請求內核幫忙完成對應的操作。其實是在發起系統調用後,CPU會執行trap指令陷入(trap)到內核。當特權操作完成後,需要執行一個指令讓CPU返回到用戶態。
  13. 除了系統調用會陷入內核,更多的是硬體會引起trap行為陷入內核,使得CPU控制權可以回到操作系統,以便操作系統去決定如何處理硬體異常。

關於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. Intel的CPU是多核共用L2緩存

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • OiDc可以說是OAuth的改造版,在最初的OAuth中,我們需要先請求一下認證伺服器獲取下Access_token,然後根據Access_token去Get資源伺服器, 況且OAuth1 和 2 完全不相容,易用性差,而OIDC可以在登陸的時候就把信息返回給你,不需要你在請求一下資源伺服器。下麵我 ...
  • 題目描述 輸入一個鏈表,按鏈表值從尾到頭的順序返回一個List。 解題思路 輸入一個鏈表,從尾到頭輸出,正常的遍歷都是從頭到尾輸出,而這裡需要從尾到頭輸出,那麼就是“先進後出”,也就是棧的功能。 代碼實現 棧的方式實現 遞歸的方式實現 想入非非:擴展思維,發揮想象 目的: 1. 熟悉鏈表 2.熟悉棧 ...
  • 在windows下創建以.xxx開頭的文件夾時,點擊確認,系統提示“必須鍵入文件名”。 最方便的方法: (1)新建文件夾 (3)在文件名.xxxxx後再加一個.,也就是把文件名改成這樣子:.XXXXXX. (4)點擊確認,系統沒有報錯,文件夾名顯示為:.XXXXXX,改名成功。 就這些。 ...
  • 下載最新版puppylinux,從官網下載 現在U盤引導程式製作工具Unetbootin 打開下載的UNetbootin,進行下麵的操作: 製作完畢後,修改U盤的配置文件:用編輯器打開syslinux.cfg,把:append initrd=/initrd.gz pmedia=cd改為:append ...
  • 用戶管理命令、網路操作命令、磁碟與文件系統命令、系統許可權及用戶授權相關命令、內置命令、 ...
  • 常用的ps命令,如ps aux,ps lax,ps f,ps -A | grep java,ps aux > ps001.txt, ps aux --sort cmd等 ...
  • 一、下載解壓 1、Zookeeper簡介 Zookeeper 作為一個分散式的服務框架,主要用來解決分散式集群中應用系統的一致性問題,它能提供基於類似於文件系統的目錄節點樹方式的數據存儲,但是 Zookeeper 並不是用來專門存儲數據的,它的作用主要是用來維護和監控你存儲的數據的狀態變化。通過監控 ...
  • windows 2003,自己買吧...安裝IIS6.0:安裝系統後在"控制面板"->"添加或刪除程式"->"添加/刪除Windows組件"->雙擊"應用程式伺服器"->然後選中"Internet信息服務(IIS)"->確定->安裝完畢...下載PHP:http://cn2.php.net/get/ ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...