转载目的,主要是为了理解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原则是尽量使用物理内存。

测试如下:

一)

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

编写Linux C++程序如何影响VIRT(虚存)和RES(实存/常驻内存)的更多相关文章

  1. Linux多线程实践(10) --使用 C++11 编写 Linux 多线程程序

    在这个多核时代,如何充分利用每个 CPU 内核是一个绕不开的话题,从需要为成千上万的用户同时提供服务的服务端应用程序,到需要同时打开十几个页面,每个页面都有几十上百个链接的 web 浏览器应用程序,从 ...

  2. 使用C++编写linux多线程程序

    前言 在这个多核时代,如何充分利用每个 CPU 内核是一个绕不开的话题,从需要为成千上万的用户同时提供服务的服务端应用程序,到需要同时打开十几个页面,每个页面都有几十上百个链接的 web 浏览器应用程 ...

  3. [转]使用 C++11 编写 Linux 多线程程序

    前言 在这个多核时代,如何充分利用每个 CPU 内核是一个绕不开的话题,从需要为成千上万的用户同时提供服务的服务端应用程序,到需要同时打开十几个页面,每个页面都有几十上百个链接的 web 浏览器应用程 ...

  4. linux top命令看到的实存(RES)与虚存(VIRT)分析

    近期在公司中解决程序使用的内存高问题,将一部分之前无法回收的内存进行了回收,实现降内存效果(降实存). 在统计效果时, QA问是统计RES(实存)还是VIRT(虚存). 在网上学习看了一些博客,这里自 ...

  5. 为 Linux 应用程序编写 DLL[转]

    自:http://www.ibm.com/developerworks/cn/linux/sdk/dll/index.html 在仅仅只会编写插件的时候为什么要编写整个应用程序? 插件和 DLL 通常 ...

  6. 闲来瞎扯 -- 在vs2008下编写linux程序

    虽说vim很强大,但是个人感觉器代码提示功能不如visual assist来的强大.如何使用visual assist来实现代码的提示功能呢? 首先说明我的环境 : 宿主机是xp(O(∩_∩)O~还是 ...

  7. 使用VS2017 编写Linux系统上的Opencv程序

    背景 之前写图像算法的程序都是在window10下使用VS编写,VS这个IDE结合“ImageWatch.vsix“插件,用于调试opencv相关的图像算法程序十分方便.后因项目需要,需将相关程序移植 ...

  8. Linux 虚存的性能问题

    虚存子系统是所有 UNIX 系统的核心组件.下面讨论虚存系统的实现及其对操作系统中几乎其他所有子系统的作用和影响.首先详细说明一些基本的内存管理问题:然后具体分析 Linux 操作系统如何实施虚存管理 ...

  9. Python编写守护进程程序

    Python编写守护进程程序思路 1. fork子进程,父进程退出通常,我们执行服务端程序的时候都会通过终端连接到服务器,成功连接后会加载shell环境,终端和shell都是进程,shell进程是终端 ...

随机推荐

  1. 我写的Angular相关的文章

    此文正在更新中... Angular6的变化 Angular7的变化 No value accessor for form control with path的解决方案

  2. Android为TV端助力 很详细的序列化过程Parcelable

    直接上代码:注释都写的很清楚了. public class Entry implements Parcelable{ public int userID; public String username ...

  3. gitlab runner安装与使用

    今天来讲一下如何使用gitlab-runner 下载runner,根据自己对应服务器的型号自行选择下载: # Linux x86- sudo wget -O /usr/local/bin/gitlab ...

  4. centos7安装配置redis

    1.下载redis > cd /usr/local/src #文件下载目录 > curl -O http://download.redis.io/releases/redis-3.2.8. ...

  5. Linux如何查看YUM的安装目录

    Linux下如何查看使用YUM安装过的包的安装路径呢? 在搞清楚这个问题前,我们先来了解一下YUM. YUM(全称为 Yellow dog Updater, Modified)是一个在Fedora和R ...

  6. The operation could not be performed because OLE DB provider "SQLNCLI11" for linked server "SDSSDFCC...

    The operation could not be performed because OLE DB provider "SQLNCLI11" for linked server ...

  7. c/c++ 数组的智能指针 使用

    数组的智能指针 使用 数组的智能指针的限制: 1,unique_ptr的数组智能指针,没有*和->操作,但支持下标操作[] 2,shared_ptr的数组智能指针,有*和->操作,但不支持 ...

  8. 使用netstat命名排查网络问题的参考指引

    原文链接:http://www.lookdaima.com/WebForms/WebPages/Blanks/Pm/Docs/DocItemDetail.aspx?id=69b487d0-8bf4-4 ...

  9. VBR的部署

    一.实验拓扑图 二.实验目标 通过部署Veeam Backup & replication,实现虚拟机的备份和还原. 三实验要求 1.  如图所示,开启实验环境.(请参考公众号以前的相关文档) ...

  10. LeetCode算法题-Invert Binary Tree

    这是悦乐书的第194次更新,第199篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第55题(顺位题号是226).反转二叉树.例如: 输入: 4 / \ 2 7 / \ / ...