关于32位机器只支持4g内存的疑问

power0811 2011-08-03 04:37:49
如果32位操作系统只支持最大4g内存的话 我要是给32位机器配 8g内存的话 然后我自己写一个c程序 在malloc() 3g内存的话 是操作系统给我分配在它支持的4g内存以内的空闲内存还是说 我可以申请4g以上 把操作系统用不上的另外4g内存用上呢 如果我配置16g内存 是不是可以自己malloc() 12g内存给我的程序用呢 依次类推 是不是内存越大越好 包括linux和windwos操作系统
请各位指教 多谢
...全文
737 19 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
xwxxww 2011-08-03
  • 打赏
  • 举报
回复
还有应用程序中使用的地址 叫做 逻辑地址(4G的寻址能力),是指相对于段选择基地址的偏移地址,
而虚拟地址 是48位(64T的寻址能力),
虚拟地址经过分段系统转换成32为的线性地址,
线性地址直接是物理地址(分页机制没有开启), 或者线性地址经分页机制转换为物理地址。
大于4G的内存 只是使有更多的物理地址可以供分页机制使用。
luciferisnotsatan 2011-08-03
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 power0811 的回复:]

那是否可以这样理解 如果我malloc 4g以上内存比如malloc 8g, 操作系统会去调用虚拟内存 肯定不会调用剩余的物理内存呢? 如果我的物理内存是16G 且是双通道的话
[/Quote]
如果你开10个进程,每个malloc 1G,那么你可以用10G物理内存(开启PAE)。
但单个进程里,windows 2G用户态模式,一次malloc个1.8G都不行。windows的系统dll通常都加载到0x7开头处。而程序本身的起始位置是0x00400000
至善者善之敌 2011-08-03
  • 打赏
  • 举报
回复
重说纷纭,还是找权威点的资料看看!
power0811 2011-08-03
  • 打赏
  • 举报
回复
多谢各位达人 呵呵
xwxxww 2011-08-03
  • 打赏
  • 举报
回复
因为32位机的地址总线是32条,所以寻址能力只有 2**32 == 4G,因此不能给用户程序申请大于4G的内存。

即使现在大多数机器有36条地址总线,寻址能力达到了 2**4 * 2**32 == 64G。但是PAE技术对应用程序是不可见,因此最多还是只能使用4G内存。而扩展的内存只能使虚拟地址映射到更多的物理地址上。
13号大王 2011-08-03
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 power0811 的回复:]

那是否可以这样理解 如果我malloc 4g以上内存比如malloc 8g, 操作系统会去调用虚拟内存 肯定不会调用剩余的物理内存呢? 如果我的物理内存是16G 且是双通道的话
[/Quote]

另外,对于应用程序来说,它分不出来物理内存和虚拟内存,都以为是一样的。
这种划分是os的工作,对app来说是透明的。
13号大王 2011-08-03
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 power0811 的回复:]

那是否可以这样理解 如果我malloc 4g以上内存比如malloc 8g, 操作系统会去调用虚拟内存 肯定不会调用剩余的物理内存呢? 如果我的物理内存是16G 且是双通道的话
[/Quote]


单个32位程序的最大可用空间就是4g。
物理内存+虚拟内存 <= 4g
power0811 2011-08-03
  • 打赏
  • 举报
回复
那是否可以这样理解 如果我malloc 4g以上内存比如malloc 8g, 操作系统会去调用虚拟内存 肯定不会调用剩余的物理内存呢? 如果我的物理内存是16G 且是双通道的话
nightkids_008 2011-08-03
  • 打赏
  • 举报
回复
CPU限制你的。。。。
玩笑 2011-08-03
  • 打赏
  • 举报
回复
有2G内存限制,你申请不到那么大的内存,至于32位支持4G内存的问题,还是学学硬件和操作系统实现之类的吧
wjjjuniniho 2011-08-03
  • 打赏
  • 举报
回复
32位操作系统cpu中的地址寄存器就是32位的,最多也就到0~~2^32-1也就是0~(4G-1)的寻址空间,你再怎么malloc也只是代码级别的分配,到底分不分配成功得硬件资源和操作系统说的算

你malloc之后可以判断一下指针是不是空,是空的话说明分配失败的
yin138 2011-08-03
  • 打赏
  • 举报
回复
skyworth98的解释非常正确,一个程序的最大空间是不会超过4G的,而系统要占去一大半。
这里与语言并没有多大关系,因为所有语言最终动态分配函数都会映射到windows上的虚拟内存管理API。
13号大王 2011-08-03
  • 打赏
  • 举报
回复
32位环境下,理论上不可以使用超过4g以外的内存空间。
BUT,你能见到的32位处理器,如P3,P4,基本都有PAE功能,能够寻址4g以外的物理内存。
(CORE i3,5,7不在此列,他们本身就是64位cpu,同时兼容32位)

同事,很多操作系统支持PAE技术。(这就解释了为什么32位的高端windows server系统能够支持超过4g内存)

然而,对于单个32位应用程序,操作系统分配给他的空间最多还是4g,
这是因为每个32位应用程序的“虚拟地址”仍然为32位寻址。

lz可以参考:
http://zh.wikipedia.org/wiki/PAE

skyworth98 2011-08-03
  • 打赏
  • 举报
回复
IA32系统默认支持4G内存,打开PAE之后,最大支持32G内存,实际最大支持物理内存大小受芯片组限制.
对单个程序而言,能用到的内存,不会超过4GB.也就是说,对单个程序来说,即使打开PAE支持,单个程序也无法利用4G以上的物理内存.
Troiph 2011-08-03
  • 打赏
  • 举报
回复
2^32=4G,大于4G CPU已经没有地址分配给它了。。就像IPV4将要被IPV6代替一样
luciferisnotsatan 2011-08-03
  • 打赏
  • 举报
回复
每个进程都有自己的虚拟内存地址空间,32位系统,指针也就是32位,范围从0x00000000~0xffffffff,4G。指针怎么指向4G以外的地址呢??
luciferisnotsatan 2011-08-03
  • 打赏
  • 举报
回复
32为系统,寻址只能4G。分配不了4G以上内存。
而且,高地址是留给内核的(2G或1G)。起始处还有一些不能用的。代码也得占内存。
power0811 2011-08-03
  • 打赏
  • 举报
回复
为什么呢 是操作系统限制了么 无法用到4g以外的其他内存了么 还是说c语言本身限制了呢 其实也不一定要c语言 其他语言也行 只是举个例子 我就想知道 32位机配更大内存的话 到底是有没有用
麻烦说的详细些 多谢 呵呵
luciferisnotsatan 2011-08-03
  • 打赏
  • 举报
回复
其实,你能用的也就1.5G左右

70,023

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