博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
编写Linux C++程序如何影响VIRT(虚存)和RES(实存/常驻内存)
阅读量:6583 次
发布时间:2019-06-24

本文共 2905 字,大约阅读时间需要 9 分钟。

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

 

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

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

查阅资料后,归纳一下。

VIRT:

1、进程“需要的”虚拟内存大小,包括进程使用的库、代码、数据,以及malloc、new分配的堆空间和分配的栈空间等;

2、假如进程新申请10MB的内存,但实际只使用了1MB,那么它会增长10MB,而不是实际的1MB使用量。

3、VIRT = SWAP + RES

RES:

1、进程当前使用的内存大小,包括使用中的malloc、new分配的堆空间和分配的栈空间,但不包括swap out量;

2、包含其他进程的共享;

3、如果申请10MB的内存,实际使用1MB,它只增长1MB,与VIRT相反;

4、关于库占用内存的情况,它只统计加载的库文件所占内存大小。

5、RES = CODE + DATA

SHR:

1、除了自身进程的共享内存,也包括其他进程的共享内存;

2、虽然进程只使用了几个共享库的函数,但它包含了整个共享库的大小;

3、计算某个进程所占的物理内存大小公式:RES – SHR;

4、swap out后,它将会降下来。

SWAP:

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

测试如下:

一)

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

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中,并不在内容中真实的分配物理内存。

二)

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

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出来的空间被使用后,会真实分配物理内存。

三)

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

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出来的空间,如果只使用部分,则只分配部分物理内存。

四)

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

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中)。

五)

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

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都会包含。

六)

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

第一个循环时:

  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的情况。

你可能感兴趣的文章
java调用jacob组件实现word转pdf,HTML等出现的问题
查看>>
django 在python 3中提示 无法找到 MySQLDB
查看>>
相关系数
查看>>
pl/sql development 查询的数据复制到excel
查看>>
自定义指令的参数
查看>>
python实现进度条
查看>>
MySQL之事件学习整理
查看>>
Android 一个应用启动另一个应用的说明
查看>>
阿里云CentOS7服务器利用LVM分区挂载磁盘全记录
查看>>
计蒜客一维坐标的移动
查看>>
Visual SVN的安装
查看>>
AIX日常维护
查看>>
CISCO 命令
查看>>
Excel02-快速无误输入多个零
查看>>
花椒映客感觉要开打了,又是因为抄袭的事儿
查看>>
SQL Server 2012笔记分享-15:连接到Windows Azure SQL
查看>>
Javascript语法易出错方面总结
查看>>
Ossim4系统故障处理
查看>>
如何通过预加载器提升网页加载速度
查看>>
抬杠APP获Donews“年度最佳运营创意”大奖,跨界营销引瞩目
查看>>