在 4GB 物理内存的机器上,申请 8G 内存会怎么样?.doc
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
"在 4GB 物理内存的机器上,申请 8G 内存会怎么样?" 在讨论这个问题之前,我们需要了解操作系统的虚拟内存机制。操作系统虚拟内存大小是有限的,32 位操作系统的虚拟地址空间大小为 4GB,而 64 位操作系统的虚拟地址空间大小为 128TB。应用程序通过 malloc 函数申请内存的时候,实际上申请的是虚拟内存,而不是物理内存。当应用程序读写了这块虚拟内存,CPU 就会去访问这个虚拟内存,如果发现这个虚拟内存没有映射到物理内存,CPU 就会产生缺页中断,进程会从用户态切换到内核态,并将缺页中断交给内核的 Page Fault Handler 处理。 缺页中断处理函数会看是否有空闲的物理内存,如果有,就直接分配物理内存,并建立虚拟内存与物理内存之间的映射关系。如果没有空闲的物理内存,那么内核就会开始进行回收内存的工作,如果回收内存工作结束后,空闲的物理内存仍然无法满足此次物理内存的申请,那么内核就会放最后的大招了触发 OOM 机制。 现在我们可以回答这个问题了:在 32 位操作系统、4GB 物理内存的机器上,申请 8GB 内存,会怎么样?因为 32 位操作系统,进程最多只能申请 3GB 大小的虚拟内存空间,所以进程申请 8GB 内存的话,在申请虚拟内存阶段就会失败。 在 64 位操作系统、4GB 物理内存的机器上,申请 8G 内存,会怎么样?64 位操作系统,进程可以使用 128TB 大小的虚拟内存空间,所以进程申请 8GB 内存是没问题的,因为进程申请内存是申请虚拟内存,只要不读写这个虚拟内存,操作系统就不会分配物理内存。 我们可以简单做个测试,我的服务器是 64 位操作系统,但是物理内存只有 2GB:现在,我在机器上,连续申请 4 次 1GB 内存,也就是一共申请了 4GB 内存,注意下面代码只是单纯分配了虚拟内存,并没有使用该虚拟内存: #include <stdio.h> #include <stdlib.h> #include <string.h> #define MEM_SIZE 1024*1024*1024 int main(){ char* addr[4]; int i=0; for(i=0; i<4; i++){ addr[i] = (char*)malloc(MEM_SIZE); } return 0; } 然后运行这个代码,可以看到,我的物理内存虽然只有 2GB,但是程序正常分配了 4GB 大小的虚拟内存: 我们可以通过下面这条命令查看进程(test)的虚拟内存大小: #ps aux | grep test USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 7797 0.0 0.04 3985403 312 pts/1 S+ 16:58 0:00 ./test 其中,VSZ 就代表进程使用的虚拟内存大小,RSS 代表进程使用的物理内存大小。可以看到,VSZ 大小为 4198540,也就是 4GB 的虚拟内存。 Swap 机制的作用是当系统的物理内存不够用的时候,将物理内存中的一部分空间释放出来,以便让系统继续运行。如果没有开启 Swap 机制,程序就会直接 OOM;如果有开启 Swap 机制,程序可以正常运行。Swap 机制可以将一部分物理内存交换到硬盘上,以释放出物理内存来供其他程序使用。 在讨论这个问题时,我们需要考虑三个前置条件:操作系统是 32 位的,还是 64 位的?申请完 8G 内存后会不会被使用?操作系统有没有使用 Swap 机制?只有考虑了这些前置条件,我们才能正确地回答这个问题。
剩余10页未读,继续阅读
- 粉丝: 1
- 资源: 2837
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助