Cuestión de memoria
[ Sistemas operativos / Linux ]



He oído decir que la memoria que ocupa un proceso mostrada por top o ps no siempre refleja la realidad ¿Es cierto y cómo se ve entonces cuánta memoria ocupa un proceso?
Angel San José



Efectivamente, el campo SIZE (tamaño, si viene traducido) no siempre da una idea correcta de cuánto ocupa el programa. En primer lugar, es espacio direccionado que muchas veces coincide con memoria física pero no siempre; el caso más representativo es el del servidor X, que "mapea" la memoria de la tarjeta gráfica en su espacio virtual de direccionamiento, sin que por ello ocupe memoria física. En el caso del servidor X también hay que tener en cuenta que parte de la memoria utilizada no es por el servidor X en sí mismo, sino porque almacena "mapas de bits" a dibujar de los clientes X (los programas) para ahorrar transferencias.

Si en Gnome ejecutas Monitor del sistema Gtop, verás un campo llamado RSS (si no sale y lo mismo se aplica para el resto de campos de los que vamos a hablar, activa su salida en configuración/preferencias/campos de los procesos). RSS refleja ya memoria física real en lugar de espacio de direccionamiento. Al ser memoria física se excluye la parte de memoria del proceso que se ha volcado al fichero de paginación del disco, para recuperarla más tarde si volvemos a necesitar acceder a ella.

De todos modos, con RSS es muy importante tener en cuenta que está incluida la memoria compartida: por ejemplo, lo que ocupa la librería dinámica de C, que se comparte entre todos los programas, o las librerías Gnome, común a todos los programas de este escritorio. Es decir, que al arrancar el proceso la memoria utilizada libre disminuyó en menos de lo que marca RSS, porque las librerías dinámicas ya estaban cargadas por otros programas. La memoria física compartida entre más de un ejecutable nos la da precisamente el campo SHARED. Por tanto, al arrancar el proceso, si ya estaban en ejecución los otros, el decremento de memoria física es RSS-SHARED.

Si queremos ver con más detalle el espacio de direcciones de un proceso, para compararle con el de otros y ver qué partes comparten, podemos mirar con un cat /proc/<id_del_proceso>/maps.

El campo Residente en Linux coincide con size si se incluye el espacio volcado al fichero de swap, mientras que en algunos otros sistemas coincide con RSS.

Para los cálculos de memoria, otra consideración a tener en cuenta son los programas multihilo, como galeon o la máquina virtual Java. En sistemas como Solaris, al hacer un ps sólo sale una entrada por programa, pues ps se supone que muestra procesos, mientras que en Linux sale una entrada por cada hilo. El motivo es que en Linux los hilos se implementan como procesos que comparten su espacio de direccionamiento (salvo la pila, que cada uno tiene la suya).

En conclusión hay que contar sólo una entrada para calcular la memoria que ocupa el proceso en total: cada hilo por sí mismo incrementa la memoria en lo que ocupa su pila, que puede ser muy poco aunque no necesariamente. En C por ejemplo van a la pila las variables locales, o lo que es lo mismo las no static, ni globales, ni creadas pidiendo espacio dinámicamente sino las que se destruyen al salir del bloque de código en que se definen. Obsérvese que la pestaña uso memoria (residente) de gtop suma para los procesos multihilo la memoria de cada uno, pese a que es mayoritariamente común y cuenta las librerías compartidas para cada proceso. Por ese motivo sale una cifra de total de espacios residentes muy superior al que realmente se está usando.

En el caso de Apache, aunque salga varias veces el nombre del ejecutable seguidas como con galeon o java, hay que tener claro que son procesos independientes y por tanto comparten el espacio del código ejecutable, pero no el de memoria de datos. Con Apache 2.0 en cambio se podrá usar un servidor multihilo. De todos modos, en Linux (también en otros sistemas como Solaris o NT) se utiliza la técnica copy on write, es decir, al crear un proceso (haciendo una copia de otro con fork) las páginas de datos también se comparten en memoria, como en los hilos, y mientras uno de los procesos no las modifique, se mantiene una copia separada para cada uno.

Como ves, en un sistema operativo moderno el cálculo de la memoria física que ocupa un proceso es más complicado de lo que parece: cada programa ve un espacio de direccionamiento propio pero luego puede estar compartiendo memoria física con varios procesos, o tener la parte de memoria que no está usando volcada a disco.






Anterior         Siguiente         





© 2002 VNU Business Publications España. Queda terminantemente prohibida su reproducción total o parcial por cualquier medio sin el permiso explicito y por escrito del propietario del copyright.