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等,就竟單個程序可以使用到多少內存

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

 

再分享一下我老師大神的人工智能教程吧。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智能的隊伍中來!https://www.cnblogs.com/captainbed


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM