lunes, 11 de junio de 2007

Espacio de intercambio

charlie_mtp

En informática, el espacio de intercambio es una zona del disco (un fichero o partición) que se usa para guardar las imágenes de los procesos que no han de mantenerse en memoria física. A este espacio se le suele llamar swap, del inglés "intercambiar".

Descripción::

La mayoría de los sistemas operativos modernos poseen un mecanismo llamado memoria virtual, que permite hacer creer a los programas que tienen más memoria que la disponible realmente (por ejemplo, 4 Gb en un ordenador de 32 bits). Como en realidad no se tiene físicamente toda esa memoria, algunos procesos no podrán ser ubicados en la memoria RAM.

En este caso es cuando es útil el espacio de intercambio: el sistema operativo puede buscar un proceso poco activo, y moverlo al área de intercambio (el disco duro) y de esa forma liberar la memoria principal para cargar otros procesos. Mientras no haga falta, el proceso extraído de memoria puede quedarse en el disco, ya que ahí no gasta memoria física. Cuando sea necesario, el sistema vuelve a hacer un intercambio, pasándolo del disco a memoria RAM. Es un proceso lento (comparado con usar sólo la memoria RAM), pero permite dar la impresión de que hay más memoria disponible.

Implementación::

En realidad, puede ser que no toda la imagen del proceso se lleve al disco. De esta forma, se mantienen algunas partes en memoria principal, mientras que otras permanecen en el almacenamiento secundario.

Si los algoritmos utilizados en el intercambio de páginas están mal diseñados o hay poca memoria disponible, se puede dar un problema conocido como "hiperpaginación" o, en inglés, thrashing. Los síntomas son un atasco y sobrecarga en el sistema; esto se debe a que los procesos continuamente están siendo pasados de memoria física a área de intercambio (porque hace falta memoria para correr otro proceso) y luego otra vez a memoria (porque han de ejecutarse). Aquí vamos a hacer un alto y añadir una observación donde espero que los seguidores de Microsoft no se molesten. Tenemos que dejar claro que en Windows esto no está todo lo bien implementado que pudiera, y el resultado de ésto lo podemos ver cuando en ocasiones estamos sin hacer nada en el ordenador y vemos el bombillo del disco duro encendido (o sea, que está trabajando) y pensamos que está loco o nos preguntamos que estará haciendo. Pues bien, el problema está que Windows es algo nervioso (hiperactivo) y pagina en ocasiones sin necesitarlo. La razón es que cuando el sistema tiene menos de 200 Mb de memoria física libre necesita paginar, y he aquí la explicación de por qué pagina tan seguido.

Posibles ubicaciones::

En los sistemas operativos se puede usar como área de intercambio un fichero o una partición (los dos son en realidad parte de un disco duro o almacenamiento secundario).

Fichero de intercambio:
Un fichero en blanco puede prepararse para ser usado como área de intercambio. Esto tiene una gran ventaja: es fácil de crear, borrar, ampliar o reducir, según se crea necesario (a diferencia de una partición). Pero tiene una desventaja: le afecta la fragmentación, ya que se encuentra dentro de un sistema de ficheros. El problema de la fragmentación no es grave, ya que el espacio de intercambio no siempre es accedido de forma secuencial, sino directa (en oposición a la secuencial).

Partición de intercambio:
También se puede dedicar una partición entera del disco duro (o el disco completo) como área de intercambio. Ventajas: se puede conseguir mejor rendimiento si se coloca la partición en la zona más rápida del disco, que es al principio (los cilindros exteriores del disco, por donde pasan más datos a cada vuelta). No hay problemas de fragmentación y no hay que usar ningún sistema de ficheros en concreto.
Tiene pocas desventajas: crear una partición es un proceso algo difícil; de todas formas, si se elige bien el tamaño de la partición, no hará falta ningún cambio en el futuro la partición siempre ocupará el mismo espacio, aunque no se esté usando al 100%.

Otros dispositivos::

