Sistemas operativos modernos

descriptor del arcliivo que se va a hacer corresponder. Sólo es posible establecer correspon­ dencia con archivos abiertos, así que primero se debe abrir el archivo antes de usar mmap. Por último, offset indica en qué punto del archivo se iniciará la correspondencia. No es necesario iniciar la correspondencia en el byte 0 ; puede usarse cualquier frontera de página. La otra llamada, unmap, anula la correspondencia de un archivo. Si sólo se deshace la co­ rrespondencia de una porción de un archivo, el resto conserva la correspondencia. 10.4.3 Implementación de la administración de memoria en UN IX Antes de 3BSD, la mayoría de los sistemas UNIX usaba intercambio (swapping), que funciona co­ mo sigue: si había más procesos de los que se podían mantener en memoria, algunos de ellos se intercambiaban a disco. Un proceso intercambiado a disco siempre se intercambiaba entero (salvo quizá el texto compartido). Así, un proceso estaba en la memoria o bien estaba en el disco. Intercambio El movimiento entre la memoria y el disco corría por cuenta del nivel superior del calendariza­ dor, conocido como el intercambiador (swapper). Se iniciaba el intercambio de memoria a dis­ co cuando el kernel se quedaba sin memoria libre a causa de uno de estos sucesos: 1. Una llamada fork al sistema necesitaba memoria para el proceso hijo. 2. Una llamada brk al sistema necesitaba expandir un segmento de datos. 3. Una pila crecía y agotaba el espacio asignado para ella. Además, cuando llegaba el momento de traer a la memoria un proceso que había estado dema­ siado tiempo en el disco, a menudo era necesario quitar otro proceso para hacerle espacio. Para escoger la víctima del desalojo, el intercambiador primero examinaba los procesos que estaban bloqueados esperando algo (por ejemplo, entradas de la terminal), adoptando el criterio de que es mejor quitar un proceso que no puede ejecutarse, que uno que sí puede hacerlo. Si se hallaba uno o más procesos bloqueados, se escogía aquél para el que la suma de la prioridad y el tiempo de residencia daba el valor más alto. Así, un proceso que había consumido reciente­ mente una gran cantidad de tiempo de CPU era un buen candidato, lo mismo que uno que ha­ bía estado en la memoria largo tiempo, aunque estuviera efectuando principalmente E/S. Si no había ningún proceso bloqueado, se escogía un proceso listo empleando el mismo criterio. Cada pocos segundos, el intercambiador examinaba la lista de procesos intercambiados a disco para ver si alguno de ellos estaba listo para ejecutarse. Si había alguno, se escogía el que había estado más tiempo en disco. Luego, el intercambiador determinaba si el intercambio iba a ser fácil o difícil. Un intercambio fácil era uno para el que había suficiente memoria desocu­ pada en ese momento, de modo que no sería necesario quitar ningún proceso para hacerle espa­ cio al nuevo. Un intercambio difícil requería desalojar uno o más procesos. Los intercambios fáciles se implementaban tan sólo trayendo el proceso a la memoria. Los difíciles se implemen- taban desocupando primero suficiente memoria mediante el intercambio a disco de uno o más procesos, y trayendo después el proceso deseado del disco.

RkJQdWJsaXNoZXIy MjI4NDcx