天天操夜夜爱_天天插天天操天天干_黄色av地址_成人黄色在线观看_国内久久久久久_欧美国产日韩一区二区三区_国产精品久久久久久久久晋中

一個電腦裝兩個內存條嗎

發布時間: 2023-04-15 23:10 閱讀: 文章來源:轉載

關于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寄存器,總線,內存。

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和int64的含義

這個我們平時寫代碼接觸得最多,比較好理解了。int32也就是用4個字節,32位的內存去存儲數據,int64也就是用8個字節,64位去存數據。這個數值就是剛剛CPU運行流程中放在內存里的數據。

那么問題又來了。

32位的CPU能進行int64位的數值計算嗎?

先說結論,。但比起64位的CPU,性能會慢一些。

如果說我用的是64位的CPU,那么我在計算兩個int64的數值相加時,我就能將數據通過64位的總線,一次性存入到64位的寄存器,并在進行計算后返回到內存中。整個過程一步到位,一氣呵成。

但如果我現在用的是32位的CPU,那就憋屈一點了,我雖然在代碼里放了個int64的數值,但實際上CPU的寄存器根本放不下這么大的數據,因此最簡單的方法是,將int64的數值,拆成前后兩半,現在兩個int64相加,就變成了4個int32的數值相加,并且后半部分加好了之后,拿到進位,才能去計算前面的部分,這里光是執行的指令數就比64位的CPU要多。所以理論上,會更慢些。

系統位數會限制內存嗎?

上面提到了CPU位數,系統位數,軟件位數,以及數值位數之間的區別與聯系。

現在,我們回到標題里提到的問題。

32位CPU和系統插8g內存條,能用嗎?

系統能正常工作,但一般用不到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內存,那也沒毛病。

64位CPU裝32位操作系統,再插上8g的內存條,尋址能力還是4G嗎

上面提到32位CPU就算插上8G內存條,尋址能力也還是4G,那如果說我現在換用64位的CPU,但裝了個32位的操作系統,這時候插入8G內存條,尋址能力能超過4G嗎?

尋址能力,除了受到cpu的限制外,還受到操作系統的限制,如果操作系統就是按著32位的指令和尋址范圍(4G)來編譯的話,那么它就會缺少64位系統該有的指令,它在運行軟件的時候就不能做到超過這個限制,因此尋址能力還會是4G。

最后留下一個問題吧。

上面提到,我們平時寫的代碼(也就是C,go,java這些),先轉成匯編,再轉成機器碼。最后CPU執行的是機器碼,那么問題來了。

為什么我們平時寫的代碼不直接轉成機器碼,而要先轉成匯編,這是不是多此一舉?

總結

  • CPU位數主要指的是寄存器的位寬,
  • 32位CPU只能裝32位的系統和軟件,且能計算int64,int32的數值。內存尋址范圍是4G。
  • 64位CPU,同時兼容32位和64位的系統和軟件,并且進行int64數值計算的時候,性能比32位CPU更好,內存尋址范圍可以達到256T。
  • 32位CPU和操作系統,插入8G的內存,會有點浪費,因為總線尋址范圍比較有限,它只能用上4G不到的內存。
  • 64位CPU,如果裝上32位的操作系統,就算插上8G的內存,效果也還是只能用上4G不到的內存。

最后

剛工作的時候一直覺得int32,有21個億,這么大的數值肯定夠用了吧,結果現實好幾次打臉。

以前做游戲的時候,血量一開始是定義為int32,游戲設定是可以通過充錢,提升角色的屬性,還能提升血量上限,誰也沒想到,老板們通過氪金,硬是把血量給打到了int32最大值。于是策劃提了個一句話需求:"血量要支持到int64大小",這是我見過最簡單的策劃案,但也讓人加班加的最兇。

那是我第一次感受到了鈔能力。

這篇文章老早就想寫了,但涉及的知識點有點多,一直很頭疼,怎么樣才能用最簡單的方式把他們表述清楚,于是想著從大家最熟悉的場景開始說起。希望能給大家帶來價值。

如果文章對你有幫助,歡迎.....

算了。

別說了,一起在知識的海洋里嗆水吧

???展開全文
相關文章
主站蜘蛛池模板: 日本高清在线一区 | 日本1区2区| 欧美无删减 | 人人澡 人人澡碰人人看软件 | 女人成午夜大片7777在线 | 国产成人高清在线 | 在线观看日韩视频 | 老司机午夜性大片免费 | 国产旗袍丝袜在线观看视频 | 亚洲国产午夜 | 天天操人人爱 | 欧美123首页 | 久久精品一区二区三区中文字幕 | 人碰人操 | 欧美视频在线网站 | 久久精品国产精品亚洲蜜月 | 国产亚洲一区二区精品 | 两个人www视频在线观看 | 人人澡人人人人夜夜爽 | 免费看一级a一片毛片 | 国产高清精品在线 | 亚洲日本中文字幕天天更新 | 人人插人人舔 | 欧美日韩高清不卡免费观看 | 中文字幕色在线 | 国产精品人人做人人爽人人添 | 99精品国产第一福利网站 | 国产成人精品福利色多多 | 日本xxxx在线视频免费 | 99精品视频在线 | 久久人人视频 | 日本经典在线三级视频 | 日本www高清| 欧美xxxx做受欧美精品 | 欧美 日韩 国产在线 | 女人被免费看在线看 | 就操在线 | www.亚洲视频.com | 欧美大成色www永久网站 | 国产一级特黄高清免费大片dvd | 九草在线播放 |