12.10.2014 Views

TEMA 3. GESTIÓN DE MEMORIA - Universidad de Almería

TEMA 3. GESTIÓN DE MEMORIA - Universidad de Almería

TEMA 3. GESTIÓN DE MEMORIA - Universidad de Almería

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

Diseño <strong>de</strong> Sistemas Operativos<br />

Tema <strong>3.</strong> Gestión <strong>de</strong> Memoria<br />

Las funciones unuse_pte, unuse_pmd y unuse_pgd se llaman al <strong>de</strong>sactivarse un dispositivo <strong>de</strong> swap. Exploran<br />

las tablas <strong>de</strong> páginas y recargan en memoria todas las páginas presentes en el dispositivo especificado. La<br />

función unuse_vma utiliza unuse_pgd para recargar todas las páginas correspondientes a una región <strong>de</strong><br />

memoria.<br />

La función unuse_process explora la lista <strong>de</strong> regiones <strong>de</strong> memoria contenidas en el espacio <strong>de</strong><br />

direccionamiento <strong>de</strong> un proceso. Llama a unuse_vma por cada región. La función try _to_unuse se llama<br />

para recargar en memoria todas las páginas presentes en el dispositivo especificado. Explora la tabla <strong>de</strong><br />

procesos y llama a la función unuse_process para recargar el espacio <strong>de</strong> direccionamiento <strong>de</strong> cada proceso.<br />

La función sys_swapoff implementa la primitiva swapoff que <strong>de</strong>sactiva un dispositivo <strong>de</strong> swap. Primero<br />

verifica que el proceso que llama posee los privilegios necesarios, y busca el <strong>de</strong>scriptor <strong>de</strong>l dispositivo en la<br />

tabla swap_info, y lo suprime <strong>de</strong> la lista. Seguidamente llama a try_to_unuse para recargar en memoria todas<br />

las páginas guardadas en ése dispositivo. Si esto falla, el <strong>de</strong>scriptor <strong>de</strong>l dispositivo se inserta <strong>de</strong> nuevo en la<br />

lista y se <strong>de</strong>vuelve un error. En caso <strong>de</strong> éxito, se llama a la operación <strong>de</strong> archivo release asociada al<br />

dispositivo, y el <strong>de</strong>scriptor se libera.<br />

La función sys_swapon implementa la primitiva swapon que activa un dispositivo <strong>de</strong> swap. Primero verifica<br />

que el proceso que llama posee los privilegios necesarios, luego busca un <strong>de</strong>scriptor libre en la tabla<br />

swap_info, e inicializa dicho <strong>de</strong>scriptor. Seguidamente, se asigna una página <strong>de</strong> memoria, el directorio <strong>de</strong>l<br />

dispositivo <strong>de</strong> swap se lee en esta página, y se verifica la firma <strong>de</strong>l dispositivo <strong>de</strong> swap. Tras esta verificación,<br />

se efectúa un bucle con el objetivo <strong>de</strong> contar las páginas disponibles en el dispositivo, y la tabla <strong>de</strong> bytes que<br />

indica el estado <strong>de</strong> cada página se asigna e inicializa. Para terminar, el <strong>de</strong>scriptor <strong>de</strong>l dispositivo se inserta en<br />

la lista.<br />

<strong>3.</strong>4.4.5.2. Entrada/Salida <strong>de</strong> páginas <strong>de</strong> swap<br />

El archivo fuente mm/page_io.c contiene las funciones <strong>de</strong> entrada/salida <strong>de</strong> páginas sobre dispositivos <strong>de</strong><br />

swap. La función rw_swap_page lee o escribe una página en un dispositivo <strong>de</strong> swap. Verifica que el<br />

dispositivo especificado está activo, y que el número <strong>de</strong> página es válido, y a continuación bloquea la página<br />

en cuestión en el <strong>de</strong>scriptor <strong>de</strong>l dispositivo <strong>de</strong> swap. Seguidamente, comprueba el tipo <strong>de</strong>l dispositivo <strong>de</strong> swap:<br />

(1) Si se trata <strong>de</strong> un dispositivo en modo bloque, se llama a la función ll_rw_page para leer o escribir el<br />

contenido <strong>de</strong> la página. (2) Si se trata <strong>de</strong> un archivo <strong>de</strong> swap, se llama a la operación brnap asociada al inodo<br />

<strong>de</strong>l archivo para <strong>de</strong>terminar la dirección <strong>de</strong> los bloques que componen la página, y se llama a ll_rw_swap_file<br />

para leer o escribir los bloques. Esta función, <strong>de</strong>finida en el archivo fuente drivers/block/ll_rw_blk.c, genera<br />

peticiones <strong>de</strong> entradas/salidas para los bloques especificados.<br />

La función swap_after_unlock_page se llama cuando la lectura o la escritura <strong>de</strong> una página en un dispositivo<br />

<strong>de</strong> swap ha terminado, y <strong>de</strong>sbloquea la página en cuestión en el <strong>de</strong>scriptor <strong>de</strong>l dispositivo <strong>de</strong> swap. La función<br />

ll_rw_page se utiliza rara leer o escribir una página en un dispositivo en modo bloque. Bloquea la página en<br />

memoria activando el indicador PG_locked, y llama a la función brw_page para efectuar la entrada/salida.<br />

Las funciones read_swap_page y write_swap_page, <strong>de</strong>claradas en el archivo <strong>de</strong> cabecera ,<br />

llaman a rw_swap_page para efectuar una lectura o una escritura <strong>de</strong> página.<br />

La función swap_in, <strong>de</strong>finida en el archivo fuente mm/page_alloc.c, se llama para cargar una página en<br />

memoria para un proceso. Asigna una página <strong>de</strong> memoria, y llama a read_swap_page para cargar su<br />

contenido. Seguidamente, la dirección <strong>de</strong> la página se registra en la entrada <strong>de</strong> la tabla <strong>de</strong> páginas afectada.<br />

<strong>3.</strong>4.4.5.<strong>3.</strong> Eliminación <strong>de</strong> Páginas <strong>de</strong> Memoria<br />

El archivo fuente mm/vmscan.c contiene las funciones que <strong>de</strong>ci<strong>de</strong>n la eliminación <strong>de</strong> páginas <strong>de</strong> memoria y su<br />

escritura en un dispositivo <strong>de</strong> swap. La función try_to_swap_out se llama para intentar eliminar una página<br />

específica. Si la página está reservada o bloqueada, o si ha sido accedida recientemente, no se elimina <strong>de</strong> la<br />

Departamento <strong>de</strong> Lenguajes y Computación. <strong>Universidad</strong> <strong>de</strong> Almería Página <strong>3.</strong>49

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!