Las tarjetas de video incluyen una memoria, que en los modelos actuales puede llegar a cientos de megabytes; además, son muy rápidas, y no se están usando siempre. Por eso no es extraño que ya se haya intentado usar esta memoria como dispositivo de intercambio (y como almacenamiento genérico). En Linux se puede hacer esto mediante MTD. También ésto se ha hecho con la memoria de una tarjeta de sonido, usando un controlador específico que la convierte en un dispositivo de bloque.

Uso en sistemas operativos::

Cada sistema operativo gestiona la memoria virtual de forma distinta, por tanto, el intercambio depende de la implementación de los algoritmos de intercambio.

En Windows:
Microsoft Windows usa un fichero de intercambio desde su versión 3.1 (1992), la primera en usar memoria virtual. Lo implementa mediante un fichero situado en el directorio raíz (C:\) o en el de sistema ( C:\WINDOWS\), y tiene por nombre: 386SPART.PAR en Windows 3.1; WIN386.SWP en Windows 3.11, 95 y 98; pagefile.sys en Windows NT y sucesores. Este fichero tiene un tamaño variable (depende de la configuración) y no debe ser movido o borrado. Aquí haremos otro alto para añadir que si quiere ver cómo aumenta este archivo, sólo obsérvelo recién iniciada la máquina y más adelante, después de tener varios procesos pesados abiertos. Entonces verá cómo su tamaño aumenta.

Hay una opción para establecer un tamaño fijo para el fichero, pero no es recomendable, porque a veces (cuando se acaba la memoria física y un programa necesita más) hace falta aumentar el tamaño del fichero de intercambio, y si no se puede, no habrá memoria extra para los programas. Si los programas (o el propio Windows) no pueden conseguir la memoria que necesitan, probablemente den fallos extraños. Se puede controlar el tamaño mínimo y el máximo para el fichero. Mientras que aumentar mucho el máximo no hará que funcione mejor, aumentar el mínimo sí que puede ayudar en sistemas que tengan poca memoria RAM.

En Linux:
Linux se suele usar con una partición de intercambio, aunque también permite usar ficheros de intercambio.
Se pueden asignar varios dispositivos de intercambio, incluso de diferentes tipos, y asignar a cada uno una prioridad. Si la prioridad es la misma en varios, las páginas de memoria se distribuirán como en un RAID de nivel 0. Esto permite que los dispositivos de swap se usen en paralelo, cosa que puede aumentar la eficacia, sobre todo si están en discos independientes.

Para crear un área de intercambio en Linux se usa la orden mkswap nombre, donde nombre puede ser un fichero o la ruta a un dispositivo de disco (por ejemplo /dev/hda1). Esto prepara el dispositivo y le pone la cabecera apropiada. Si lo que se está usando es un fichero swap, el contenido puede ser cualquiera (se destruirá), y lo que importa es el tamaño. Pero además, mkswap tiene un requisito especial: el fichero no ha de tener agujeros. Quiere decir que los bytes del fichero han de estar realmente en el disco. Esto no pasa siempre: si se usa cp /dev/zero nuevo, el sistema de ficheros probablemente vea que se trata de un fichero disperso (tiene regiones muy grandes todas con nulos), y no lo grabará realmente en el disco. Al usar algo como dd if=/dev/zero of=nuevo bs=1024 count=65536 se le fuerza a que escriba todos los bloques, sin agujeros. El dispositivo de intercambio se activa con la orden swapon nombre y se desactiva con swapoff nombre. En el fichero /proc/swaps se muestra una lista de los dispositivos de intercambio activos, y en /etc/fstab se suelen añadir las particiones swap que se activan al inicio del sistema. Con el programa free se puede ver, además de cuánta RAM queda libre, el tamaño total de las áreas de intercambio, cuán de llenas están, y cuánta memoria (RAM) se está usando como caché.

¿Hace falta swap?

La memoria de intercambio sirve como RAM adicional. Entonces, en un ordenador que ya tenga mucha memoria RAM, ¿hace falta swap?

