前言:
- 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