15

'man top' 说的是:RES = CODE + DATA

q: RES -- Resident size (kb)
The non-swapped physical memory a task has used.
RES = CODE + DATA.

r: CODE -- Code size (kb)
The amount of physical memory devoted to executable code, also known as the 'text        resident set' size or TRS.

s: DATA -- Data+Stack size (kb)
The amount of physical memory devoted to other than executable code, also known as the   'data >resident set' size or DRS.

当我运行'top -p 4258'时,我得到以下信息:

PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  CODE DATA COMMAND
258 root      16   0  3160 1796 1328 S  0.0  0.3   0:00.10  476  416 bash

1796 != 476+416

为什么?

ps:linux发行版:

linux-iguu:~ # lsb_release -a
LSB Version:    core-2.0-noarch:core-3.0-noarch:core-2.0-ia32:core-3.0-ia32:desktop-3.1-ia32:desktop-3.1-noarch:graphics-2.0-ia32:graphics-2.0-noarch:graphics-3.1-ia32:graphics-3.1-noarch
Distributor ID: SUSE LINUX
Description:    SUSE Linux Enterprise Server 9 (i586)
Release:        9
Codename:       n/a

内核版本:

linux-iguu:~ # uname -a
Linux linux-iguu 2.6.16.60-0.21-default #1 Tue May 6 12:41:02 UTC 2008 i686 i686 i386 GNU/Linux
4

2 回答 2

30

我将通过一个程序分配和使用内存时发生的示例来解释这一点。具体来说,这个程序:

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>

int main(){

        int *data, size, count, i;

        printf( "fyi: your ints are %d bytes large\n", sizeof(int) );

        printf( "Enter number of ints to malloc: " );
        scanf( "%d", &size );
        data = malloc( sizeof(int) * size );
        if( !data ){
                perror( "failed to malloc" );
                exit( EXIT_FAILURE );
        }

        printf( "Enter number of ints to initialize: " );
        scanf( "%d", &count );
        for( i = 0; i < count; i++ ){
                data[i] = 1337;
        }

        printf( "I'm going to hang out here until you hit <enter>" );
        while( getchar() != '\n' );
        while( getchar() != '\n' );

        exit( EXIT_SUCCESS );
}

这是一个简单的程序,它询问你要分配多少个整数,分配它们,询问要初始化多少个整数,然后初始化它们。对于我分配 1250000 个整数并初始化其中 500000 个的运行:

$ ./a.out
fyi: your ints are 4 bytes large
Enter number of ints to malloc: 1250000
Enter number of ints to initialize: 500000

Top 报告以下信息:

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  SWAP CODE DATA COMMAND
<program start>
11129 xxxxxxx   16   0  3628  408  336 S    0  0.0   0:00.00 3220    4  124 a.out
<allocate 1250000 ints>
11129 xxxxxxx   16   0  8512  476  392 S    0  0.0   0:00.00 8036    4 5008 a.out
<initialize 500000 ints>
11129 xxxxxxx   15   0  8512 2432  396 S    0  0.0   0:00.00 6080    4 5008 a.out

相关信息是:

                          DATA CODE  RES VIRT
before allocation:         124    4  408 3628
after 5MB allocation:     5008    4  476 8512
after 2MB initialization: 5008    4 2432 8512

在我 malloc 了 5MB 的数据后,VIRT 和 DATA 都增加了约 5MB,但 RES 没有。在我触及分配的 2MB 整数后,RES 确实增加了,但 DATA 和 VIRT 保持不变。

VIRT 是进程使用的虚拟内存总量,包括共享的和过度提交的。DATA 是使用的未共享且不是代码文本的虚拟内存量。即,它是进程的虚拟栈和堆。RES 不是虚拟的:它是对进程在特定时间实际使用的内存量的测量。

因此,在您的情况下,较大的不等式 CODE+DATA < RES 可能是进程包含的共享库。在我的示例(和您的示例)中,SHR+CODE+DATA 更​​接近于 RES。

希望这可以帮助。有很多与 top 和 ps 相关的挥手和巫术。网上有很多关于这些差异的文章(咆哮?)。例如,这个这个

于 2011-12-07T19:32:10.247 回答
0

这个解释非常适合解决我的一些疑问。谢谢!同时,尝试补充一下我在理解linux内存管理知识的过程中得到的一些东西。如有误解,请指正!

  1. 现代操作系统进程概念基于虚拟内存。虚拟内存系统包括RAM+SWAP;所以我认为与进程相关的内存概念大部分都是指虚拟内存,只是有一些补充说明。

  2. 分配给进程的任何虚拟地址(页面)都处于以下状态:

    a) 已分配,但没有映射到任何物理内存(类似于 COW)

    b) 已分配,已映射到物理内存

    c) 已分配,已映射到交换内存。

  3. top 命令的字段输出:

    a) VIRT——它是指进程有权访问的所有虚拟内存,无论它已经映射到物理内存还是交换内存,甚至没有任何映射。

    b) RES——它指的是已经映射到物理地址的虚拟地址,它仍然在 RAM 中。

    c) SWAP——指已经映射到物理地址的虚拟地址,并被交换到SWAP空间。

    d) SHR - 它指的是进程可用的共享内存(VM?)

    e) CODE + DATA -- CODE 可以处于 2.b/2.c 状态,DATA 可以处于 2.a/2.b/3.c 和 3.b/3 3 种状态中的任何一种。 c 还有一个名为“USED”的字段名称。

4)所以计算可能看起来像:

a) VIRT(VM) = RES(VM in memory) + SWAP(VM in swap) + VM unmapped(DATA, SHR?)。

b) 已使用 = RES + SWAP

c)SWAP = CODE(内存中的vm)+ DATA(内存中的vm)+ SHR(内存中的vm?)

d)RES = CODE(内存中的vm)+ DATA(内存中的vm)+ SHR(内存中的vm?)

至少 DATA 段仍然有一个“DATA(VM unmapped)”,这可以从上面的 malloc 示例中观察到。这与 top 命令的联机帮助页略有不同,其中显示“数据:专用于可执行代码以外的物理内存量,也称为数据驻留集大小或 DRS”。再次感谢。所以(CODE + DATA + SHR)的数量通常大于RES,因为至少DATA(vm unmapped)实际上是在“DATA”中计算的,不像manpge声称的那样。

问候,

于 2016-11-14T11:22:21.273 回答