RES! = CODE + DATA в выходной информации верхней команды, почему? - PullRequest
14 голосов
/ 29 сентября 2011

то, что сказал «человек сверху»: RES = КОД + ДАННЫЕ

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

Ответы [ 2 ]

25 голосов
/ 07 декабря 2011

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

#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

После того как я выделил 5 МБ данных, значения VIRT и DATA увеличились на ~ 5 МБ, а RES - нет.RES увеличился после того, как я коснулся 2 МБ целых чисел, которые я выделил, но DATA и VIRT остались прежними.

VIRT - это общий объем виртуальной памяти, используемой процессом, включая общую и чрезмерно совершенные .ДАННЫЕ - это объем используемой виртуальной памяти, который не используется совместно и не является кодовым текстом.Т.е. это виртуальный стек и куча процесса.RES не является виртуальным: это измерение того, сколько памяти фактически использует процесс в это конкретное время.

Таким образом, в вашем случае большое неравенство CODE + DATA

Надеюсь, это поможет.Есть много размахиваний руками и вуду, связанных с топом и пс.Есть много статей (рантов?) Онлайн о несоответствиях.Например, это и это .

0 голосов
/ 14 ноября 2016

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

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

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

    а) выделен, но не привязан ни к какой физической памяти (что-то вроде COW)

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

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

  3. Выходные данные полей команды top:

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

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

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

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

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

4) Так что расчет может выглядеть так:

a) VIRT (ВМ) = RES (ВМ в памяти) + SWAP (ВМ в разделе подкачки) + ВМ не отображается (DATA, SHR?).

b) ИСПОЛЬЗУЕТСЯ = RES + SWAP

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

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

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

С уважением,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...