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.
Привет,