Sistemas operativos modernos
los dos trozos de ocho páginas adyacentes recién liberados son amigos, es decir, se originaron en el mismo trozo de 16 páginas, se fusionan para recuperar el trozo de 16 páginas (i). Linux administra la memoria empleando el algoritmo del amigo, con la característica adi cional de tener un arreglo en el que el primer elemento es la cabeza de una lista de bloques de una unidad cada uno, el segundo elemento es la cabeza de una lista de bloques de dos unida des cada uno, el siguiente elemento apunta a los bloques de cuatro unidades, etc. Así, es posi ble localizar con rapidez cualquier bloque que sea potencia de 2 . Este algoritmo produce una fragmentación interna considerable, porque si se desea un tro zo de 65 páginas es preciso solicitar y obtener uno de 128 páginas. Para aliviar este problema, Linux tiene una segunda asignación de memoria que toma tro zos empleando el algoritmo del amigo pero luego corta tajadas (unidades más pequeñas) del trozo y las administra aparte. También se cuenta con un tercer asignador de memoria para los casos en que la memoria solicitada sólo tiene que ser contigua en el espacio virtual, pero no en la memoria física. Todos estos asignadores de memoria se derivan de los de System V. Linux es un sistema de paginación por demanda sin prepaginación y sin concepto de con junto de trabajo (aunque hay una llamada al sistema con la que el usuario puede avisar que cier ta página podría necesitarse pronto, con la esperanza de que ya esté en la memoria cuando se necesite). Los segmentos de texto y los archivos con correspondencia en memoria se paginan a sus respectivos archivos en disco. Todo lo demás se pagina a la partición de paginación, si existe, o bien, a uno de hasta ocho archivos de paginación de longitud fija. Los archivos de pa ginación pueden añadirse y quitarse en forma dinámica y cada uno tiene una prioridad. Paginar a una partición aparte, a la que se tiene acceso como dispositivo crudo, es más eficiente que pa ginar a un archivo por varias razones. Primera, no es necesario que haya una correspondencia entre bloques de archivo y bloques de disco (lo cual ahorra la E/S de disco por lectura de bloques indirectos). Segunda, las escrituras físicas pueden ser de cualquier tamaño; no tienen que ser del bloque de archivo entero. Tercera, una página siempre se escribe contiguamente en el disco; si se usa un archivo de paginación, podría quedar contigua en el disco o no. Las páginas no se asignan en el dispositivo o la partición de paginación sino hasta que se les necesita. Cada dispositivo y archivo inicia con un mapa de bits que indica cuáles páginas están desocupadas. Cuando una página que no tiene almacenamiento de respaldo debe desalo jarse de la memoria, se escoge la partición o el archivo de paginación de más alta prioridad que todavía tenga espacio, y se asigna una página allí. Lo normal es que la partición de paginación, si está presente, tenga más alta prioridad que cualquier archivo de paginación. La posición en el disco se escribe en la tabla de páginas. El reemplazo de páginas funciona como sigue. Linux trata de mantener algunas páginas desocupadas para poder usarlas en caso necesario. Claro que esta reserva debe reabastecerse en forma continua, y de ello se encarga el verdadero algoritmo de paginación. En el momento del arranque, init pone en marcha un demonio de páginas, kswapd, que se ejecuta una vez por segundo. Kswapd verifica si hay suficientes páginas libres disponibles. Si las hay, se desacfiva durante otro segundo, aunque se puede activar antes si de repente se necesitan más páginas. El código del demonio de páginas consiste en un ciclo que se ejecuta hasta seis veces, con urgen cia creciente. ¿Por qué seis? De seguro el autor del código pensó que cuatro no era suficiente y ocho era demasiado. A veces Linux es así.
RkJQdWJsaXNoZXIy MjI4NDcx