studio programacion móviles desarrollo curso aplicaciones linux memory top-command

linux - móviles - manual de programacion android pdf



RES!=CÓDIGO+DATOS en la información de salida del comando superior, ¿por qué? (2)

lo que ''man top'' dijo es: 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.

cuando ejecuto ''top -p 4258'', obtengo lo siguiente:

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

¿por qué?

ps: distribución de 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

versión del núcleo:

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


Esta explicación es excelente para resolver algunas de mis consultas. ¡Gracias! Y mientras tanto, intento agregar algo durante mi comprensión del conocimiento de administración de memoria de Linux. Si hay algún malentendido, por favor corrígeme!

  1. Los conceptos de proceso del sistema operativo moderno se basan en la memoria virtual. El sistema de memoria virtual incluye RAM + SWAP; Así que creo que la mayoría de los conceptos de memoria relacionados con los procesos se refieren a la memoria virtual, excepto que hay algunas notas complementarias.

  2. Cualquier dirección virtual (página) asignada a un proceso se encuentra en el siguiente estado:

    a) asignado, pero no mapeo a ninguna memoria física (algo así como COW)

    b) asignado, ya asignado a la memoria física

    c) asignado, ya asignado a la memoria intercambiada.

  3. La salida de campos del comando superior:

    a) VIRT: se refiere a toda la memoria virtual a la que el proceso tiene derecho de acceder, sin importar si ya está mapeada en la memoria física o en la memoria intercambiada, o incluso si no tiene ningún mapeo.

    b) RES: se refiere a la dirección virtual ya asignada a la dirección física y aún está en la RAM.

    c) SWAP - se refiere a la dirección virtual ya asignada a la dirección física y se intercambia al espacio SWAP.

    d) SHR: se refiere a la memoria compartida disponible para un proceso (VM?)

    e) CODE + DATA - CODE podría estar en un estado de 2.b / 2.c, y DATA podría estar en cualquiera de los 3 estados 2.a / 2.b / 3.c, y 3.b / 3. c también tiene un nombre de campo llamado "USADO".

4) Entonces el cálculo puede ser similar a:

a) VIRT (VM) = RES (VM en la memoria) + SWAP (VM en el intercambio) + VM no asignada (DATA, SHR?).

b) USADO = RES + SWAP

c) SWAP = CODE (vm en la memoria) + DATA (vm en la memoria) + SHR (vm en la memoria?)

d) RES = CODE (vm en la memoria) + DATA (vm en la memoria) + SHR (¿vm en la memoria?)

Al menos el segmento de DATOS todavía tiene un "DATO (VM no asignado)", esto podría observarse desde el ejemplo de malloc anterior. Eso es un poco diferente de la página de manual del comando superior que dice "DATOS: la cantidad de memoria física dedicada a un código que no sea ejecutable, también conocido como Tamaño de conjunto de residentes de datos o DRS". Gracias de nuevo. Por lo tanto, la cantidad de (CÓDIGO + DATOS + SHR) generalmente es mayor que RES, porque al menos los DATOS (vm no asignados) realmente se calculan en "DATOS", no como el reclamo de manpge.

Saludos,


Explicaré esto con la ayuda de un ejemplo de lo que sucede cuando un programa asigna y usa memoria. Específicamente, este programa:

#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 ); }

Este es un programa simple que le pregunta cuántos números enteros asignar, los asigna, pregunta cuántos de esos enteros inicializar, y luego los inicializa. Para una ejecución donde asigno 1250000 enteros e inicializo 500000 de ellos:

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

Arriba informa la siguiente información:

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

La información relevante es:

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

Después de descifrar 5MB de datos, tanto VIRT como DATA aumentaron en ~ 5MB, pero RES no lo hizo. RES aumentó cuando toqué 2MB de los enteros que asigné, pero DATA y VIRT se mantuvieron igual.

VIRT es la cantidad total de memoria virtual utilizada por el proceso, incluyendo lo que se comparte y lo que está comprometido en exceso . DATA es la cantidad de memoria virtual utilizada que no se comparte y que no es código-texto. Es decir, es la pila virtual y el montón del proceso. RES no es virtual: es una medida de cuánta memoria está usando el proceso en ese momento específico.

Entonces, en su caso, la gran desigualdad CODE + DATA <RES es probable que las bibliotecas compartidas incluidas por el proceso. En mi ejemplo (y el suyo), SHR + CODE + DATA es una aproximación más cercana a RES.

Espero que esto ayude. Hay muchas manos y vudú asociados con top y ps. Hay muchos artículos (¿rants?) En línea sobre las discrepancias. Por ejemplo, esto y esto .