Я объясню это на примере того, что происходит, когда программа выделяет и использует память.В частности, эта программа:
#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
Надеюсь, это поможет.Есть много размахиваний руками и вуду, связанных с топом и пс.Есть много статей (рантов?) Онлайн о несоответствиях.Например, это и это .