Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Apuntes Fundamentos Basicos de Los Sistemas Operativos PDF
Apuntes Fundamentos Basicos de Los Sistemas Operativos PDF
ii
Condiciones de carrera......................................................................................23
Secciones críticas...............................................................................................23
Descripción de la exclusión mutua....................................................................23
Soluciones software a la exclusión mutua.........................................................24
Soluciones a la exclusión mutua con apoyo del hardware................................25
Semáforos...............................................................................................................25
Implementación.................................................................................................25
Utilidad de los semáforos..................................................................................27
Sincronización de procesos...............................................................................27
Problemas potenciales asociados a un mal uso de los semáforos.....................27
Problemas clásicos de sincronización de procesos concurrentes...........................28
El problema de los productores y los consumidores.........................................28
El problema de los lectores y los escritores......................................................28
Monitores...............................................................................................................29
Definición..........................................................................................................29
Estructura y declaración de un monitor.............................................................29
Uso de los monitores.........................................................................................30
Paso de mensajes....................................................................................................30
Definición..........................................................................................................30
Especificación de la fuente y el destino del mensaje........................................31
Esquemas de sincronización..............................................................................31
Formato y almacenamiento de los mensajes.....................................................32
Uso del paso de mensajes..................................................................................32
Capítulo 5. Interbloqueo..........................................................................................33
Introducción...........................................................................................................33
Definición y condiciones del interbloqueo............................................................33
Grafos de asignación de recursos...........................................................................33
Prevención de interbloqueos..................................................................................34
Eliminación de la condición de exclusión mutua..............................................34
Eliminación de la condición de retención y espera...........................................34
Eliminación de la no existencia de expropiación..............................................34
Eliminación de la espera circular......................................................................34
Evitación de interbloqeos.......................................................................................34
Estado de la asignación de recursos: estados seguros y estados inseguros.......35
Denegación de asignación de recursos: el algoritmo del banquero...................35
Denegación de la iniciación de un proceso.......................................................35
Detección y recuperación de interbloqueos...........................................................36
Algoritmos de detección de interbloqueos........................................................36
Frecuencia de invocación del algoritmo de detección de interbloqueos...........36
Técnicas de recuperación del interbloqueo.......................................................36
Ventajas e inconvenientes..................................................................................36
Otras estrategias de tratamiento de interbloqueos..................................................37
Capítulo 6. Administración de memoria.................................................................38
Espacio de núcleo y espacio de usuario............................................................38
Área de intercambio en memoria secundaria....................................................38
Asignación de memoria en sistemas monoprogramados.......................................39
Particionamiento fijo..............................................................................................40
Particiones de igual tamaño...............................................................................40
Particiones de distinto tamaño...........................................................................40
Traducción de direcciones y protección............................................................40
iii
Ventajas e inconvenientes..................................................................................41
Particionamiento dinámico.....................................................................................41
Asignación de espacio de memoria principal....................................................41
Traducción de direcciones y protección............................................................42
Ventajas e inconvenientes..................................................................................42
Paginación simple..................................................................................................42
Traducción de direcciones.................................................................................43
Tablas de páginas paginadas..............................................................................44
Tablas de páginas invertidas..............................................................................45
Protección..........................................................................................................46
Compartición de páginas...................................................................................46
Ventajas e inconvenientes..................................................................................46
Segmentación simple.............................................................................................46
Traducción de direcciones.................................................................................47
Protección..........................................................................................................47
Compartición de segmentos..............................................................................47
Ventajas e inconvenientes..................................................................................47
Segmentación con paginación simple....................................................................48
Capítulo 7. Memoria virtual....................................................................................49
Paginación por demanda........................................................................................49
Reinicio de instrucciones...................................................................................50
Localización de las páginas en memoria secundaria.........................................50
Bloqueo de marcos de página............................................................................50
Tratamiento de un fallo de página.....................................................................50
Conjunto de trabajo de un proceso.........................................................................51
Reemplazamiento de páginas.................................................................................51
Algoritmo de reemplazamiento óptimo.............................................................52
Algortimo de reemplazamiento LRU................................................................52
Algoritmo de reemplazamiento mediente envejecimiento................................52
Algoritmo de reemplazamiento FIFO...............................................................52
Algoritmo de reemplazamiento de la segunda oportunidad (algoritmo del reloj)
...........................................................................................................................53
Algoritmo de reemplazamiento del reloj considerando el conjunto de trabajo.53
Conclusiones sobre los algoritmos de reemplazamiento...................................54
Asignación de memoria principal..........................................................................54
Control de carga.....................................................................................................55
Copia en memoria secundaria de páginas modificadas..........................................55
Consideraciones adicionales sobre la paginación por demanda.............................55
Tamaño de página..............................................................................................55
Paginación por adelantado.................................................................................56
Reserva de marcos libres...................................................................................56
Capítulo 8. Gestión de la Entrada/Salida...............................................................57
Peticiones de E/S....................................................................................................57
Capas del núcleo de un sistema operativo encargadas de la E/S...........................57
Subsistema de E/S.............................................................................................57
Drivers de dispositivos de E/S...........................................................................58
Manejador de las interrupciones........................................................................58
Buffering................................................................................................................58
Estrategias..........................................................................................................59
Caché de buffers de bloques de disco................................................................59
iv
Spooling.................................................................................................................59
Detalles de la gestión de E/S de algunos dispositivos............................................59
Relojes...............................................................................................................59
Discos duros......................................................................................................60
Dispositivos de E/S adaptados al usuario..........................................................62
Capítulo 9. Gestión de archivos...............................................................................64
Archivos.................................................................................................................64
Tipos de archivos...............................................................................................64
Atributos de un archivo.....................................................................................64
Estructura interna de un archivo........................................................................64
Métodos de acceso a un archivo........................................................................65
Operaciones sobre archivos...............................................................................65
Directorios..............................................................................................................66
Estructura de los directorios..............................................................................66
Operaciones sobre directorios...........................................................................67
Sistemas de archivos..............................................................................................67
Estructura de un sistema de archivos.................................................................67
Montaje de un sistema de archivos....................................................................68
Asignación de espacio.......................................................................................68
Gestión del espacio libre...................................................................................69
Implementación de directorios..........................................................................70
Consistencia.......................................................................................................70
Recuperación de archivos......................................................................................71
Copias de seguridad...........................................................................................71
Instantáneas.......................................................................................................71
Eficiencia................................................................................................................72
v
Capítulo 1. Consideraciones generales de los sistemas
operativos
Un sistema operativo es una capa de software cuya función es administrar todos los dispositivos
hardware del computador y suministrar para usuarios y programas una interfaz apropiada con el
hardware.
Objetivos
Gestionar eficientemente los dispositivos hardware
• Tiempo de procesador a los programas de usuario: planificador.
• Ocupación/gestión de memoria principal
• Gestión de memoria secundaria: área de intercambio (zona donde se almacenan los
programas que hay que ejecutar pero que aún no disponen de espacio en memoria principal)
y sistema de archivos y resto de dispositivos E/S.
Ofrecer una interfaz cómoda a los usuarios. El SO proporciona una máquina virtual que envuelve al
hardware facilitando su programación. Capas:
• Hardware
• Núcleo (kernel), proporciona un conjunto de instrucciones como llamadas al sistema.
• Utilidades del SO (intérpretes de comandos, sistemas de ventanas, compiladores, etc).
• Programas de aplicación.
Evolución histórica
• Procesamiento serie
• Procesamiento por lotes (batch)
• Multiprogramación (multitarea). Aprovechamiento de operaciones de E/S de un proceso
para ejecutar otro.
• Multiprogramación por tiempo compartido. Debe gestionar los recursos asignándolos de
manera equitativa.
Llamadas al sistema
La mayoría de procesadores disponen de dos modos de operación: modo núcleo y modo usuario.
Los programas de usuario deben hacer uso de llamadas al sistema para poder utilizar los recursos
hardware a través del SO.
• Mediante el uso de librerías de llamadas al sistema, de forma similar a como se invoca
cualquier otra función.
• De forma directa, mediante programas en lenguaje ensamblador.
La llamada al sistema provoca una trampa (tramp), haciendo que el procesador conmute a modo
núcleo. Para poder acceder a los parámetros de la llamada al sistema se utiliza:
• Cargar los parámetros en registros. Método sencillo, puede que no se tengan registros
suficientes.
• Almacenamiento en un bloque o tabla de memoria. Sólo es necesario conocer la dirección
de comienzo del bloque.
• Almacenamiento en una pila.
Las llamadas al sistema, atendiendo a su funcionalidad, se pueden agrupar en:
• Control de programas en ejecución (procesos).
• Administración de archivos y directorios.
• Comunicaciones.
• Gestión de dispositivos.
• Gestión de información del sistema.
Tipos de procesos
• Procesos de usuario. Pueden ejecutarse en primer o segundo plano. Se ejecutan en modo
usuario.
• Procesos demonio. Procesos no asociados a ningún usuario. Realizan tareas relacionadas
periódicas de administración del sistema. Se ejecutan en modo usuario generalmente en
segundo plano.
• Procesos del sistema operativo. Realizan tareas de administración (como el intercambio de
procesos entre memoria principal y secundaria) del sistema en modo supervisor y,
generalmente, en segundo plano.
Estados de un proceso
Aunque el número y el nombre depende de cada sistema operativo, algunos de los estados más
habituales son:
• Nuevo.
• Preparado.
• Ejecutándose.
• Bloqueado.
• Terminado.
Además, nos podemos encontrar con otros dos estados disponibles en algunos sistemas operativos:
Creación de procesos
• Comprobar si el proceso puede ser creado.
• Asignar una nueva entrada de la tabla de procesos para el nuevo proceso.
• Reservar espacio en memoria para el proceso.
• Inicializar el bloque de control del proceso.
• Establecer los enlaces adecuados.
Las causas que originan la creación de un proceso pueden ser:
• El arranque del sistema operativo.
• Interacción del usuario mediante intérprete de comandos o entorno de ventanas.
• Inicio de un trabajo por lotes.
• Un proceso en ejecución invoca una llamada al sistema para crear otro proceso.
◦ UNIX y Linux, mediante llamada a fork. Crea una copia exacta del proceso padre.
Cuando el hijo es planificado para ejecutarse, invoca a execve, y lanza el otro programa.
Terminación de procesos
Cuando se produce una excepción en su ejecución.
Cuando finaliza la tarea para la que ha sido creado
• En UNIX, llamada al sistema exit.
• En Windows llamada a ExitProcess.
Cuando un proceso privilegiado detenga otro.
• En UNIX, llamada al sistema kill.
• En Windows, llamada al sistema TerminateProcess.
Una vez finalizado el proceso, hay que liberar los recursos que utilizaba. El PCB no se elimina
inmediatamente, sino después de haber auditado los datos.
Cambio de proceso
Un proceso A se interrumpe para iniciar o continuar la ejecución de otro proceso B: cambio de
contexto o cambio de proceso. Causas más frecuentes para un cambio de contexto son:
• El proceso en ejecución pasa al estado bloqueado.
• La terminación voluntaria o forzada del proceso en ejecución.
• El sistema operativo termina de atender una interrupción y existe un proceso B en estado
preparado con mayor prioridad que el proceso actual.
• El proceso en ejecución ha excedido el tiempo máximo de ejecución ininterrumpida.
Para proceder a un cambio de contexto, el sistema operativo sigue los pasos siguientes:
• Salva el contexto del proceso A en su PCB.
• Se ejecuta el algoritmo de planificación para seleccionar el proceso B.
• Cargar el PCB del proceso B seleccionado.
El tiempo de conmutación es el tiempo que se tarda en completar todo el proceso debido a las
limitaciones físicas de los componentes.
Procesos multihilo
Un proceso está caracterizado por dos elementos que pueden ser tratados de forma independiente:
Control de hilos
Como sucede con los procesos, un hilo puede encontrarse durante su tiempo de vida en diferentes
estados. En un determinado instante, un proceso se encontrará en un estado determinado que no
tiene por que coincidir con el estado de sus hilos. Obviamente, el estado del proceso limita el estado
en el que pueden encontrarse sus hilos: si un proceso se encuentra en estado preparado ninguno de
sus hilos puede estar ejecutándose.
La planificación de la cola de hilos se realiza a nivel de hilos. Cuando un hilo termina su ejecución
simplemente desaparece, ya no es planificable.
El poder realizar un cambio de hilo dentro de un mismo proceso cuando un hilo cambia al estado
bloqueado depende del tipo de implementación de hilos que soporte el sistema operativo.
En el momento que un hilo finaliza su ejecución sus recursos asignados son liberados. Un proceso
no puede entrar en estado terminado hasta que no hayan finalizado todos sus hilos.
Tipos de hilos
Hilos a nivel de usuario. O, simplemente, hilos de usuario, son implementados por una biblioteca
de hilos que se ejecuta a nivel de usuario. Inicialmente, una aplicación comienza con un solo hilo.
Este proceso puede iniciar otro hilo invocando a la función apropiada de la biblioteca de hilos del
SO.
Cada proceso requiere una tabla de hilos, en la que cada entrada, denominada bloque de control del
hilo, mantiene la información asociada al hilo (contador del programa, registro de pila, etc.) Esta
tabla es similar a la tabla de procesos.
La realización del cambio de hilo dentro de un mismo proceso se realiza sin necesidad de realizar
un cambio de modo y un cambio de contexto. Toda esta actividad tiene lugar en modo usuario
dentro del proceso en ejecución, sin intervención del sistema operativo. Esto proporciona las
siguientes ventajas:
Niveles de planificación
Colas de procesos para planificar los recursos del procesador:
• Cola de procesos en estado preparado.
• Cola de procesos en estado preparado en memoria secundaria.
• Cola de procesos en estado bloqueado.
• Cola de procesos en estado bloqueado en memoria secundaria.
• Cola de trabajos por lote o cola de entrada.
Un proceso puede pasar por varias colas. La actividad de determinar cuándo se entra en una cola o
se pasa a otra se denomina planificación de procesos y al componente que la realiza planificador. Se
distinguen tres niveles de planificación:
• Planificación a corto plazo, que decide qué proceso será ejecutado a continuación.
• Planificación a medio plazo, de determina qué proceso en cola de memoria principal pasa a
cola de memoria secundaria y viceversa.
• Planificación a largo plazo, determina qué trabajo por lotes pasa a ser ejecutado mediante la
creación de un proceso.
Además, se puede distinguir un cuarto nivel de planificación, la planificación de E/S.
Cada nivel de planificación es implementado por su propio planificador.
Algoritmos de planificación
Planificación de hilos
La planificación de hilos depende de los tipos de hilos soportados por el SO.
• Si sólo se soportan hilos a nivel de usuario el SO no es consciente de su existencia, debiendo
ser el proceso que los lanza quien debe encargarse de su planificación.
• Si se soportan hilos del núcleo el sistem operativo los planifica utilizando alguno de los
métodos vistos anteriormente.
◦ El planificador debe tener en cuenta la sobrecarga que puede producir en el sistema el
cambio de contexto entre hilos de distintos procesos.
Exclusión mutua
Condiciones de carrera
El problema denominado condición de carrera (race condition) surge cuando múltiples procesos
independientes se ejecutan concurrentemente y acceden para leer o escribir en un recurso
compartido. En ese caso el resultado final de la ejecución depende del órden en que se hayan
planificado los procesos.
Secciones críticas
Sección crítica o región crítica de un proceso es una instrucción o conjunto de instrucciones
secuenciales de su código que requieren manipular un recurso compartido (variable, dato, fichero,
…) con otros procesos. Dentro del código de un proceso pueden existir varias regiones críticas.
#define FALSE 0
#define TRUE 1
int turno;
int peticion_rec[2];
void acceso_sc(int pid) {
int otro_pid;
otro_pid = 1 – pid;
peticion_rec[pid] = TRUE;
turno = otro_pid;
while(turno == otro_pid && peticion_rec[otro_pid == TRUE):
}
Cada proceso llama a acceso_sc antes de acceder a su sección crítica y al salir llamaría a
salida_sc, que establece a FALSE su entrada en peticion_rec. Este algoritmo garantiza la
exclusión mutua ya que el proceso que primero ejecuta la instrucción
peticion_rec[pid] = TRUE obtiene el acceso al recurso. Se evita la posibilidad de
interbloqueo al almacenarse en turno el valor del pid del otro proceso.
El principal inconveniente es que también hay que realizar una espera activa para comprobar
el valor del cerrojo. También pueden producirse interbloqueos.
• Bloqueo de las interrupciones. Antes de entrar en una región crítica, puede ejecutarse una
instrucción especial que bloquea el mecanismo de interrupciones del sistema, restaurándolo
al salir de la sección crítica. Pero el sistema se puede degradar bastante al no permitirse
atender las interrupciones mas prioritarias en el momento en que llegan, Además, se deja en
manos del proceso la decisión de ceder el procesador, pudiendose quedar el sistema colgado
si este nunca lo devuelve. Esta solución no sirve en el caso de multiprocesadores.
Semáforos
Son un mecanismo de sincronización de procesos concurrentes gestionados por los sistemas
operativos. Un semáforo es una variable que almacena un valor entero sobre el que se pueden
realizar tres operaciones básicas:
• Asignar un valor inicial entero no negativo. S = N
Implementación
El sistema operativo se encarga de asignar las estructuras de datos necesarias para los semáforos y
de realizar las operaciones sobre ellos.
Las operaciones wait_sem y signal_sem son implementadas por el núcleo como primitivas o
funciones atómicas, esto es, que se ejecutan como un único ciclo de instrucción que no puede ser
interrumpido.
En la implementación de estas primitivas en el núcleo se ha de resolver un problema de exclusión
mutua.
En sistemas monoprocesadores la exclusión mutua se garantiza bloqueando las interrupciones
cuando se está ejecutando una operación sobre el semáforo.
void wait_sem(semaforo S) {
/* Bloqueo de interrupciones */
S.contador = S.contador – 1;
if (S.contador < 0) {
/* Añadir el proceso a la cola del semáforo */
/* Bloquear el proceso */
/* Desbloquear las interrupciones */
} else {
/* Desbloquear las interrupciones */
}
}
void signal_sem(semaforo S) {
/* Bloqueo de las interrupciones */
S.contador = S.contador + 1;
if (contador <= 0) {
/* Eliminar un proceso P de la cola del semáforo */
/* Añadir el proceso P a la cola de procesos preparados */
}
/* Desbloqueo de las interrupciones */
}
struct semaforo {
int contador;
int ocupado;
/* Otras variables para implementar el semáforo y su cola */
/* que dependen del sistema operativo */
}
void wait_sem(semaforo S) {
while (!test_set_maquina(S.ocupado)) // Bucle de espera activa
S.contador = S.contador – 1;
if (S.contador < 0) {
/* Añadir el proceso a la cola del semáforo */
/* Bloquear el proceso */
S.ocupado = 0;
}
void signal_sem(semaforo S) {
while (!test_set_maquina(S.ocupado)) // Bucle de espera activa
S.contador = S.contador + 1;
if (contador <= 0) {
/* Eliminar un proceso P de la cola del semáforo */
/* Añadir el proceso P a la cola de procesos preparados */
}
S.ocupado = 0;
}
Si el procesador no dispone de ninguna instrucción especial, debe emplearse algún algoritmo como
el de Peterson.
La cola puede gestionarse con cualquier algoritmo, siendo FIFO el más utilizado.
Sincronización de procesos
En este caso basta con que el proceso que espera la ocurrencia de un suceso ejecute wait_sem para
pasar al estado bloqueado. El proceso que lanza la operación ejecuta signal_sem para notificar que
el suceso se ha producido, provocando que el proceso que espera prosiga su ejecución.
#define TRUE 1
semaforo S
void procesoA() {
while(TRUE) {
// . . .
wait_sem(S); // Se bloquea en espera de un evento
// . . .
}
}
void procesoB() {
while(TRUE) {
// . . .
signal_sem(S); // Notifica la ocurrencia de un evento
// . . .
}
}
void main() {
init_sem(S, 0); // Inicia el semáforo binario S
ejecución_concurrente(procesoA, procesoB);
}
signal_sem(acceso);
// Sección crítica
wait_sem(acceso);
En este caso se ha invertido el órden correcto de las operaciones, por lo que varios procesos podrían
estar accediendo al mismo tiempo a la sección crítica.
wait_sem(acceso);
// Sección crítica
wait_sem(acceso)
En este ejemplo se escibe un segundo wait_sem en lugar del correcto signal_sem para indicar la
liberación del recurso. Por tanto, el proceso nunca desbloqueará el recurso, ya que una vez
#define TRUE 1
#define N 100 // Tamaño del buffer
semaforo_binario acceso;
semaforo ocupado, disponible;
void productor() {
int dato; // Dato a grabar en el buffer
while (TRUE) {
dato = generar_dato();
wait_sem(disponible); // Espera/comprueba que el buffer tenga espacio libre
wait_sem(acceso); // Espera a que el buffer esté disponible
escribir_buffer(dato); // Entrar en sección crítica: escribir en el buffer
signal_sem(acceso); // Liberar el buffer
signal_sem(ocupado); // Avisa al consumidor de la existencia de datos
}
}
void consumidor() {
int dato; // Dato a leer del buffer
while (TRUE) {
wait_sem(ocupado); // Espera a que haya datos disponibles en el buffer
wait_sem(acceso); // Espera a que el buffer esté disponible
leer_buffer(dato); // Leer dato del buffer / Sección crítica
signal_sem(acceso); // Liberar el buffer
signal_sem(disponible); // Informa que tras la lectura, hay espacio en el buffer
}
}
void main() {
init_sem(acceso, 1); // Inicializa el semáforo binario
init_sem(disponible, N); // Indica el espacio disponible
init_sem(ocupado, 0); // Indica el espacio ocupado
ejecución_concurrente(productor, consumidor);
}
Se utilizan un semáforo binario para acceder al buffer y dos semáforos para indicar el espacio
disponible y el ocupado en el buffer, que serán utilizados por los consumidores y productores.
void lector() {
while (TRUE) {
wait_sem(S2); // Intenta acceder a la variable contador
contador = contador + 1; // Hay un lector más accediendo
if (contador == 1) wait_sem(S1); // Si es el 1er lector, bloquea el acceso al escritor
signal_sem(S2); // Se libera el acceso a la variable contador
leer_dato();
wait_sem(S2); // Solicitud de acceso a la variable contador
contador = contador – 1; // Hay un lector menos
if (contador == 0) signal_sem(S1); // No hay lectores, se permite el acceso al escritor
signal_sem(S1); // Libera el acceso a la variable contador
procesar_dato();
}
}
void escritor() {
producir_dato();
wait_sem(S1); // Espera a tener acceso de escritura
escribir_dato();
signal_sem(S1); // Libera el recurso
}
void main() {
init_sem(S1, 1);
init_sem(S2, 1);
contador = 0;
}
Monitores
Definición
Un monitor, es un módulo software que consta de un conjunto de procedimientos, variables y
estructuras de datos que posee la propiedad especial de que solo permite a un único proceso
simultáneamente ejecutar alguno de sus procedimientos. Las variables contenidas en un monitor
sólo son accedidas por los procedimientos del monitor y no por procedimientos externos.
Para la sincronización de procesos, el monitor dispone de las variables de condición, cada una de
ellas asociadas a una cola de procesos bloqueados en espera de que esa condición se cumpla.
Sobre una variable de condición se pueden realizar dos operaciones, en este texto:
• wait_mon(X). El proceso que realiza esta operación queda suspendido en la cola de procesos
bloqueados asociada a la condición X. Al contrario que en los semáforos, esta operación
siempre produce el bloqueo del proceso que la invoca.
• signal_mon(X). Comprueba si en la cola de procesos bloqueados asociada a la variable X
existe algún proceso. En ese caso, se desbloquea un proceso. Esta operación no opera sobre
un contador. Si no hay ningún proceso en cola, esta operación no tiene ningún efecto y la
señal de aviso se pierde. Según la propuesta de B. Hansen (1975) el proceso que invoca esta
operación sale del monitor inmediatamente, siendo por tanto la sentencia final del
procedimiento de un monitor.
#define TRUE 1
#define N 100 // Capacidad del buffer
monitor mon1 // Definición del monitor
condicion lleno vacio; // Variables de condición
int contador; // Variables locales
char buffer[N];
{
contador = 0; // Inicialización del monitor
}
end monitor
void productor() {
while (TRUE) {
dato = producir_dato();
mon1.escribir(dato);
}
}
void consumidor() {
while (TRUE) {
mon1.leer(dato);
consumir_dato(dato);
}
}
Paso de mensajes
Definición
El paso de mensajes es un mecanismo de sincronización y comunicación entre procesos soportado
por los sistemas operativos tanto de sistemas centralizados como distribuidos. Un mensaje es un
conjunto de información que puede ser intercambiada entre un proceso emisor y un proceso
receptor.
Las operaciones básicas son:
Comunicación directa
Emisor y receptor del mensaje especifican explícitamente a qué proceso va dirigido o de quién se
espera el mensaje. Otra posibilidad es que el receptor especifique implícitamente el proceso emisor
del mensaje, pudiendo llegar éste de cualquier emisor.
La comunicación directa explícita es útil para procesos concurrentes cooperantes, la comunicación
directa implícita cuando un proceso realiza una operación en función del mensaje enviado por un
proceso que no se conoce a priori (cola de impresión...).
Comunicación indirecta
El proceso emisor envía el mensaje a una estructura de datos compartida, el buzón, que se
implementa como una cola de mensajes.
• Un emisor – un receptor: para comunicación privada entre procesos.
• Un emisor – varios receptores: para difundir determinada información entre varios procesos.
• Varios emisores – un receptor: típico en aplicaciones cliente – servidor.
• Varios emisores – varios receptores: varios servidores atienden concurrentemente a varios
clientes.
Esquemas de sincronización
Pueden distinguirse varios casos en función de si el proceso emisor o receptor pueden pasar al
estado bloqueado al realizar una operación send o receive.
• Send con bloqueo: el emisor pasa al estado bloqueado hasta que el mensaje sea recibido por
el receptor o por el buzón.
• Send sin bloqueo: el emisor envía el mensaje al buzón o al destinatario y sigue con su
ejecución. Al no garantizarse su recepción deben emplearse mensajes de respuesta. El
emisor también podría estar intentando enviar el mensaje repetidamente, degradando el
rendimiento
• Receive con bloqueo: el receptor permanece en estado bloqueado en espera un mensaje. Si
este nunca llega, el receptor quedaría indefinidamente bloqueado.
• Receive sin bloqueo. El receptor obtiene un mensaje de un buzón o un emisor y prosigue su
ejecución. El mensaje puede ser nulo o no.
El esquema más utilizado es el envío sin bloqueo y la recepción con bloqueo. El envio y recepción
con bloqueo se conoce como cita (rendezvous) entre emisor y receptor.
Ejemplo de exclusión mutua utilizando un buzón y send sin bloqueo y receive con bloqueo. El
mensaje se utiliza como paso de testigo para ir pasando la utilización del recurso entre procesos.
Introducción
De forma general, un recurso hardware o software se puede clasificar en:
• Recurso reutilizable, como archivos, semáforos, y elementos hardware. Una instancia de un
recurso reutilizable sólo puede asignarse a un proceso como máximo. Sólo cuando un
proceso finaliza el uso de de una instancia de un recurso reutilizable puede ser usada por
otro. Los recursos hardware son reutilizables.
• Recurso consumible, como buffers de entrada/salida y mensajes. Estos recursos pueden
crearse y posteriormente consumirse (destruirse).
Prevención de interbloqueos
Esta estrategia persigue eliminar alguna de las cuatro condiciones necesarias para la existencia de
interbloqueos.
Evitación de interbloqeos
Consiste en conceder sólo aquellas peticiones de recursos que tengan garantizado que no
conducirán a un estado de interbloqueo.
Un proceso debe especificar por adelantado todos los recursos que va a necesitar. Después, los va
solicitando conforme los va necesitando. Si la concesión es segura, no conduce a interbloqueo, se
realiza.
El sistema operativo debe llevar la cuenta de los recursos disponibles, el número de recursos
asignados a cada proceso y el número de recursos que restan por asignar. Además comprueba que la
asignación es segura.
34 Capítulo 5. Interbloqueo
Estado de la asignación de recursos: estados seguros y estados inseguros.
Se dispone de:
Vector de recursos existentes, RE; cada elemento del vector R En indica la cantidad de instancias n
existentes del recurso R.
Vector de recursos disponibles, RD; donde se indica el número de instancias disponibles del recurso
R.
Matriz N de recursos máximos necesitados por cada proceso. Cada fila corresponde a un proceso y
cada columna a un recurso existente en el sistema.
Matriz A de recursos asignados a cada proceso, correspondiendo cada fila a un proceso y cada
columna al número de recursos asignados
El estado del sistema con respecto a la asignación de sus recursos en un instante determinado queda
definido por los vectores RE, RD y las matrices N y A.
Un estado se dice que es seguro si posibilita al menos una secuencia de asignación de recursos a los
procesos que garantiza que estos puedan finalizar sin producirse interbloqueos. Un estado inseguro
no ofrece esa garantía, aunque no necesariamente tiene que conducir a un estado de interbloqueo.
En la práctica, habría que comprobar que ( N i− Ai)≤R D , esto es, que los recursos necesitados
menos los asignados no superan los recursos disponibles.
Ver ejemplos 5.3 y 5.4 en el libro de teoría, páginas 176-179.
Ventajas e inconvenientes
La detección y recuperación de interbloqueos permite una mayor concurrencia de procesos ya que
no limita el número de asignaciones. Sin embargo, la detección introduce sobrecarga aunque puede
limitarse con algoritmos eficaces. La recuperación sí produce elevada sobrecarga y
desaprovechamiento de recursos. Es eficaz en sistemas con baja probabilidad de interbloqueos.
36 Capítulo 5. Interbloqueo
Otras estrategias de tratamiento de interbloqueos
• Estrategias mixtas, agrupando los recursos en diferentes clases, ordenando las clases para
evitar la espera circular y utilizando para cada clase la estrategia más oportuna.
• Ignorar los interbloqueos. Sistemas como UNIX o Windows no utilizan ninguna estrategia
de tratamiento de interbloqueos.
Particionamiento fijo
La forma más sencilla de gestionar la memoria en sistemas multiprogramados consiste en dividir la
memoria principal en un número fijo de N particiones que pueden ser de igual o diferente tamaño.
Esta división puede realizarse manualmente al arrancar el sistema o de manera automática.
Esta técnica se conoce como particionamiento fijo.
Se reserva una partición para contener el sistema operativo en un extremo de la memoria,
normalmente en la parte baja. Las restantes N-1 particiones estarán disponibles para cargar
procesos.
El número de particiones define el grado de multiprogramación del sistema.
El sistema operativo mantiene una tabla de descripción de particiones que contiene la dirección
física de comienzo (dirección base), el tamaño y el estado (libre o no) de cada partición.
Ventajas e inconvenientes
La principal ventaja es su facilidad de implementación, únicamente requiere de una tabla de
descripción de particiones y una o varias colas, lo que produce poca sobrecarga.
Los principales inconvenientes son que provoca fragmentación interna, el tamaño máximo de un
proceso y la limitación del grado de multiprogramación en función del número de particiones.
Particionamiento dinámico
En el particionamiento dinámico el número de particiones no es fijo, sino que va variando con el
tiempo. La memoria principal se divide en particiones, una zona contigua de memoria ocupada, y
huecos, una zona contigua de memoria libre. Esta técnica ha dejado de utilizarse, pero fue usada en
macrocomputadoras como el OS/MVT de IBM.
Cuando un proceso debe ser cargado en memoria el sistema localiza un hueco del mismo tamaño o
mayor que el proceso. Ese espacio define una partición y el espacio sobrante define un nuevo
hueco.
Conforme se van cargando procesos se van generando nuevos huecos cada vez más pequeños, en lo
que se conoce como fragmentación externa. Una técnica para solucionar la fragmentación externa
es la compactación de memoria, que consiste en agrupar todos los huecos y mover las particiones.
El inconveniente es que se produce alta sobrecarga.
Es común que se utilice una unidad mínima de asignación o bloque de memoria mínimo. Esto evita
el tener huecos de pequeño tamaño que no pueden ser utilizados. Como contrapartida, se produce
fragmentación interna, aunque despreciable en comparación con la técnica de particionamiento fijo.
El sistema mantiene una o varias estructuras de datos que contengan información sobre los huecos y
las particiones. Estas estructuras pueden ser mapas de bits o listas enlazadas simples o dobles.
Manteniendo una lista para huecos y otra para particiones asignadas es posible acelerar el proceso
de búsqueda de hueco disponible.
Ventajas e inconvenientes
• Minimiza la fragmentación interna, que es como máximo cercana a una unidad de
asignación
• Permite ejecutar procesos de mayor tamaño.
• Permite asignar fácilmente más espacio a procesos cuya región de datos o pila aumenta por
encima del tamaño inicialmente asignado, reubicando el proceso o asignando un hueco
contíguo.
Los inconvenientes son
• Estructuras de datos más complejas, que aumentan la sobrecarga del sistema.
• Produce fragmentación externa, lo que reduce el aprovechamiento de la memoria.
Paginación simple
La técnica de paginación consiste en dividir la memoria principal en bloques del mismo tamaño, S P,
denominados marcos de página o páginas físicas. El espacio de direcciones de un proceso también
se divide en bloques del mismo tamaño SP, denominados páginas o páginas lógicas.
Una página de un proceso se carga en un marco de página libre de memoria principal.
Si CMP es la capacidad de la memoria principal, el número N MP de marcos de página de tamaño SP en
que se divide es
N MP = floor
( )
C MP
SP
Cada marco de página se identifica de forma unívoca mediante un número de marco de página j. De
esta manera, se hará referencia al marco de página j o marco j de la memoria principal.
Traducción de direcciones
El hardware debe disponer de ciertos componentes donde cargar la información necesaria para
realizar la traducción de instrucciones. Pueden ser:
• Registro base, donde se almacena la dirección física de comienzo de la tabla de páginas.
• Banco de registros, para almacenar una copia completa de la tabla de páginas.
Protección
En la gestión de memoria mediante paginación, la protección se implementa a nivel de página. Cada
entrada i de la tabla de páginas de un proceso contiene un campo de uno o varios bits que permiten
determinar el tipo de acceso permitido sobre dicha página: w, rw, x, etc. En caso de intento de
violación se lanza una excepción.
También se incorpora un registro límite donde se carga el número de páginas de que consta el
proceso.
Compartición de páginas
El espacio lógico de un proceso puede dividirse en las regiones de código, datos y pila. En
paginación simple, todas las páginas deben estar cargadas en memoria.
En sistemas de tiempo compartido, multiples usuarios pueden estar ejecutando el mismo programa
de manera simultanea. Si el programa posee código reentrante, no modificable, se puede ahorrar
espacio en memoria cargando sólo una imagen de ese proceso y compartiéndola entre todos los
usuarios.
Se utiliza un contador de referencias que lleva la cuenta del número de instancias activas. Se
elimina de memoria cuando el contador se hace cero.
Ventajas e inconvenientes
La paginación simple presenta varias ventajas
• No produce fragmentación externa.
• Produce una sobrecarga pequeña, la gestión de las estructuras de datos no requiere de mucho
tiempo de procesador.
• No precisa de intervención humana para la definición de las particiones.
• Permite compartición de código común entre varios procesos.
La principal desventaja es que produce fragmentación interna, de término medio, media página por
proceso.
La paginación es invisible al programador, lo que puede ser considerado tanto como una ventaja
como un inconveniente.
Segmentación simple
La segmentación simple es una técnica de gestión de la memoria que soporta los elementos en los
que se descompone el código de un programa. Básicamente, el compilador divide el programa en
segmentos. Cada segmento es una entidad lógica conocida por el programador y asociada a una
determinada estructura de datos o módulo.
Cada segmento, código principal, subrutinas, datos, pila... tiene su propio espacio de direcciones
lógicas. Cuando el sistema operativo crea un proceso asociado a un determinado programa, asigna
a cada segmento un identificador numérico positivo h, el número del segmento.
Traducción de direcciones
Si se dispone de un registro base, en cada cambio de contexto el sistema carga en ese registro la
dirección física de comienzo de la tabla de segmentos, Dir F0, obtenida del bloque de control del
proceso.
Para llegar a una dirección física DirF a partir de una dirección lógica DirL se siguen estos pasos:
• Se suman el campo número de segmento h de la dirección lógica y Dir F0 para obtener la
dirección DirF1 de la entrada h de la tabla de segmentos.
• Se accede a DirF1 y se lee la dirección física base y la longitud del segmento h.
• Se compara el campo desplazamiento con la longitud del segmento, lanzando una excepción
si se supera el tamaño.
• Si el desplazamiento es menor que la longitud se suma la dirección física base del segmento
h al desplazamiento indicado en DirL para obtener la dirección física DirF equivalente.
El principal inconveniente es que se requiere de un acceso a memoria para leer la tabla de
segmentos, lo que provoca un retardo en la ejecución de la instrucción en curso.
Para acelerar la ejecución puede utilizarse un banco de registros o un TLB.
Protección
La protección del espacio de direcciones se implementa a nivel de segmento. En cada entrada h de
la tabla de segmentos de un proceso se almacenan los permisos de acceso sobre dicho segmento.
Adicionalmente suele haber un registro límite donde se almacena en cada cambio de contexto el
número de segmentos de que consta el proceso que va a ser ejecutado.
Compartición de segmentos
Esta técnica permite que un segmento de código o datos sea compartido por más de un proceso.
Para ello el sistema operativo mantiene una tabla con los segmentos cargados en memoria principal
en la que se contabilizan las referencias que otros procesos realizan a estos segmentos. Cuando el
contador de referencias se haga cero, el segmento puede ser eliminador de memoria principal.
Ventajas e inconvenientes
Como ventajas:
• Produce una fragmentación interna despreciable, de como máximo cercana a una unidad de
asignación.
• Soporta la visión modular que el programador posse del programa.
Reemplazamiento de páginas
El reemplazamiento de páginas consiste en seleccionar una página k cargada en un marco j de
memoria principal para ser reemplezada por la página i a la que hacía referencia la dirección virtual
que produjo el fallo de página. La página seleccionada para ser reemplazada se denomina página
Tamaño de página
El tamaño de página viene determinado por la arquitectura del computador, siempre potencia de
dos. Algunos computadores permiten seleccionar el tamaño dentro de un rango de valores. Para
seleccionar el tamaño adecuado hay que tener en cuenta:
• Fragmentación interna. De promedio es de media página por proceso. Cuanto mayor sea el
tamaño de página, mayor será la cantidad de memoria no utilizada.
• Tamaño de la tabla de páginas. Cuanto menor sea el tamaño de página en más páginas se
descompondrá el proceso y en consecuencia el tamaño de la tabla de páginas será mayor.
Además el tiempo de cambio de proceso aumenta al tener que cargar o vaciar más registros,
con MMU, o banco de registros, si se dispone de TLB.
• Número de fallos de página. Si el tamaño de página es pequeño el espacio de direcciones
virtual constará de más páginas, aumentando la probabilidad de que se produzca un fallo de
página.
• Tiempo de uso de E/S. Se tarda menos tiempo en transferir una página de tamaño grande que
varias de tamaño más pequeño. Si el espacio de direcciones virtuales se descompone en
Peticiones de E/S
Una operación de E/S puede ser solicitada por un proceso o por el propio sistema operativo
mediante una llamada al sistema indicando la dirección lógica del dispositivo, la dirección lógica
del espacio del proceso donde se almacenarán los datos y la cantidad de datos a transferir.
Subsistema de E/S
Es el componente que se encarga de efectuar todas las tareas necesarias para la realización de las
operaciones de E/S comunies a todos los dispositivos e independiente de estos. Entre sus tareas se
encuentran:
• Asignación y liberación de dispositivos dedicados. Los dispositivos dedicados son aquellos
que sólo pueden ser utilizados por un proceso cada vez, como impresoras o unidades de
cinta. El subsistema de E/S determina si la petición de un proceso sobre un dispositivo
dedicado puede ser aceptada o rechazada.
• Bloqueo de procesos que solicitan una operación de E/S. El susbistema puede decidir pasar
al estado bloqueado al proceso que realiza la petición de E/S, dependiendo del tipo de
llamada y del estado del dispositivo.
• Planificación de la E/S. El sistema debe planificar el usao de los dispositivos con el fin de
optimizar su uso, disminuir el tiempo de espera promedio y distribuir equitativamente el uso
de los recursos, atendiendo a las prioridades de las peticiones.
• Invocación del driver de dispositivo apropiado. Para el subsistema de E/S, un dispositivo es
una caja negra que soporta un conjunto estándar de operaciones. Realmente cada dispositivo
implementa estas operaciones de forma diferente y son los drivers los que conocen estas
particularidades.
• Almacenamiento temporal de datos o buffering.
Buffering
Si la transferencia de datos desde un dispositivo al proceso que realiza la petición se realizara de
forma directa a su espacio de direcciones, el proceso debería estar cargado en un marco de memoria
durante todo el tiempo desde la petición hasta la obtención de resultados. El marco debe ser
bloqueado para evitar que la página del proceso fuera reemplazada. Cuanto mayor sea el número de
Estrategias
• Buffering con buffer único. Los datos se transfieren desde el dispositivo hasta el buffer y del
buffer al espacio del proceso en una operación de lectura. Desde el espacio del proceso al
buffer y del buffer al dispositivo en una operación de escritura. No se puede volver a utilizar
el buffer hasta que no finalice la operación completa y se vacíe el buffer.
• Buffering con dos buffers o buffering doble. Cuando se llena un buffer se utiliza el siguiente.
Mientras se llena el segundo se vacía el primero. En esta estrategia se desacopla el productor
del consumidor, ya que mientras uno escribe en un buffer se lee del otro. Además se reduce
el tiempo de espera de productor o consumidor.
• Buffering circular. Cuando un proceso realiza ráfagas largas de E/S es más conveniente el
empleo del bufferfng circular, consistente en disponer de varios bufferes utilizados de forma
consecutiva, volviendo a emplear el primero, si está vacío, finalizado el ciclo.
Spooling
Una técnica muy utilizada para la asignación y control de los dispositivos de E/S dedicados, como
una impresora, suele utilizarse la técnica del spooling. Se implementa mediante un proceso demonio
y un directorio especia, directorio de spool o spooling. El proceso demonio es el único autorizado
para acceder al dispositivo. Si un proceso quiere hacerlo, envía los archivos deseados al directorio
de spooling desde donde el demonio los irá cogiendo para enviarlos al dispositivo.
Relojes
Una forma de generar una señal periódica, reloj, es mediante un chip denominado reloj
programable que, entre otros, contiene un contador, un registro y un cristal de cuarzo.
Un reloj programable dispone de varios modos de operación, como el de disparo único o el de onda
cuadrada. En el modo disparo único cuando el contador alcanza el valor cero se genera una
interrupción y se detiene hasta que vuelva a ser inicializado.
En modo onda cuadrada el reloj se rearma automáticamente volviendo a cargar en el contador el
valor del registro y comenzando de nuevo la cuenta.
Discos duros
Estructura física
Está formado por varios platos circulares de aleaciones de metal o plástico recubiertas de material
magnetizable que giran en torno a un eje vertical común a velocidades típicas de 5400, 7200 o
10800 rpm.
Cada superficie se divide en anillos concéntricos llamados pistas. Las pistas se dividen en sectores
donde se almacena la información. El sector es la unidad básica de transferencia de información de
un disco.
Sobre cada superfice existe un brazo en cuyo extremo se monta una cabeza de lectura/escritura. El
conjunto formado por las pistas de todas las superficies de todos los platos situadas a la misma
distancia del eje de rotación se denomina cilindro.
Archivos
Desde el punto de vista de los usuarios de los computadores, la unidad de trabajo es la abstracción
de almacenamiento en memoria secundaria conocida como archivo o fichero.
Tipos de archivos
Un archivo informáticose puede definir como un conjunto de información relacionada que se
almacena en memoria secundaria y que se identifica mediante un nombre, como una cadena de
caracteres. En general, un archivo contiene programas o datos.
Dos de los tipos de archivos comunmente soportados por los sistemas operativos son los directorios
y los archivos regulares u ordinarios.
Un directorio es un archivo que almacena una lista de los archivos y otros directorios que contiene.
Un archivo regular puede ser un archivo ASCII o un archivo binario.
• Un archivo binario contiene información de cualquier tipo codificado en binario con una
estructura determinada que solo puede ser interpretada por los programas que los utilizan.
• Un archivo ASCII está compuesto de líneas de caracteres ASCII codificados en binario que
no requiere de un programa que las interprete.
El nombre de un archivo es una cadena de caracteres. Cada sistema de archivos soportado por el
sistema operativo especifica la longitud máxima y el tipo de caracteres que puede tener. La
extensión del archivo proporciona información sobre el tipo de archivo. Sistemas como UNIX
ignoran las extensiones y otros como Windows las reconoce e interpretan asociándolas con el
programa que los genera.
Atributos de un archivo
La lista de atributos varía en función del sistema de archivos pero en general se tiene:
• Tipo de archivo.
• Tamaño, en bytes, palabras o bloques.
• Localización, ubicación en memoria secundaria.
• Creador y propietario. Identifica al usuario que lo creó y su actual propietario.
• Permisos de acceso. Para determinar quién puede acceder y qué puede hacer con el archivo.
• Información asociada al tiempo. Como fecha y hora de creación, modificación, último
acceso, etc.
Sistemas de archivos
Asignación de espacio
Un aspecto importante es la forma en que se asignan los bloques físicos del área de datos del
sistema. Los métodos más utilizados son la asignación contigua, la asignación enlazada y la
asignación indexada.
Asignación contigua
Se asigna a un archivo un conjunto de bloques físicos contiguos. Así, si un archivo consta de N
bloques y el primer bloque se almacena en BF0, el segundo lo hará en BF0 + 1, y el último ocupará el
bloque físico BF0 + N - 1.
Este método minimiza las operaciones de búsqueda en disco y soporta tanto archivos de acceso
secuencial como aleatorio.
Presenta la desventaja de producir fragmentación externa. Sucesicos procesos de creación y borrado
de archivos provocará la aparición de huecos cada vez más pequeños, siendo necesario compactar
el disco, esto es, trasladar todos los archivos a un lado de la partición y todos los huecos al otro.
Otro inconveniente es que el sistema operativo debe conocer de antemano el espacio que va a
ocupar el archivo. Si se le asigna un hueco de tamaño superior al necesario se producirá
fragmentación interna. Si se le asigna un espacio inferior al que podría alcanzar tendrá que
recurrirse a alguna estrategia cuando necesite más espacio.
Asignación enlazada
El método de asignación enlazada consiste en almacenar al principio de cada bloque físico asignado
a un archivo la dirección física del siguiente bloque físico del archivo. Así, se organiza como una
lista enlazada de bloques físicos.
Permite usar cualquier bloque, por lo que no produce fragmentación externa y evita conocer por
adelantado el tamaño del archivo.
Resulta muy lento para su utilización con archivos de acceso aleatorio ya que para localizar un
bloque hay que pasar por todos los anteriores.
Además, la utilización de algunos bytes del bloque para almacenar la dirección del bloque siguiente
provoca que haya menos espacio disponible para datos y que este espacio no sea potencia de dos,
dificultando el procesamiento y la eficiencia.
Implementación de directorios
Un directorio es un archivo que almacena una lista de los archivos y subdirectorios que contiene.
Algunos sistemas, como FAT-32, almacena en cada entrada de un directorio el nombre del archivo o
subdirectorio y sus atributos, entre los que se encuentra la información para localizar los bloques de
datos que lo contiene.
En UFS (UNIX) o ext2 de Linux, se almacena en cada entrada el nombre del archivo o
subdirectorio y un puntero (número de nodo-i) a la estructura de datos (nodo-i) donde se almacenan
los atributos del archivo. Esta organización precisa de un acceso más a disco para copiar el nodo-i a
memoria principal.
Entre las implementaciones más comunes de directorios se encuentran:
• Directorios con entradas de igual tamaño. En cada entrada se almacenan las informaciones
asociadas al archivo y a continuación el nombre del archivo. Es sencilla de gestionar pero
para dar soporte de nombres largos cada entrada debe tener ese máximo, lo que supone un
derroche de espacio.
• Directorios con entradas de tamaño variable. Primero se almacena el tamaño que ocupa la
entrada, a continuación la información asociada a la entrada (atributos o nodo-i y finalmente
el nombre de archivo (hasta un cierto tamaño) al que se le añade un carácter especial para
marcar el final del nombre. Cada entrada se rellena para que coincida con un entero positivo
de palabras de memoria principal. Como máximo se despercicia casi una palabra. Cuando se
eliminan entradas quedan huecos de longitud variable, generando fragmentación externa que
puede precisar de una compactación del directorio.
• Directorios con entradas de igual tamaño y montículo (heap) para almacenar los nombres
de los archivos. Se almacena un puntero al comienzo del nombre de archivo dentro de l
montículo y sus atributos o nodo-i. Elimina la fragmentación externa y no es necesario
incluir caracteres de relleno, pero es de administración más complicada al tener que
gestionarse el montículo.
Otro aspecto a considerar está relacionado con la forma en que se realiza la búsqueda de un archivo
en un directorio, por ejemplo, buscando las entradas una a una.
Para ahorrar tiempo se puede mantener una cache de directorios con las entradas recientemente
accedidas o implementar cada directorio con una tabla hash y su lista de archvos y subdirectorios.
Cuando se desea realizar una búsqueda se introduce el nombre en la función hash que devolverá qué
entrada de la tabla hay que leer. Si la entrada está vacía, el archivo no existe. Para evitar las
colisiones cada entrada se puede implementar como una lista enlazada.
Consistencia
Para verificar la consistencia del sistema de archivos se suele incluir en los sistemas operativos un
verificador de consistencia. las inconsistencias más frecuentes que pueden presentarse en el sistema
de archivos son:
• Un bloque no aparece en la lista de bloques libres ni está asignado a ningún archivo. Se
soluciona añadiendo el bloque a la lista de bloques libres.
Recuperación de archivos
Copias de seguridad
Existen dos tipos de copias de seguridad:
• Copia de seguridad lógica. Únicamente contiene los directorios y archivos que el
administrador o el usuario desea copiar al medio de respaldo. Permite acceder a los
contenidos de forma individualizada. Estas copias pueden ser de tres tipos:
◦ Copia completa, con todos los archivos seleccionados.
◦ Copia diferencial, únicamente los archivos nuevos o modificados desde la última
completa determinada.
◦ Copia incremental, únicamente los archivos creados o modificados desde la última
completa o incremental.
• Copia de seguridad física. También conocida como imagen de disco. Consiste en copiar
bloque a bloque la partición de disco. Son más simples de realizar pero requieren montar la
imagen para iniciar la recuperación.
Instantáneas
ZFS, de Solaris, utiliza la técnica de copiar al escribir, copy-on-write. En esta técnica si el sistema
operativo precisa modificar el contenido de un bloque en el disco se localiza un bloque libre y se
copia el contenido modificado en ese bloque, modificando los punteros para que apunten a ese
nuevo bloque.
El sistema agrupa las modificaciones y las realiza cada cierto tiempo (valor típico 30 segundos).
Cada modificación se etiqueta con un número de versión diferente. La versíón actual coexiste con
versiones anteriores del sistema de archivos. Cada nueva versión se denomina instantánea
(snapshot). Cada instantanea puede montarse como un archivo de solo lectura para reacuperar datos
individualmente o en modo de escritura para restaurar el sistema completo a un estado anterior.
Las instantáneas no son una copia de seguridad. Las diferencias fundamentales son:
• Las instantáneas se toman de forma prácticamente inmediata y no ocupan espacio en el
momento de su creación. Sólo se requiere cambiar el número de versión actual.
• Las instantáneas pueden ser restauradas con gran rapidez. Tan solo es necesario volver a
montar el sistema de archivos a partir de la versión anterior.
Eficiencia
La eficiencia del sistema aumenta notablemente si se reduce al mínimo imprescindible el número de
accesos de E/S a disco. Para lograr ese objetivo algunos sistemas operativos implementan en
memoria principal una caché de bloques de disco.
Para mejorar la tasa de aciertos de caché se utiliza la estrategia de lectura por adelantado de
bloques, que consiste en copiar en la caché no solo el bloque que ha dado el fallo sino varios
bloques contíguos a éste.
También puede intentarse que los accesos a disco consuman poco tiempo, por ejemplo almacenando
en el mismo cilindro los bloques a los que se espera acceder de forma secuencial.
En sistemas con nodo-i sería conveniente que éstos estuvieran lo más cerca posible de los bloques
de datos del archivo, por lo que el mejor sitio para almacenarlos sería la zona central del disco.
Otro aspecto a considerar es el tamaño de bloque de disco, en un compromiso entre un bloque
pequeño que reduce la fragmentación interna pero aumenta el número de accesos o un bloque
grande que desaprovecha espacio pero con menor número de accesos. Distintas pruebas demuestran
que un tamaño óptimo de bloque está en unos pocos KiB.