鱼C论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 155|回复: 9

win系统分配给进程的虚拟地址不够用怎么办?

[复制链接]
最佳答案
0 
发表于 2019-10-7 13:16:29 | 显示全部楼层 |阅读模式
10鱼币
本帖最后由 夜昙 于 2019-10-7 17:05 编辑

32位系统给每个进程分配4G的虚拟地址,如果程序很大,4G的虚拟地址都不够分配给进程,怎么办?再开辟4G的虚拟地址?那指针怎么索引?

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
0 
发表于 2019-10-7 17:40:16 | 显示全部楼层
我觉得最简单的方法就是创建一个子进程,父进程和子进程使用进程间通讯交换数据,这样父进程就相当于多了一份地址空间可以使用了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
3 
发表于 2019-10-9 14:53:32 | 显示全部楼层
如果您的物理内存是4G内存,建议将总内存加至8-16G。
Win7810的方法:
右击计算机或这台电脑选属性/选择左面的高级系统设置/性能中的设置/高级/虚拟内存选项选择更改/自动管理取消勾选/点选自定义大小/在初始大小和最大值上添上数值,看下面,添好后按设置选项,在按确定就可以了,当然也可以不用设置,我就是这样的,不要去掉自动管理所有驱动器的分页大小选项前面的勾,如果没有进行勾选按确定就可以了。
一般设置与您的内存大小是有关系的:
建议将初始大小和最大值同时设置为你物理内存的1-2倍,比如2G设置为4096MB(2G内存是2倍),3G设置为4608MB(3G内存是1.5倍),4G内存先设置为4096MB(4G的1倍不够在加),6-8G内存或更大就选则自动管理就是了,如果你的物理内存是2G,建议升级一下你的物理内存(初始大小和最大值设置要一致)。
如果6-8G或更大的话,您一定要设置,最大值最大是物理内存是1倍,或少设置一点,初始大小设置半倍,因为物理内存越大,虚拟内存就没必要设置太大了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
0 
 楼主| 发表于 2019-10-9 23:12:24 | 显示全部楼层
tianzhiya 发表于 2019-10-7 17:40
我觉得最简单的方法就是创建一个子进程,父进程和子进程使用进程间通讯交换数据,这样父进程就相当于多了一 ...

有可能
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
0 
 楼主| 发表于 2019-10-9 23:12:57 | 显示全部楼层
lh1996 发表于 2019-10-9 14:53
如果您的物理内存是4G内存,建议将总内存加至8-16G。
Win7810的方法:
右击计算机或这台电脑选属性/选择 ...

虚拟内存和虚拟地址不是一个概念
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
581 
发表于 2019-10-11 22:06:08 | 显示全部楼层
程序要使用内存,就会调用内存申请函数,例如C语言的malloc函数,C++的new关键字
如果已经没有内存地址空间可以分配了,那么这类内存申请函数会失败,返回NULL或者抛异常,表示没有内存可用了
举个例子,你是64位系统,安装了16GB内存,一个32位的程序一直申请内存,当把4GB内存地址空间用完后这类内存申请函数会失败,这样就强制这个程序只能使用4GB地址空间

当然,4GB内存空间是操作系统和应用程序共用的,操作系统好像是占用1GB,应用程序只能使用3GB内存空间,用完了3GB内存空间就没得用了,因为内存申请函数会失败,程序不会有更多的内存地址可用

如果程序很大,4G的虚拟地址都不够分配给进程,怎么办?
这取决于这个程序,一个程序想用内存,唯一的办法就是调用内存申请函数,如果内存申请函数失败了,那么这个程序该怎么做?
1.直接调用exit类函数退出
2.释放一部分内存,然后重新申请内存,这样还是使用4GB内存地址空间

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
581 
发表于 2019-10-11 22:22:08 | 显示全部楼层
如果程序很大,4G的虚拟地址都不够分配给进程,怎么办?

程序很大是什么意思?一个5GB的exe文件?
那我认为操作系统根本就不会去加载这个文件,直接报错
以上是我猜的,没有亲自测试过,也没有什么官方文档参考
不过我认为我的猜测是正确的

还有就是,链接器真的能链接出一个5GB的32位exe文件吗?应该不能吧?(我指的5GB是全部要分配地址空间的那部分,你说你有一个5GB的exe文件,调试信息占4GB,只有1GB分配有内存地址空间,我认为这样的程序可以运行,起码从理论上可行)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
581 
发表于 2019-10-11 22:23:52 | 显示全部楼层
如果程序很大,4G的虚拟地址都不够分配给进程,怎么办?

要么这个程序根本就不能运行,要么在4GB的临界点程序因为没有内存可用而出错,或者自愿退出
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
0 
发表于 前天 23:33 | 显示全部楼层
我觉得你这个问题没有意义,首先,32位操作系统不可能加载一个超过3G的32位可执行文件,这是系统运行机制的限制,其次,32位系统的最大寻址空间只有4G,也就是说32位操作系统内部维护的虚拟地址表只有4G的地址,但应用程序实际可用的只有3G,如果32位进程申请超过3G的内存,操作系统会直接杀死这个进程,或者直接崩溃或者抛出异常,还有,链接器是不可能链接出超过4G的32位应用程序的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
638 
发表于 昨天 02:02 | 显示全部楼层
本帖最后由 jackz007 于 2019-10-18 02:07 编辑

       楼上各位都是纸上谈兵啊,各种不可能,不过,我本人孤陋寡闻,也坚定地支持这一观点。但不知楼主为何有此一问,莫非亲见过有这样的实例,给大家解释一下呗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

小甲鱼强烈推荐上一条 /1 下一条

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号

GMT+8, 2019-10-19 07:35

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表