1. 程式人生 > >64位系統下,一個32位的程式究竟可以申請到多少記憶體,4GB還是更多?

64位系統下,一個32位的程式究竟可以申請到多少記憶體,4GB還是更多?

前言:

  • cpu的位是指一次性可處理的資料量是多少,1位元組=8位,32位處理器可以一次性處理4個位元組的資料量,依次類推。32位作業系統針對的32位的CPU設計。64位作業系統針對的64位的CPU設計。作業系統只是硬體和應用軟體中間的一個平臺。我們的CPU從原來的8位,16位,到現在的32位和64位。

背景:

電腦的記憶體是8GB, 裝的是32位的Win 7 32位版本,系統認出的記憶體是3.5GB, 應該說是4GB,因為還有0.5GB記憶體分配給了視訊記憶體。

筆者十分痛苦,花重金購置的駭客神條單條8GB竟然被瞬間閹割了4GB。為了物盡其用以及嚐鮮系統,又在另外一個分割槽上安裝了Win 8的64位版

  • Win 7(X86)下的記憶體狀況:

  

  • Win 8(X64)下的記憶體狀況:

      

問題:

在滿足的看著8G記憶體全部啟用以及體驗Win 8 Metro華麗的介面後,腦海裡突然飄出一個問題:64位系統下8G記憶體是否完全能為32位的程式所用。

實驗環境:

  • Windows 7 ultimate(x86)
  • Windows 8 Professional(X64)
  • Visual Studio 2010 C++ 編譯一個32位程式控制臺應用程式
    • 以GB為單位向系統申請記憶體
    • 以32位方式編譯
  • 主函式程式碼:
    •  1 // CPP_MemoryStudy.cpp : Defines the entry point for the console application.
      2 // 3 4 #include "stdafx.h" 5 #include <iostream> 6 using namespace std; 7 8 int _tmain(int argc, _TCHAR* argv[]) 9 {10 int a = 5;11 int MEM_SIZE = 0;12 const int GIGABTYE = 1024*1024*1024*sizeof(char); #1GB 記憶體13 int *p = NULL;14 cout<<"Please input how many GB memoroy you want allocate:
      "<<endl;15 cin>>MEM_SIZE;16 p = (int *)malloc(GIGABTYE*MEM_SIZE);17 if(NULL == p)18 {19 cout<<"Allocate Memory Error"<<endl;20 }21 else22 {23 cout<<"Succeed Allocate Memory"<<endl;24 }25 getchar();26 getchar();27 return 0;28 }
  • 程式介面
  • Win 7下執行(測試申請1GB記憶體 OK
  • Win 8下執行(測試申請1 GB記憶體 OK
    •    
  • Win 8下執行(單程序測試申請3 GB記憶體(總記憶體已 > 4GB) FAIL
    •    
  •  Win 8 下(多32位程序在64位系統下申請記憶體>4GB OK)-- 這個點子是在和好友討論的時候想到的,測試了一下竟然可以

結論:

  • 從初步實驗結果來看一個32位的程式在64位的環境下不具備使用4GB+記憶體的能力。
  • 多個32位程式可以申請超過4GB的記憶體,
  • 還有一個有趣的現象,當我申請記憶體大於4GB的時候,有的時候會顯示記憶體顯示成功,但是資源管理器裡面沒有更新,證明本質還是沒有成功,是保護的原因還是其他的原因還需要深究,這將作為下一章節的題材。
  • 64位系統對於常年執行32位程式的使用者的意義只是有可以執行更多地單個32位程式的能力,32位的程式在64位系統下依然不具有定址4GB+的能力
    • 通俗點說,就是擴大倉庫的容量,讓其可以放下更多貨物

後續研究思路:

  • 將上述程式在64位環境下重新編譯,研究記憶體使用情況
  • 那些號稱支援64GB RAM的32位伺服器系統,如Windows Server等,就竟單個程式可以使用到多少記憶體

以上是筆者一些膚淺的理解,尚待更多的研究論證,我會繼續跟進這個話題也歡迎您加入這個話題的討論。