前言:

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位方式编译
  • 主函数代码:
    •  // 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 = ;
      int MEM_SIZE = ;
      const int GIGABTYE = ***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 ;
      }
  • 程序界面

  • 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位环境下重新编译,研究内存使用情况
  • Linux Ubuntu 32位系统可以支持8GB内存,我会实验一下单个程序的寻址能力。
  • 那些号称支持64GB RAM的32位服务器系统,如Windows Server等,就竟单个程序可以使用到多少内存

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

64位系统下,一个32位的程序究竟可以申请到多少内存,4GB还是更多?(一)的更多相关文章

  1. 64位系统下注册32位dll文件

    64位系统下注册32位dll文件 在64位系统里注册32位软件所需的一些dll会提示不兼容,大概因为32 位进程不能加载64位Dll,64位进程也不可以加载32的导致. 若要支持的32 位和64 位C ...

  2. 64位系统下注册32位dll、ax文件

    64位系统下注册32位dll.ax文件. 换了64位系统遇到的新问题,目前常用的影音处理软件多数为32位. 注册这些32的滤镜会提示不兼容,大概因为32 位进程不能加载64位Dll,64位进程也不可以 ...

  3. WinDbg 在64位系统下转储32位进程

    在64位系统下,首先要判断进程是32位,还是64位 在Win8之前,进程名后带星号(*)则是32位进程.但Win8.1后,则不显示星号.需要选出“平台”列,来确认32位,还是64位. 在64位系统下的 ...

  4. pyinstaller在64位系统下打包32位程序

    使用环境说明:win10 64位,已安装python3.6-64位版本 遇到的问题:win10 64位打包成exe文件后,不能在32位系统运行 需求:使用python打包生成exe文件,win64位和 ...

  5. 64位操作系统下调用32位com的问题

    Hello Guys! I am trying to create a simple VBS script to automatically open some .tif images from a ...

  6. PL/SQL Developer 在windows7 64位系统下连Oaracle11g64位系统的解决经验

    PL/SQL Developer 在windows7 64位系统下连Oaracle11g64位系统的解决经验 一.问题现象及解决方法 现象: 1.PL/SQL 无法登录64位数据库 2.在PL/SQL ...

  7. Windows 8 64位系统 在VS2010 32位软件上 搭建 PCL点云库 开发环境

    Windows 8 64位系统 在VS2010 32位软件上 搭建 PCL点云库 开发环境 下载PCL For windows 软件包 到这个网站下载PCL-All-In-One Installer: ...

  8. 64位系统上运行32位程序能否申请到8G内存?

    申请不到,因为64为系统在运行32位程序的时候只是为了向下兼容而已,对于32位程序来讲,申请8G的存储空间没有任何意义,因为32位的程序最大寻址空间只有4G,32位程序在编译之后的机器代码也只有32位 ...

  9. 64位系统VBS调用32位COM组件

    64位系统VBS调用32位COM组件 标签: 32位, 64位, COM, COM组件, VB, VBS, VBScript 标题: 64位系统VBS调用32位COM组件作者: Demon链接: ht ...

  10. <linux系统c语言生成.so文件,生成64位可执行文件,在64位系统中运行32位的可执行文件>

    1.linux 系统c语言生成.o文件,---->gcc -m64 -c -fPIC test.c -o test.o2.linux 系统c语言生成.so文件,----->gcc -sha ...

随机推荐

  1. 关于mysql存储过程创建动态表名及參数处理

      转载请注明出处:帘卷西风的专栏(http://blog.csdn.net/ljxfblog)  近期游戏開始第二次内測,開始处理操作日志.最開始把日志放到同一个表里面,发现一天时间,平均100玩家 ...

  2. RocketMq通信协议格式及编解码 (源码分析)

    一.RocketMq broker服务器与客户端的网络通信是基于netty4.x实现的,重点分析  RocketMq设计的通信协议及对应的编解码 开发.         名字解释           ...

  3. 流媒体播放mime类型添加

    .m3u8 application/x-mpegURL.ts video/MP2T

  4. HipHop PHP简介(转)

    HipHop PHP是FaceBook的一个开源项目,它优化了FaceBook网站Web服务器的运行速度. HipHop 是一个源代码转换器.它将 PHP 代码转换为高度优化的 C++ 代码,然后再使 ...

  5. phpexcel表的一些设置

    $objPHPExcel = new PHPExcel(); $objPHPExcel->setActiveSheetIndex(0); //set default styles$objPHPE ...

  6. linux c++ 文件获取md5

    当前在linux系统下,shell命令可以获取md5值,如下: 如果进行c++编程,在代码里执行shell命令可以获得,但是很不雅观,特别是了解了system或者popen函数的机制之后.现在介绍使用 ...

  7. ufldl学习笔记与编程作业:Multi-Layer Neural Network(多层神经网络+识别手写体编程)

    ufldl学习笔记与编程作业:Multi-Layer Neural Network(多层神经网络+识别手写体编程) ufldl出了新教程,感觉比之前的好,从基础讲起,系统清晰,又有编程实践. 在dee ...

  8. win 7 下vim的使用

    1.gVim74.exe ftp://ftp.vim.org/pub/vim/pc/gvim74.exe 2.vimcdoc-1.9.0-setup.exe 中文说明文档 http://211.147 ...

  9. JVM虚拟机(二):堆、栈、方法区概念区别

    Java 堆 Java堆是和Java应用程序关系最密切的内存空间,几乎所有的对象都放在其中,并且Java堆完全是自动化管理,通过垃圾收集机制,垃圾对象会自动清理,不需自己去释放. 根据垃圾回收机制的不 ...

  10. Atitit.判断汉字的编码 regedit 注册表里面的reg_sz

    Atitit.判断汉字的编码 regedit 注册表里面的reg_sz 1. 可以判断出是unicode编码1 2. 有下面分割ucs2 大头小偷编码1 3. 使用小偷编码测试1 4. 注册表里面的r ...