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

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

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

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

Otros campos interesantes <strong>de</strong> mm_struct son: (1) rss: marcos <strong>de</strong> página asignados al proceso. (2) total_vm:<br />

tamaño <strong>de</strong>l espacio <strong>de</strong> direcciones <strong>de</strong>l proceso en páginas. (3) locked_vm: Número <strong>de</strong> páginas bloqueadas.<br />

(4) mm_count: número <strong>de</strong> procesos que comparten el mismo <strong>de</strong>scriptor. (5) mmap, mmap_avl, mmap_cache:<br />

punteros a regiones <strong>de</strong> memoria. Los <strong>de</strong>scriptores se almacenan en un caché <strong>de</strong>l Slab allocator.<br />

<strong>3.</strong>4.<strong>3.</strong>8. Regiones <strong>de</strong> Memoria<br />

Linux organiza los intervalos <strong>de</strong> memoria utilizados por un proceso en lo que se <strong>de</strong>nominan regiones <strong>de</strong><br />

memoria. Estas regiones están caracterizadas por una dirección lógica inicial, una longitud y unos ciertos<br />

permisos <strong>de</strong> acceso. Linux implementa una región <strong>de</strong> memoria por medio <strong>de</strong> un objeto <strong>de</strong>l tipo<br />

vm_area_struct (<strong>de</strong>scriptor <strong>de</strong>l área <strong>de</strong> memoria virtual). Cada <strong>de</strong>scriptor i<strong>de</strong>ntifica un rango o intervalo <strong>de</strong><br />

direcciones lineales.<br />

struct vm_area_struct {<br />

struct mm_struct *vm_mm;<br />

unsigned long vm_start, vm_end;<br />

pgprot_t vm_page_prot;<br />

unsigned short vm_flags;<br />

short vm_avl_height;<br />

struct vm_area_struct *vm_next;<br />

struct vm_area_struct *vm_avl_left, *vm_avl_right;<br />

struct vm_area_struct *vm_next_share;<br />

struct vm_uea_struct **vm_pprev_share;<br />

struct vm_cperations_struct *vm_ops;<br />

unsigned long vm_offset;<br />

struct file *vm_file;<br />

unsigned long vm_pte;<br />

};<br />

Algunos campos interesantes <strong>de</strong> esta estructura <strong>de</strong> datos son los siguientes: (1) vm_start: primera dirección<br />

válida <strong>de</strong>l intervalo. (2) vm_end: última dirección válida más 1 (primera dirección fuera <strong>de</strong>l intervalo, vm_end<br />

– vm_start <strong>de</strong>nota la longitud <strong>de</strong> la región <strong>de</strong> memoria). (3) vm_mm: <strong>de</strong>scriptor <strong>de</strong> memoria dueño <strong>de</strong> la<br />

región (apunta al <strong>de</strong>scriptor <strong>de</strong> memoria virtual vm_struct <strong>de</strong>l proceso que es dueño <strong>de</strong> la región). (4)<br />

vm_flags: <strong>de</strong>rechos <strong>de</strong> acceso. (5) vm_next, vm_avl_left, vm_avl_right: punteros a otras regiones <strong>de</strong>l espacio<br />

<strong>de</strong> direcciones.<br />

Las regiones nunca se solapan, y el kernel intenta fusionarlas siempre que los <strong>de</strong>rechos <strong>de</strong> acceso coincidan:<br />

(1) El kernel pue<strong>de</strong> crear una región nueva o agrandar una existente. (2) Igualmente, al eliminar una región el<br />

kernel redimensiona las regiones afectadas, incluso dividiéndolas en dos.<br />

Organización <strong>de</strong> las regiones <strong>de</strong> memoria. Primera aproximación: lista enlazada mediante vm_next. Una<br />

operación que se realiza muy frecuentemente es la búsqueda <strong>de</strong> la región correspondiente a una dirección<br />

lineal ⇒ Mejora: or<strong>de</strong>nar ascen<strong>de</strong>ntemente la lista por direcciones lineales. Se consi<strong>de</strong>ra encontrada la región<br />

cuando por primera vez vm_end es mayor a la dirección. Como es muy probable que las siguientes búsquedas<br />

que se realicen tengan como resultado la misma región, se mantiene un puntero a la última región encontrada<br />

en el <strong>de</strong>scriptor <strong>de</strong> memoria, mmap_cache.<br />

Las regiones se utilizan para representar intervalos contiguos <strong>de</strong> direcciones lógicas con los mismos permisos<br />

o el mismo comportamiento. Todas las acciones que se <strong>de</strong>ben tomar en relación a una región vienen dadas<br />

por las operaciones establecidas en el campo vm_ops (struct vm_operations_struct). Esta estructura contiene<br />

tres campos bastante importantes: la función open, la función close y la función nopage. En particular, la<br />

función nopage indica que acción realizar cuando una dirección lógica perteneciente a esa región no tiene una<br />

página física asociada o da un fallo <strong>de</strong> protección.<br />

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

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

Saved successfully!

Ooh no, something went wrong!