RES!= CODE + DATA в выходной информации верхней команды, почему?

что сказал "человек сверху": 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

почему?

пс: 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

Ответы

Ответ 1

Я объясню это с помощью примера того, что происходит, когда программа выделяет и использует память. В частности, эта программа:

#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'd 5MB данных, VIRT и DATA увеличились на ~ 5 МБ, но RES не сделали этого. RES увеличился после того, как я коснулся 2MB целых чисел, которые я выделил, но DATA и VIRT остались прежними.

VIRT - это общий объем виртуальной памяти, используемой процессом, в том числе общий и что перехвачено. DATA - это количество используемой виртуальной памяти, которая не является общей и не является кодом. I.e., это виртуальный стек и куча процесса. RES не является виртуальным: это измерение того, сколько памяти фактически использует этот процесс в это конкретное время.

Итак, в вашем случае большое неравенство CODE + DATA < RES - это, вероятно, общие библиотеки, включенные в процесс. В моем примере (и вашем) SHR + CODE + DATA является более близким приближением к RES.

Надеюсь, это поможет. Там много ручного размаха и вуду связаны с топ и ps. Есть много статей (rants?) В Интернете о descrepancies. Например, this и this.

Ответ 2

Это объяснение потрясающе для решения моих некоторых запросов. Благодарю! А между тем, пытаясь добавить что-то, полученное во время моего понимания знаний управления памятью Linux. Если какие-либо недоразумения, пожалуйста, поправьте меня!

  • Современные концепции процесса ОС основаны на виртуальной памяти. Система виртуальной памяти включает в себя RAM + SWAP; Поэтому я думаю, что большинство концепций памяти, связанных с процессами, относятся к виртуальной памяти, за исключением того, что есть некоторые примечания к приложению.

  • Любой виртуальный адрес (страница), выделенный для процесса, находится в состоянии ниже:

    a) выделено, но нет отображения в какую-либо физическую память (что-то вроде COW)

    b) выделено, уже сопоставлено с физической памятью

    c) выделено, уже сопоставлено с измененной памятью.

  • Поля вверху команды:

    a) VIRT - это относится ко всей виртуальной памяти, что процесс имеет право для доступа, независимо от того, он уже отображен в физическую память или заменен памяти или даже не имеет никакого отображения.

    b) RES - он ссылается на виртуальный адрес, уже сопоставленный с физическим адресом, и он все еще находится в ОЗУ.

    c) SWAP - относится к виртуальному адресу, уже сопоставленному с физическим адресом, и он заменяется на пространство SWAP.

    d) SHR - это относится к общей памяти, доступной для процесса (VM?)

    e) КОД + ДАННЫЕ - КОД может находиться в состоянии 2.b/2.c, а DATA может находиться в любом из 3 состояний 2.a/2.b/3.c и 3.b/3.c также имеет имя поля под названием "USED".

4) Итак, вычисление может выглядеть так:

a) VIRT (VM) = RES (VM в памяти) + SWAP (VM в swap) + VM unmapped (DATA, SHR?).

b) USED = RES + SWAP

c) SWAP = CODE (vm в памяти) + DATA (vm в памяти) + SHR (vm в памяти?)

d) RES = CODE (vm в памяти) + DATA (vm в памяти) + SHR (vm в памяти?)

По крайней мере сегмент DATA по-прежнему имеет "DATA (VM unmapped)", это можно было наблюдать из приведенного выше примера malloc. Это немного отличается от manpage верхней команды, которая гласит: "DATA: объем физической памяти, предназначенный для других, кроме исполняемого кода, также известный как размер набора резидентных данных или DRS". Еще раз спасибо. Таким образом, количество (CODE + DATA + SHR) обычно больше, чем RES, потому что по крайней мере DATA (vm unmapped) фактически вычисляется в "DATA", а не как заявка на manpge.

Привет,