转载目的,主要是为了理解lVIRT虚拟内存、RES常驻内存、共享内存SHR、SWAP和实际程序应用如何对应的。

在Linux命令行中执行top命令,可以查询到所有进程使用的VIRT虚拟内存、RES常驻内存和共享内存SHR。

那么,什么是VIRT虚拟内存、RES常驻内存和共享内存SHR?我们编写的Linux C++程序如何影响它们呢?

查阅资料后,归纳一下。

VIRT:

RES:

SHR:

SWAP:

      只有当物理内存耗尽时才会使用到,linux的swap原则是尽量使用物理内存。

测试如下:

一)

  1. #include <iostream>
  2. int main()
  3. {
  4. char * p = new char [1024*1024*512];
  5. getchar();
  6. return 0;
  7. }

top结果如下:

PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND

401 huyiyang  17   0  523m  916  792 S  0.0  0.0   0:00.00 ./main

VIRT包含了new出来的512MB空间,但是RES不包含该空间。即刚new出来的空间,如果没有使用,会放入SWAP中,并不在内容中真实的分配物理内存。

二)

  1. #include <iostream>
  2. int main()
  3. {
  4. char * p = new char [1024*1024*512];
  5. memset(p, 0, 1024*1024*512);
  6. getchar();
  7. return 0;
  8. }

top结果如下:

PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+ 
COMMAND

32604 huyiyang  17   0  523m 512m  792 S  0.0 26.2   0:00.33 ./main

VIRT包含new出来的512MB空间,RES包含目前使用的memset的512M空间。即new出来的空间被使用后,会真实分配物理内存。

三)

  1. #include <iostream>
  2. int main()
  3. {
  4. char * p = new char [1024*1024*512];
  5. memset(p + 1024*1024*128, 0, 1024*1024*128);
  6. getchar();
  7. return 0;
  8. }

top结果如下:
PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
456 huyiyang  17   0  523m 128m  792 S  0.0  6.6   0:00.07 ./main

VIRT包含new出来的512MB空间,RES包含目前使用的memset的128M空间。即new出来的空间,如果只使用部分,则只分配部分物理内存。

四)

  1. #include <iostream>
  2. int main()
  3. {
  4. char p[1024*1024*10];
  5. getchar();
  6. return 0;
  7. }

top结果如下:
PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND

544 huyiyang  17   0 21568  884  760 S  0.0  0.0   0:00.00 ./main

没有使用的栈空间,VIRT会包含(没有使用的栈空间会在SWAP中)。

五)

  1. #include <iostream>
  2. int main()
  3. {
  4. char p[1024*1024*10];
  5. memset(p, 0, 1024*1024*10);
  6. getchar();
  7. return 0;
  8. }

top结果如下:

PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND

561 huyiyang  17   0 21568  10m  760 S  0.0  0.6   0:00.00 ./main

已经使用的栈空间,VIRT和RES都会包含。

六)

  1. #include <iostream>
  2. int main()
  3. {
  4. char ** pp = new char * [1024];
  5. for(int i=0;i<1024;i++)
  6. {
  7. pp[i] = new char [1024*1024*512];
  8. memset(pp[i], 0, 1024*1024*512);
  9. printf("p%d\n", i);
  10. getchar();
  11. }
  12. return 0;
  13. }

第一个循环时:

PID USER       PR  NI  VIRT    RES   SHR S %CPU %MEM    TIME+  SWAP COMMAND

3627 huyiyang  18   0  523m 512m  836   S       0.0        26.2    0:00.34  10m ./main

第二个循环时:

PID USER       PR  NI  VIRT    RES   SHR S %CPU %MEM    TIME+  SWAP COMMAND

3627 huyiyang  18   0 1035m 1.0g  836    S     0.0      52.4      0:00.69  10m     ./main

第三个循环时:

PID   USER      PR  NI  VIRT   RES  SHR S %CPU %MEM    TIME+  SWAP
COMMAND                                                                                                       
 
 3627 huyiyang  18   0 1547m 1.5g    836 S     0.0       78.5   0:01.03    10m     ./main

在我的服务器上,当执行到第四个循环时,并且有其他程序占用较大内存的情况下,top结果如下:

PID USER       PR  NI  VIRT    RES   SHR S %CPU %MEM    TIME+  SWAP COMMAND

3427 huyiyang  16   0 2059m 711m  836 S  0.0        36.4       0:01.45 1.3g     ./main

出现了swap out的情况。

04-20 12:32