C++内存管理1-64位系统运行32位软件会占用更多的内存吗?
随着大容量内存成为电脑平台常规化的配置,在配置组装机时很多的用户都会选择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位软件会占用更多的内存吗?的更多相关文章
- 64位系统运行32位Oracle程序解决方案
Attempt to load Oracle client libraries threw BadImageFormatException. This problem will occur when ...
- 64位Ubuntu运行32位程序时报文件不存在(No such file or Directory)的一种解决办法
尝试在64位Ubuntu下面运行32位程序时, 一直说 文件不存在(No such file or directory), 我只想说++. 你tm说个文件格式不正确不就好了? 非得说个文件不存在! 真 ...
- 64位win8.1系统 运行 32位程序,文件夹路径是中文遇到问题
今天有一位用户向我反应软件使用遇到问题. 用户使用的是64位win8.1系统,之前有很多用户使用64位的win8.1系统没遇到过问题. 远程协助了一下,差不多15分钟我试了几个办法没解决问题. 最后我 ...
- ubuntu 12.04 LTS 64位兼容运行32位程序
安装完Goagent,运行的时候出现了问题,在网络上翻看一些关于ubuntu的文档时,突然记起自己安装的是64位版,而goagent应该是32位的,于是通过sudo apt-get install i ...
- 64位系统上32位进程拷贝文件到System32目录时的重定向
64位系统上,32位进程拷贝文件到"System32"目录时,会被文件系统重定向到"SysWOW64"目录 要禁用这种重定向,需要用到下面2个API: Wow6 ...
- 如何在ubuntu14.04(64位)编译运行32位程序
sudo -i cd /etc/apt/sources.list.d echo "deb http://archive.ubuntu.com/ubuntu/ raring main rest ...
- <linux系统c语言生成.so文件,生成64位可执行文件,在64位系统中运行32位的可执行文件>
1.linux 系统c语言生成.o文件,---->gcc -m64 -c -fPIC test.c -o test.o2.linux 系统c语言生成.so文件,----->gcc -sha ...
- 64位系统上运行32位程序能否申请到8G内存?
申请不到,因为64为系统在运行32位程序的时候只是为了向下兼容而已,对于32位程序来讲,申请8G的存储空间没有任何意义,因为32位的程序最大寻址空间只有4G,32位程序在编译之后的机器代码也只有32位 ...
- 你必须了解的java内存管理机制(一)-运行时数据区
前言 本打算花一篇文章来聊聊JVM内存管理机制,结果发现越扯越多,于是分了四遍文章(文章讲解JVM以Hotspot虚拟机为例,jdk版本为1.8),本文为其中第一篇.from 你必须了解的java内存 ...
随机推荐
- kuangbin专题专题四 Silver Cow Party POJ - 3268
题目链接:https://vjudge.net/problem/POJ-3268 题意:点X处开办排队,其他点的牛到X点去参加派对,然后从X点回到各自的点,通路是单向的,所有牛都要走最短路, 求出所有 ...
- commix 命令注入工具
关于系统命令注入,可以参考这篇文章:命令攻击介绍 系统命令注入场景 在对企业进行安全测试时候,很少会发现系统注入漏洞.这是因为大部分情况下代码业务主要是数据操作.文件操作.逻辑处理和api接口调用等, ...
- npm install 和 npm ci 的主要区别
npm install 和 npm ci 的主要区别: 该项目必须有一个 package-lock.json 或 npm-shrinkwrap.json. 如果 package-lock.json 中 ...
- 【大数据】虚拟机-Ubuntu环境
目标 1.宿主机器能相互访问 2.虚拟机能访问互联网 方法 1.VMWare--编辑---虚拟网络编辑器,选择宿主机上网网卡 2.虚拟机设置-网络适配器 3.宿主机网络设置查看 4.Ubuntu网络设 ...
- Squeeze Excitation Module 对网络的改进分析
Squeeze-and-Excitation Networks SE-net 来自于Momenta 孙刚团队 SE的设计思路: 从卷积操作的实际作用来考虑,conv 把局部空间信息和通道信息组合起来, ...
- maven 查看依赖树结构命令mvn dependency:tree
使用maven 管理项目的依赖,可以使用如下命令查看依赖树结构: mvn dependency:tree 如下图是使用idea的终端执行命令的局部图: 也可以使用如下命令将输出定向到某个文件,这样就可 ...
- docker 服务无法启动
重装以后仍然不行,dockerd可以运行,但是systemctl start docker.service不行,后来在编辑一个文件时,提示没有空间可以保存,结果一查,发现服务器空间基本占满了, 通过 ...
- Docker 更改容器映射端口
1.编辑容器的配置文件进行更改端口: docker run 运行启动时 -p 可以指定容器启动映射端口 ( ) 可以编辑配置文件 进行修改:(需要重启docker 服务 不止是是容器 才能生效.只能重 ...
- CCF 201812-3 CIDR合并
CCF 201812-3 CIDR合并 //100分 93ms #include<stdio.h>//CCF上stdio.h比cstdio快!!! #include<string.h ...
- 解决mysql无法显示中文/MySQL中文乱码问号等问题
一般都是编码格式问题 显示编码格式: show variables like'character_set_%'; 将其中Value不是utf8的改为utf8: set character_set_cl ...