随着大容量内存成为电脑平台常规化的配置,在配置组装机时很多的用户都会选择8GB甚至是16GB的容量规格内存使用在自己的机器上,如果要将这8GB甚至是16GB的内容在系统使用时能充分利用起来的话,你平台必须使用64位的操作系统作为支持。

  但值得注意的是虽然64位系统已经在近几年成为主流,但不少的软件或者不少的用户在使用电脑时运行的软件仍为32位版本,这引发了一个有趣的问题。你需要更多或更少的内存来让32位应用程序运行在64位版本的Windows?并且还有一个传言是说“在64位系统运行32位应用程序所耗费的内存相比32位系统运行32位应用程序要高出1.5倍的需求”

  最近国外媒体就针对这一情况通过测试来验证是否在64位系统运行32位应用程序所耗费的内存相比32位系统运行32位应用程序要高这一选题是否真的成立。

  首先我们要了解一下在64位系统里面32位程序是怎样执行的?在一个64位系统里面当不采用任何兼容支持辅助是无法让32位程序实现运行的,毕竟32位程序对比64位程序在系统指针、数据类型以及系统调用指令,是不同的。

  所以我们首先要知道什么32位程序进程在64位系统上起到作用。

  

  注意:在64位操作系统上,Windows使用了WoW64子系统,它有效地实现一个32位Windows的x64系统仿真器和基于Itanium(IA64)系统仿真器

  IA64系统是一个由处理器指令和不同的内存页面大小(x86和x64为4K,IA64为8K)组成,由于x64处理器具有x86处理器的所有的指令且使用相同的存储器页大小。在这两种情况下,提供了WoW64 64位的Windows内核32位版本的ntdll.dll之间的通信界面,以便他们可以通过Windows内核提供的原生64位功能处理。

  (ntdll是WindowNT操作系统原型中的库)(即,通过WoW64子系统,可以为32位程序提供64位系统相应的工程处理

下图是:32bit 的程序在64位操作系统中所依赖的模块,其中都是从系统文件SysWOW64中提供的相应的32bit的库dll

  用于x64和IA64系统实现需求三个DLL文件,分别为wow64cpu.dll, wow64win.dll, and wow64.dll。他们的功能是在Win32k.sys中提供了Windows功能和部分包含执行、内核、内存管理、进程调度程序和其他的操作系统核心要素

  一个thunk是一个子程序,它允许一个程序在系统中执行一个共同的子程序或函数。在这种情况下,它提取从32位程序调用堆栈的参数,将它们转换成它们的64位同行,并使得64位系统调用。在从调用返回时,将64位的结果返回给32位转换并推到程序的调用堆栈调用者使用。

  

 此外还要需要注意其他一些重要的差异

  IA64系统使用两个附加文件:IA32exec.bin是x86软件模拟器Wowia32x.dll提供了WoW64与软件模拟器之间的接口

  一个32位程序的过程中会加载这些文件,而在64位版本的ntdll.dll中都是可以被加载到另外一个DLL,apisetschema.dll,而在Windows 7和更高版本的32位进程,这将被加载到所有进程中唯一的64位二进制文件。

  当一个32位程序开始,它将加载wow64.dll依次加载ntdll.dll 32位版本和%SystemRoot% \ Syswow64任何必要的32位DLL。这些文件大多数是在32位系统中的相同的二进制文件,但是在WOW64有些已被重写修改。

  测试的方式通过虚拟机运行两组Windows 7旗舰版本,分别为64位系统和32位系统各一个并且使用相同的完全安装以及系统补丁安装,每个系统分配2GB的内存。禁用双方的交换文件以获得更好的画面内存 确保内存无法调出到磁盘的使用情况。

  通过Sysinternals Process Explore来收集系统运行时工作集以及WindowSystem的使用状况,这些工作组数字反映了程序所使用的内存数量。它更复杂的是即使它们已被另一个进程加载也能通过其反映出共享库所使用的内存量。测试监测以LibreOffice程序soffice.exe,soffice.bin在运行时需要在所有的三个过程中寻找有效的内存使用量的所有程序。而测试方式是开启计算器、打开一个3、7MB的.xls文件和一个3.9MB的.PPTX文件时所占用的内存使用状况。

  经过一系列的对比是对比32位系统与64位系统在内存占用差异上不超过9.9%,而在一些同类型的测试中也获得了相类似的测试结果,甚至64位系统的最终使用比32位系统的内存更少。所以,64位版本的Windows的需要比他们的32位运行更多的RAM运行32位应用程序时?一般情况下,是的。但是,你需要升级内存?可能不会,而且运行需求并没有1.5倍的使用差异。

endl;

C++内存管理1-64位系统运行32位软件会占用更多的内存吗?的更多相关文章

  1. 64位系统运行32位Oracle程序解决方案

    Attempt to load Oracle client libraries threw BadImageFormatException. This problem will occur when ...

  2. 64位Ubuntu运行32位程序时报文件不存在(No such file or Directory)的一种解决办法

    尝试在64位Ubuntu下面运行32位程序时, 一直说 文件不存在(No such file or directory), 我只想说++. 你tm说个文件格式不正确不就好了? 非得说个文件不存在! 真 ...

  3. 64位win8.1系统 运行 32位程序,文件夹路径是中文遇到问题

    今天有一位用户向我反应软件使用遇到问题. 用户使用的是64位win8.1系统,之前有很多用户使用64位的win8.1系统没遇到过问题. 远程协助了一下,差不多15分钟我试了几个办法没解决问题. 最后我 ...

  4. ubuntu 12.04 LTS 64位兼容运行32位程序

    安装完Goagent,运行的时候出现了问题,在网络上翻看一些关于ubuntu的文档时,突然记起自己安装的是64位版,而goagent应该是32位的,于是通过sudo apt-get install i ...

  5. 64位系统上32位进程拷贝文件到System32目录时的重定向

    64位系统上,32位进程拷贝文件到"System32"目录时,会被文件系统重定向到"SysWOW64"目录 要禁用这种重定向,需要用到下面2个API: Wow6 ...

  6. 如何在ubuntu14.04(64位)编译运行32位程序

    sudo -i cd /etc/apt/sources.list.d echo "deb http://archive.ubuntu.com/ubuntu/ raring main rest ...

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

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

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

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

  9. 你必须了解的java内存管理机制(一)-运行时数据区

    前言 本打算花一篇文章来聊聊JVM内存管理机制,结果发现越扯越多,于是分了四遍文章(文章讲解JVM以Hotspot虚拟机为例,jdk版本为1.8),本文为其中第一篇.from 你必须了解的java内存 ...

随机推荐

  1. The Preliminary Contest for ICPC Asia Nanjing 2019 H. Holy Grail

    题目链接:https://nanti.jisuanke.com/t/41305 题目说的很明白...只需要反向跑spfa然后输入-dis,然后添-dis的一条边就好了... #include < ...

  2. 编程题:SaturdayNightStay

    "输入2019年的一个时间段,开始时间代表出发,结束时间代表在那一天返回,判断在该时间段内,如果旅行有多少个子时间段可以在周六晚上休息" * 周六晚上休息,即子时间段必须包含周六, ...

  3. python 验证码识别示例(三) 简单验证码识别

    今天介绍一个简单验证的识别. 主要是标准的格式,没有扭曲和变现.就用 pytesseract 去识别一下. 验证码地址:https://user.www.gov.cn/sso/verifyimg_ed ...

  4. css 宽高等比

    1.利用js 2.容器里添加图片,让图片的等比缩放撑大容器,图片z-index=负数,

  5. ansible部署EFK

    修改自己不确定的配置文件前,先准备备份,防患于未然!!! Environment:{ 目前测试准备三台2m2g虚拟机  详情概略图见EFK的架构图 https://www.cnblogs.com/se ...

  6. sqlg rdbms 上实现的Apache TinkerPop

    sqlg 可以让关系型数据库支持Apache TinkerPop,当前支持的数据库有postgresql,hsqldb,h2,mariadb,mysql,mssqlserver 以下是一个简单的使用 ...

  7. 6.学习springmvc的文件上传

    一.文件上传前提与原理分析 1.文件上传必要前提: 2.文件上传原理分析: 3.需要引入的jar包: 二.传统方式文件上传程序 1.pom.xml <dependency> <gro ...

  8. send 和recv小结

    不论是客户还是服务器应用程序都用send函数来向TCP连接的另一端发送数据. 不论是客户还是服务器应用程序都用recv函数从TCP连接的另一端接收数据. #include <sys/socket ...

  9. nginx 配置ssl

    单向SSL配置实例: server{ listen ssl; server_name www..com; root /data/wwwroot/www..com/ ; index index.html ...

  10. shell 查找字符串中字符出现的位置

    #!/bin/bash a="The cat sat on the mat" test="cat" awk -v a="$a" -v b=& ...