Gestión de Procesos y Memoria: Interbloqueo, Inanición, Exclusión Mutua y Técnicas de Memoria Virtual

Enviado por Chuletator online y clasificado en Informática y Telecomunicaciones

Escrito el en español con un tamaño de 4,97 KB

El interbloqueo, bloqueo mutuo o deadlock consiste en que varios procesos necesitan varios recursos y cada uno obtiene un recurso, pero necesita los otros, por lo que tendrá que esperar a que el otro lo libere para poder usarlo. Por ejemplo, hay dos niños que quieren jugar con un arco y una flecha; de repente, uno coge el arco y el otro la flecha. Ninguno de los dos podrá jugar hasta que el otro libere el recurso que posee.

La inanición ocurre en multitarea cuando un proceso o hilo necesita un recurso, pero se les va asignando ese recurso a otros procesos, pero nunca a ese. Por tanto, ese proceso o hilo nunca podrá realizar la tarea que debe.

Cooperación entre procesos

Cooperación entre procesos por compartimiento: las operaciones de escritura deben ser obligatoriamente excluyentes, y las secciones críticas deben garantizar que no haya cambios en los datos por más de un proceso a la vez.

Cooperación entre procesos por comunicación: deben pasarse mensajes entre los procesos, pero aun así puede producirse un interbloqueo (un proceso espera un mensaje de otro) o una inanición (dos procesos se mandan mensajes mientras que un tercero está esperando mensajes).

Exclusión Mutua

Un concepto importante es la exclusión mutua. Esto se da en la zona crítica y se basa en que, cuando ningún proceso esté en la zona crítica, cualquiera que lo solicite podrá entrar. Cada proceso podrá estar ahí un tiempo finito, y no se podrán hacer suposiciones sobre cuánto tiempo tardará en salir.

Para evitar problemas de exclusión mutua, usamos semáforos que pueden ser robustos (se usan en FIFO y evitan inanición) o débiles (no previenen inanición). Si un semáforo tiene un valor positivo, entonces este se activa; si no, está apagado. Una señal signal aumenta el valor del semáforo en 1, mientras que una señal wait lo disminuye en uno.

Memoria Virtual

La memoria virtual es el uso combinado de espacio de la RAM más el disco duro. Esto se usa para que haya más espacio de almacenamiento total. El sistema operativo mantiene en memoria solo las partes del programa que se están usando y manda a disco el resto. Lo bueno de la memoria virtual es que permite que pueda haber más procesos en memoria virtual, ayuda a que la multiprogramación sea más efectiva y permite que exista un proceso que en su totalidad sea más grande que la memoria principal.

Inconvenientes de la Memoria Virtual

Pero la memoria virtual trae consigo inconvenientes, como los fallos de direccionamiento = fallos de página, que ocurren cuando se pide una página que no existe, por lo que ese proceso pasa a estar bloqueado esperando el suceso de que exista esa página.

Otro problema muy típico es la hiperpaginación o thrashing, que tiene que ver con la memoria a largo plazo y consiste en que el sistema operativo se pasa más tiempo trayendo y llevando cosas a disco que ejecutando procesos.

Fragmentación de la Memoria

La fragmentación externa se produce cuando los procesos asignados han ocupado posiciones no contiguas de memoria, dejando demasiados bloques libres de pequeño tamaño, en los que no "caben" nuevos procesos.

La fragmentación interna se produce cuando los procesos son demasiado pequeños en comparación con el tamaño que tenemos reservado para cada proceso (marco >> proceso) y, por tanto, desperdiciamos espacio.

Paginación y Segmentación

La paginación consiste en que la memoria se divide en bloques de tamaño fijo llamados marcos, y la memoria virtual se divide en bloques del mismo tamaño llamados páginas. Los programas se dividen en páginas, y al ejecutar un proceso se cargan sus páginas en los marcos disponibles. La paginación evita la fragmentación externa, pero crea fragmentación interna en el último marco. Es invisible al programador.

Si hay un fallo de página, el SO coge una página poco usada, la manda a disco y asigna la página a la que queremos acceder al marco que acabamos de dejar vacío.

Por otro lado, tenemos la segmentación, donde se divide un programa en distintos segmentos. Los segmentos pueden ser de distintos tamaños e incluso cambiar de tamaño dinámicamente, por lo que se soluciona el problema de la fragmentación interna que provoca la paginación. Pero al elegir los marcos que más se ajusten en tamaño a nuestro proceso, se provocará mucha fragmentación externa. Aquí la segmentación es visible al programador (el programador conoce el tamaño libre, etc. y debe gestionarlo).

La paginación multinivel permite no tener en memoria tablas de páginas completas, ya que solo esta tabla ya puede ser más grande que toda la memoria principal.

Entradas relacionadas: