64位系统下一个32位的程序究竟可以申请到多少内存?

64位系统下一个32位的程序究竟可以申请到多少内存?

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 864位版。

Win 7(X86)下的内存状况:

https://images0.cnblogs.com/blog/39047/201306/19225943-e108edbd484f4b49b6a378344f8ce0e3.png

Win 8(X64)下的内存状况:

https://images0.cnblogs.com/blog/39047/201306/24223747-76e62d8ab9d54b74823ebb594c820382.png

问题:

在满足的看着8G内存全部启用以及体验Win 8 Metro华丽的界面后,脑海里突然飘出一个问题:64位系统下8G内存是否完全能为32位的程序所用。

实验环境:

Windows 7 ultimate(x86)

Windows 8 Professional(X64)

Visual Studio 2010 C++ 编译一个32位程序控制台应用程序,以GB为单位向系统申请内存,以32位方式编译。

主函数代码:

// CPP_MemoryStudy.cpp : Defines the entry point for the console application.

#include "stdafx.h"

 #include <iostream>

 using namespace std;

 

int _tmain(int argc, _TCHAR* argv[])

{

    int a = 5;

    int MEM_SIZE = 0;

    const int GIGABTYE = 1024*1024*1024*sizeof(char); #1GB 内存

    int *p = NULL;

    cout<<"Please input how many GB memoroy you want allocate:"<<endl;

    cin>>MEM_SIZE;

    p = (int *)malloc(GIGABTYE*MEM_SIZE);

    if(NULL == p)

    {

        cout<<"Allocate Memory Error"<<endl;

    }

    else

    {

        cout<<"Succeed Allocate Memory"<<endl;

    }

    getchar();

    getchar();

    return 0;

}

程序界面:

https://images0.cnblogs.com/blog/39047/201306/24203308-19c542c04a9e40d6bca981f8523b479d.png

Win 7下运行(测试申请1GB内存:OK

https://images0.cnblogs.com/blog/39047/201306/24203247-4ecb7e2de1c246d3a617996fe8c77bc8.png

https://images0.cnblogs.com/blog/39047/201306/24203320-e242970322ce4b61a171fa9a1adea4ca.png

Win 8下运行(测试申请1 GB内存:OK

https://images0.cnblogs.com/blog/39047/201306/24220024-1d309e5acefb4f3f8e696249e732fd97.png

https://images0.cnblogs.com/blog/39047/201306/24220031-bd253c1b945a491db007a72b4f621c6e.png

Win 8下运行(单进程测试申请3 GB内存(总内存已 > 4GB):FAIL

https://images0.cnblogs.com/blog/39047/201306/24220627-25640cad0ef548bd8ca26a1aff42ea18.png

https://images0.cnblogs.com/blog/39047/201306/24220706-365ddab064794a6f97fd2d4ef5963341.png

Win 8 下(多32位进程在64位系统下申请内存>4GBOK

https://images0.cnblogs.com/blog/39047/201306/24222523-f63cfba7a3e14e8bbd86d46d53e831b2.png

结论:

  1. 从初步实验结果来看一个32位的程序在64位的环境下不具备使用4GB+内存的能力。
  2. 多个32位程序可以申请超过4GB的内存。

还有一个有趣的现象,当我申请内存大于4GB的时候,有的时候会显示内存显示成功,但是资源管理器里面没有更新,证明本质还是没有成功,是保护的原因还是其他的原因还需要深究,这将作为下一章节的题材。

64位系统对于常年运行32位程序的用户的意义只是有可以运行更多地单个32位程序的能力,32位的程序在64位系统下依然不具有寻址4GB+的能力。

通俗点说,就是扩大仓库的容量,让其可以放下更多货物。

后续研究思路:

  1. 将上述程序在64位环境下重新编译,研究内存使用情况。
  2. Linux Ubuntu 32位系统可以支持8GB内存,我会实验一下单个程序的寻址能力。
  3. 那些号称支持64GB RAM32位服务器系统,如Windows Server等,就竟单个程序可以使用到多少内存。

以上是笔者一些肤浅的理解,尚待更多的研究论证,我会继续跟进这个话题也欢迎您加入这个话题的讨论。

【转载】https://www.cnblogs.com/Leo_wl/p/3154072.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值