虚拟内存与实际内存
虚拟内存指的是,程序向操作系统所申请的内存空间,这个空间不一定会使用,这个空间也可以比服务器实际可提供内存空间大。
实际内存是程序所申请的内存页与物理内存中的物理页进行一一映射的内存空间,这个空间永远不会比物理内存大。
C语言内存空间分配函malloc()数简介.
调用形式:
(类型说明符*)malloc(size)
功能:在内存的动态存储区中分配一块长度为“size”字节的连续区域。函数的返回值为该区域的首地址。
说明:
(1)“类型说明符”表示把该区域用于何种数据类型。
(2)(类型说明符*)表示把返回值强制转换为该类型指针。
(3)“size”是一个无符号数。
例如:
pc=(char*)malloc(100);
表示分配100个字节的内存空间,并强制转换为字符数组类型,函数的返回值为指向该字符数组的指针,把该指针赋予指针变量pc。
编程实现虚拟内存分配
#include <malloc.h> /*malloc()函数所在的头文件*/
#include <unistd.h> /*sleep()所在的头文件*/
int main(int argc, char const *argv[])
{
int *p;
p=(int *)malloc(8000000000); /*此处分配8G内存空间*/
sleep(90);
return 0;
}
编译运行此程序并查看此进程内存占用情况
[zyq@zyq ~]$ ps aux | grep a.out
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
zyq 19931 0.0 0.0 7816672 348 pts/2 S+ 15:46 0:00 ./a.out
zyq 19935 0.0 0.0 9044 664 pts/0 S+ 15:46 0:00 grep --color=auto a.out
ps 命令中的VSZ代表虚拟内存,单位为KiB
VSZ virtual memory size of the process in KiB (1024-byte units). Device mappings are currently excluded; this is subject to change. (alias vsize).
malloc(1000) 代表分配1000Bytes
所以malloc(size)函数中的 size/1024=VSZ (近似相等)
通过maps文件进一步验证
[zyq@zyq tmp]$ ps aux | grep a.out
zyq 20452 0.0 0.0 7816668 348 pts/2 S+ 15:05 0:00 ./a.out
zyq 20462 0.0 0.0 9044 660 pts/0 S+ 15:05 0:00 grep --color=auto a.out
[zyq@zyq tmp]$ cat /proc/20452/maps
00400000-00401000 r-xp 00000000 fd:00 68615735 /tmp/a.out
00600000-00601000 r--p 00000000 fd:00 68615735 /tmp/a.out
00601000-00602000 rw-p 00001000 fd:00 68615735 /tmp/a.out
7ff1fb83c000-7ff3d85a2000 rw-p 00000000 00:00 0
7ff3d85a2000-7ff3d875a000 r-xp 00000000 fd:00 33754686 /usr/lib64/libc-2.17.so
7ff3d875a000-7ff3d895a000 ---p 001b8000 fd:00 33754686 /usr/lib64/libc-2.17.so
7ff3d895a000-7ff3d895e000 r--p 001b8000 fd:00 33754686 /usr/lib64/libc-2.17.so
7ff3d895e000-7ff3d8960000 rw-p 001bc000 fd:00 33754686 /usr/lib64/libc-2.17.so
7ff3d8960000-7ff3d8965000 rw-p 00000000 00:00 0
7ff3d8965000-7ff3d8986000 r-xp 00000000 fd:00 33754679 /usr/lib64/ld-2.17.so
7ff3d8b68000-7ff3d8b6b000 rw-p 00000000 00:00 0
7ff3d8b85000-7ff3d8b86000 rw-p 00000000 00:00 0
7ff3d8b86000-7ff3d8b87000 r--p 00021000 fd:00 33754679 /usr/lib64/ld-2.17.so
7ff3d8b87000-7ff3d8b88000 rw-p 00022000 fd:00 33754679 /usr/lib64/ld-2.17.so
7ff3d8b88000-7ff3d8b89000 rw-p 00000000 00:00 0
7ffd51c3f000-7ffd51c60000 rw-p 00000000 00:00 0 [stack]
7ffd51d4c000-7ffd51d4e000 r-xp 00000000 00:00 0 [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
如上图7ff1fb83c000-7ff3d85a2000 rw-p 00000000 00:00 0 所示,其实这一行是虚拟内存中的heap段,malloc()函数所申请的内存都在heap段中, 计算本进程中这个段的大小
7ff3d85a2000-7ff1fb83c000=1DCD66000(换算成十进制为8000004096约等于malloc(8000000000))
结论
通过实验可以发现程序申请了8000000000Bytes/1024=7.812500GiB的虚拟地址空间,和展示的7816672 基本吻合,剩余的部分(7.816672-7.812500)是进程加载别的内容所申请的内存空间。