前言:

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等,就竟单个程序可以使用到多少内存

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

最新文章

  1. JAVA数据类型,变量,转换,常量,运算符
  2. .sh脚本判断判断某一变量是否为某一数值
  3. pause 和 title
  4. Java Collections Source Code Series 1 --- 简介
  5. Android 通过ViewFlipper实现广告轮播功能并可以通过手势滑动进行广告切换
  6. 关于读style元素定义样式表兼容性
  7. OO Unit 1 表达式求导
  8. 解决jsp表达式不能解析的问题
  9. C# 一个数组未赋值引发的错误
  10. 堆排序(大顶堆、小顶堆)----C语言
  11. Cordova - 解决升级NDK之后无法编译!
  12. POJ2528:Mayor&#39;s posters(线段树区间更新+离散化)
  13. NSArray利用Cocoa框架进行汉字排序
  14. SAS中的宏语言
  15. sign-up 签约注册
  16. C#中 ACCESS数据库常用操作语句...容易出错的地方(DateTime类型)
  17. 10、OpenCV Python 图像二值化
  18. MySQL-python install
  19. 问题:C# List;结果:C#中数组、ArrayList和List三者的区别
  20. Oracle数据库导入、导出(远程、10g、11g)

热门文章

  1. $(document).ready()方法和window.onload()方法
  2. Android 事件分发
  3. 【转】linux性能相关的命令和概念
  4. proxyTable 解决跨域问题
  5. java基础-java语言中的keyword总结
  6. mongodb的基本语法(二)
  7. mongodb安装的两条命令
  8. 整站下载工具Teleport Pro
  9. Solr 缓存配置
  10. 【原创】打造基于Dapper的数据访问层