Aunque puede funcionar bien sin tener ningún área de intercambio, es muy recomendable crearla. La razón es que siempre es bueno quitar de la memoria los procesos poco usados, ya que eso permite usar la RAM para otras tareas, como por ejemplo, la memoria caché de las operaciones de entrada/salida o el acceso al disco.

Un ejemplo: supongamos que un usuario abre en un programa una imagen muy grande, que le consume el 80% de la memoria RAM, y después, sin cerrarla, se pone a hacer varias búsquedas de ficheros por su disco duro. Si no se puede llevar a disco ese proceso grande, quiere decir que ha de mantenerse en memoria física; por tanto, las búsquedas sólo tendrán menos del 20% de la memoria RAM para hacer de caché, y por eso serán poco eficientes. Con swap, se podría llevar a disco el proceso grande (o al menos una parte), hacer esas búsquedas usando toda la RAM como caché, y luego restaurar el proceso, si hace falta.
Hay algunos procesos que, debido a la función que realizan, están poco activos, y puede ser recomendable que estén en el área de intercambio para liberar un poco la memoria RAM. Por ejemplo, un servidor SSH (mecanismo de control remoto del ordenador) tiene que estar siempre activo para atender las posibles peticiones, pero sólo empezará a trabajar de verdad cuando un usuario se conecte.

Tamaño del espacio de intercambio::

Ésta es una discusión típica entre los administradores de sistemas, y una duda común que aparece durante la instalación de un sistema Linux (o cualquier UNIX). Hay una regla muy conocida que dice que "la swap ha de ser el doble de la memoria RAM instalada", pero esto ya no es válido hoy en día. Esta regla funcionaba bien antes, cuando siempre se compraba menos RAM de la que realmente se necesitaba, porque era muy cara. Tener tres veces más memoria que la física iba bien para la mayoría de usuarios. Pero en un ordenador nuevo que tenga 1 Gb de RAM, no será necesario gastar 2 Gb en una partición de swap, porque probablemente no se usará.

La regla habitual usada para decidir el tamaño del área de intercambio es "pensar en cuánto querrías tener y en cuánto tienes, y poner como swap la diferencia". Por ejemplo, si un usuario necesita abrir ficheros de hasta 700 Mb, pero sólo tiene 256 Mb de RAM, entonces lo que le falta (aproximadamente 500 Mb) se ha de poner como swap, como mínimo. Más swap puede ir bien, pero no será muy usada. Si el ordenador ha de soportar mucha carga, la partición ha de ser mínimamente grande; se recomienda algo más de 128 Mb.

Seguridad::

El espacio de intercambio sirve para guardar, aproximadamente, las mismas cosas que la memoria RAM. Esto incluye información privada, contraseñas, documentos abiertos (aunque no se hayan grabado), etc. Pero con una diferencia: la memoria RAM se pierde al apagar el ordenador; en cambio, la swap no (porque está dentro del disco duro).

Esto hace que sea necesaria una política de borrado de swaps en algunos sistemas donde la privacidad sea importante. Borrar una partición de swap en Linux es muy fácil (sólo hay que escribirla con ceros mediante dd), pero hacerlo manualmente puede ser tedioso, sobre todo porque antes hay que desmontarla y luego volverla a montar.

Otra opción es escribir un código que se ejecute al apagar el ordenador para que haga esto cada vez, cosa que puede ser algo lenta. Existen programas que automatizan estas tareas en varios sistemas operativos.

De todas formas, borrar la swap al apagar no asegura los datos mientras el ordenador está encendido, ya que en el disco habrá información que supuestamente sólo debía estar en memoria RAM. Por eso, en algunos casos se usa un dispositivo de intercambio cifrado, que ofrece más protección, pero, como contrapartida, es mucho más lento. Eso afecta al rendimiento general del sistema, y hace que esta solución sea prohibitiva en el caso general. Naturalmente, también es necesario controlar los permisos de los dispositivos de intercambio, para evitar que usuarios no autorizados puedan leer un fichero de swap, y por tanto la memoria.

Para saber más...



Artículos relacionados


No hay comentarios: