2011-09-29 13 views
14

lo que dijo 'hombre superior' es: RES = + CÓDIGO DE DATOSRES! = CÓDIGO + DATOS en la información de salida del comando superior, ¿por qué?

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. 

lo que cuando corro 'de arriba -p 4258', me sale el 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: Versión

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 

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 

Respuesta

23

voy a explicar esto con la ayuda de un ejemplo de lo que sucede cuando un programa asigna y utiliza la memoria. En concreto, 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 sencillo programa que te pregunta cuántos números enteros de asignar, los asigna, se pregunta cuántos de esos números enteros para inicializar, y luego los inicializa. Para una carrera donde se asigno 1250000 enteros e inicializar 500.000 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 

Top reporta 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 que malloc' d 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 what is over-committed. 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.

Por lo tanto, en su caso, la gran desigualdad CODE + DATA < RES es probable que las bibliotecas compartidas incluidas en 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 una gran cantidad de agitar las manos y el vudú asociado con la parte superior y ps. Hay muchos artículos (¿rants?) En línea sobre las discrepancias. Por ejemplo, this y this.

+0

gracias por su explicación! Llegué a la conclusión de que el manual de usuario de ps es inexacto. Pero aquí surgen otras preguntas. Mencionó que DATA es virtual y que RES no lo es. Mi pregunta es si SHR es virtual o no. ¿Por qué SHR aumentó en su programa? ¿por SHR + CODE es una camada más grande que RES si SHR no es virtual? – redhatlinux10

+0

SHR es virtual e incluido en VIRT. RES es solo un recuento de qué parte de la asignación virtual realmente utiliza el proceso en la memoria, excluyendo lo que se intercambia. –

+0

Tu explicación aclara mis dudas, gracias de nuevo. – redhatlinux10

0

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) asignado a un proceso está por debajo de estado:

    a) asignado, pero ninguna asignación a cualquier memoria física (algo así como VACA)

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

    c) asignados, ya asignados a la memoria intercambiada.

  3. Los campos ouput de la parte superior de comandos:

    a) VIRT - se refiere a toda la memoria virtual que el proceso tiene el derecho de acceso a , no importa que ya está asignada a la memoria física o alternarse memoria , o incluso 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 en la memoria RAM.

    c) SWAP - hace referencia a la dirección virtual ya asignada a la dirección física y se intercambia en el espacio SWAP.

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

    e) CÓDIGO + DATA -? Código 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 tienen un nombre de campo llamado "USED".

4) De modo que el cálculo puede que parezca:?

a) VIRT (VM) = RES (VM en la memoria) + SWAP (VM de intercambio) + VM no correlacionada (DATOS, SHR).

b) = Utilizado RES + SWAP

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

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

Por lo menos el segmento de DATOS aún tiene un "DATO (VM no mapeado)", esto se puede observar 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) suele ser mayor que RES, porque al menos los DATOS (vm no asignados) realmente se calculan en "DATOS", no como el reclamo de manpge.

Saludos,

Cuestiones relacionadas