64 位軟體和 32 位有什麼具體區別?

2021-08-08 04:01:03 字數 2680 閱讀 4571

64bit軟體和32bit軟體最大的區別是64bit的軟體可以同時操作大於4gb的記憶體。注意這裡的記憶體指的是位址空間,而不是物理記憶體。比如現在有乙個10gb的資料庫需要進行排序。64bit的軟體可以malloc乙個10gb的空間把整個資料庫「放進」記憶體然後使用任意經典排序演算法,而32bit的軟體在malloc時就會崩潰(out-of-memory)。所以32位軟體的程式設計師只能使用複雜的演算法顯式的分塊讀入,區域性排序,寫回資料庫,然後重複。這樣不僅程式複雜難寫,程式設計師swap記憶體和檔案的演算法效率可能也不如os自動處理來的高效。另一方面,64bit軟體巨大的記憶體空間也可能加速物理記憶體的消耗,增加定址的開銷,因此未必總是能夠提高效能。

當然最終系統的效率還是取決於物理記憶體的大小,64bit只是解決了位址空間的瓶頸。

1.32bcpu和64bcpu的區別?

首先二者的指令集合、運算元位數、暫存器名稱和個數等等都不相同;

比如一條mov eax,1指令,可能在32bcpu上對應的機器指令是0x1201;在64位機器上就是0x123401。程式對於機器cpu而言,僅僅是一系列順序躺在記憶體中的01**而已,而硬體上直接執行的是作業系統,所以你馬上得出結論:32b的cpu只能執行32b的作業系統,64位亦然。

這麼設計的確在理論上沒什麼不妥,實際上intel ia 64架構的處理器就是這樣的,64b的cpu上只能執行64b的作業系統(作業系統本身也是軟體,也是一系列指令序列)。

但這樣問題就來了:我需要公升級硬體來提速,難道買了cpu以後,要把上層的作業系統和應用軟體通通換掉?坑碟呢?這種軟硬體不相容帶來的問題就是,沒有多少客戶會去購買這種沒法相容32b原有軟體環境的cpu。所以,後來intel和amd都推出了相容32b原有軟體環境的cpu——intel 的x86——64和amd的amd64.

也就是說,現在主流的64b處理器,上面可以執行32b和64b的作業系統。

2.編譯器與程式位數?

通常情況下,編譯器也僅僅是乙個應用軟體而已,64b機器上的64b編譯器編譯出來的也就是64b的應用軟體。但是有沒有例外呢?

想一想:第乙個64的作業系統是怎麼來的?

我們都知道現在作業系統一般是用c語言實現的,然後像普通程式一樣經過編譯器編譯成可執行檔案,難道64b的作業系統不是用64b的編譯器編譯出來的?

很顯然,你的第乙個64b的作業系統,需要用「64b」的編譯器來生成,但你的64b的編譯器執行在什麼作業系統上呢?當然,我肯定執行在64b的作業系統之上,那你64b的作業系統從**來呢。。。。。。。。。。。。。。是不是覺得陷入迴圈了!!!!

所以,必然有一種編譯器,本身是32b的軟體,但是能夠將程式編譯成64b的可執行檔案,也就是作業系統。也只有這種情況下,編譯器本身位數和編譯出來程式的位數才不一致。

3.作業系統位數和軟體位數的關係

這裡,我們首先要弄清乙個軟體是如何被執行的。

我們以c檔案為例,討論我們經典的hello word程式:

#include

int main()

乙個源程式首先被預處理,尋找標頭檔案,將標頭檔案包括進來,裡面有printf的申明。

然後被編譯成目標檔案,注意目標檔案已經是二進位制檔案了,裡面的符號表中有main、printf等,但是很顯然,這個prinf不是我們自己寫的,我們僅僅有它的申明而已。此時如果我們檢視目標檔案,就會發現目標檔案中的printf函式是extern標記,表示這是乙個外部符號,並不是我們定義的。

很顯然,目標檔案是沒法執行的,因為裡面有未知符號沒有解析。

目標檔案經過鏈結,形成可執行目標檔案。因為作業系統提供了已經編譯好的動態鏈結庫,所以此時我們僅僅經過鏈結,神奇的hello就能執行了。

這樣,你是不是沒有感覺到你的軟體有32b和64b的區別?你管它叫128b都沒問題。

但是,上述過過程有幾個非常重要的地方:

1)動態鏈結庫

2)系統api量外,我們很多程式肯定用到了read和write等c語言庫函式,而庫函式的實現是依賴於系統api的。

如果你工作在windows上,程式大多數是以exe形式發布的,你得到的程式是目標檔案以後的結果,本身是帶有位數的;如果你工作在linux上,本身大部分軟體包rpm等也是已經編譯好的,就是說,它們本身就是具有「位數」的。如果你得到的是原始碼,那麼基本上你的應用程式還沒有「位數」的概念,你用多少位的編譯器去編譯它,它就是多少位的應用程式。我們這裡討論多少位的程式,都是針對已經編譯到目標檔案以後的狀態。

4.回到最初的問題:

1)64位的系統上是否能執行32b的應用程式?

2)32b的系統上是否能執行64位的應用程式?

1)對於win系統而言,64b的系統上往往有32b的庫和其他必要的資訊,基本上能相容32b的程式。想想,如果不能相容,那麼作業系統肯定比應用軟體先出來——畢竟軟體是在作業系統上開發的,這樣作業系統出來之後,上面32b的軟體都不能執行了?

顯然不是這樣的。也就是說,64b的系統上可以執行32b的程式。

2)32b的系統,一般情況下是沒有64b的庫的,也沒有相關系統api,

一般情況下,32b的系統上沒法執行64b的應用程式。

32位系統和64位區別

第一,設計初衷不同。64位作業系統的設計初衷是 滿足機械設計和分析 三維動畫 32位作業系統是為普通使用者設計的。第二,要求配置不同。64位作業系統只能安裝在64位電腦上 cpu必須是64位的 同時需要安裝64位常用軟體以發揮64位 x64 的最佳效能。32位作業系統則可以安裝在32位 32位cpu...

32位與64位區別

機器為什麼要分為32位和64位?作業系統為什麼分為32位和64位?程式設計上32位和64位有什麼差異?一 機器與作業系統32位,64位。32位和64位指的是機器字長 cpu同時處理的資料的最大長度。一台電腦機器是由cpu,記憶體,io裝置,匯流排組成,電腦機器是64位指各部件都支援64位。實際當中c...

32位和64位的理解

大家都知道現在流行的作業系統是32位和64位的,都知道32位作業系統能 認出 4g以內的記憶體而64位的 可以認出多記憶體 2的64次方byte 簡稱大b,還有一種是小b,1個byte由8個bit組成 但是為什麼會64位的能認到的記憶體就多呢?先看一下概念 32位和64位 cpu一次處理資料的能力是...