上圖為計算機的基本組成. 計算機有cpu 内存 硬盤等結構通過總線進行關聯起來,總線傳輸着各種各樣的數據。總線還連接着一些外部設備usb、顯卡、網卡等等。
一個程序是如何讓cpu給運行起來的呢?先來講一下程序、進程、線程、指令的關系:在硬盤裡的可執行文件叫程序跑在内存裡分配了一些内存資源讓cpu去執行他叫做進程,一個程序是可以有多個進程的。這個進程中的線程對于cpu來說就是一條一條的指令;一個進程裡面不同的執行路徑叫線程,一個程序可以有多個進程。
一個線程在cpu内部執行:線程是cpu執行的基本單位,進程是CPU分配資源的基本單位
拿qq程序舉例:
CPU
當我們點擊qq.exe時操作系統就把qq.exe從硬盤裡面放到内存裡面映射成了一個進程,這個進程中的線程相對于cpu而言是一個一個的指令然後cpu去執行它。
PC (Program Counter 程序計數器)
cpu是如何去執行這些指令的呢?
cpu有個組成部分叫 pc 這個pc裡面記錄這一個地址存放下一條執行的指令在哪裡,cpu執行完一條就去内存取下一條。
Register 寄存器
執行指令過程中少不了一些數據放到cpu來執行 ,那這些數據就放在寄存器(registers)裡面。
alu (Arithmetic Logic Unit)運算單元
數據放到寄存器之後使用運算單元alu來運算,運算完寫回到寄存器,寄存器再寫回到内存裡面去。比如:2 3這條在内存上的指令 首先pc指向2 3這條指令 然後2和3會放到寄存器裡面 然後alu會進行計算然後把計算結果放回到寄存器裡面 然後寄存器寫回到内存裡面
cache重點講一下
存儲器層次結構
L1、L2是緩存 一般位于cpu内部,L3會位于主闆或者cpu内。由上圖可以得知,如果寄存器想要得到存儲在内存的數據是需要經曆三層(不同cpu不同層,一般是三層)緩存,先進入L3再進入L2再進L1。
緩存行
寄存器要從内存中讀數據的時候是,并不是一個字節一個字節的讀取的而是通過總線一塊一塊的進行讀取數據的,這裡就有了緩存行的概念。緩存行越大 局部空間效率越高 但讀取數據慢反之。目前多用的是64字節。
一塊cpu裡面有好多的核,每個核裡面都有自己的内存單元自己的寄存器自己的pc。
小細節:經常寫與經常讀的數據單獨存與緩存行中可以提高速度。
比如:long類型占4字節那麼,前面申請56字節字段後面申請56字節字段,不論在哪裡取此long類型數據都是單獨在一個緩存行中。
MESI協議
如果一個線程或者cpu需要xy另外一個線程或者cpu也需要xy,那麼第一個線程修改了xy後就必須通知另外一個線程使用最新的值,就産生了線程的可見性,怎麼做呢?intel使用的是MESI Cache一緻性,具體可參考下面文章鍊接,講的特别細:
https://juejin.im/post/5d67e75a5188256db0644778
超線程:一個ALU 邏輯運算單元對應多個PC (Program Counter 程序計數器)和register數據寄存器
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!