Windows下使用大地址空间

现在讨论一个虚拟地址空间不足的问题。
问题的提出:
    用C/C++写一个程序,要求处理一个非常大的矢量,100M以上个元素。数据处理过程中,还需要用到同样大小的中间结果。
    假设矢量是大小为100M,类型为单精度浮点型(float 4字节),总共需要400MB空间。一个输入矢量,一个输出矢量,以及若干个中间矢量。
    在计算前,通常用new float[1024*1024]来位数组申请空间。对于一个应用程序来说,有4GB的地址空间可用,但实际上连续这样400MB的数组,大约申请3个,就会出现内存不够的错误(严格说不是内存不够,而是虚拟地址空间不够)。程序代码所占空间很小,几百KB,用GlobalMemoryStatusEx()查看,还用1G多用。为什么回内存不够?
    由于内存碎片,连续空间不够。因为在Win32中,4GB的上端2GB归系统所用,一个应用程序实际上可用的只有2GB。而且连接器自动生成的应用程序通常并不占用连续的一个地址空间,而是断断续续的几片,在使用DLL时情况更严重。MFC做的程序,刚启动,虚拟空间中最大的连续空间大约800MB。用new(包括其它空间分配函数,如malloc等)分配的空间,在虚拟地址上必须是连续的。如何解决这个问题。
    有3个思路:
   1、微软的AWE技术。微软对使用大内存的应用程序提供一个方案,在物理内存中申请一些页面,然后在虚拟地址空间中映射一个窗口(窗口可以很小),来对物理内存进行操作。由于这个方案限制了必须使用物理内存。在32位系统中,物理内存最大不能超过4G(通常是2G~3G),用户空间也有2G,如果出现空间不够而是使用AWE,有效的使用最多只有2G(理论上可以用所有的空闲物理页面,但是物理页面占用太多,应用程序的那2G必然要到交换文件中去,效率大大下降),这还不考虑系统和其它应用程序占用的物理页。所以不会带来质的改善。
    2、模拟页交换。这是我所采用的解决方案,以后将详细叙述。这个方案可以解决单个连续空间不大,但是数量很多而不够用的问题,例如要申请20个200MB的空间。
    3、粒度更细的页面交换,需要硬件参与。可以实现每个数据块4GB的地址空间。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值