老電腦升級內存條
之前升級了i7-13700K,主板選的七彩虹Z790,顯卡配的是七彩虹3080AD 12G,現在給這個主機加了一對DDR5內存條以及一條PCIe4.0的固態,我過來跑個性能測試給大家看看到底多強。裝機...
2025.07.02COPYRIGHT ? 2023
粵ICP備2021108052號
郵箱:611661226@qq.com
留言給我關于32位和64位,這個概念一直讓人比較懵。
在買電腦的時候,我們看到過32位和64位CPU。
下軟件的時候,我們也看到過32位或64位的軟件。
就連裝虛擬機的時候,我們也看過32位和64位的系統。
在寫代碼的時候,我們的數值,也可以定義為int32或者int64。
我們當然很清楚,裝軟件的時候,一般64位的系統就選64位的軟件,肯定不出錯,但是這又是為什么呢?既然CPU,軟件,操作系統,數值大小都有32位和64位,他們之間就可以隨意組合成各種問題,比如32位的系統能裝64位的軟件嗎?32位的系統能計算int64的數值嗎?他們之間到底有什么關系?
我們從熟悉的場景開始說起,比方說,我們寫代碼的時候,會在代碼編輯器里寫入。
// test.c#include int main(){ int i,j; i = 3; j = 2; return i + j;}復制代碼
但這個代碼是給人看的,機器可看不懂,于是這段代碼,還會經過被編譯器轉成匯編碼。
匯編碼就是我們大學的時候學得頭禿的這種
// gcc -S test.cpushq %rbp.cfi_def_cfa_offset 16.cfi_offset %rbp, -16movq%rsp, %rbp.cfi_def_cfa_register %rbpmovl$0, -4(%rbp)movl$3, -8(%rbp)movl$2, -12(%rbp)movl-8(%rbp), %eaxaddl-12(%rbp), %eaxpopq%rbpretq復制代碼
大家也別去看上面的內容,沒必要。
而匯編,總歸還是有各種movl,pushq這些符號,雖然確實不好看,但說到底還是給人看的,而機器cpu要的,說到底還是要0101這樣的二進制編碼,所以還需要使用匯編器將匯編轉成二進制的機器碼。我們可以看到下面內容分為3列,左邊是指令地址, 右邊是匯編碼內容,中間的就是指令機器碼,是16進制,可以轉成二進制01串,這就是機器cpu能認識的內容了。
// objdump -d test0000000000001125 :1125: 55push%rbp1126: 48 89 e5mov%rsp,%rbp1129: c7 45 fc 03 00 00 00movl$0x3,-0x4(%rbp)1130: c7 45 f8 02 00 00 00movl$0x2,-0x8(%rbp)1137: 8b 55 fcmov-0x4(%rbp),%edx113a: 8b 45 f8mov-0x8(%rbp),%eax113d: 01 d0 add%edx,%eax113f: 5dpop%rbp1140: c3retq1141: 66 2e 0f 1f 84 00 00nopw%cs:0x0(%rax,%rax,1)1148: 00 00 00 114b: 0f 1f 44 00 00nopl0x0(%rax,%rax,1)復制代碼
而機器碼,最后會放在我們編譯生成的可執行文件里。
也就是說我們平時寫的代碼,最后會變成一堆01機器碼,放在可執行文件里,躺在磁盤上。
一旦我們執行以下命令
./可執行文件名復制代碼
這個可執行文件就會加載進內存中,成為一個進程,運行起來。
可執行文件里的機器碼也會被加載到內存中,它就像是一張列滿todo list的清單,而CPU就對照著這張清單,一行行的執行上面的機器碼。從效果上來看,進程就動起來了。
對CPU來說,它執行到某個特定的編碼數值,就會執行特定的操作。比如計算2+3,其實就是通過總線把數據2和3從內存里讀入,然后放到寄存器上,再用加法器相加這兩個數值并將結果放入到寄存器里,最后將這個數值回寫到內存中,以此循環往復,一行行執行機器碼直到退出。
上面這個流程里,最重要的幾個關鍵詞,分別是CPU寄存器,總線,內存。
CPU的寄存器,說白了就是個存放數值的小盒子,盒子的大小,叫位寬。32位CPU能放入最大2^32的數值。64位就是最大2^64的值。這里的32位位寬的CPU就是我們常說的32位CPU,同理64位CPU也是一樣。
而CPU跟內存之間,是用總線來進行信號傳輸的,總線可以分為數據總線,控制總線,地址總線。功能如其名,舉個例子說明下他們的作用吧。在一個進程的運行過程中,CPU會根據進程的機器碼一行行執行操作。
比如現在有一行是將A地址的數據與B地址的數據相加,那么CPU就會通過控制總線,發送信號給內存這個設備,告訴它,現在CPU要通過地址總線在內存中找到A數據的地址,然后取得A數據的值,假設是100,那么這個100,就會通過數據總線回傳到CPU的某個寄存器中。B也一樣,假設B=200,放到另一個寄存器中,此時A和B相加后,結果是300,然后控制CPU通過地址總線找到返回的參數地址,再把數據結果通過數據總線傳回內存中。這一存一取,CPU都是通過控制總線對內存發出指令的。
而總線,也可以理解為有個寬度,比如寬度是32位,那么一次可以傳32個0或1的信號,那么這個寬度能表達的數值范圍就是0到2^32這么多。
32位CPU的總線寬度一般是32位,因為剛剛上面提到了,CPU可以利用地址總線在內存中進行尋址操作,那么現在這根地址總線,最大能尋址的范圍,也就到2^32,其實就是4G。
64位CPU,按理說總線寬度是64位,但實際上是48位(也有看到說是40位或46位的,沒關系,你知道它很大就行了),所以尋址范圍能到2^48次方,也就是256T。
上面提到了32位CPU和64位CPU的內存尋址范圍,那么相應的操作系統,和軟件(其實操作系統也能說是軟件),也應該按CPU所能支持的范圍去構建自己的尋址范圍。
比方說下面這個圖,在操作系統上運行一個用戶態進程,會分為用戶態和內核態,并設定一定的內存布局。操作系統和軟件都需要以這個內存布局為基礎運行程序。比如32位,內核態分配了1個G,用戶態分配了3G,這種時候,你總不能將程序的運行內存邊界設定在大于10G的地方。所以,系統和軟件的位數,可以理解為,這個系統或軟件內存尋址的范圍位數。
一般情況下,由于現在我們的CPU架構在設計上都是完全向前兼容的,別說32位了,16位的都還兼容著,因此64位的CPU是能裝上32位操作系統的。
同理,64位的操作系統是兼容32位的軟件的,所以32位軟件能裝在64位系統上。
但反過來,因為32位操作系統只支持4g的內存,而64位的軟件在編譯的時候就設定自己的內存邊界不止4個G,并且64位的CPU指令集內容比32位的要多,所以32位操作系統是肯定不能運行64位軟件的。
同理,32位CPU也不能裝64位的操作系統的。
這個我們平時寫代碼接觸得最多,比較好理解了。int32也就是用4個字節,32位的內存去存儲數據,int64也就是用8個字節,64位去存數據。這個數值就是剛剛CPU運行流程中放在內存里的數據。
那么問題又來了。
先說結論,能。但比起64位的CPU,性能會慢一些。
如果說我用的是64位的CPU,那么我在計算兩個int64的數值相加時,我就能將數據通過64位的總線,一次性存入到64位的寄存器,并在進行計算后返回到內存中。整個過程一步到位,一氣呵成。
但如果我現在用的是32位的CPU,那就憋屈一點了,我雖然在代碼里放了個int64的數值,但實際上CPU的寄存器根本放不下這么大的數據,因此最簡單的方法是,將int64的數值,拆成前后兩半,現在兩個int64相加,就變成了4個int32的數值相加,并且后半部分加好了之后,拿到進位,才能去計算前面的部分,這里光是執行的指令數就比64位的CPU要多。所以理論上,會更慢些。
上面提到了CPU位數,系統位數,軟件位數,以及數值位數之間的區別與聯系。
現在,我們回到標題里提到的問題。
系統能正常工作,但一般用不到8G,因為32位系統的總線尋址能力為2的32次方,也就是4G,哪怕裝了8G的內存,真正能被用到的其實只有4g,多少有點浪費。
注意上面提到的是一般,為什么這么說,因為這里有例外,32位系統里,有些是可以支持超過4G內存的,比如Windows Server 2003就能最大支持64G的內存,它通過使用 PAE (Intel Physical Address Extension)技術向程序提供更多的物理內存,PAE本質上是通過分頁管理的方式將32位的總線尋址能力增加到36位。因此理論上尋址能力達到2的36次方,也就是64G。
至于實現細節大家也不用關心,現在用到這玩意的機器也該淘汰得差不多了,而且都是windows server,注意Windows Server 2003 名字里帶個server,是用來做服務器的,我們一般也用不到,知道這件事,除了能幫助我們更好的裝x外,就沒什么作用了。
所以,你當32位系統最大只能用到4G內存,那也沒毛病。
上面提到32位CPU就算插上8G內存條,尋址能力也還是4G,那如果說我現在換用64位的CPU,但裝了個32位的操作系統,這時候插入8G內存條,尋址能力能超過4G嗎?
尋址能力,除了受到cpu的限制外,還受到操作系統的限制,如果操作系統就是按著32位的指令和尋址范圍(4G)來編譯的話,那么它就會缺少64位系統該有的指令,它在運行軟件的時候就不能做到超過這個限制,因此尋址能力還會是4G。
最后留下一個問題吧。
上面提到,我們平時寫的代碼(也就是C,go,java這些),先轉成匯編,再轉成機器碼。最后CPU執行的是機器碼,那么問題來了。
為什么我們平時寫的代碼不直接轉成機器碼,而要先轉成匯編,這是不是多此一舉?
剛工作的時候一直覺得int32,有21個億,這么大的數值肯定夠用了吧,結果現實好幾次打臉。
以前做游戲的時候,血量一開始是定義為int32,游戲設定是可以通過充錢,提升角色的屬性,還能提升血量上限,誰也沒想到,老板們通過氪金,硬是把血量給打到了int32最大值。于是策劃提了個一句話需求:"血量要支持到int64大小",這是我見過最簡單的策劃案,但也讓人加班加的最兇。
那是我第一次感受到了鈔能力。
這篇文章老早就想寫了,但涉及的知識點有點多,一直很頭疼,怎么樣才能用最簡單的方式把他們表述清楚,于是想著從大家最熟悉的場景開始說起。希望能給大家帶來價值。
如果文章對你有幫助,歡迎.....
算了。
之前升級了i7-13700K,主板選的七彩虹Z790,顯卡配的是七彩虹3080AD 12G,現在給這個主機加了一對DDR5內存條以及一條PCIe4.0的固態,我過來跑個性能測試給大家看看到底多強。裝機...
2025.07.02電腦用時間長了配置跟不上了怎么辦?要不就賣掉舊電腦后組裝新電腦,要不就給舊電腦進行硬件升級后繼續使用。今天我們重點談談舊電腦的硬件升級問題,硬件升級的意思就是:在舊電腦上面加裝或更換一些必要硬件,使電...
2025.07.02頭條朋友,晚上好 ,我給大家分享一下筆記本電腦如何增加內存條 ,該電腦已經使用7年了,有一點卡頓,擴容后各方面性能都會提高,這里以戴爾筆記本電腦為例 ,該電腦原裝4G內存條 ,有備用內存擴容槽 。擴...
2025.07.02請您在閱讀前點擊上面的“關注”二字,后續會為您提供更多有價值的電腦知識,感謝每一位朋友的支持!有朋友想把舊電腦或者其他內存換掉,裝在新電腦里,但是又擔心內存條的通用性和兼容性。他的擔心正確嗎,是否有必...
2025.06.28不同的內存配置,對日常使用以及玩游戲都有影響。那么面對兩根8g的內存條,和一根16g的內存條,你會怎么選擇?電腦賣家一般會推薦你選擇插兩根8g的內存條。電腦小白就疑惑了,兩根8g的加起來也是16g,為...
2025.07.02