-
1 # 子更
-
2 # 極客科技紀元
因為不清楚題主問的是電腦還是手機,那麼本著先來後到的原則,電腦上先出現64位的,我就當時回答電腦的軟體為什麼區分32位和64位了。
32位和64位,首先體現了作業系統上,當你下載作業系統的時候,一般都會有這種提示,X64和X86。X64代表的就是64位的作業系統,X86代表的就是32位的作業系統。
其實是下載軟體的時候也會提示,是32位還是64位的,一般也是用X86和X64來代替的,這都屬於軟體層面的。
軟體服從於硬體,軟體64位的前提是處理器能支援64位,電腦上64位處理器出現了很久了,蘋果公司的A7是歷史上首款64位的手機處理器。
那麼64位到底是什麼?
從程式上說:32位與64位程式,是指經過語言編譯後的可執行檔案,比如 C 語言編寫的程式需要區分 32 位和 64 位。
從系統和硬體上講:CPU一次處理資料的能力是32位還是64位,關係著系統需要安裝32位還是64位的系統。32 位和 64 位中的“位”,也叫字長,是 CPU 通用暫存器的資料寬度,是資料傳遞和處理的基本單位。字長是 CPU 的主要技術指標之一,指的是 CPU 一次能並行處理的二進位制位數,字長總是8的整數倍。
64 位 CPU 是指 CPU 內部的通用暫存器的寬度為 64 位元,支援整數的 64 位元寬度的算術與邏輯運算。那麼 32 位 CPU 同理。一個 CPU,聯絡外部的資料匯流排與地址匯流排,可能有不同的寬度;術語“64位”也常用於描述這些匯流排的大小。不過這一術語也可能指電腦指令集的指令長度,或其它的資料項。去掉進一步的條件,“64位”電腦架構一般具有 64 位寬的整數型暫存器,它可支援 64 位“區塊”的整數型資料。64 位架構無疑可應用在需要處理大量資料的應用程式,如數字影片、科學運算、和早期的大型資料庫。這麼說是不是很複雜?
我們舉一個例子,有一個人同時能處理32件事情,用時1分鐘,而另一個能同時處理64件事情,用時也是1分鐘。那麼在相同的時間下,64位比32位能處理更多的事情,這就是效率的提升。
反應在軟體上就是64位的軟體會比32位速度更快,執行效率更高。
但是64位的環境是比較苛刻的,要求處理器、作業系統、軟體必須全部支援64位,缺了其中任何一個都不行。而且64位是向下相容的,什麼意思呢,64位的處理器支援32位的作業系統,64位的作業系統支援32位的軟體。
總結:
64 位版本的程式佔用的記憶體空間更大,但是更快
64 位 CPU 可以支援更大記憶體,32 位 CPU 只能支援 4G 及以下記憶體
-
3 # 一一哥Sun
作業系統有32位的,也有64位的,基本上從win7之後,都是64位的多了。那麼兩種位數之間有哪些區別呢?區別大致有這麼些吧。
區別一:
當windows 64位作業系統執行起來的時候是要比windows 32位的系統,理論上快2倍,是理論上。從 32位到 64 位架構的改變是一個根本的改變,因為大多數作業系統必須進行全面性修改,以取得新架構的優點。其它軟體也必須進行移植,以使用新的效能;較舊的軟體一般可藉由硬體相容模式(新的處理器支援較舊的 32 位版本指令集)或軟體模擬進行支援。
或者直接在 64 位處理器裡面實作 32 位處理器核心(如同 Intel 的 Itanium 處理器,其內含有 x86 處理器核心,用來執行 32 位 x86 應用程式)。支援 64 位架構的作業系統,一般同時支援 32 位和 64 位的應用程式。
區別二:
說道最實用的一點,windows 32位作業系統最多能夠支援4G記憶體(實際上也就差不多3.15 3.25這個樣子)但是呢,如果你裝了64位的作業系統,4G的記憶體的話,能用的也就是3.7 3.8幾這個樣子,也可以這麼說你的記憶體小於等於4G。
區別三:
windows64位的作業系統,理論上支援的記憶體很大,更多的是取決於你的主機板有多少個插槽。64位作業系統只能安裝在64位電腦上(CPU必須是64位的)。同時需要安裝64位常用軟體以發揮64位(x64)的最佳效能。32位作業系統則可以安裝在32位(32位CPU)或64位(64位CPU)電腦上。
64位作業系統能和32位作業系統並存麼?答案是肯定,大家可以裝雙系統即可解決,但需要注意4G以上記憶體在32位系統上最多隻能識別4GB,因此如果是大記憶體裝機使用者還是首選64位系統吧,畢竟後者也更先進一些。win732位和64位的區別相信大家現在也有了一定的認識了吧。
區別四:
這點就是相容性的問題了,大家應該知道如下圖有兩個資料夾,一個後面有個(x86),X86代表32位,X64代表64位,(X多少代表的是架構的意思,不需要多瞭解)之前32相容性確實要好一些,但如今嘛,直到win8.1,系統發展的很好,相容性都不錯。
區別五:
目前如果自己的電腦配置足夠的話,建議裝一個windows7 64位旗艦版 不能說他是最好的,只能說他是最相容的,至於目前win8/8.1這樣的系統,幾乎不用考慮相容問題!
區別六:
如果現在市場上的CPU全部是64位的平臺開發的,那麼現在的所有軟體都使用不了,因為目前大部分的軟體都是基於32位開發的,目前我們說的64位的 windows7系統也只是在32位系統的基礎上添加了一些64位的定址功能,其實對於我們來說64位的CPU,作業系統意義不大,畢竟我們使用的記憶體大部分還是2G,使用的也是常用軟體,對於運算速度的要求也不大。
-
4 # 肝膽病頻道葉醫生
概括來說,一是電腦的作業系統分32位和64位,現在大多數應用軟體一般都分32位和64位,主要是和作業系統相匹配,32位的作業系統上一般是無法執行64位的軟體的,同樣,64位的作業系統因為相容性問題也無法很好的執行32位軟體。二是電腦CPU也分32位和64位,最理想的情況當然是64位的CPU上裝的是64位的作業系統,並且執行64為的軟體,可實際情況是,現有的電腦大部分還是32位的CPU和32位的作業系統,比如英特爾的i3和i5系列,作業系統比如win7系列,所以32位和64位的軟體還會同時存在一段時間,當然,隨著電腦硬體的發展,作業系統的不斷升級,未來32位的軟體會逐漸被淘汰。希望可以幫到您。
-
5 # TonyDeng
所謂32位和64位,是指標的長度。
計算機程式設計中,指標是用於定址的,是一個整數,32位二進位制的整數,能夠表達2的32次方個(4G)不同的整數,這樣一個整數代表計算機系統內一個地址的話,單個指標最遠可以訪問的地址是4G遠。平常我們說記憶體是4G,即是32位計算機可以訪問的記憶體極限,這裡32位計算機意思是CPU硬體設計的計算能力就到此為止(其實是有辦法突破的,這裡不說)。軟體程式設計,跟作業系統一樣,都使用指標訪問資料,就看它使用的指標是多少位,就說是多少位的軟體。
64位的指標,是2的64次方,理論定址能力是4G的2次方,這個翻倍幅度有多大,算出來比較嚇人,所以目前為止,計算機系統最多也就是64位的,再往上暫時用不到,也就無意義。
軟體到底使用多少位指標來程式設計,其實是由自己需要操作多少資料來決定的,並非越大越好。一個小規模的軟體,用到的資料很少,佔不了多少空間,卻去使用64位計算力,那是浪費資源。指標的長度,可以類比為武器棍棒的長度,理論上越長優勢越大,但揮舞起來也是越耗力的,伸長不錯,不過近身處就是短板,這是顧遠不顧近的武器。指標本身也是佔記憶體的,自己已經佔了64位(8位元組),使用越多數量的指標,這些指標佔用的資源也越多,64位作業系統之所以比32位系統佔用更多的記憶體,就是因為它使用的指標本身就佔去不少空間,並非功能更多。指標跟整數是一回事,如果一個程式使用的整數最大不超過10000(16位資料範圍內),用32位或64位的整數型別來記錄這些資料,就是多餘的。正是因此,現在的64位作業系統,都會提供相容32位的模式,當它載入一個32位軟體的時候,就封裝在一個32位的虛擬環境中執行,實質是模擬32位系統,這個32位軟體就覺得自己執行在32位系統中,只是這樣作業系統可以同時載入、管理若干個不同的32位軟體,它們互不幹擾,比純粹的32位系統更好。
明白了上面所講的,就知道我們編寫軟體,不需要追求更高的位數,通常32位足夠了,這也目前絕大多數軟體都是32位軟體的原因。系統用64位的,軟體卻不需要,除非這個軟體真的需要用到突破4G空間的巨量資料,而且還需要同時載入的記憶體中處理,否則,用32位的可以了。事實上,被稱為地表第一IDE的visual studio開發軟體,也是32位軟體,office官方向使用者推薦的也是32位,不要盲目安裝64位office,反而會出問題。看到這裡,至少會明白一點道理,就是某些軟體宣傳64位優勢的時候,能夠分辨他是吹牛還是真的——跟商家吹CPU頻率和核心數一樣,到底有沒有實際意義,花那個錢值不值。
-
6 # 實用技能站
有以下幾點區別:
一、處理資料的能力不同:
32位和64位表示CPU一次能處理的最大位數,理論上來說,64位系統處理的資料效率比32位更高,相當於 單車道和雙車道開車似得,雙車道單位時間可以有更多的車輛通行。但需要記憶體跟上,而且程式本身也是64位編譯才能發揮64位系統的優勢。
二、支援的記憶體不同:
電腦能在多大的空間裡(記憶體)找到一個軟體的資料被存放在哪裡。32位系統的最大定址空間是2的32次方=4294967296(bit)= 4(GB)左右;而64位系統的最大定址空間為2的64次方=4294967296(bit)的32次方,數值大於1億GB。也就是意味著32位系統最多隻能在4GB記憶體裡找東西,64位系統就最大支援的記憶體高達億位數,不過那也只是理論值而已,實際使用過程中大多數的電腦32位系統最多識別3.5GB記憶體,64位系統最多識別128GB記憶體。
三、軟體相容性區別:
32位系統無法執行64位軟體,64位系統可以相容32位軟體,64位的軟體基本都是可以相容各類32位軟體了,而且64位的病毒都少了很多。64位和32位軟體在64位系統裡區別很大,64位真的快許多。
-
7 # 你看我獨角獸嗎
您的計算機可能正在執行64位版本的Windows。但是看看任務管理器,您會看到系統上的許多應用程式仍是32位的。這有問題嗎?
1.為什麼好多軟體都區分32位和64位?大多數現代計算機(肯定是Windows 7左右以後開始銷售的計算機)都具有64位功能,並附帶64位版本的Windows。如果您不確定自己的PC,可以很容易地檢查您執行的是32位還是64位Windows。Windows的64位版本和32位版本之間有很多區別,如果您的PC和應用程式支援Windows,則您應該執行64位版本。即使您執行的每個應用程式都是32位應用程式,執行64位OS仍將更加安全可靠。
但是事情實際也並不是那麼簡單。首先要知道的是Windows的64位版本可以執行32位應用程式,但是Windows的32位版本不能執行64位軟體。另一個小問題(僅適用於極少數人)是32位版本的Windows可以執行舊的16位應用程式,但那些16位應用程式不能在64位版本的Windows上執行。因此,讓我們進一步研究它,看看什麼時候對您來說很重要。
2.如何檢查您的哪些應用程式仍為32位您可以使用任務管理器檢視哪些程式是64位的,哪些程式是32位的。要開啟它,請右鍵單擊工作列上的任何開啟區域,然後單擊“任務管理器”(或按Ctrl + Shift + Escape)。
在“程序”選項卡上的“名稱”列下檢視。如果您使用的是Windows 8或10的64位版本,則在任何32位應用程式的名稱之後都會看到“(32位)”文字。如果您使用的是Windows 7的64位版本,則會看到文字“ * 32”。在所有版本中,64位應用程式的名稱後都沒有多餘的文字。
Windows還會在不同的地方(或至少嘗試這樣做)安裝32位和64位應用程式。32位應用程式通常安裝在Windows 64位版本上的資料夾中,而64位程式通常安裝在該資料夾中。
但是,這更多是一個準則。沒有強制將32位和64位應用程式放入其各自資料夾的規則。例如,Steam客戶端是32位程式, 預設情況下會正確安裝到該資料夾中。但是,預設情況下,透過Steam安裝的所有遊戲都會安裝到該資料夾中,即使是64位遊戲也是如此。
如果比較兩個不同的Program Files資料夾,則會發現大多數程式可能已安裝到C:\ Program Files(x86)資料夾。它們可能是32位程式。
3.在64位Windows上執行32位應用程式不是一個好主意嗎?從表面上看,在64位環境中執行32位應用程式似乎很糟糕,或者無論如何都不理想。畢竟,32位應用程式沒有充分利用64位體系結構。沒錯 如果可能,執行該應用程式的64位版本可為可能受到攻擊的應用程式提供其他安全功能。與32位應用程式可以訪問的4 GB相比,64位應用程式可以直接訪問更多的記憶體。
儘管如此,這些差異使您幾乎不可能注意到在現實世界中執行常規應用程式。例如,透過執行32位應用程式,您不會受到任何效能損失。在Windows的64位版本中,32位應用程式在Windows 64位(WoW64)相容性層(一個處理執行32位應用程式的完整子系統)的名為Windows 32位的環境下執行。您的32位Windows程式將與在32位版本的Windows上執行的程式大致相同(在某些情況下甚至更好),因此在64位OS上執行這些程式沒有不利之處。
即使您使用的每個程式仍然是32位,您也會從中受益,因為您的作業系統本身正在64位模式下執行。Windows的64位版本更安全。
4.但是64位程式會更好,對嗎?正如我們前面提到的,執行64位版本的應用程式(如果有)是有優勢的。在Windows的64位版本上,每個32位程式只能訪問4 GB的記憶體,而64位程式可以訪問更多的記憶體。如果某個程式可能受到攻擊,則應用於64位程式的其他安全功能將有所幫助。
許多應用程式提供32位和64位版本。Chrome,Photoshop,iTunes和Microsoft Office是一些最受歡迎的Windows程式,並且全部以64位格式提供。要求苛刻的遊戲通常是64位的,因此它們可以使用更多的記憶體。
但是,許多應用程式都沒有實現這一飛躍,而大多數應用程式基本都沒有64位。您仍然可以在當今的64位版本的Windows上執行大多數具有十年曆史的32位Windows程式,即使它們的開發人員自從64位版本的Windows出現以來就沒有對其進行更新。
想要提供其程式的64位版本的開發人員必須做其他工作。他們必須確保現有程式碼可以作為64位軟體編譯並正確執行。他們必須提供並支援該程式的兩個單獨版本,因為執行32位版本的Windows的人們不能使用64位版本。
而且在許多應用程式中,人們根本不會注意到任何區別。讓我們以Evernote的Windows桌面版本為例。即使他們提供了64位版本的Evernote,使用者也可能根本不會注意到差異。32位程式可以在64位版本的Windows上很好地執行,而64位版本沒有明顯的優勢。
5.總結簡而言之,如果您有選擇的話,一定要抓住應用程式的64位版本。如果您別無選擇,請獲取32位版本,也沒什麼關係其實。
最後,重要的是不要確保您執行的是64位應用程式,而是要確保執行的應用程式對您而言效果很好。如果有一個應用程式的64位版本,則一定要使用它。如果不是,則使用32位版本就可以了。對於大多數應用程式,您甚至都不會注意到差異。
-
8 # BWanger軟體開發達人
在回答這個問題前,有必要對中央處理器CPU的相關知識普及一下,很多人嘴上常講16位,32位,64位速度如何如何,但概念上很模糊。在此釐清一下。
1,常說的計算機是多少位的,到底指的什麼?
一般講計算機是8/16/32/64位,是指的資料位,而不是地址位。大多數人理解為地址位,如32位,馬上就會說定址空間為4GB。這是不嚴肅的。照此理論,16位機只有2^16=64K定址空間嗎?事實上,即使最早的16位機,也有20根地址線,定址1MB。
2,處理器CPU與資料位有什麼關係?
一般處理器多少位是指通用暫存器的長度,與資料線位數相同。
再次強調,地址線則不需要與之相等。
好比 intel 64 位處理器則是 40 位地址匯流排,最大支援 1TB 的記憶體定址。
32位宏彙編, 32位CPU有4個32位的通用暫存器EAX、EBX、ECX和EDX。所以,32和64表示CPU一次性可以讀/寫的最大位數,在主頻率等外部條件一樣的情況下,理論上64位的執行速度是32位的兩倍。
3,定址能力決定可支援的最大記憶體。32位的CPU只能定址最大4GB的記憶體,這是因為其地址線也正好是32位。有的廠家做成40位地址線,可支援1TB記憶體。
4,作業系統向下相容。即64的CPU可安裝32位的作業系統win10 for32。當然,對CPU來說,是一種浪費,有一半的效能未發揮出來。
5,在win10 for 64系統上開發的app,都是64位的嗎?非也。它還與整合開發及編繹環境IDE有直接關係。現在大部分app都是32位的,64位app很少。原因是軟體開發滯後。
-
9 # 網路圈
我們日常使用電腦的過程中,難免會去下載安裝一些軟體,本來是很簡單的一件事,但現在同一款軟體在下載頁中會被分為32位和64位版本,如果下錯了版本可能還無法正常安裝和執行軟體。以前下載軟體沒有這種區分,為什麼現在的軟體都有32位和64位之分呢?這兩者有什麼區別呢?
為什麼電腦系統有32位和64位之分?現在主流的作業系統(像Windows、Linux等)其實都是有32位和64位之分的,不過在Windows XP那個年代都是32位的,自Windows 7推出後有了64位版本,對於現代的系統我們都是建議安裝64位的。
電腦系統為什麼要有32位和64位之分呢?
其實,電腦系統之所以有32位和64位之分,是取決於CPU的位數!CPU是整臺電腦的核心,可以理解為“人腦”,CPU按照每次處理資料的能力分為32位和64位。簡單說來,如果CPU是32位的,那隻能安裝32位的作業系統(不支援64位系統),若CPU是64位的那就可以安裝64位系統(也支援32位系統)。
32位系統與64位系統的區別對於同一款系統而言,64位系統相當於是32位系統的升級,兩者雖然功能上一樣,但還是有很多區別的,比如說:
1、可識別記憶體大小不同
32位作業系統理論上只能識別4G記憶體(2的32次方位元組),而64位系統記憶體識別能達到PB/TB級了(但實際上很少有超過128G的記憶體)。
2、64位系統執行速度比32位系統要快
64位的CPU可以執行64位資料指令,而32位CPU只能執行32位資料指令,所以在理論上,64位系統的運算速度比32位要快,當然實際速度取決於很多因素(電腦軟硬體配置及效能)。
3、64位系統上的軟體比32位系統要更“吃記憶體”
同樣一款軟體,64位的執行後比32位的要更佔記憶體一些,所以安裝了64位系統的電腦一定要裝大記憶體。
4、64位系統上可執行32位軟體,但32位系統上難以執行64位軟體
64位系統對32位系統上執行的軟體是做了一定的相容處理的,所以正常情況下在64位系統上可以執行32位軟體,但32位系統上執行64位軟體就會報錯。
綜上,現在電腦普遍用的是64位的CPU和系統,所以我們下載軟體只需要根據電腦系統的位數選擇就行了。
-
10 # 匯聚魔杖
64位軟體和32位軟體最大的區別是:64位的軟體可以同時操作大於4GB的記憶體(注意這裡的記憶體指的是地址空間,而不是物理記憶體)。
比如現在有一個10GB的資料庫需要進行排序。64位的軟體可以動態的分配一個10GB的空間把整個資料庫“放進”記憶體然後使用任意經典排序演算法,而32位的軟體在動態分配時就會崩潰。
所以32位軟體的程式設計師只能使用複雜的演算法顯式的分塊讀入,區域性排序,寫回資料庫,然後重複。這樣不僅程式複雜難寫,程式設計師交換記憶體和檔案的演算法效率可能也不如作業系統自動處理來的高效。另一方面,64位軟體巨大的記憶體空間也可能加速物理記憶體的消耗,增加定址的開銷,因此未必總是能夠提高效能。當然最終系統的效率還是取決於物理記憶體的大小,64位只是解決了地址空間的瓶頸。
32位CPU和64位CPU的區別?32位、64位CPU在指令集合、運算元位數、暫存器名稱和個數等都不相同。
比如一條mov eax,1指令,可能在32位CPU上對應的機器指令是0x1201;在64位機器上就是0x123401。程式對於機器CPU而言,僅僅是一系列順序躺在記憶體中的01程式碼而已,而硬體上直接執行的是作業系統,所以你馬上得出結論:32位的CPU只能執行32位的作業系統,64位同理。
這麼設計的確在理論上沒什麼不妥,實際上intel IA 64架構的處理器就是這樣的,64位的CPU上只能執行64位的作業系統(作業系統本身也是軟體,也是一系列指令序列)。
但這樣問題就來了:我需要升級硬體來提速,難道買了CPU以後,要把上層的作業系統和應用軟體通通換掉?
這種軟硬體不相容帶來的問題就是,沒有多少客戶會去購買這種沒法相容32位原有軟體環境的CPU。所以,後來intel和amd都推出了相容32位原有軟體環境的CPU(intel 的x86&64和amd的amd64)。
也就是說,現在主流的64位CPU,上面可以執行32位和64位的作業系統。
編譯器與程式位數編譯器也是一個應用軟體,64位機器上的64位編譯器編譯出來的也就是64位的應用軟體。但是有沒有例外呢?
那第一個64位的作業系統是怎麼來的?
我們都知道現在作業系統一般是用C語言實現的,然後像普通程式一樣經過編譯器編譯成可執行檔案,難道64位的作業系統不是用64位的編譯器編譯出來的?
很顯然,你的第一個64位的作業系統,需要用“64位”的編譯器來生成,但你的64位的編譯器執行在什麼作業系統上呢?當然,我肯定執行在64位的作業系統之上,那你64位的作業系統從哪裡來呢?死迴圈狀態中。
所以,必然有一種編譯器,本身是32位的軟體,但能夠將程式編譯成64位的可執行檔案,也只有這種情況下,編譯器本身位數和編譯出來程式的位數才不一致。
#include<stdio.h>
int main(){
printf("hello world")
}
一個源程式首先被預處理,尋找標頭檔案,將標頭檔案包括進來,裡面有printf的申明。
然後被編譯成目標檔案,注意目標檔案已經是二進位制檔案了,裡面的符號表中有main、printf等,但是很顯然,這個prinf不是我們自己寫的,我們僅僅有它的申明而已。此時如果我們檢視目標檔案,就會發現目標檔案中的printf函式是extern標記,表示這是一個外部符號,並不是我們定義的。顯然,這時目標檔案是沒法執行的,因為裡面有未知符號沒有解析。目標檔案經過連結,形成可執行目標檔案。因為作業系統提供了已經編譯好的動態連結庫,所以此時我們僅僅經過連結,神奇的hello就能執行了。
這樣,你是不是沒有感覺到你的軟體有32位和64位的區別?你管它叫128位都沒問題。
但是,上述過過程有幾個非常重要的地方:
1)動態連結庫
2)系統API
首先,你32位的作業系統上一般是沒有64位的庫檔案,如果你的應用程式原始碼中引用了只有64位的動態庫中才有的函式,很顯然你連結的時候就會出問題。
另外,我們很多程式肯定用到了read和write等C語言庫函式,而庫函式的實現是依賴於系統API的。如果你工作在windows上,程式大多數是以exe形式釋出的,你得到的程式是目標檔案以後的結果,本身是帶有位數的;如果你工作在linux上,本身大部分軟體包rpm等也是已經編譯好的,就是說,它們本身就是具有“位數”的。如果你得到的是原始碼,那麼基本上你的應用程式還沒有“位數”的概念,你用多少位的編譯器去編譯它,它就是多少位的應用程式。我們這裡討論多少位的程式,都是針對已經編譯到目標檔案以後的狀態。
所以32位和64位軟體的並存是CPU、系統、編譯綜合決定的,而這些都是因為時代的需要。對於Windows系統而言,64位的系統上往往有32位的庫和其他必要的資訊,基本上能相容32位的程式。
回覆列表
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.作業系統位數和軟體位數的關係
這裡,我們首先要弄清一個軟體是如何被執行的。
#include<stdio.h>
int main()
{printf("hello world")}
一個源程式首先被預處理,尋找標頭檔案,將標頭檔案包括進來,裡面有printf的申明。然後被編譯成目標檔案,注意目標檔案已經是二進位制檔案了,裡面的符號表中有main、printf等,
但是很顯然,這個prinf不是我們自己寫的,我們僅僅有它的申明而已。此時如果我們檢視目標檔案,就會發現目標檔案中的printf函式是extern標記,表示這是一個外部符號,並不是我們定義的。很顯然,目標檔案是沒法執行的,因為裡面有未知符號沒有解析。目標檔案經過連結,形成可執行目標檔案。因為作業系統提供了已經編譯好的動態連結庫,所以此時我們僅僅經過連結,神奇的hello就能執行了。這樣,你是不是沒有感覺到你的軟體有32b和64b的區別?你管它叫128b都沒問題。但是,上述過過程有幾個非常重要的地方:
1)動態連結庫
2)系統API首先,你32b的作業系統上一般是沒有64b的庫檔案的.如果你的應用程式原始碼中引用了只有64b的動態庫中才有的函式,很顯然你連結的時候就會出問題。量外,我們很多程式肯定用到了read和write等C語言庫函式,而庫函式的實現是依賴於系統API的。如果你工作在windows上,程式大多數是以exe形式釋出的,你得到的程式是目標檔案以後的結果,本身是帶有位數的;如果你工作在linux上,本身大部分軟體包rpm等也是已經編譯好的,就是說,它們本身就是具有“位數”的。如果你得到的是原始碼,那麼基本上你的應用程式還沒有“位數”的概念,你用多少位的編譯器去編譯它,它就是多少位的應用程式。我們這裡討論多少位的程式,都是針對已經編譯到目標檔案以後的狀態。
4.回到最初的問題:
64位的系統上是否能執行32b的應用程式?
32b的系統上是否能執行64位的應用程式?
1)對於win系統而言,64b的系統上往往有32b的庫和其他必要的資訊,基本上能相容32b的程式。想想,如果不能相容,那麼作業系統肯定比應用軟體先出來——畢竟軟體是在作業系統上開發的,這樣作業系統出來之後,上面32b的軟體都不能運行了?顯然不是這樣的。也就是說,64b的系統上可以執行32b的程式。
2,32b的系統,一般情況下是沒有64b的庫的,也沒有相關係統api,一般情況下,32b的系統上沒法執行64b的應用程式。