FUNDAMENTOS BÁSICOS DE LOS SISTEMAS OPERATIVOS
José Manuel Díaz Martínez Díctino Chaos García Rocío Muñoz Mansílla Joaquín Aranda Almansa
sanz y torres
FUNDAMENTOS BÁSICOS DE LOS SISTEMAS OPERATIVOS
Todos los derechos reservados. Queda prohibida, sa lvo excepción prevista en la ley, cualquier forma de reproducción , distribución, comun icac ión pública y transformación de esta obra sin contar con la autorización de los autores Ylo editores. La infracción de los derechos mencionados puede ser co nstitutiva de delito contra la propiedad intelectual. © José Manuel Díaz Martínez, Dictino Chaos García , Rocío Muñoz Mansilla , Joaquín Aranda Almansa
© EDITORIAL SANZ y TORRES, S. L. cl Pinos Alta , 49 - 28029 Madrid ~ 902 400 415 - 91 314 55 99 www.sanzytorres.com
[email protected] www.sanzytorres.com/editorial
[email protected] ISBN : 978-84-92948-47-5 Depósito legal: M-26812-2011 Portada: Masterline. S. L.
cl Las Minas, 1, 28250 Torrelodones (Mad rid )
Composición: Autores Impresión: Edigrafos, S. A.
cl Volta, 2, PoI. Ind. San Marcos, 28906 Getafe (Madrid )
Encuadernación: Felipe Méndez, S. A.,
cl Del Carbón, 6 y 8, PoI. Ind . San José de Valderas 2, 28918 Leganés (Madrid )
~
Indice general Prefa cio
XVII
Lista de acrónimos y abreviaturas
XXI
Computadores y programas
1
0. 1. Introducción . . . . . . . . .. . . . . . . 0.2. Componentes hardware de un computador 0.2.1. Procesador . . . . . . 0.2.2. Memoria principal . . 0.2.3. Controladores de E/S. 0.2A. Buses .. . . . . . 0.3 . Jerarquía de memoria . . . . . 0 .-+. Instrucciones y programas .. 0.4.1. Repertorio de instrucciones. OA.2. Ciclo de ejecución de una instrucción OA.3 . Generación de un fichero ejecutable 0.5. Técnicas de Entrada/ Salida . . . . . . . . 0.5.1. E/S controlada por programa . . . 0.5.2. E/S controlada por interrupciones 0.5.3. Acceso directo a memoria .. 0. 6. Arranque de un computador personal. 0. 7. Resumen . . . . .. . 0.8. Lecturas recomendadas 0.9. Autoevaluación 0. 10. Problemas . . . . . . .
2 2 2 4
10 11 13 14 14 16 17 18 20 20 21
l. Consideraciones generales de los sistemas operativos
25
1.1. Introducción. . . . . . . . . . . . . . . . . . . . . 1. 2. Definición, objetivos y servicios de un sistema operativo 1.2.1. Definición y objetivos de un sistema operativo VII
6 8 8 9
9
25
26 26
VIII
Fundamentos básicos de los sistemas operativos
1.2.2. Servicios de un sistema operativo . . 1.3. Evolución histórica de los sistemas operativos 1.3.1. Los primeros sistemas operativos 1.3.2. Introducción de la multiprogramación en los sistemas operativos 1.3 .3. Sistemas operativos modernos . . . . . . . . . . . . . . . . . . lA. Tipos de sistemas operativos . . . . . . . . . . . . . . . . . . . . . . . 104.1. Clasificación en función del número de usuarios que se pueden atender simultáneamente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 104.2. Clasificación según el número de programas cargados en la memoria principal 104.3. Clasificación en función de los requisitos temporales de los programas a ejecutar 10404. Clasificación en función de la finalidad del computador . 1.4.5. Otros tipos importantes de sistemas operativos 1.5. Llamadas al sistema. . . . . . . . . . . . . . . . . . . . . . . . 1.6. Estructura del núcleo de un sistema operativo . . . . . . . . . . 1.6.1. Componentes principales del núcleo de un sistema operativo 1.6.2. Tipos de estructuras del núcleo . 1.7. Resumen . . . . . . . 1.8. Lecturas recomendadas 1.9. Autoevaluación . . . . 2. Descripción y control de procesos 2.1. Introducción. . . . . . . . . . 2.2. Descripción de los procesos . . 2.2.1. Definición de proceso 2.2.2. Espacio de direcciones de memoria lógica o virtual de un proceso 2.2.3. Tipos de procesos. . . 2.204. Estados de un proceso .. . . . . . . . . . 2.3 . Control de los procesos . . . . . . . . . . . . . . . 2.3.1 . Estructuras de control del sistema operativo 2.3.2. Creación de procesos . . 2.3.3 . Terminación de procesos 2.304. Cambio de proceso . . . 204. Ejecución del sistema operativo 2.5. Procesos multihilos . . . . . . . 2.5.1. Concepto de hilo . . . . 2.5.2. Ventajas e inconvenientes 2.5.3. Control de hilos . . . . . . 2.504. Tipos de hilos . . . . . . . 2.5.5. Principales configuraciones en función del número y tipo de hilos soportados por un sistema operativo 2.6. Resumen . . . . . . . . . .
28 29 29 30 32 34 34 34 37 39 40 40 44 44 45 49 50 50 53 54 54 54 55 57 57 60 60 62 63 64 65 67 67 67 70 70 72
74
Índice general
2.7. Lecturas recomendadas 2.8 . Autoevaluación 2.9. Problemas .. .. . .
IX
76 76 77
3. Planificación de procesos 3.1 . Introducción. . . . . 3.2. Niveles de planificación . . . . . . 3.2.1. Planificador a corto plazo . 3.2.2. Planificador a medio plazo 3.2.3. Planificador a largo plazo . 3.3. Criterios generales considerados en la planificación de procesos 3.4. Criterios considerados en la planificación del procesador 3.5 . Expropiabilidad del procesador. . . . . . . . . . . . . . . . . . 3.6. Algoritmos de planificación . . . . . . . . . . . . . . . . . . . . 3.6.1. Algoritmo de planificación del primero en llegar - primero en ser servido 3.6.2. Planificación de primero el proceso más corto . . . . 3.6.3. Planificación del proceso con menor tiempo restante 3.6.4. Planificación de tumo rotatorio . . . . . . . . . . . . 3.6.5. Planificación basada en prioridades . . . . . .. . . 3.6.6. Planificación basada en múltiples colas de prioridad 3.6.7. Planificación basada en múltiples colas de prioridad y realimentación 3.6.8. Planificación por tiempo límite . . . . . 3.6.9. Elección del algoritmo de planificación 3.7. Planificación de hilos . 3.8. Resumen . .. . . . . 3.9. Lecturas recomendadas 3. 10. Autoevaluación 3. 11. Problemas . . .. . ..
81 8] 82 83 85 85 87 87 88 89 89 91 94 95 99 10] 103 106 107 107 109 111 111 112
~.
117 117 119 119 119 121 123 124 129 131 131 134
Sincronización y comunicación de procesos 4.1. Introducción . . . . . . . . . . . . . . . 4.2. Exclusión mutua . . . . . . . . . . .. 4.2.1. Interacción entre procesos concurrentes 4.2.2. Condiciones de carrera . . . . . . . 4.2.3. Secciones críticas . . . . . . . . . . . . 4.2.4. Descripción de la exclusión mutua . . . 4.2.5. Soluciones software a la exclusión mutua 4.2.6. Soluciones a la exclusión mutua con apoyo del hardware 4.3. Semáforos .. . . .. . . 4.3.1. Definición .. . . 4.3.2. Implementación .
•
x
Fundamentos básicos de los sistemas operativos
4.3.3 . Utilidad de los semáforos. . . . . . . . . . . . . . . . . . . . . 4.3.4. Problemas potenciales asociados a un mal uso de los semáforos Problemas clásicos de sincronización de procesos concurrentes 4.4.1. El problema de los productores y los consumidores 4.4.2. El problema de los lectores y los escritores Monitores . . . . . . . . . . . . . . . . . . . . 4.5.1. Definición . . . . . . . .. . . . . . . . 4.5.2. Estructura y declaración de un monitor 4.5.3 . Uso de los monitores Paso de mensajes . . . . . . . . . . . . . . . . 4.6.1. Definición . . . . . . . . . . . . . . . . 4.6.2. Especificación de la fuente y el destino del mensaje . 4.6.3 . Esquemas de sincronización . . . . . . . . 4.6.4. Formato y almacenamiento de los mensajes 4.6.5 . Uso del paso de mensajes Resumen . . . . .. . Lecturas recomendadas Autoevaluación Problemas
137 139 141 141 143 145 145 147 148 151 151 151 153 154 155 159 161 161
5. Interbloqueo 5.1. Introducción . . . .. . . . . . . . .. . . 5.2. Definición y condiciones del interbloqueo 5.3. Grafos de asignación de recursos . . . . . 5.4. Prevención de interbloqueos . . . . . . . 5.4.1. Eliminación de la condición de exclusión mutua 5.4.2. Eliminación de la condición de retención y espera . 5.4.3. Eliminación de la condición de no existencia de expropiación 5.4.4. Eliminación de la condición de espera circular .. . . . . . . 5.5. Evitación de interbloqueos . . . . . . . . . . . . . . . . . . . . . . . 5.5.1. Estado de la asignación de recursos: estados seguros y estados inseguros. 5.5.2. Denegación de asignación de recursos: el algoritmo del banquero 5.5.3. Denegación de la iniciación de un proceso. 5.6. Detección y recuperación de interbloqueos. . . . . . . . . . . . . . . . . 5.6.1. Algoritmos de detección de interbloqueos . . . . . . . . . . . . . 5.6.2. Frecuencia de invocación del algoritmo de detección de interbloqueos 5.6.3. Técnicas de recuperación del interbloqueo. 5.6.4. Ventajas e inconvenientes .. . . . . . . . 5.7. Otras estrategias de tratamiento de interbloqueos 5.7.1. Estrategia mixta de tratamiento de interbloqueos 5.7.2. Ignorar los interbloqueos . . . . . . . . . . . . .
167
4.4.
4.5.
4.6.
4.7 . 4.8. 4.9. 4.10.
164
]67 168 169 172 172 172 173 173 174 174 179 180 181 181 184 185 185 186 186 187
Índice general
5.8. 5.9. 5.10. 5. 11.
Resumen Lecturas recomendadas Autoeva1uación Problemas . . . . . . .
6. Administración de memoria 6.1 . Introducción. . . . . . . . . . . . . . . . . . . 6.2. Definiciones previas . . . . . . . . . . . . . . . 6.2.1. Espacio del núcleo y espacio de usuario 6.2.2. Área de intercambio en memoria secundaria. 6.3. Asignación de memoria en sistemas monoprogramados 6.4. Particionamiento fijo . . . . . . . . 6.4.1. Características . . . . . . . . 6.4.2. Particiones de igual tamaño . 6.4.3. Particiones de distinto tamaño 6.4.4. Traducción de direcciones y protección 6.4.5. Ventajas e inconvenientes 6. 5. Particionamiento dinámico .. . . . . . . .. . 6.5 .1. Características . . . . . . . . .. . . . 6.5.2. Asignación de espacio de memoria principal 6.5.3. Traducción de direcciones y protección 6.5.4. Ventajas e inconvenientes 6.6. Paginación simple .. . . . . . . . 6.6.1. Descripción .. .. . . . . 6.6.2. Traducción de direcciones 6.6.3 . Tablas de páginas paginadas 6.6.4. Tablas de páginas invertidas 6.6.5. Protección . .. . . . . . 6.6.6. Compartición de páginas . 6.6.7. Ventajas e inconvenientes 6.7 . Segmentación simple . . . . .. . 6.7.1. Descripción .. .. . . . . 6.7 .2. Traducción de direcciones 6.7.3. Protección .. .. . . . . 6.7.4. Compartición de segmentos 6.7.5. Ventajas e inconvenientes 6.8. Segmentación con paginación simple. 6.9. Resumen . . . . .. . 6.] O. Lecturas recomendadas 6.11 . Autoevaluación 6.12. Problemas . . . . . . .
XI
187 188 189 190
193 193 195 195 195 ]97 199 199 202 202 204 206 207 207 213 214 214 215 215 227 232 236 238 238 239 240 240 244 245 245 245 246 248 251 251 253
•
XII
Fundamentos básicos de los sistemas operativos
7. Memoria virtual 7.1. Introducción. . . . . . . 7.2. Paginación por demanda 7.2.1. Descripción... 7.2.2. Reinicio de instrucciones 7.2.3. Localización de las páginas en memoria secundaria 7.2.4. Bloqueo de marcos de página .. 7.2.5. Tratamiento de un fallo de página 7.3. Conjunto de trabajo de un proceso . . . . 7.4. Reemplazamiento de páginas . . . . . . . 7.4.1. Algoritmo de reemplazamiento óptimo 7.4.2. Algoritmo de reemplazamiento LRU . . 7.4.3 . Algoritmo de reemplazamiento mediante envejecimiento 7.4.4. Algoritmo de reemplazamiento FIFO . . . . . . . . . . 7.4.5 . Algoritmo de reemplazamiento de la segunda oportunidad (algoritmo del reloj) 7.4.6. Algoritmo de reemplazamiento del reloj considerando el conjunto de trabajo 7.4.7. Conclusiones sobre los algoritmos de reemplazamiento 7.5. Asignación de memoria principal. . . . . . . . . . . . . 7.6. Control de carga . . . . . . . . . . . . . . . . . . . . . . . . . 7.7 . Copia en la memoria secundaria de páginas modificadas 7.8. Consideraciones adicionales sobre la paginación por demanda 7.8.1. Tamaño de página . . . . 7.8 .2. Paginación por adelantado 7.8.3. Reserva de marcos libres 7.9. Resumen .. . . . . . 7.10. Lecturas recomendadas 7.11. Autoeva1uación 7.12. Problemas . . . . . . .
8. Gestión de la Entrada/Salida 8.1. Introducción. . . . . . . 8.2. Peticiones de E/S . . . . 8.3. Capas del núcleo de un sistema operativo encargadas de la E / S 8.3 .1. Subsistema de E/S . . . . . . . . 8.3.2. Drivers de dispositivos de E/S .. 8.3.3. Manejadores de las interrupciones 8.4. Buffering . . . . . 8.4.1. Definición.. . . . . . . . . . . . 8.4.2. Estrategias . . . . . .. . . . . . 8.4.3 . Caché de buffers de bloques de disco 8.5. Spooling .. . . . . . . .. . . . . . . . . . .
257 257 259 259 262 264 267 268 269 272 274 275 277 279 280 285 289 289 292 292 293 293 294 296 296 299 299 301
305 305 307 308 309 311 313 314 314 315 317 318
Índice general
.6. Detalles de la gestión de la E/S de algunos dispositivos 8.6.1. Relojes . . . . . .. . . . . . . . . . . . 8.6.2. Discos duros . . . . . . . . . . . . . . . 8.6.3. Dispositivos de E/S adaptados al usuario .7 . Resumen . . . . . . . .8. Lecturas recomendadas .9. Autoevaluación .10. Problemas . . . Gestión de archivos 9. 1. Introducción .. . . . . . 9. 2. Archivos . .. .. . . . . 9.2.1. Tipos de archivos 9.2.2. Atributos de un archivo. 9.2.3. Estructura interna de un archivo 9.2.4. Métodos de acceso a un archivo 9.2.5. Operaciones sobre archivos 9. 3. Directorios . . . . . . . . . . . . . 9.3.1. Estructura de los directorios 9.3.2. Operaciones sobre directorios 9.4. Sistemas de archivos .. . . . . . . . 9.4.1. Estructura de un sistema de archivos 9.4.2. Montaje de un sistema de archivos 9.4.3. Asignación de espacio . .. . 9.4.4. Gestión del espacio libre . . . 9.4.5. Implementación de directorios 9.4.6. Consistencia . . . . 9. 5. Recuperación de archivos .. 9.5 .1. Copias de seguridad 9.5.2. Instantáneas. 9.6. Eficiencia . . . . . . . 9. 7. Resumen . . . . . . . 9. 8. Lecturas recomendadas 9.9. Autoevaluación 9.10. Problemas . . . . .
10. Seguridad y protección 10. 1. Introducción . . . . 10.2. Seguridad de un sistema informático 10.2.1. Objetivos de la seguridad 10.2.2. Políticas de seguridad
xm 318 3i8 321 329 330 332 332 334
337 338 339 339 341 341 342 344 345 345 354 354 354 356 356 365 369 374 377 377 378 379 380 383 383 385
387 387 388 388 389
•
XIV
Á.
Fundamentos básicos de los sistemas operativos
10.3. Autenticación de usuarios . 10.3.1. Contraseñas . . . . 10.3.2. Objetos físicos .. 10.3.3. Características fisiológicas o de comportamiento 10.4. Software malicioso . . 10.4.1 . Bomba lógica .. 10.4.2. Puerta secreta .. 10.4.3. Caballo de Troya 10.4.4. Virus . . . . . 10.4.5. Gusano . . . . . 10.4.6. Programa espía . 10.5. Mecanismos de protección 10.5.1. Matriz de acceso . 10.5.2. Listas de control de acceso 10.5.3. Listas de capacidades. 10.6. Sistemas confiables . . . . . 10.6.1. Definición . . . . .. . 10.6.2. Seguridad multinivel . 10.6.3. Principios de diseño de sistemas operativos seguros 10.7. Resumen . . . . . . . 10.8. Lecturas recomendadas 10.9. Autoevaluación . . . .
389 390 391 391 392 392 392 392 393 394 394 394 395 398 399 401 401 401 402 403 404 404
Unidades y funciones matemáticas usadas en el texto Al. Unidades . . . . . . . . . . . . . . .. . . . . . . A1.1. Unidades de almacenamiento de la información A.1.2. Unidades de tiempo. A.2. Funciones matemáticas . A.2.1. Función módulo A2.2. Función ceil. . . A2.3. Función ftoor . . A.2.4. Codificación binaria de N elementos
407
B. Tablas hash B.1. Definición B.2. Operaciones básicas . . . B.3. Ventajas e inconvenientes
407 407 408 408 408 409 409 410 411 411
413 413
Índice general
C. Soluciones completas de los problemas
c. l. C. 2. C.3 . CA.
C. 5. C. 6. C.7 . C.8 . C.9 .
Soluciones problemas capítulo O Soluciones problemas capítulo 2 Soluciones problemas capítulo 3 Soluciones problemas capítulo 4 Soluciones problemas capítulo 5 Soluciones problemas capítulo 6 Soluciones problemas capítulo 7 Soluciones problemas capítulo 8 Soluciones problemas capítulo 9
xv
415 415 422 428 438 450 455 462 470 475
Bi bliografía
479
lndice alfabético
481
Prefacio Objetivos Los sistemas operativos son un pilar central de cualquier sistema informático y constituyen en sí :ni smos una materia de conocimiento fundamental que debe estar presente de manera ineludible en mayor ,:> menor medida en el plan de estudios de cualquier disciplina sobre computación (Informática, Ingeniería l e Computadores, Ingeniería del Software, Sistemas de la Información, Tecnologías de la Información,
=',. Este libro tiene como objetivo fundamental explicar, de la forma más clara posible, los fundamentos _ ' icos de los sistemas operativos. Como resultado del estudio y aprendizaje de los contenidos de este .1 ro. el estudiante será capaz de: • Comprender qué es un sistema operativo y cuáles son funciones y objetivos principales. • Conocer los servicios y componentes de un sistema operativo. Así como las diferentes estructuras que puede presentar el núcleo de un sistema operativo. • Comprender qué es un proceso y un hilo, y conocer las ventajas e inconvenientes del modelo de proceso monohilo y del modelo de proceso multihilo. • Conocer cómo los procesos son administrados y controlados por un sistema operativo. • Identificar los diferentes tipos de planificadores de procesos y conocer los algoritmos básicos de planificación. • Comprender la necesidad de la exclusión mutua y conocer diferentes soluciones hardware y software para garantizarla. • Conocer los principales mecanismos de sincronización y comunicación entre procesos: semáforos, monitores y paso de mensajes. • Comprender qué es un interbloqueo y cuándo se produce. Distinguir entre las diferentes estrategias de tratamiento de los interbloqueos. • Conocer y distinguir los diferentes esquemas de gestión de la memoria principal en un sistema con multiprogramación. xvn
XVIII
Fundamentos básicos de los sistemas operativos
• Conocer cómo gestiona un sistema operativo la Entrada/Salida (E/S) del computador. • Conocer cómo gestiona un sistema operativo los archivos y directorios. Comprender qué son los sistemas de archivos y cuáles son sus principales características. • Comprender la necesidad de implementar mecanismos de seguridad y protección en un sistema informático, y conocer los principales mecanismos de protección proporcionados por un sistema operativo.
A quién va dirigido este libro Este libro está concebido para ser la bibliografía básica de la asignatura Sistemas Operativos que se imparte en el segundo curso de los Grados de Ingeniería Informática y de Tecnologías de la Información de la UNED. Asimismo puede resultar de utilidad a estudiantes de Escuelas de Ingenierías o Facultades de Ciencia que tengan en sus planes de estudio asignaturas relacionadas con sistemas operativos. Por supuesto, este libro también puede ser utilizado por cualquier persona que desee aprender los fundamentos de los sistemas operativos.
Organización Los contenidos de este libro se organizan en once capítulos. El capítulo O está pensado como repaso de los conocimientos sobre los componentes físicos de un computador (hardware) y los programas informáticos (software) que son necesarios conocer inicialmente para comprender los fundamentos básicos de los sistemas operativos. En el capítulo 1 se incluyen una serie de consideraciones generales sobre los sistemas operativos. Se define qué es un sistema operativo y cuáles son sus objetivos y servicios. Además se describe la evolución histórica de los sistemas operativos, los diferentes tipos de sistemas operativos y las llamadas al sistema. Finalmente, se analizan las diferentes estructuras del núcleo de un sistema operativo. El capítulo 2 se dedica a la descripción y control de procesos. En primer lugar se trata la descripción de los procesos, es decir, su definición, tipos y estados. En segundo lugar se describen ¡as estructuras de datos y las principales tareas del sistema operativo asociadas con el control de procesos . En tercer lugar se realizan diversas consideraciones relativas a la ejecución del sistema operativo. La parte final del capítulo está dedicada a presentar el modelo de proceso multihilo. El capítulo 3 está dedicado a la planificación de procesos . En este capítulo se describen los diferentes niveles de planificación existentes, se enumeran y explican los criterios generales considerados en la planificación de procesos, se analiza cómo afecta en la planificación la expropiación del procesador, se describe el funcionamiento y las características de los principales algoritmos de planificación de procesos, y se analiza la planificación de hilos. En el capítulo 4 se explica la sincronización y comunicación de procesos. En este capítulo en primer lugar se define la exclusión mutua y se presentan algunas soluciones software y hardware que permiten garantizarla. En segundo lugar se describen los semáforos. A continuación, se plantean y se resuelven
Prefa cio
XIX
_ ~;:¡
el uso de semáforos algunos problemas clásicos de sincronización de procesos concurrentes. Postese estudian los monitores y el paso de mensajes. El capitulo 5 está dedicado al estudio del interbloqueo. En primer lugar se realiza una definición de -:.:erbloqueo y se describen las condiciones que se tienen que dar para que se produzca. A continuación ; ~sc ri ben las principales estrategias que se pueden adoptar para tratar los interbloqueos.
-: : ~ e n te
Lo capítulos 6 y 7 están dedicados a la administración de memoria por parte del sistema operativo. las principales técnicas de administración de memoria principal que no con_ ~e ran la existencia de memoria virtual: particionamiento fijo , particionamiento dinámico , paginación _j¡ le y segmentación simple. El capítulo 7 está dedicado al estudio de la memoria virtual. En concreto ....c C'\ plica la implementación de la memoria virtual mediante paginación por demanda, que es la más _ : ::lún.
=-:. el capítulo 6 se estudian
El capítulo 8 está dedicado a explicar la gestión de la E / S por parte de un sistema operativo. Se -: , :- lican las características y las tareas que realizan las diferentes capas en que se estructura el software =~:.:ugado de E / S del núcleo de un sistema operativo. También se estudia la gestión de la E / S de algunos .=..--;,'Úsitivos de E / S como los relojes, los disco duros, la pantalla, el teclado y el ratón. El capitulo 9 está dedicado a explicar la gestión de los archivos que realiza el sistema operativo. En la ~.J:lera parte del capítulo se realizan ciertas consideraciones sobre los archivos y directorios soportados :-.::- n sistema operativo. En la segunda parte se explican diversos aspectos de los sistemas de archivos. En el capítulo lO se realiza una breve introducción a la seguridad y protección de un sistema infor- 2.:1 ~o haciendo especial hincapié en aquellos contenidos que involucran al sistema operativo. El libro también contiene tres apéndices. En el apéndice A se incluyen las definiciones de las unidades . :.:.5 fu nciones matemáticas que se usan en este libro. En el apéndice B se explica qué son y cómo :'-,-::,c10nan las tablas hash, las cuales aparecen en los capítulos 6, 8 y 9. Finalmente en el apéndice e se .=. : ~u y e n las soluciones completas de los cerca de 50 problemas incluidos en este libro, la mayoría de los : ""':':es han sido propuestos en exámenes.
Cómo usar el libro Este libro está pensado para la educación a di stancia, por ello sus contenidos han sido organizados ~~k cc io nados para un aprendizaje progresivo y secuencial. Además se incluyen numerosas figuras y =,E~ p l os que ayudan a comprender los contenidos expuestos. Por otra parte, el estudiante dispone de cuestiones de autoevaluación y de las soluciones de todos ~ : problemas para poder comprobar si efectivamente ha asimilado los contenidos y ha alcanzado los : :,' e i\'os marcados. Todos los capítulos tienen una estructura uniforme. En primer lugar, se enumeran los objetivos do: E]leS del capítulo. En segundo lugar, se realiza una introducción a los contenidos del capítulo. En tercer , _~ ar. se incluyen los contenidos propiamente dichos. En cuarto lugar, se realiza un resumen de los con';::.Jdos. el cual ayuda a fijar los contenidos más importantes. En quinto lugar, se incluyen las lecturas :-:- 'omendadas. En sexto lugar, se incluyen las cuestiones de autoevaluación, a través de las cuales el ~:'J di ante puede establecer el grado de asimilación de los contenidos y deducir qué contenidos debe
xx
Fundamentos básicos de los sistemas operativos
repasar. Finalmente, se plantean varios problemas con los que practicar con los contenidos aprendidos. Se recomienda intentar hacer cada problema antes de mirar su solución en el apéndice C.
Sobre los datos, unidades y funciones matemáticas usados en este libro Conviene tener presente que los datos numéricos relativos al hardware y software que aparecen en este libro están referidos al año 2010. Por otra parte, en el apéndice A se incluyen las definiciones de las unidades y de las funciones matemáticas usadas en el texto.
Contacto con los autores: envío de erratas, comentarios y sugerencias Con el objetivo de ir mejorando este libro en sus futuras ediciones, los autores estaremos encantados de recibir en la dirección so@dia. uned. es todas las erratas, comentarios y sugerencias que deseen enviamos. Además en la página web http: //www .uned.es /7 19 02 04 8 se irán recopilando todas las erratas que se vayan detectando.
Lista de acrónimos y abreviaturas .-\CL .-\PI .-\SClI BIOS BSD CD CHS CMOS CP/ M CPU CRC CTSS DMA DVD E/ S ECC EEPROM FAT FCFS FIFO FMS GUI lOE
IEEE ISA JCL LBA LRU LSI MacOS Malware
Access Control List Application Program Interface American Standard Code for Information Interchange Basic Input-Output System Berkeley Software Distribution Compact Disc Cylinder-Head-Sector Complementary Metal Oxide Semiconductor Control Program for Microcomputers Central Processing Unit Cyclic Redundancy Check Compatible Time-Sharing System Direct Memory Access Digital Versatile Disc Error Correcting Code Electrically-Erasable Programmable ReadOnly Memory File Allocation Table First-Come First-Served First Input - First Output Fortran Monitor System Graphical U ser Interface Integrated Device Electronics Institute of Electrical and Electronic Engineers Industry Standard Architecture Job Control Language Logical Block Addressing Least Recently Used Large Scale Integration Macintosh Operating System Malicious software XXI
Lista de control de acceso Interfaz de programas de aplicación Código estándar americano para el intercambio de información Sistema básico de Entrada/Salida Distribución de software de Berkeley Disco compacto Cil indro-cabeza-sector Semiconductor óxido-metal complementario Programa de control para microcomputadores Unidad central de procesamiento Comprobación de Redundancia Cíclica Sistema de tiempo compartido compatible Acceso directo a memoria Disco versátil digital Entrada/ Salida Código de corrección de errores Memoria de sólo lectura programable y borrable eléctricamente Tabla de asignación de archivos Primero en llegar primero en ser servido Primero en entrar primero en salir Sistema monitor de Fortran Interfaz de usuario gráfica Dispositivos electrónicos integrados Instituto de ingenieros eléctricos y electrónicos Arquitectura estándar de la industria Lenguaje de control de trabajos Direccionamiento de bloques lógicos Usada menos recientemente Integración a gran escala Sistema Operativo de Macintosh Software malicioso
XXII
Fundamentos básicos de los sistemas operativos MBR MIT MMU MS-DOS MULTICS Nodo-i npi OS jMFf OS jMVT PC PCB PCI PDA PFF POSIX POST RAID RAM ROM S ATA SCSI SI SJF SPN Spyware SRT SSTF TCB TLB UCT ut USB VMS VRAM
Master Boot Record Massachusetts Institute of Technology Memory Management Unit MicroSoft-Disk Operating System MULTiplexed Information and Computing Service
Multiprogramming with a Fixed number of Task Multiprogramming with a Variable number ofTask Personal Computer Process Control Block Peripheral Component Interconnect Personal Digital Assistant Page Fault Frequency Portable Operating System Interface based on uniX Power On Self Test Redundant Array of Independent Disks Random Access Memory Read Only Memory Serial Advanced Technology Attachment Small Computers System Interface Le Systéme International d'Unités Shortest Job First Shortest Process Next Spy software Shortest Remaining Time Next Shortest Search Time First Trusted Computer Base Translation Lookaside Buffer Universal Coordinated Time Universal Serial Bus Virtual Memory System Video Random Access Memory
Registro de arranque maestro Instituto Tecnológico de Massachusetts Unidad de gestión de memoria Sistema operativo de disco de Microsoft Servicio de cálculo e información multiplexada Nodo índice Nivel de prioridad de interrupción Multiprogramación con un número fijado de tareas Multiprogramación con un número variable de tareas Computador personal Bloque de control del proceso Interconexión de componentes periféricos Asistente digital personal Frecuencia de fallos de página Interfaz de sistema sistema operativo portable basada en UNIX Autotest de encendido Array redundante de discos independientes Memoria de acceso aleatorio Memoria de sólo lectura Acoplamiento de tecnología avanzada en serie Sistema de interfaz para computadores pequeños Sistema Internacional de unidades Primero el trabajo más corto A continuación el proceso más corto Software espía A continuación el de menor tiempo restante Primero el del tiempo de búsqueda más corto Base de computador confiable Buffer de traducción de vista lateral Tiempo coordinado universal unidades de tiempo Bus universal en serie Sistema de memoria virtual Memoria de acceso aleatorio de vídeo
Capítulo O
Computadores y programas Objetivos docentes El principal objetivo de este capítulo es el de repasar los conocimientos sobre los componentes físie un computador (hardware) y los programas informáticos (software) que son necesarios conocer ~:. .alrne nte para comprender los fundamentos básicos de los sistemas operativos. Más en detalle los - =-.· :ó'Ii \ os docentes de este capítulo son los siguientes: • Saber cuáles son las funciones de los principales componentes de un computador. • Distinguir los diferentes tipos de memoria presentes en la estructura jerárquica de memoria de un computador. • Saber qué es una instrucción y un repertorio de instrucciones. • Conocer cuáles son las fases del ciclo de ejecución de una instrucción. • Conocer los pasos de generación de un fichero ejecutable. • Conocer la diferencia entre direcciones lógicas y direcciones físicas. • Conocer el funcionamiento de las principales técnicas de realización de la Entrada/Salida (E/S) en un computador: E/S controlada por programa, E/S controlada por interrupciones y acceso directo a memoria. • Conocer y diferenciar los diferentes tipos de interrupciones. • Conocer los pasos que se realizan durante el proceso de arranque de un computador personaL
2
Fundamentos básicos de los sistemas operativos
0.1.
Introducción
Un computador es una máquina electrónica cuya función principal es la ejecución de programas informáticos, que son conjuntos de instrucciones y datos representados en código binario (también conocido como código máquina). Además, un computador es capaz de aceptar datos a través de un medio de entrada, procesarlos automáticamente bajo el control del programa en ejecución y proporcionar la información resultante a través de un medio de salida. En este capítulo se introducen de forma resumida aquellos conocimientos sobre los componentes físicos de un computador y los programas informáticos que son necesarios conocer inicialmente para poder comprender los fundamentos básicos de los sistemas operativos a los cuáles está dedicado este libro. En primer lugar se describen los principales componentes hardware de un computador: el procesador, la memoria principal, los controladores de Entrada/Salida (E/S) y los buses. En segundo lugar se comenta la jerarquía de memoria existente en un computador. En tercer lugar se explica qué es el repertorio de instrucciones de un computador y cuáles son las fases que se distinguen en la ejecución de una instrucción. En cuarto lugar se comenta la generación de un programa ejecutable. En quinto lugar, se describen las posibles formas de realización de la E / S en un computador. Finalmente, se describe el proceso de arranque de un computador personal.
0.2.
Componentes hardware de un computador
En función de sus prestaciones y de su tamaño es posible distinguir diferentes tipos de computadores: supercomputadores, macrocomputadores, minicomputadores, servidores, estaciones de trabajo, computadores personales, computadores de mano (PDAs, teléfonos móviles inteligentes, ... ), y computadores integrados en otros sistemas (automóviles, microondas, reproductores DVD, reproductores MP3,...). De forma general, independientemente del tipo de computador considerado, todos ellos están compuestos por uno o varios de los siguientes tipos de componentes físicos (ver Figura 0.1): procesador, memoria principal y controlador o adaptador de E/ S. Estos componentes se encuentran interconectados a través de uno o varios conjuntos de líneas conductoras denominadas buses. Las siguientes secciones se dedican a describir brevemente cada uno de estos componentes.
0.2.1.
Procesador
El procesador, también denominado como microprocesador o unidad central de procesamiento (Central Processing Unit, CPU), se encarga de ejecutar secuencialmente las instrucciones de un programa y controlar el funcionamiento de los restantes componentes del computador. Un procesador consta de los siguientes componentes: • Unidad de control. Se encarga de buscar e interpretar las instrucciones y generar las señales de control necesarias a los restantes elementos del computador para su procesamiento. • Unidad de procesamiento . Se encarga de la realización de operaciones aritméticas y lógicas sobre los datos.
Computadores y programas
3
Computador Procesador
Memoria principal
Controlador DMA Bus
Controlador disco
Controlador DVD-Rom
Controlador Gráfico
______________
- - ______ 1
Figura 0.1 - Principales componentes hardware de un computador personal
• Registros. Permiten al procesador almacenar de forma temporal información necesaria para su fu ncionamiento. De forma general se distinguen en un procesador los siguientes tipos de registros: - Registro de instrucción. Contiene la instrucción actual que se tiene que ejecutar. - Registro contador de programa. Contiene la dirección de memoria donde se encuentra la próxima instrucción que hay que ejecutar. Puntero de pila. Dependiendo del tipo de procesador contiene la dirección de memoria de la próxima entrada libre (o de la última entrada ocupada) de la pila. Registro de estado del procesador. Contiene diferentes campos para almacenar información del estado del procesador en relación con el programa actualmente en ejecución, como por ejemplo: el modo de ejecución, el nivel de prioridad, el indicador de rebose, el indicador de arrastre, etc. - Registros de propósito general. Para el almacenamiento de datos y resultados.
Otros componentes presentes en el circuito integrado de un microprocesador son la unidad de gestión memoria (Memory Management Unit, MMU), que será descrita en la sección 7.1, y la memoria caché, ": _~ se describe en la próxima sección. ~
4
Fundamentos básicos de los sistemas operativos
El procesador es un dispositivo de lógica secuencial que opera en función de una señal de sincronización, que usualmente es una onda cuadrada periódica. Dicha señal es producida por un reloj , que es un circuito electrónico basado en un oscilador de cuarzo, encargado de emitir pulsos eléctricos a un periodo constante. A cada pulso emitido se le denomina ciclo de CPU. Al número de ciclos emitidos por segundo se le denomina frecuencia del reloj del procesador y se mide en hercios (Hz). La frecuencia de reloj de un procesador sirve para indicar la velocidad a la que un procesador realiza sus operaciones más básicas, como sumar dos números o transferir el valor de un registro a otro. En la actualidad, el circuito integrado o chip del procesador contiene varios minichips o núcleos cada uno de los cuales es un procesador completo.
0.2.2.
Memoria principal
La memoria principal es el componente hardware del computador donde se almacenan temporalmente los programas que se van a ejecutar. A la unidad natural de organización de la memoria se le denomina palabra, que es un conjunto ordenado de n bits contiguos que son manejados como un conjunto por la máquina. Los computadores actuales tienen un tamaño de palabra de 32 o 64 bits. Para leer o escribir en la memoria se debe especificar la dirección física que se desea leer o escribir, que es un identificador numérico entero positivo asociado a cada contenido o unidad direccionable de memoria. Usualmente la unidad direccionable utilizada suele ser una palabra, aunque algunos computadores permiten un direccionamiento a un nivel inferior, como por ejemplo un byte. Como el computador trabaja con números binarios, las direcciones físicas deben expresarse también en binario. Si la memoria principal consta de N unidades direccionables entonces el número n de bits necesarios para representar una dirección física de memoria se obtiene resolviendo la siguiente desigualdad (ver apéndice A):
La memoria principal se puede visualizar como una matriz de celdas (ver Figura 0.2) cada una de las cuales es capaz de almacenar un bit. El modelo de memoria más sencillo es aquél que considera que cada fila de la matriz contiene una palabra .
• Ejemplo 0.1 En la Figura 0.2 se representa el contenido de una memoria principal que consta de N = 16 palabras con una longitud de palabra de L = 8 bits . También se han representado las direcciones físicas (DirF) expresadas en decimal asociadas a cada palabra. Se observa que el rango de direcciones físicas comprende las direcciones O a 15. El número de bits n necesarios para representar en binario una dirección física de esta memoria se obtiene resolviendo la siguiente desigualdad: mín {N n
Como 16 = 24 entonces n = 4 bits.
~
2 11 }
Computadores y programas
5
_ :-r ej emplo, si se referencia a la dirección física DirF = 10102 = 1010 en una operación de lectura se ' ederá al contenido de la palabra direccionada, que en este caso es 110 11 00 1.
~
L=8 bits
Dirf
~(-----~)
o
1 OO 1 OOOO O 1 OO 1 OO 1
2
1 O l O 1 O 1 O
3
O 1 O 1 1 1 O 1
4
1 OO 1 OOOO
5
O 1 OO 1 OOO
6
1 OO 1 1 1 1 1
7
1 1 O 1 O 1 OO
8
1 OO 1 OOOO
9
O 1 OOOOO 1
10 1 1 O 1 1 O O 1 11
1 OOO 1 O l 1
12 1 O O 1 O O O O 13 O 1 O O 1 O 1 O
14 1 O O l 1 O O l 15 O 1 O O 1 O 1 O
Figura 0.2 - Contenido de la memoria principal del Ejemplo 0.1
• Como todas las palabras poseen la misma longitud, la capacidad de la memoria principal CMP se como el producto del número total N de palabras por el número L de bits de que consta una ::<:':'abra : .::~ ' ula
C MP = N (palabras)-L (bits/palabra) La capacidad de una memoria se puede expresar en bits, en bytes o en alguno de sus múltiplos (ver -:--..:ndice A). También es común expresar la capacidad de memoria en palabras. En este último caso, a ::-' e5 se omiten las unidades, con lo que se sobreentiende que la capacidad está expresada en palabras. '. Ej emplo 0.2 .: ..)nsidérese una memoria principal que consta de 2 mebipa1abras con una longitud de palabra de 32 bits. =-.:: 'apacidad C MP se puede expresar de cualquiera de las siguientes formas :
6
Fundamentos básicos de los sistemas operativos
a) CMP
= 2 mebipalabras·32 (bits/palabra) = 221
palabras·32 (bits/palabra).
b) CMP = 2 mebipalabras = 221 palabras. c) CMP
= 2 Mi.
d) C MP = 64 mebibits = 64 Mib.
Nótese que la forma a) de expresar la capacidad de memoria es la que contiene más información ya que especifica el número de palabras y la longitud en bits de una palabra. Por el contrario la forma d) es la que menos información contiene ya que no permite conocer explícitamente ni el número de palabras ni la longitud en bits de una palabra.
•
La memoria principal de un computador está compuesta por uno o varios módulos de memoria RAM. El contenido de una memoria RAM se puede leer o escribir tantas veces como sea necesario. Sin embargo, su contenido es volátil, es decir, cuando se apaga el computador su contenido se borra. Otro tipo de memoria volátil también presente en un computador son las memorias CMOS que se utilizan para almacenar la fecha y la hora o parámetros de configuración (como por ejemplo el dispositivo de E/S desde el que se debe arrancar el sistema operativo). Para que el contenido de una memoria CMOS no se borre cuando se apague el computador debe ser alimentada por una pequeña batería, similar a la usada en los relojes de pulsera. Muchos computadores disponen también de pequeñas memorias no volátiles como las memorias ROM, las memorias EEPROM y las memorias flash RAM. Las memorias ROM son memorias relativamente rápidas y no muy caras. Su contenido es programado cuando se fabrica el computador. Típicamente el primer programa que se ejecuta cuando se enciende un computador se almacena en una memoria de este tipo. Las memorias EEPROM y las memorias flash RAM, se suelen usar para las mismas funciones que las memorias ROM, con la ventaja de que pueden ser reescritas . Puesto que son no volátiles podría pensarse en usarlas como memorias principales; el inconveniente que presentan es que su tiempo de acceso es mucho mayor que el de una memoria RAM. El contenido de estas memorias ROM, CMOS , EEPROM o flash se direcciona de la misma forma que el contenido de la memoria principal, es decir, mediante el uso de direcciones físicas. De esta forma el mapa de direcciones físicas de memoria abarca la memoria principal y todos los restantes módulos de memoria presentes en el computador.
0.2.3.
Controladores de E/S
Existen una gran variedad de dispositivos de E/ S (también denominados periféricos): discos magnéticos, discos ópticos, impresoras, ratones, monitores, teclados, módems, etc. Cada tipo de dispositivo de E / S posee unas características (finalidad, velocidad de transmisión, capacidad de almacenamiento, etc) muy distintas entre sí. Para que un dispositivo de E / S pueda ser utilizado por el computador se debe conectar a un módulo hardware denominado controlador o adaptador de E /S.
Computadores y programas
7
Cada controlador permite controlar a uno o varios dispositivos de E/S de un mismo tipo. Por ejemplo, un controlador de discos SCSI puede controlar varias discos duros y unidades de CD-ROM. Un controlador de E/S dispone de uno o varios registros, también denominados puertos de E/S, para el almacenamiento temporal de datos, lo que permite compatibilizar las bajas velocidades de transferen' ia de datos que presentan los dispositivos de E/S (ver Tabla 0.1) con las altas velocidades del procesador : la memoria principal. También dispone de uno o varios registros para almacenar información relativa al estado de los dispositivos de E/S que controla (ocupado, preparado, condiciones de error, etc.). El controlador de E/S acepta órdenes del procesador, por ejemplo, leer o escribir en una determinada posición del dispositivo de E/S. El controlador de E/S se encarga de traducir dicha orden en las órdenes apropiadas de control del periférico. Dispositivo de E/S Teclado Ratón Módem de 56K Escáner Unidad CD-ROM 52x Tarjeta Ethernet Unidad de DVD 16x Unidad de Blue-Ray 8x Impresora láser con USB 2.0 Disco SCSI Ultra 11 Disco SATA 11 300 Tarjeta gráfica
Velocidad de transferencia 10 by tes/s 100 bytes 7 KB/s 400 KB/s 7,8 MB/s (52 x 0,15) 10 MB/s 21,60 MB/s (16 x 1,35) 36 MB/s (8 x 4,5) 60 MB/s 80 MB/s 300 MB/s 0,4 GB/s
Tabla 0.1 - Velocidades de transferencia de algunos dispositivos de E/S
Tipo de bus ISA IDEo ATA Firewire (IEEE 1394) USB 2.0 SCSI Ultra 2 PCI PCle PCle 2.0 USB 3.0
Velocidad de transferencia 8 MB/s 16 MB/s 50 MB/s 60 MB/s 80 MB/s 133 MB/s 250 MB/s 528 MB/s 600 MB/s
Tabla 0.2 - Diferentes tipos de buses
8
Fundamentos básicos de los sistemas operativos
0.2.4.
Buses
Un bus es un medio de comunicación compartido entre dos o más dispositivos. Físicamente se implementa como un conjunto de líneas conductoras. El número de líneas suele ser una potencia de dos. En un determinado instante de tiempo solamente puede transmitir información uno de los dispositivos conectados al bus mientras que la recepción puede ser realizada simultáneamente por varios dispositivos . Se denomina bus del sistema al bus que conecta a los elementos principales del computador (procesador, memoria principal y controladores de E/S). Inicialmente éste era el único bus existente en un microcomputador. Conforme fueron apareciendo nuevos tipos de dispositivos de E/S y fueron aumentaron sus velocidades de transferencia de datos, el uso de un único bus provocaba problemas de rendimiento del computador. Para resolver estos problemas se han ido incluyendo buses adicionales (ver Tabla 0.2). Por ejemplo el bus del sistema en los computadores con procesador Pentium ha sido sustituido por el bus caché, el bus local y el bus de memoria. El bus caché comunica al procesador con la memoria caché de segundo o de tercer nivel. El bus local comunica al procesador con el controlador del bus PCI. Este controlador se conecta, a través del bus de memoria, con la memoria principal. Por otra parte al bus PCI se conectan los controladores de otros buses más específicos: el bus SCSI, el bus USB, el bus ISA y el bus IDE.
0.3.
Jerarquía de memoria
La memoria ideal sería aquella que tuviese una capacidad muy grande, un tiempo de acceso muy pequeño y que fuese no volátil. Lamentablemente una memoria de este tipo no es viable desde un punto de vista económico ya que el coste del bit de memoria aumenta con la velocidad de acceso. Por este motivo en un computador conviven diferentes tipos de memorias: • Registros del procesador. El tiempo de acceso a un registro del procesador es muy pequeño (0,3 ns); pero su capacidad de almacenamiento es muy pequeña (32 ó 64 bits) . • Memoria caché del procesador. Se trata de una memOlia RAM de acceso asociativo con un tiempo de acceso más pequeño que la memoria prjncipal; pero con una capacidad mucho menor. En la memoria caché se almacenan copias de algunos bloques de palabras de la memoria principal.
Cuando el procesador tiene que acceder a una determinada palabra de memora comprueba en primer lugar si existe una copia de dicha palabra almacenada en la memoria caché. En caso afirmativo, se dice que se produce un acierto, la palabra es leída por el procesador directamente desde la caché. En caso negativo, se dice que se produce un fallo, el procesador debe leer la palabra de la memoria principal y cargar una copia del bloque de palabras que contiene a dicha palabra en la memoria caché. De esta forma si dicha palabra es accedida próximamente no se producirá un nuevo fallo. En definitiva, con el uso de la memoria caché se pretende mejorar el rendimiento del computador. La memoria caché se implementa dentro del chip del procesador estructurada en varios niveles. Cada nivel de memoria caché se diferencia del anterior por su tiempo de acceso y por su capacidad.
Computadores y programas
9
Por ejemplo, en un procesador mononúcleo con dos niveles de caché, la memoria caché de primer nivel (o caché Ll) se encuentra integrada dentro del núcleo del procesador y funciona a la misma velocidad que éste. Su tamaño está comprendido entre los 64 KiB Y los 256 KiB. Por su parte, la memoria caché de segundo nivel (o caché L2) se encuentra fuera del núcleo del procesador. Su tiempo de acceso es ligeramente superior que el de la caché Ll y su capacidad suele ser mayor, del orden de unos 4 MiB. • Memoria principal. Es una memoria RAM con una capacidad mucho mayor que la memoria caché pero con un tiempo de acceso mayor. Por ejemplo, un computador personal suele disponer de una memoria principal de 4 GiB con un tiempo de acceso de 1 ns, mientras que la memoria caché tiene una capacidad de 4 MiB y un tiempo de acceso de 0,3 ns. • Memoria secundaria. Está formada por todos aquellos dispositivos de E/S conectados al computador dedicados al almacenamiento de programas y/o datos, como por ejemplo, los discos duros, las cintas magnéticas o los discos ópticos (CD, DVD y Blue-Ray). La memoria secundaria, en comparación con la memoria principal, se caracteriza por ser no volátil, por su elevada capacidad de almacenamiento y por su baja velocidad de transferencia. Por ejemplo, el disco duro interno de un computador personal suele tener una capacidad de unos 500 GB con una velocidad de transferencia de datos de unos 300 MB/s.
0.4.
Instrucciones y programas
0.4.1.
Repertorio de instrucciones
Una instrucción es una cadena de bits que se pueden agrupar en campos con tamaños y significado diferentes. Un campo presente en la mayoría de las instrucciones es el código de operación, que codifica la función que se debe realizar al ejecutar dicha instrucción. También una instrucción suele contener uno o varios campos de dirección . Cada campo de dirección contiene información, que depende del tipo de direccionamiento utilizado, sobre la localización de algún operando necesario para la ejecución de la instrucción. Por ejemplo, en el caso de un direccionamiento de tipo directo, un campo de dirección contendría la dirección de memoria donde se encuentra un operando. Cada procesador dispone de un conjunto de instrucciones, denominado repertorio de instrucciones, que es capaz de ejecutar. Un procesador solo puede ejecutar instrucciones de su repertorio. Por ejemplo, un procesador Pentium no puede ejecutar una instrucción del repertorio de un procesador Sparc y \·¡ceversa. En un repertorio de instrucciones se pueden encontrar instrucciones de los siguientes tipos: • Instrucciones de transferencia de datos. Para copiar o mover datos de una posición de memoria o un registro a otra posición de memoria o registro. • Instrucciones de operaciones. Para realizar sobre operandos almacenados en la memoria (o en registros) operaciones aritméticas, lógicas o de desplazamiento de bits.
10
Fundamentos básicos de los sistemas operativos
• Instrucciones de transferencia de control. Para controlar la secuencia de ejecución de las instrucciones. En esta categoría se encuentran las instrucciones de salto condicional e incondicional. • Instrucciones privilegiadas de gobierno. Para modificar o comprobar el estado del procesador y los controladores de E/S . También para la gestión de la memoria .
• Ejemplo 0.3 En la Figura 0.3 se representa una instrucción de 16 bits compuesta de dos campos: el código de operación y un campo de dirección. El campo código de operación codifica la operación que el procesador debe ejecutar. Puesto que este campo consta de 4 bits, el repertorio de instrucciones tendrá un tamaño máximo de 24 = 16 instrucciones. Por su parte el campo de dirección tiene un tamaño de 12 bits por lo que se podrán direccionar de forma directa un total de 2 12 = 4096 direcciones.
I
Código de operación 4 bits
Dirección
12 bits
Figura 0.3 - Ejemplo de instrucción de 16 bits
• La mayoría de los procesadores disponen de dos modos de ejecución: modo núcleo (también denominado modo supervisor) y modo usuario. En modo núcleo el procesador puede ejecutar cualquier instrucción de su repertorio de instrucciones. Por el contrario, un procesador en modo usuario solo puede ejecutar un conjunto limitado de instrucciones del repertorio. Típicamente las instrucciones privilegiadas no se pueden ejecutar en modo usuario. El modo de ejecución se establece a través de un bit del registro de estado del procesador.
0.4.2.
Ciclo de ejecución de una instrucción
Se denomina ciclo de instrucción a la secuencia de operaciones realizadas por el procesador durante la ejecución de una instrucción. Un ciclo de instrucción consta de los siguientes fases : 1. Fase de búsqueda de la instrucción. El procesador busca en la memoria, de acuerdo con la dirección almacenada en el registro contador de programa, la instrucción que tiene que ejecutar. A menos que se indique lo contrario el procesador incrementa el contador de programa después de cada fase de búsqueda para que quede apuntando a la próxima instrucción que hay que ejecutar. La instrucción leída en la memoria se almacena en el registro de instrucción.
Computadores y programas
11
., Fase de ejecución de la instrucción. El procesador decodifica el campo código de operación de la instrucción almacenada en el registro de instrucción, interpreta dicho campo de acuerdo con su repertorio de instrucciones y ejecuta las acciones adecuadas.
Dependiendo de la frecuencia del reloj del procesador un ciclo de instrucción, puede emplear uno o ciclos de CPU .
.=..';05
. A.3.
Generación de un fichero ejecutable
Programar en código máquina es bastante molesto y propenso a errores. Con el fin de simplificar la -ri tma de los programas se desarrollaron los lenguajes ensambladores, que son lenguajes de progra= .l-ión de bajo nivel compuestos de instrucciones representadas por palabras simbólicas o mnemónicos, ~ e se corresponden más o menos directamente con el repertorio de instrucciones de un procesador
.:.~
.:.~pc cífi co.
Un programa escrito en lenguaje ensamblador se traduce a código máquina empleando un ensam
• Ejemplo 0.4
eonsidérese la siguiente sentencia de un lenguaje de programación de alto nivel: z=x+y esta sentencia suma el valor de las variables x e Y, y almacena el resultado en la variable .:. esta sentencia en código ensamblador para un procesador Motorola 68000 es: mave add mave
z. El equivalente
$1200 , d5 $1202 , d5 $d5,$1204
::"a primera instrucción mueve el número que está en la dirección de memoria 12 OO al registro d5. La -egunda instrucción suma el número que está en la dirección de memoria 12 O2 al registro d5. Final:nente la tercera instrucción mueve el resultado de la suma, contenido en el registro d5, a la dirección
12
Fundamentos básicos de los sistemas operativos
de memoria 12 04. El equivalente a este fragmento de código ensamblador en lenguaje máquina para un procesador Motorola 68000 es: Dirección
Código Máquina
$1000 $1002 $1004 $1006 $1008 $100A
0011101000111000 0001001000000000 1101101001111000 0001001000000010 0011000111000101 0001001000000100
• Un fichero compilado o módulo objeto puede contener referencias a otros módulos objetos o a funciones de librería. En este caso se debe utilizar un programa enlazador (linker), también denominado editor de enlaces, que integre todos los módulos en un único fichero objeto, al que se denomina módulo de carga y que constituye en sí mismo el fichero ejecutable. En la Figura 0.4 se resumen las etapas de generación de un fichero ejecutable. El fichero ejecutable, como cualquier otro fichero, reside en memoria secundaria, típicamente en un disco duro. Para poder ser ejecutado en el procesador debe ser previamente cargado en la memoria principal por un programa cargador.
Programación
Compilador o ensamblador
Editor de enlace
Figura 0.4 - Fases de creación de un fichero ejecutable
De forma general, desde un punto de vista lógico, en un módulo objeto generado por un compilador o un ensamblador se distinguen dos zonas: una zona de código y una zona de datos. La zona de código contiene las instrucciones del programa, mientras que la zona de datos contiene los datos referenciados por dichas instrucciones. También se pueden añadir otras zonas con información de utilidad para el cargador de programas, como por ejemplo, el tamaño de cada zona y algún identificador o número mágico que identifique al fichero como ejecutable.
Computadores y programas
13
Durante la fase de compilación las referencias a memoria presentes en el código fuente en la forma \ ariables simbólicas son asociadas típicamente a direcciones numéricas relativas a algún punto de ..:::.:-io conocido, como por ejemplo, la primera instrucción del programa. De esta forma el compilador ~ : lTlienza a asociar direcciones a las instrucciones y a los datos comenzando por la dirección O. A las ':':"'-cc iones asociadas por el compilador se les denominan direcciones lógicas, relativas o virtuales en __ :maposición a las direcciones de memoria principal que se denominan direcciones físicas o absolutas. ? ::- -: otra parte, durante la fase de enlace las referencias a otros módulos objetos o a funciones de librería .: _= se encuentran expresadas en forma simbólica son sustituidas, típicamente, por direcciones lógicas . ~
• Ej emplo 0.5
=-.::. la Figura 0.5 se representa la estructura lógica de un fichero ejecutable denominado prueba . a . Se : ::' ~~f\ a que consta de 100 instrucciones y 25 datos. La zona de código ocupa el espacio de direcciones _' 9cas comprendido entre O y 99. Por su parte, la zona de datos ocupa las direcciones lógicas 100 a 124. Direcciones Lógicas
o
Instrucción 1 Instrucción 2
Zona de código
99 100 101
InstruCCIón 100 Dato 1 Dato 2 Zona de datos
124
Dato 25
Figura 0.5 - Estructura lógica del fichero ejecutable prueba . a
• ~ .~ .
Técnicas de Entrada/Salida
En las siguientes secciones se describen las principales técnicas de realización de la E/S de un E/S controlada por programa, E/ S controlada por interrupciones y acceso directo a me=)fia (Direct Memory Access, DMA) . ~ ~ :n pu tador:
14
Fundamentos básicos de los sistemas operativos
0.5.1.
E/S controlada por programa
En la E/S controlada por programa, se ejecuta un programa de gestión de la E/S en el procesador que posee el control completo y directo de la operación de E/S. Este programa, antes de enviar o recibir un dato de un dispositivo de E/S , pregunta al controlador de E/S del dispositivo si éste se encuentra preparado. Dicha pregunta se implementa dentro de un bucle. El programa solo sale del bucle cuando el dispositivo se encuentra listo para enviar o recibir otro dato. Puesto que la implementación de un bucle requiere la ejecución repetida de una o varias instrucciones, a esta forma de implementar una espera por un determinado evento se le denomina espera activa. La E/S controlada por programa es una técnica de E/S sencilla de programar pero presenta como principal inconveniente que desperdicia tiempo de uso del procesador debido a la espera activa del programa de gestión de la E/S. La E/S controlada por programa es aceptable si se sabe que el dispositivo de E/S tarda poco en estar preparado, es decir, la espera activa consume poco tiempo. También si el procesador no tiene tareas pendientes que ejecutar mientras se está ejecutando el programa de control de la E/S, como suele ocurrir en algunos sistemas integrados.
0.5.2.
E/S controlada por interrupciones
Una forma de evitar el problema de la espera activa presente en la E/S controlada por programa sería que el controlador de E/S avisara al procesador cuando el dispositivo de E/S estuviese preparado para enviar o recibir un dato. Mientras que el dispositivo de E/S no está listo, el procesador podría ejecutar otros programas, con lo que se mejoraría el rendimiento del computador. Esta es la idea en la que se basa la E/S controlada por interrupciones. Una interrupción es una señal recibida por el procesador que le avisa que se ha producido algún determinado evento. Ante la llegada de una interrupción el procesador debe interrumpir la ejecución del programa en curso y pasar a ejecutar la rutina de servicio o manejador (handler) de la interrupción, es decir, código especifico para tratar el evento que se ha producido. Una vez atendida la interrupción el procesador puede continuar con la ejecución del programa que estaba ejecutando antes de recibir la interrupción. Atendiendo a la fuente que produce la interrupción y a si la interrupción se produce por causas internas o externas al procesador, se pueden distinguir tres tipos de interrupciones: • Interrupciones hardware. Son producidas por módulos hardware externos al procesador, como por ejemplo los controladores de E/S. Estos dispositivos puede activar una interrupción para notificar al procesador que se ha completado una operación de E/ S, que se ha producido un cambio en el estado del periférico o que se ha producido algún error en el mismo . • Trampas (traps) . Se producen al ejecutar una determinada instrucción privilegiada del repertorio del procesador típicamente para solicitar los servicios del sistema operativo. Las trampas, a diferencia de las excepciones, son insertadas de manera voluntaria por el programador.
Computadores y programas
15
• Excepciones. Son generadas por el hardware al intentar realizar una operación no permitida durante
la ejecución de una instrucción de un programa, como por ejemplo, el acceso a una dirección de memoria ilegal, el rebose de una pila, la realización de una división por cero, etc. Con relación al programa que se esté ejecutando en el procesador, las interrupciones hardware son eventos asíncronos, mientras que las excepciones y las trampas son eventos síncronos . Es decir, si el mismo programa se ejecuta varias veces, las excepciones y las trampas sucederán durante la ejecución de las mismas instrucciones. Mientras que los instantes de aparición de las interrupciones hardware pueden variar. Las excepciones y las trampas son atendidas de forma inmediata ya que se producen durante la ejecución de la instrucción actual. Por el contrario, las interrupciones hardware solo son atendidas cuando termina de ejecutarse la instrucción actual. En un computador que implementa un mecanismo de interrupciones, el ciclo de ejecución de una instrucción aparte de las fase de búsqueda y de la fase de ejecución se amplia con una fase de interrupción. Cuando el procesador termina la fase de ejecución de una instrucción, antes de comenzar con el ciclo de ejecución de otra instrucción, realiza la fase de interrupción que consiste en comprobar la existencia de interrupciones hardware pendientes y atenderlas si existe alguna. Como se ha visto existen diferentes eventos que pueden causar una interrupción, por lo que puede suceder que llegue una petición de interrupción mientras otra interrupción está siendo atendida. En consecuencia, es necesario asignar a cada tipo de interrupción un determinado nivel de prioridad de inTerrupción (npi) o nivel de ejecución del procesador. De tal forma que las interrupciones de mayor npi tenga preferencia sobre las de menor npi. Por ejemplo, una interrupción del reloj del computador debe tener preferencia sobre una interrupción de un dispositivo de red, puesto que esta última requerirá un mayor tiempo de uso del procesador para ser atendida. Normalmente el npi se almacena en un campo del registro de estado del procesador, aunque también se puede implementar vía software. Los computadores típicamente poseen un conjunto de instrucciones privilegiadas para comparar y configurar el valor del npi. Si se fija el npi a un determinado valor, las interrupciones del mismo nivelo de niveles inferiores quedan enmascaradas o bloqueadas, por lo que solo se atenderán las interrupciones de los niveles superiores. El número de niveles de prioridad de interrupción permitidos depende de cada procesador. De forma general la atención de una interrupción, requiere entre otras las siguientes acciones: cambiar de modo usuario a modo supervisor, guardar en memoria los valores de los registros del procesador asociados al programa que se estaba ejecutando, identificar la fuente de la interrupción, ejecutar la rutina de servicio de la interrupción y cargar en los registros del procesador los valores almacenados anteriormente para poder continuar, si es posible, con la ejecución del programa que se estaba ejecutando antes de recibir la interrupción.
16
Fundamentos básicos de los sistemas operativos
0.5.3.
Acceso directo a memoria
Cuando la cantidad de datos a transferir entre la memoria principal y el dispositivo de E/S es grande, se suele usar la técnica de acceso directo a memoria o DMA. En esta técnica el controlador de E/S puede transferir bloques de datos a la memoria principal (o viceversa) sin la intervención directa del procesador, excepto al inicio y al final de la transferencia. La implementación del DMA requiere de un módulo hardware adicional denominado controlador de DMA que se conecta al bus del sistema. Para iniciar una transferencia mediante DMA con un determinado dispositivo, el procesador únicamente ejecuta unas pocas instrucciones de un programa de gestión de la E/S para inicializar al controlador de DMA con información sobre la operación de E/S a realizar. Mientras se realiza la transferencia mediante DMA el procesador puede ejecutar otros programas. Cuando el controlador de DMA finaliza la transferencia de todos los datos genera una interrupción. Es importante resaltar que aunque la realización del DMA disminuye notablemente la intervención del procesador en una operación de E/S, también puede afectar al rendimiento del procesador. Recuérdese que solo un módulo puede usar el bus del sistema simultáneamente, por lo que si lo usa el controlador de DMA no lo podrá usar el procesador quedándose inactivo a la espera de usarlo. El procesador necesita usar el bus cuando tiene que acceder a una palabra de memoria principal asociada a un dato o a una instrucción que no encuentra en la memoria caché. Dependiendo de la estrategia de DMA utilizada el tiempo que puede estar parado el procesador puede ser mayor o menor. Entre las estrategias de realización de DMA más comunes se encuentran las siguientes: • DMA por ráfagas. Se cede el bus al controlador de DMA hasta que se completa la transferencia de datos. • DMA por robo de ciclos. Cuando el procesador termina de ejecutar una instrucción de un programa cede el bus al controlador de DMA unos pocos ciclos de CPU antes de comenzar a ejecutar la siguiente instrucción del programa. • DMA transparente. El procesador cede el uso del bus al controlador de DMA en aquellas fases dentro del ciclo de ejecución de una instrucción donde no requiere su uso, como por ejemplo cuando está realizando cálculos aritméticos o lógicos.
De las tres estrategias descritas, la estrategia de DMA por ráfagas es con la que se consigue una mayor velocidad de transferencia de datos; pero también es la que produce un mayor tiempo de inactividad forzosa del procesador. Esta desventaja no supone un problema en computadores cuya carga de trabajo habitual hace poco uso del procesador y mucho uso de E/S. Un componente hardware que representa una extensión del concepto de DMA es el canal o procesador de E/ S, que es un procesador auxiliar que se encarga de realizar todas las operaciones de E/S con un determinado conjunto de dispositivos de E/S. En un computador pueden existir varios canales de E/S, los cuales pueden estar operando simultáneamente, es decir, el uso de los canales de E/S se puede solapar.
Computadores y programas
17
Ln canal de E/S tiene un repertorio de instrucciones limitado especializado en operaciones de E / S. ~ instrucciones o programas de E/S se almacenan en la memoria principal del computador. Para iniciar -=2 transferencia de E/S la CPU únicamente tiene que facilitar al canal de E/ S la dirección de inicio del :T'Jgrama de E/S. El canal de E/S ejecuta el programa y controla totalmente la transferencia de datos " cual se realiza mediante DMA. De esta forma la CPU queda totalmente liberada de las operaciones .:.:= E S. Cuando la operación de E/S finaliza el canal de E / S avisa a la CPU mediante el uso de una -=:crrupción . Por lo tanto un canal de E/S hace uso de las tres estrategias de E/S descritas: se comunica con la =::',11oria principal mediante DMA, con los controladores de E/S mediante E/ S controlada por programa _ ':: 0 0 la CPU mediante el uso de interrupciones .
.6. Arranque de un computador personal Los computadores personales del tipo IBM PC compatible disponen en su placa base de un chip de =::'IDoria ROM o de una memoria flash donde se encuentra almacenado el sistema básico de E / S (Basic --;- I-Output System, BIOS) que es un software de bajo nivel. Cuando se enciende el computador el procesador comienza a ejecutar el BIOS, que en primer lugar :-~ :]¡ za el autotest de encendido (Power On Self Test, POST) que consiste principalmente en: • Verificar la integridad del código del BIOS. • Detectar y comprobar la capacidad de la memoria principal de tipo RAM. • Explorar todos los buses del computador para determinar cuáles son los dispositivos de E/S básicos conectados al computador y comprobar su correcto funcionamiento. Si durante el POST se detecta algún problema en el hardware se envían una serie de sonidos por la _ :.:ma del computador para avisar al usuario. Estos sonidos se encuentran normalizados por un estándar ~ ::::,rn ac i onal , por ejemplo, un tono largo significa que la memoria RAM no funciona o no está instalada, =::.:.:-otras que un tono corto significa que el chequeo de todo el hardware ha terminado satisfactoriamente. C na vez realizado el POST, el BIOS busca el dispositivo de E/S desde que el se iniciará el sistema 7:lerativo. Para ello consulta en orden secuencial una lista de posibles dispositivos de arranque almace- ~ .os en la memoria CMOS de la placa base. El usuario puede modificar el orden en que se consulta esta _-:3. mediante un programa de configuración del BIOS que se puede invocar justo después del POST. ~ ::!i ' amente, en los computadores más modernos en primer lugar se intenta arrancar desde la unidad de =- TI-ROM. Si falla, se intenta arrancar desde un dispositivo USB. Si también falla, se intenta arrancar ::'"":onces desde el disco duro. Cna vez localizado el dispositivo de arranque, se accede a su primer sector (sector O) que contiene el e· .'15 (ro de arranque maestro (Master boot record, MBR), en el que se encuentra almacenado el programa .x:lOnUnado cargador de arranque (bootstrap loader) y la tabla de particiones. El cargador de arranque se carga en la memoria principal y se comienza a ejecutar. Éste examina la ~ la de particiones para determinar la partición marcada como activa. A continuación accede al sector
18
Fundamentos básicos de los sistemas operativos
de arranque de la partición activa (primer sector de dicha partici.ón) para cargar en la memoria principal un pequeño programa denominado cargador de arranque secundario que busca en el directorio raíz de dicha partición el código de inicio del sistema operativo (o un cargador de arranque más sofisticado) lo carga en memoria y le transfiere el control para que se comience a ejecutar. Cuando se inicia el sistema operativo éste obtiene del BIOS la configuración hardware del computador. A continuación comprueba que dispone de los drivers necesarios para cada dispositivo de E/S conectado, y los carga dentro del núcleo. A continuación inicializa las estructuras de datos del sistema operativo. Finalmente lanza un intérprete de comandos o una interfaz de usuario gráfica (Graphical User Interface, GUI) para que el usuario pueda interactuar con el sistema operativo.
0.7.
Resumen
Un computador es una máquina electrónica que acepta datos a través de un medio de entrada, los procesa automáticamente bajo el control del programa en ejecución y proporciona la información resultante a través de un medio de salida. Los principales componentes hardware de un computador son: el procesador, la memoria principal y los controladores de E/S, los cuales se encuentran interconectados a través de uno o varios buses, que son conjuntos de líneas conductoras. El procesador o CPU se encarga de ejecutar secuencialmente las instrucciones de un programa y controla el funcionamiento de los restantes componentes. La memoria principal almacena temporalmente los programas que se van a ejecutar. Los controladores de E/S manejan los dispositivos de E/S o periféricos (discos magnéticos, discos ópticos, impresora, ratón, etc), aceptando las órdenes del procesador y traduciéndolas en las órdenes apropiadas de control del periférico. A la unidad natural de organización de la memoria se le denomina palabra, que es un conjunto ordenado de n bits contiguos que son manejados como un conjunto por la máquina. Para escribir o leer en una palabra de memoria se debe especificar su dirección física asociada. La memoria principal está compuesta por uno o varios módulos de memoria RAM, y otras pequeñas memorias no volátiles (ROM, EEPROM, flash RAM). Con el fin de mejorar el rendimiento del computador y conseguir el ideal de capacidad muy grande y alta velocidad de lectura/escritura, en un computador existen diferentes tipos de memoria: registros del procesador, memoria caché, memoria principal y memoria secundaria. Se tiene por tanto una estructura jerárquica de memoria. Una instrucción es una cadena de bits que se pueden agrupar en campos con tamaños y significados diferentes. Cada procesador dispone de un conjunto de instrucciones, denominado repertorio de instrucciones, que es capaz de ejecutar. En un repertorio de instrucciones, se distinguen las instrucciones de transferencia de datos, de operaciones aritméticas, lógicas y desplazamiento, de transferencia de control, y las instrucciones privilegiadas de gobierno. La mayoría de los procesadores disponen de dos modos de ejecución: modo núcleo (también denominado modo supervisor) y modo usuario. En modo núcleo el procesador puede ejecutar cualquier instrucción de su repertorio de instrucciones. Por el contrario, un procesador en modo usuario solo puede ejecutar un conjunto limitado de instrucciones del repertorio.
Computadores y programas
19
Los lenguajes ensambladores son lenguajes de programación de bajo nivel compuestos de instruc:: : :::~s representadas por palabras simbólicas o mnemónicos, que se corresponden más o menos directa-;:'::1 e con el repertorio de instrucciones de un procesador específico. l' n programa escrito en lenguaje ensamblador se traduce a código máquina empleando un ensam- ~o ,.. que es un programa que toma como entrada un fichero fuente escrito en lenguaje ensamblador y =--=:::.;:, ~a como salida un fichero objeto escrito en código máquina.
Ln programa escrito en un lenguaje de alto nivel (Fortran, Basic, Modula-2, C, C++, Java, etc) '=' ~'1depe ndiente del hardware, y es más fácil de leer, escribir y mantener que un programa escrito en --;:; uaje ensamblador. Un programa en un lenguaje de alto nivel se traduce a código máquina utilizando - _'olllpilador, que es un programa que toma como entrada un fichero fuente escrito en un lenguaje de _-:: - nj \"e l y genera como salida un fichero objeto escrito en código máquina. l 'n fic hero compilado o módulo objeto puede contener referencias a otros módulos objetos o funcio- .: l e li brería, lo que requerirá el uso de un programa enlazador, que integra todos los módulos en un ': 0 fic hero objeto o ejecutable, que residirá en memoria secundaria. Para poder ser ejecutado debe ser _ ;:'. lamente cargado en la memoria principal por un programa cargador. Durante la fase de compilación, las referencias a memoria presentes en el código fuente en la forma .:c- \ ariables simbólicas son asociadas típicamente a direcciones numéricas relativas a algún punto de ~ ' lO conocido, como por ejemplo, la primera instrucción del programa. De esta forma el compilador _ ~ =u ~nza a asociar direcciones a las instrucciones y a los datos comenzando por la dirección O. A las - -::' ' iones asociadas por el compilador se les denominan direcciones lógicas, relativas o virtuales en _ =:uraposición a las direcciones de memoria principal que se denominan direcciones físicas o absolutas. Las principales técnicas usadas en un computador para la realización de la E/S son: la E/S controlada : ~ ~ programa, la E/S controlada por interrupciones y el DMA. En la E/ S controlada por programa, se =. :: ' uta un programa de gestión de la E/S en el procesador que posee el control completo y directo de la -;x'ración de E / S. L na interrupción es una señal recibida por el procesador que le avisa que se ha producido algún ':=:errninado evento. Existen tres tipos de interrupciones: interrupciones hardware, excepciones y tram:...:...: , Las interrupciones hardware son activadas por ejemplo por los controladores de E/ S cuando los ,:::,positivos que controlan se encuentran preparados para realizar una operación de E/ S. Una excepción ~. ge nerada por el hardware al intentar realizar una operación no permitida durante la ejecución de una ..::.s trucción de un programa. Una trampa se produce al ejecutarse una determinada instrucción privilegia.:.:. del repertorio del computador con objeto de solicitar los servicios del sistema operativo. La atención :'f una interrupción requiere, entre otras, de las siguientes acciones: cambiar de modo usuario a modo < pervisor, guardar en memoria los valores de los registros del procesador asociados al programa que se ="aba ejecutando, identificar la fuente de la interrupción, ejecutar la rutina de servicio de la interrupción . -argar en los registros del procesador los valores almacenados anteriormente para poder continuar, si ='- posible, con la ejecución del programa que se estaba ejecutando antes de recibir la interrupción. La técnica de DMA permite transferir grandes cantidades de datos entre un dispositivo de E / S y la -:::emoria principal (o viceversa) sin la intervención directa del procesador, excepto al inicio y al final de ::: transferencia.
20
Fundamentos básicos de los sistemas operativos
Un componente hardware que representa una extensión del concepto de DMA es el canal o procesador de E/S, que es un procesador auxiliar que se encarga de realizar todas las operaciones de E/S con un determinado conjunto de dispositivos de E/S. En un computador pueden existir varios canales de E/S , los cuales pueden estar operando simultáneamente.
0.8.
Lecturas recomendadas
Si se desea obtener una explicación adicional de los contenidos tratados en este capítulo se pueden consultar, por ejemplo: el capítulo 1 de [Stallings, 2005] y el capítulo 1 de [Tanenbaum, 2009]. Por otra parte, para profundizar en aspectos relativos al hardware de un computador se recomienda consultar [Stallings, 2006], [Tanenbaum, 2005] y [Dormido y Canto, 2010].
0.9.
Autoevaluación
0.1. ¿Cuáles son los principales componentes hardware de un computador? (Respuesta en sección 0.2) 0.2. Señalar cuál es la función del procesador y cuáles son sus principales componentes. (Respuesta en sección 0.2.1) 0.3. Señalar los registros existentes en un procesador. (Respuesta en sección 0.2.1)
0.4. ¿Cuál es la función de la memoria principal de un computador? ¿Con qué tipos de memoria se implementa? (Respuesta en sección 0.2.2) 0.5. ¿Qué es una palabra de memoria? (Respuesta en sección 0.2.2) 0.6. Conocida la capacidad de la memoria principal expresada en palabras explicar cómo se determina el número de bits de que consta una dirección de memoria. (Respuesta en sección 0.2.2) 0.7. ¿Qué es un controlador de E/S? ¿Puede un controlador de E/S controlar más de un periférico? (Respuesta en sección 0.2.3) 0.8. ¿Qué es un bus? ¿Por qué existen varios tipos de bus en los computadores modernos? (Respuesta en sección 0.2.4) 0.9. Señalar los diferentes tipos de memoria que conforman la jerarquía de memoria de un computador. (Respuesta en sección 0.3) 0.10. ¿Qué es el repertorio de instrucciones de un procesador? ¿Puede un procesador ejecutar el repertorio de instrucciones de otro? (Respuesta en sección 0.4.1) 0.11. Enumerar los diferentes tipos de instrucciones presentes en el repertorio de instrucciones de un procesador. (Respuesta en sección 0.4.1)
Computadores y programas
21
.12. Señalar la diferencia entre ejecución en modo supervisor y ejecución en modo usuario. (Respuesta en sección 0.4.1) .13. Explicar qué es el ciclo de ejecución de una instrucción y en qué fases se divide. (Respuesta en sección 0.4.2) . 1 ~.
Explicar qué es un ensamblador y un compilador. (Respuesta en sección 0.4.3)
.1 5. Describir las etapas de creación de un fichero ejecutable. (Respuesta en sección 0.4.3) 16. ¿Qué una dirección relativa o lógica? ¿Y una dirección absoluta o física? (Respuesta en sección 0.4.3) 1 . Describir el funcionamiento de la E/S controlada por programa e indicar cuál es su principal inconveniente. (Respuesta en sección 0.5.1) 1 . Explicar por qué la E/S controlada por interrupciones permite mejorar el rendimiento del computador. (Respuesta en sección 0.5.2) 19. Señalar las principales características de una interrupción hardware, una excepción y una trampa. (Respuesta en sección 0.5.2) O. Describir el funcionamiento del DMA e indicar cuándo se emplea esta técnica de E/S. ¿Puede el DMA afectar al rendimiento del procesador? (Respuesta en sección 0.5.3) 1. ¿Qué es un canal o procesador de E/S? (Respuesta en sección 0.5.3) ., Describir el proceso de arranque de un computador personal del tipo IBM PC compatible. (Respuesta en sección 0.6)
.10.
Problemas
1.1. Considérese un computador con una CPU de 3 GHz, una memoria principal de 4 GiB con un tiempo de acceso medio de 1 ns y una memoria caché de 4 MiB de un único nivel con un tiempo de acceso medio de 0,3 ns. Se pide: a) Calcular la velocidad del procesador expresada en instrucciones por segundo si en promedio el procesador emplea 2 ciclos en ejecutar una instrucción. b) Determinar el tamaño en bits de una dirección física si la longitud de palabra es de 32 bits. c) Durante la ejecución de un programa se han realizado 20000 accesos a la memoria principal. Calcular el tiempo de acceso total.
22
Fundamentos básicos de los sistemas operativos
d) La tasa de aciertos h de una memoria caché de define como la razón entre el número de aciertos obtenidos y el número de accesos a caché realizados. Supuesto que la memoria caché del enunciado tiene h = 0,98 Y que se han realizado 20000 accesos a la caché determinar el número de aciertos y el número de fallos. e) Cuando se produce un fallo en la caché primero se copia en la memoria caché el bloque de palabras donde se encuentra la palabra buscada de la memoria principal y después se lee la palabra desde la caché. Determinar el tiempo de acceso medio al conjunto formado por la memoria caché y la memoria principal. Suponer que h = 0,98 Y que un bloque contiene 8 palabras. f) Teniendo en cuenta el resultado obtenido en el apartado anterior calcular el tiempo de acceso total al conjunto formado por la memoria caché y la memoria principal supuesto que se rea-
lizan 20000 accesos. Compararlo con el resultado obtenido en el apartado c).
0.2. De acuerdo con un estudio realizado sobre la utilización de las instrucciones de un computador, que no dispone de caché, se ha determinado que en media ejecuta 50 millones de instrucciones por segundo. Las distintas instrucciones (todas ellas almacenadas en memoria principal) y los porcentajes de utilización de las mismas se muestran en la Tabla 0.3, donde Acum es el acumulador, M[dir] una posición de memoria principal, R[l] y R[2] registros internos, y PC el contador de programa. Si todas las instrucciones ocupan una palabra de memoria, calcular el número medio de accesos a memoria por segundo que se ejecutan en este computador.
LOAD STORE MOVE Operaciones aritméticas Operaciones lógicas Bifurcaciones
Acumt-M[dir] M[dir]t-Acum R[l]t-Acum R[l]t-R[l] operación aritmética R[2] R[l]t-R[l] operación lógica R[2] PCt-Acum
30 % 10% 10 % 24 % 6% 20 %
Tabla 0.3 - Utilización del procesador
0.3. Considere una CPU en la que tanto las instrucciones como los datos tienen una longitud de 16 bits. El formato de las instrucciones es el siguiente: los 4 bits más significativos de la instrucción representan el código de operación y los otros 12 bits representan una dirección de memoria. A continuación se muestra una lista parcial de los códigos de operación:
0011 0101 0110
Cargar el registro acumulador desde memoria Almacenar en memoria el contenido del registro acumulador Sumar el contenido del acumulador y el de una dirección de memoria, el resultado se almacena en el acumulador
Computadores y programas
23
Determinar una secuencia de instrucciones que sume el contenido de la dirección de memoria 3A5 16 al contenido de la dirección de memoria 3B916 y almacená el resultado en la dirección de memoria 3A5 16.
lA. En un computador que usa E/S controlada por programa, el dispositivo de E/ S tarda 6 ms en tener disponible el dato solicitado. Supuesto que el computador solo se dedica a E/S , que el bucle de espera se implementa con una única instrucción, que la lectura de un dato y la petición del siguiente dato por parte de la CPU requiere 10 instrucciones y que cada instrucción de la CPU se ejecuta en 200 j1s, calcular:
a) El tanto por ciento de tiempo de CPU que consume la ejecución del bucle de espera. b) El número total de instrucciones que emplea el programa de E/S. c) El número total de instrucciones que ejecuta el programa de E/S en el bucle de espera. d) El número de veces que se ejecuta el bucle de espera .
..5. En un sistema de E/S de un computador están conectados dos discos duros, una impresora y un CD-ROM. El sistema de E/S gestiona los dispositivos mediante interrupciones anidables y además éstos están agrupados por prioridades con PI >P2 >P3, siendo la prioridad de los discos PI , la del CD-ROM P2 y la de la impresora P3. Se sabe además que las rutinas de interrupción llevan asociados unos tiempos de servicio, siendo éstos para los discos de 10 ut, para el CD-ROM de 30 ut Y para la impresora de 15 ut. En un instante determinado t = O ut se produce una petición de interrupción del primer disco duro, después en el instante t = 3 ut llega una petición de interrupción de la impresora, posteriormente se produce una interrupción del CD-ROM en t = 5 ut y finalmente llega una petición de interrupción del segundo disco duro en t = 14 ut. Determinar el instante de ti empo en que finaliza la ejecución de la rutina de interrupción del CD-ROM. ~ota:
en un sistema con interrupciones anidables o multinivel cuando comienza a ejecutarse el programa de gestión de una interrupción, si llega una interrupción de prioridad superior se pasa a ejecutar la rutina de servicio de dicha interrupción. ,6. El procesador de un computador tarda una media de 200 ns en ejecutar una instrucción. La E/S de un cierto periférico, con una velocidad de transferencia de 1,5 MB/s, se realiza mediante DMA. El DMA requiere 10 instrucciones de inicialización, y en la transferencia de un byte mantiene ocupado el bus durante 100 ns. Se quieren transferir 500 bytes . Calcular para el peor de los casos (el procesador está parado mientras el DMA ocupa el bus):
a) El tiempo de procesador que consume la transferencia de los 500 bytes. b) El número de instrucciones de otro proceso que puede ejecutar el procesador mientras se realiza la transferencia del bloque de datos .
Capítulo 1
Consideraciones generales de los sistemas operativos Objetivos docentes Los objetivos docentes de este capítulo son los siguientes: • Saber qué es un sistema operativo y cuáles son sus objetivos y servicios. • Conocer la evolución histórica de los sistemas operativos. • Conocer los criterios que permiten clasificar a los sistemas operativos. • Saber distinguir los diferentes tipos de sistemas operativos. • Saber qué son las llamadas al sistema, cómo se invocan y cómo se tratan. • Conocer cuáles son los principales componentes del núcleo de un sistema operativo. • Conocer las principales estructuras que puede tener el núcleo de un sistema operativo.
1. 1.
Introducción
La escritura de programas que interactúen directamente con los componentes hardware de un compu~ ~or es una tarea bastante tediosa. Por otra parte, si se desean ejecutar al mismo tiempo varios programas :cix'n existir mecanismos para proteger los datos y distribuir equitativamente el uso de los recursos del ~ ~p u tador entre todos los programas. Con el fin de resolver estos problemas surgieron los sistemas ::-crativos. en sistema operativo es una capa de software cuya función es administrar todos los dispositivos ~d\\' are del computador y suministrar para los programas de los usuarios una interfaz apropiada con el
o
o
o
25
26
Fundamentos básicos de los sistemas operativos
hardware. Dicha interfaz es rica en funcionalidades, segura, consistente y proporciona una representación uniforme y abstracta de los recursos de la máquina, que las aplicaciones de los usuarios pueden solicitar y acceder. Los programas de los usuarios invocan generalmente los servicios del sistema operativo por medio de llamadas al sistema. Además los usuarios pueden interactuar con el sistema operativo directamente por medio de órdenes que son interpretados por programas denominados intérpretes de comandos (shells). En este capítulo se incluyen una serie de consideraciones generales sobre los sistemas operativos que sirven de base para comprender mejor los contenidos de los restantes capítulos. En primer lugar, se define qué es un sistema operativo y se enumeran sus objetivos y servicios. En segundo lugar, se describe la evolución histórica de los sistemas operativos. En tercer lugar, se enumeran y describen los diferentes tipos de sistemas operativos. En cuarto lugar, se describen las llamadas al sistema. Finalmente, se analizan las principales estructuras que puede presentar el núcleo de un sistema operativo.
1.2.
Definición, objetivos y servicios de un sistema operativo
1.2.1.
Definición y objetivos de un sistema operativo
Un sistema operativo es una capa de software que gestiona de forma eficiente todos los dispositivos hardware de un computador y además sumi nistra a los usuarios una interfaz cómoda con el hardware.
Programas de aplicación
8
Programadores de +-........-". aplicaciones y utilidades
Diseñadores del sistema operativo (SO)
Figura 1.1 - Arquitectura general de un sistema informático
Consideraciones generales de los sistemas operativos
27
De la definición anterior se concluye que los principales objetivos de un sistema operativo son: • Gestionar o administrar eficientemente los dispositivos hardware de un computador. El sistema operativo se encarga de decidir cuánto tiempo de ejecución en el procesador se asigna a los programas de los usuarios. El sistema operativo dispone de un módulo denominado planificador que se encarga de esta tarea.
Por otra parte, el sistema operativo también se encarga de administrar, junto con el hardware, la ocupación de la memoria principal. Recuérdese que para que un programa pueda ser ejecutado por el procesador, primero debe encontrarse cargado en la memoria principal. Además puesto que la memoria principal es un recurso finito, el número de programas que pueden encontrarse cargados en la memoria principal preparados para ser ejecutados por el procesador está limitado. También el sistema operativo se encarga de gestionar la memoria secundaria. Desde un punto de \ ista interno, controla el espacio del área de intercambio, donde se almacenan aquellos programas que hay que ejecutar pero para los cuales no existe todavía espacio en la memoria principal, y el espacio de los sistemas de archivos. Por otra parte, desde un punto de vista lógico, controla el acceso y el uso de los sistemas de archivos. Finalmente, el sistema operativo gestiona el acceso a los restantes dispositivos de E/S . • Ofrecer a los usuarios una interfaz cómoda con el hardware que les facilite el uso del computador. El sistema operativo proporciona al usuario una máquina extendida, también denominada máquina Yirtual, que es más fácil de programar que el hardware desnudo. En la Figura l.1 se muestra un posible esquema de la arquitectura general de un sistema informático, entendiendo por tal al conjunto formado por el hardware de un computador, el software que se puede ejecutar en él y los seres humanos (diseñadores del sistema operativo, programadores y usuarios). En el nivel más interno se encuentra el hardware del computador. A continuación en el siguiente nivel se sitúa el núcleo (kernel) del sistema operativo que oculta el hardware a los programadores de los siguientes niveles, suministrando un conjunto de instrucciones denominadas llamadas al sistema con el que los programas ubicados en los niveles superiores pueden solicitar los servicios del núcleo. Sobre el núcleo se sitúa el nivel formado por los programas de utilidades del sistema operativo: intérpretes de comandos, sistemas de ventanas, compiladores, editores y programas similares independientes de las aplicaciones. Realmente estos programas de utilidades no son parte imprescindible para el funcionamiento del sistema operativo, aunque se suministran conjuntamente con él para hacer más amigable su uso a los programadores y a los usuarios. Finalmente, en el último nivel se sitúan los programas de aplicación, como por ejemplo, navegadores, programas de gestión del correo electrónico, bases de datos, procesadores de texto, hojas de cálculo, etc. Pese a haberse representado este nivel en la Figura 1.1 separado del núcleo por el nivel de los programas de utilidades del sistema operativo, debe quedar claro que los programas de aplicaciones no tienen por qué hacer uso de los programas de utilidades para poder solicitar los servicios del núcleo, ya que también pueden usar directamente las llamadas al sistema.
28
Fundamentos básicos de los sistemas operativos
1.2.2.
Servicios de un sistema operativo
Los principales servicios proporcionados por un sistema operativo se pueden agrupar de forma general en las siguientes clases: • Ejecución de programas. Un sistema operativo debe ser capaz de cargar en la memoria principal un programa desde su ubicación original en la memoria secundaria y ejecutarlo. • Acceso a los dispositivos de E/S. Existen diferentes tipos de dispositivos de E/S, cada uno de los cuales para su funcionamiento utiliza su propio conjunto de instrucciones o señales de control. El sistema operativo oculta los detalles particulares de cada dispositivo proporcionando una interfaz uniforme de forma que los usuarios puedan acceder a los dispositivos de E/S utilizando un conjunto sencillo de instrucciones de lectura y escritura. • Manipulación del sistema de archivos. De forma general, un archivo o fichero se puede definir como una secuencia de bits, bytes, líneas o registros cuyos significado es definido por su creador. Los archivos se almacenan en los diferentes dispositivos de almacenamiento secundario de acuerdo con un determinado esquema de almacenamiento denominado sistema de archivos . Para muchos usuarios, el sistema de archivos es el aspecto más visible de un sistema operativo, ya que proporciona una estructura lógica para el almacenamiento de sus archivos. El sistema operativo debe ser capaz de gestionar el acceso al sistema de archivos para que los usuarios puedan realizar operaciones tales como creación, eliminación, lectura o escritura de archivos. Para ello debe mantener información del tipo de dispositivo de E/S donde se encuentra almacenado un archivo y de la estructura de los datos de dicho archivo. • Comunicación y sincronización. El sistema operativo debe soportar diferentes tipos de mecanismos de comunicación y sincronización (memoria compartida, paso de mensajes, semáforos, envio de señales, ... ) entre los programas, ya que existen muchas situaciones en que un programa necesita intercambiar datos con otros programas o sincronizar su ejecución con la aparición de algún evento. • Detección y respuesta a errores. El sistema operativo debe ser capaz de detectar los posibles errores que se puedan producir durante el funcionamiento del sistema informático donde reside. Los errores se pueden producir en el hardware (fallo en el suministro de energía, errores de memoria, sector en disco defectuoso, falta de papel en una impresora, ... ), o ser generados por el software en ejecución (acceso a una posición de memoria prohibida, división por cero, imposibilidad de conceder el uso de un recurso o aplicación, ... ). Además, el sistema operativo debe proporcionar una respuesta adecuada al error producido, por ejemplo, informar al usuario del error aparecido, finalizar el programa que produjo el error o reintentar la operación que originó el error. • Protección y seguridad. Cuando se ejecutan varios programas concurrentemente, se debe evitar que un programa interfiera con los demás. En consecuencia el sistema operativo debe asegurar un acceso controlado y protegido a los recursos del computador. Por otra parte, en sistemas informáticos multiusuario, el sistema operativo debe disponer de medidas de seguridad para regular
Consideraciones generales de los sistemas operativos
29
el acceso únicamente a los usuarios autorizados. Típicamente cuando un usuario desea acceder al sistema se debe acreditar indicando su nombre de usuario (login) y su contraseña (password) . • Contabilidad. Un sistema operativo debe llevar registros o estadísticas del uso de los diferentes recursos del computador y monitorizar parámetros tales como la productividad o el tiempo de respuesta. Esta información puede resultar muy útil para mejorar el rendimiento del sistema informático y para facturar a los usuarios.
1.3.
Evolución histórica de los sistemas operativos
U .1.
Los primeros sistemas operativos
El desarrollo de los sistemas operativos ha estado estrechamente ligado a la evolución de los compu- ""res sobre los cuales se ejecutan. Los primeros sistemas operativos surgieron a mediados de los años - - -uenta y se ejecutaban en macrocomputadores (mainframes) , que eran máquinas de tecnología ba~ en transistores individuales que ocupaban grandes salas refrigeradas. El elevado precio de los ma-xomputadores los hacía solo accesibles a las principales universidades, grandes empresas y agencias ~_--..:m amentales.
Para ejecutar un trabajo, es decir, un programa con sus datos de entrada, un programador debía escri__ el programa en papel (típicamente en lenguaje Fortran o ensamblador) y pasarlo a tarjetas perforadas. ~r ué s se las entregaba a un operario y se marchaba. Éste, cuando el computador terminaba de procesar = :::-3baj o actual, colocaba en un lector de tarjetas el compilador de Fortran. Otro programa residente en - ~oria denominado cargador transfería el compilador desde el dispositivo de entrada a la memoria, y ,c : omenzaba a ejecutar. A continuación el operario tenía que colocar en el lector de tarjetas el código ~ r ¡e del programa que se quería compilar. Si no había errores de sintaxis, el código objeto producido : := el compilador era almacenado directamente en memoria y ejecutado. En caso contrario, las tarjetas .::c: rrabajo eran devueltas al programador para que lo corrigiera. Si durante la ejecución del programa ~ iequerían datos de entrada éstos debían ser leídos de las tarjetas correspondientes en el dispositivo .::c .:?mrada. Cuando el trabajo finalizaba se imprimía su resultado en una impresora ubicada en una sala ~ - J.j gu a donde un operario lo recogía y lo dejaba listo para ser recogido por el programador que lo había ~ .:.-.:rrgado. El esquema de operación descrito se denomina procesamiento serie, ya que los trabajos se van proce.¿:jü uno tras otro. El sistema operativo (también denominado monitor) estaba formado por el programa ~5ador, que automatizaba el proceso de cargar en memoria los programas ejecutables, y las rutinas de ~ -. las cuales, bien se implementaban en paquetes de tarjetas para ser intercaladas entre el código de - ~ . rogramas de usuario, o bien se precompilaban y mediante el uso de un enlazador y programas de ___üoteca eran incluidas en el código objeto del programa de usuario. Obviamente, este modo de operación no era muy eficaz. Por una parte, cada programador tenía que :=5::'
30
Fundamentos básicos de los sistemas operativos
ni cuando se realizaba una operación de E/S. Este desperdicio de tiempo era inaceptable dado el alto coste del equipamiento. Con el fin de disminuir el tiempo de procesamiento desperdiciado, la solución que se adoptó de forma general fue el procesamiento por lotes o procesamiento batch, que consiste en agrupar en lotes los trabajos con necesidades simi1ares, los cuales ahora se ejecutarían en el computador como un grupo. De esta forma, los programadores dejaban sus trabajos al operador, quien los clasificaba según sus requerimientos formando lotes de trabajos. Cuando terminaba de ejecutarse un lote se comenzaba a cargar y ejecutar desde el dispositivo de entrada (lectoras de tarjetas perforadas o de cintas magnéticas) los trabajos del siguiente lote. Fue la implementación de este modo de operación lo que condujo al desarrollo de los primeros sistemas operativos propiamente dichos. Se considera que el primer sistema operativo por lotes (y de cualquier otro tipo) fue creado a mediados de los años 50 por General Motors para el uso de un computador IBM 701. Otros sistemas operativos típicos de la época fueron FMS e IBSYS, el sistema operativo de los computadores IBM 7090 y 7094. Estos primeros sistemas operativos eran bastante simples, su principal función era transferir el control automáticamente de un trabajo al siguiente. Este esquema de operación requería de órdenes que indicasen al sistema operativo cuándo empezaba y terminaba un trabajo y cómo debía tratar cada trabajo individual dentro de un lote. Estas órdenes eran sentencias escritas en un lenguaje de control de trabajos (Job Control Language, JCL). Cada orden tenía asociada una tarjeta perforada que se intercalaba entre las tarjetas de los trabajos de un lote. Entre las órdenes más comunes de un JCL se incluyen marcas de comienzo y finalización de un trabajo, órdenes para cargar y ejecutar programas, y órdenes que indicaban las necesidades de recursos (tiempo de ejecución máximo y memoria necesaria). Una parte del sistema operativo, denominada monitor residente, se encontraba siempre residente en memoria principal. Se encargaba de leer, interpretar y ejecutar las órdenes JCL. Mediante el uso de estas órdenes se conseguía que los trabajos de un lote se ejecutasen uno tras otro. Cuando un trabajo finalizaba transfería el control al monitor que iniciaba la carga desde el dispositivo de entrada del siguiente trabajo del lote. Los sistema operativo por lotes mejoraban las prestaciones de los monitores serie al reducir los tiempos de espera entre ejecución de trabajos. Además incrementaba los funciones y servicios de los monitores serie, ya que además del programa cargador y las rutinas de E/S incluían el intérprete de ordenes JCL.
1.3.2.
Introducción de la multiprogramación en los sistemas operativos
A mediados de los sesenta la aparición de los circuitos integrados de pequeña escala, con miles de dispositivos electrónicos (transistores, diodos, resistencias, condensadores, ... ) interconectados en pequeñas pastillas permitió el desarrollo de macrocomputadores de menor tamaño y con una mejor relación prestaciones/precio que los macrocomputadores basados en transistores individuales. Además, con objeto de satisfacer las necesidades de instituciones más pequeñas (departamentos de universidad, pequeñas empresas, etc) se desarrollaron los minicomputadores, cuyo precio era unas diez veces menor que el de los macrocomputadores.
Consideraciones generales de los sistemas operativos
31
La familia de macrocomputadores IBM 360 fue una de las primeras en utilizar este tipo de tecnología. ? _~ diseñada para intentar soportar procesamiento por lotes tanto de trabajos científicos, que requerían = c.lSO intensivo del procesador, como de trabajos empresariales o comerciales, donde las operaciones .:c E S predominaban sobre el uso del procesador. Estos requisitos tan contrapuestos hicieron que su -:t'ma operativo, el OS/360, fuera bastante complejo y dos o tres órdenes de magnitud mayor que el
..
~r
...
-'
l" na de las principales novedades del OS /360 y de los sistemas operativos de los computadores de la ' a. fue el uso de la técnica conocida como multiprogramación. Esta técnica consiste en mantener en ~emolia principal varios trabajos simultáneamente. Si el trabajo que se está ejecutando actualmente _ ~ I procesador requiere la realización de una operación de E/S, mientras se completa dicha opera-: ;- el procesador puede ejecutar otro trabajo. De esta forma se consigue aumentar el rendimiento del _ x esador.
~':O:
La multiprogramación requiere que el sistema operativo sea capaz de gestionar la memoria principal memoria secundaria. Además es necesario que disponga de un algoritmo de planificación de los =-....:'.1.105. También es necesario que el hardware soporte mecanismos de protección de la memoria, E/S _ -:rolada por interrupciones y DMA. l" sando multiprogramación el procesamiento por lotes se realizaba de forma bastante eficiente. Sin ---- _argo. el tiempo que podía transcurrir entre la entrega de un trabajo dentro de un lote y la obtención :.re " °alida, podía llegar a ser de varias horas, aunque dicho trabajo no necesitara un uso intensivo del :---: ' ~sador. Por otra parte, en el modo de operación por lotes, un usuario no podía interactuar con el _ -::.putador. _ o'::
Con objeto de obtener unos tiempos de respuesta pequeños y permitir una comunicación directa -e el usuario y el computador se desarrolló una variante de la multprogramación llamada tiempo .élan ido. Esta técnica se denomina así porque el uso del procesador se comparte entre los trabajos de - _~ :lpl e5 usuarios. En un sistema informático de tiempo compartido múltiples usuarios se comunican .lháneamente con el computador a través de terminales serie. Un terminal serie es un dispositivo de =: - qu e consta de un teclado y de una pantalla, y que se comunica con el computador mediante una línea ___ .ot'. por la cual la información se transmite bit a bit. Cada usuario introduce desde su terminal una orden ~?C ra por la respuesta. En todo momento un usuario cree que es el único que está interaccionando con =- ~ Jmputador y que tiene a su disposición todo sus recursos. l" n sistema operativo de tiempo compartido debe ser capaz de gestionar el uso de los recursos del _ ::::lpu tador entre los peticiones o trabajos interactivos de todos los usuarios, asignándoles de forma tiva el uso de los recursos del computador de tal forma que todos los trabajos puedan progresar y :.Jem pos de respuesta sean pequeños, típicamente menores de un segundo. l" no de los primeros sistemas operativos de tiempo compartido fue CTSS, desarrollado en el MIT en 01 para un computador IBM 709. Más tarde fue transferido a un IBM 7094 donde permitía un número - ' '\l mo de 32 usuarios conectados . -
•
-
o
'
.-\ fi nales de los años 60, los laboratorios Bell, General Electric y el MIT colaboraron para desarrollar _ -¡.;;rema operativo de tiempo compartido MULTICS capaz de soportar centenares de usuarios conec~ ' :. MULTICS inicialmente se ejecutaba en el macrocomputador GE-645 aunque después se adoptó
32
Fundamentos básicos de los sistemas operativos
para ser ejecutado en los computadores Honeywell 6180. Aunque el éxito comercial de MULTICS fue escaso, si tuvo, sin embargo, una gran influencia en el desarrollo de posteriores sistemas operativos ya que introdujo muchas ideas nuevas y valiosas . Entre los sistemas operativos influenciado por MULTICS se encuentra UNIX. El sistema operativo UNIX fue desarrollado en 1969 en AT&T por Ken Thompson (uno de los creadores de MULTICS) y Dennis Ritchie inicialmente para un minicomputador DEC PDP-7, aunque en 1970 fue adaptado para un DEC PDP-ll. Puesto que su código fuente era el lenguaje de programación C, UNIX fue fácilmente portado posteriormente a otras arquitecturas. UNIX llegó a ser muy popular en universidades, agencias gubernamentales y empresas. Puesto que AT&T fue obligada por las leyes antimonopolio de los Estados Unidos a conceder licencias gratuitas de UNIX, varias organizaciones desarrollaron sus propias distribuciones de UNIX, lo cual fue un verdadero caos para los programadores ya un mismo programa podía no correr en todas las distribuciones. Las dos distribuciones más importantes de UNIX fueron la distribución System V de AT &T y la distribución BSD de la Universidad de Berkeley (California, EEUU).
1.3.3.
Sistemas operativos modernos
A principios de los años 70 se desarrolló la tecnología de integración a gran escala (Large Scale Integration, LSI) que permitía almacenar cientos de miles de componentes electrónicos en un chip cuadrado de silicio de aproximadamente un centímetro cuadrado. Usando esta tecnología se logró implementar el primer microprocesador, es decir, un chip que integraba todos los componentes de un procesador. Con la aparición del microprocesador nacieron los primeros computadores personales (Personal Computers, PCs) que inicialmente recibieron el nombre de microcomputadores. Desde el punto de vista de su arquitectura y tamaño los primeros microcomputadores eran parecidos a los minicomputadores. Sin embargo, eran mucho más baratos, lo que hizo asequible, por primera vez en la historia, su compra a cualquier persona. Uno de los primeros sistemas operativos para microcomputadores fue CP 1M. CP 1M se diseñó en 1974 para ejecutarse con el microprocesador Intel 8080 de 8 bits, aunque en 1977 fue reescrito para poder ser ejecutado también con otros microprocesadores como el Zilog Z80. Este sistema operativo fue el dominante durante cerca de cinco años. Fue a principios de la década de los 80 cuando la producción de computadores personales comenzó a tomar gran importancia. IBM y Apple Computers fueron dos de las empresas cuyos computadores personales tuvieron mayor éxito de ventas en esta época, y que además propiciaron el nacimiento de los sistemas operativos MS-DOS y Mac OS , respectivamente. Los computadores personales con microprocesadores de la familia Intel x86 de 16 bits, fabricados por IBM o por otras compañías, utilizaban predominantemente el sistema operativo MS-DOS de Microsoft. La primera versión de MS-DOS escrita en 1981 por Tim Paterson para un IBM PC era bastante primitiva, aunque versiones posteriores fueron incluyendo características más avanzadas, muchas de ellas inspiradas en UNIX. La interacción del usuario con MS-DOS se realizaba a través de un intérprete de comandos. El usuario debía introducir por teclado la orden o el nombre del programa de aplicación que deseaba que el sistema operativo ejecutase.
Consideraciones generales de los sistemas operativos
33
Los computadores Macintosh (o más conocidos como Mac) fabricados por Apple Computers a par1984 con microprocesadores de la familia Motorola MC68000 disponían de un sistema operativo 7~?IO . Mac OS. Este sistema operativo tenía una atractiva interfaz de usuario gráfica (Graphical User --c~iace, GUI) con ventanas, iconos, menús y uso del ratón. Conviene aclarar que el primer GUI de =--:lS aracterísticas fue inventado por Douglas Engelbart a principios de los 70, y que el primer compu- Jr personal que disponía de dicho GUI fue el Xerox Alto desarrollado por Xerox PARC en 1973. Este : :mo gráfico amigable al usuario, fue todo una revolución y posibilitó el acercamiento a los compu- :."reS a usuarios sin ningún tipo de conocimiento en informática.
=-- ':c
In fl uenciado por el éxito del Macintosh y con objeto de explotar las prestaciones de los microproce- .: ~es rntel 486 e Intel Pentium, Microsoft desarrolló el sistema operativo Windows. En sus primeras ~~!0 n eS Windows era únicamente un entorno gráfico que se ejecutaba sobre MS-DOS . Sería en 1995 : aparición del Windows 95, cuando Windows adquirió la categoría de sistema operativo como tal, - _ e todavía usaba MS-DOS apara arrancar. Desde entonces hasta la fecha han aparecido diferentes -:0nes del sistema operativo Windows de Microsoft tanto enfocados a computadores personales como ~_ ¡dores. )uos sistemas operativos para computadores personales que merecen ser mencionados por su impory porque el objetivo de su desarrollo no era el beneficio económico son Minix y Linux. En 1987, - - '=-e\\ S. Tanenbaum desarrolló con fines educativos un pequeño clon de UNIX , el sistema operativo - -\. uyo código fuente era público y que se ejecutaba en computadores personales con microproce:-" ~ rntel 8088 o superior. ~}
.-\ pri ncipios de los 90, Linus B . Torvalds con objeto de explotar todas las funcionalidades de los ;' tadores personales con procesador Intel 386 desarrolló, basándose en Minix, el sistema operativo _'1.- \1ediante el uso de Internet distribuyó libremente el código fuente de su sistema operativo. Ello _:. ' ió que miles de personas de todo el mundo colaboraran desinteresadamente con Linus para mejorar _\. En la actualidad Linux es un sistema operativo que ha sido portado a diferentes arquitecturas y - :ontinúa evolucionando. Además cada vez interesa a un número creciente de empresas ya que, aparte ~ gratuito, es comparable en potencia y flexibilidad a ciertos sistemas UNIX comerciales.
=_ el caso de computadores de altas prestaciones, como los supercomputadores, los macrocompu- ~:-eS . los servidores y las estaciones de trabajo, el sistema operativo UNIX (en sus diferentes distri-:::' cs. por ejemplo, Solaris) es en la actualidad de los más utilizados. Si bien UNIX ha inspirado a -.:; 15 de los sistemas operativos para computadores personales, es justo reconocer que UNIX también .:: -l uido mejoras, sobre todo desde el punto de vista de su interfaz de usuario, basándose en los siste-.) rativos de los computadores personales. Prueba de ello, es el entorno gráfico basado en ventanas, - dows incluido en 1984. O la interfaz gráfica de usuario Motif disponible desde 1989 que dotaba a _ ~ -on un aspecto similar a Mac OS o Windows . o tipo de computadores que se ha ido extendiendo progresivamente desde principios del siglo _ son los computadores de bolsillo (PDAs, teléfonos móviles inteligentes, ...). Para ellos se han desa0.10 sistemas operativos, como PALM OS, Windows CE, Symbian o Android, que son capaces de ":cf trabajos en tiempo real teniendo en cuenta las limitaciones de tamaño, manejo, procesamiento y 1ria de estos computadores.
34
Fundamentos básicos de los sistemas operativos
Finalmente comentar que, el espectacular incremento a finales de los ochenta de las redes de computadores, siendo Internet su máximo exponente, ha propiciado el desarrollado de sistemas operativos en red y sistemas operativos distribuidos. En un sistema operativo en red un usuario en un computador conoce la existencia de los otros computadores conectados en red y puede interactuar con dichas máquinas para acceder a sus contenidos. En un sistema operativo distribuido un usuario no percibe la existencia de otras máquinas y cuando ejecuta un programa no sabe si se está ejecutando en el procesador de su máquina o en de otra de la red, lo mismo se aplica al almacenamiento de archivos.
1.4.
Tipos de sistemas operativos
Los sistemas operativos pueden ser clasificados en función de diferentes criterios. Algunos de los más importantes son: el número de usuarios que se pueden atender simultáneamente, el número de programas cargados en la memoria principal, los requisitos temporales de los programas a ejecutar y la finalidad del computador.
1.4.1.
Clasificación en función del número de usuarios que se pueden atender simultáneamente
Teniendo en cuenta el número de usuarios que se pueden atender simultáneamente, los sistemas operativos se clasifican en multiusuario y monousuario. Un sistema operativo se dice que es multiusuario si puede atender simultáneamente a múltiples usuarios. Cada usuario trabaja con el sistema sin percibir que existen otro usuarios conectados. Ejemplos de sistemas operativos multiusuario son: UNIX, Windows Server y Linux. Por el contrario, un sistema operativo monousuario es aquél que solo puede atender a un único usuario simultáneamente. Ejemplos de sistemas operativos monousuario son: MS-DOS, Windows y Mac OS.
1.4.2.
Clasificación según el número de programas cargados en la memoria principal
Según el número de programas que pueden estar cargados en la memoria principal, se distinguen de forma general dos tipos de sistemas operativos: monoprogramados y multiprogramados. En un sistema operativo monoprogramado o con monoprogramación, en la memoria principal del computador se almacena el sistema operativo y un único programa de usuario (ver Figura 1.2a), que tiene a su disposición todos los recursos del computador. El procesador ejecuta dicho programa ininterrumpidamente desde su inicio hasta su finalización. Cuando finaliza dicho programa se carga otro programa en memoria que pasa a ser ejecutado. Un ejemplo de sistema operativo monoprogramado es MS-DOS . En un sistema operativo multiprogramado o con multiprogramación, en la memoria principal se almacenan (ver Figura] .2b), aparte del sistema operativo, varios programas, que deben compartir durante su ejecución los recursos del computador. Si un programa A está siendo ejecutado en el procesador, el sistema operativo puede interrumpir su ejecución para ejecutar otro programa B cargado en la memoria principal. Posteriormente, la ejecución del programa A puede ser reanudada. Se denomina grado de
Consideraciones generales de los sistemas operativos
Sistema Operativo
Sistema Operativo
Programa A
Programa A
3S
Programa B
Programa e
(a)
(b)
Figura 1.2 - Esquema de distribución de la memoria principal en sistemas operativos con monoprogramación (a) y con multiprogramación (b)
ry; 1I1tiprogramación al número de programas cargados en memoria principal. Si dicho grado es constante -:1número de programas que se cargan en memoria debe ser igual al número de programas que se eliminan ':c ella. Para implementar la multiprogramación, el sistema operativo debe ser capaz de gestionar el uso .:e los recursos del computador entre todos los programas. Para ello debe disponer de algoritmos de :,lanificación, mecanismos de sincronización y mecanismos de asignación y protección de la memoria xi ncipal y de la memoria secundaria. También es necesario que el hardware soporte mecanismos de :' otección de la memoria, E/S controlada por interrupciones y DMA. • Ejemplo 1.1 -upóngase que en un determinado sistema informático se desean ejecutar dos programas A y B. La :'J ec ución del programa A requiere en primer lugar de 2 ut de uso del procesador, a continuación emplea :; ut en una operación de E/S y finalmente requiere otra vez el uso del procesador durante 3 ut. Por su ;:> arte, la ejecución del programa B requiere en primer lugar 3 ut de uso del procesador, a continuación -:mplea 6 ut en una operación de E/S y finalmente requiere otra vez el uso del procesador durante 1 ut. -i no se utiliza multiprogramación (ver Figura 1.3a) y primero se ejecuta el programa A, se observa que .3. ejecución del programa B comienza en t = 10 ut y finaliza en t = 20 ut. Durante la ejecución de .ill1bos programas el procesador ha permanecido inactivo durante 11 ut, es decir, un 55 %. Por su parte
36
Fundamentos básicos de los sistemas operativos
Procesador
A
E/S
A
B
A
o
B
5
10
20
15
Tiempo (ut)
(a)
Procesador
A
A
B
A
E/S
o
5
10
20
15
Tiempo (ut) (b)
Figura 1.3 - Diagrama de uso del procesador y de los dispositivos de E / S del Ejemplo 1.1 sin usar multiprogramación (a) y usando multiprogramación (b)
los dispositivos de E/S han permanecido inactivos durante 9 ut, es decir, un 45 %. Si se utiliza multiprogramación (ver Figura 1.3b) y se supone que el programa A usa el procesador antes que el programa B, se observa que la ejecución del programa B se inicia en t = 2 ut y finaliza en el instante de tiempo t = 14 ut. Durante la ejecución de ambos programas el procesador ha permanecido inactivo durante 5 ut, es decir, un 35,7 %. Por su parte los dispositivos de E/S han permanecido inactivos durante 3 ut, es decir, un 21 ,4 %. En definitiva, el uso de la multiprogramación permite disminuir los tiempos de finalización de los programas y aumentar el uso de los recursos del sistema. Sin embargo, conviene tener presente que existe un límite máximo del grado de multiprogramación por encima del cual el rendimiento del sistema disminuye (ver sección 7.6).
•
Consideraciones generales de los sistemas operativos
37
?ara evitar posibles confusiones conviene aclarar algunas cuestiones relativas a la multiprograma-
• Se suelen usar el término multitarea como sinónimo de multiprogramación. • Cn sistema operativo multitarea puede ser multiusuario (UNIX, Linux, Windows Server,... ) o monousuario (Windows XP, Mac OS, ... ). • Se dice que un sistema operativo es multiacceso, si permite el acceso al sistema informático a través de dos o más terminales. El multiacceso no requiere necesariamente la existencia de multiprogramación. Algunos sistemas informáticos dedicados al procesamiento de transacciones, como por ejemplo los sistemas de reserva de billetes, soportan centenares de terminales activos que son atendidos por un único programa. • C n sistema operativo con multiprocesamiento es aquél que es capaz de coordinar la actividad de \ arios procesadores simultáneamente. Este tipo de sistemas operativos son sistemas multitarea por defi nición ya que soportan la ejecución de varios programas sobre diferentes procesadores. Dependiendo de la implementación, la multitarea puede estar también permitida en cada procesador individual.
3.
Clasificación en función de los requisitos temporales de los programas a ejecutar
Te niendo en cuenta los requisitos temporales (tiempo de ejecución o tiempo de respuesta) de los _~m as que se van a ejecutar, es posible distinguir los siguientes tipos de sistemas operativos: • Sistemas operativos por lotes o sistemas batch. En estos sistemas los trabajos se procesan agrupado s en lotes de trabajos con necesidades similares. Cada trabajo consta típicamente del programa a ejecutar, los datos necesarios y órdenes para el sistema operativo. El tipo de trabajos que se suelen ejecutar en estos sistemas son aquéllos que requieren un tiempo de ejecución grande, típicamente minutos u horas, y que además necesitan de poca o nula interacción con lo usuarios, como por ejemplo: análisis estadísticos, gestión de nóminas, etc.
En los sistemas por lotes la planificación del procesador es bastante simple, los trabajos son procesados normalmente por orden de llegada, aunque a veces se ordenan los trabajos por tiempo estimado de ejecución y se ejecuta primero el más corto. Asimismo, como en cada momento solo hay como máximo un programa en ejecución, no existen limitaciones temporales en el uso de los dispositivos de E/S, por ello se suele utilizar E/S controlada por programa. La gestión de la memoria principal en los sistemas operativos por lotes es sencilla, la memoria se suele dividir en dos regiones: una ocupada permanentemente por el sistema operativo y la otra por programas transitorios. Asimismo es sencilla la gestión de archivos, puesto que el acceso a los mismos se realiza de forma secuencial, lo que no requiere prácticamente de mecanismos de protección o de control de accesos concurrentes.
38
Fundamentos básicos de los sistemas operativos
• Sistemas operativos de tiempo compartido o sistemas interactivos. Son sistemas multiusuario con multiprogramación donde cada usuario introduce desde su terminal una orden, bien mediante el uso del teclado o del ratón, y espera por la respuesta del sistema operativo. En todo momento, gracias a la multiprogramación, un usuario cree ser el único que está interaccionando con el computador y tener a su disposición todo sus recursos. Las aplicaciones que se suelen ejecutar en estos sistemas son programas que requieren un tiempo de respuesta pequeño, típicamente menores de un segundo, ya que en caso contrario el usuario pensará que el sistema es insensible a su acciones. Ejemplo de aplicaciones interactivas son: los intérpretes de comandos, los editores y las aplicaciones con GUI. Un sistema operativo de tiempo compartido debe disponer de un algoritmo de planificación que asegure un uso equitativo del procesador a todos los programas. También debe contar con mecanismos de protección de la memoria principal y de la memoria secundaria, así como con mecanismos de control de acceso concurrente a los archivos.
• Sistemas operativos de tiempo real. Son sistemas con multiprogramación que soportan aplicaciones de tiempo real, que son aquellas que reciben unas entradas procedentes de unos sensores externos, a través de unas tarjetas de adquisición de datos, y deben generar unas salidas en un tiempo de respuesta preestablecido. Tales aplicaciones de tiempo real se usan en experimentos científicos, control industrial, robótica, sistemas de control de vuelo, simulaciones, telecomunicaciones, dispositivos multimedia, etc. Se pueden clasificar en dos tipos: aplicaciones de tiempo real estrictas y aplicaciones de tiempo real suaves. Las aplicaciones de tiempo real estrictas son aquellas donde es necesario que sus tareas asociadas se completen siempre en un límite preestablecido de tiempo de respuesta, como por ejemplo, aplicaciones de tiempo real para control industrial o robótica. Las aplicaciones de tiempo real suaves son aquellas que permiten sobrepasar en algunas ocasiones dicho límite de tiempo de respuesta, como por ejemplo aplicaciones de tiempo real para multimedia o realidad virtual. Los sistemas operativos de tiempo real utilizan un algoritmo de planificación basado en prioridades de tipo expropiativo, de tal forma que el proceso más prioritario siempre consigue el uso de los recursos que necesita. La gestión de la memoria es menos exigente que en otros sistemas con multiprogramación, ya que muchos procesos residen permanentemente en memoria principal con el fin de lograr unos tiempos de respuesta rápidos. Además, el número de procesos suele ser estático y existe poco movimiento de programas entre la memoria primaria y la secundaria. Asimismo no suele ser necesaria la administración de archivos. Ejemplos de sistemas operativos de tiempo real son VxWorks y QNX.
• Sistemas operativos híbridos. Son aquellos sistemas operativos con capacidad para soportar tanto trabajos por lotes como aplicaciones interactivas o incluso aplicaciones suaves de tiempo real. Normalmente se asigna a los trabajos por lotes una prioridad de ejecución más pequeña que a las aplicaciones interactivas, y a éstas una prioridad de ejecución menor que a las aplicaciones suaves de tiempo real. Así, los trabajos por lotes se ejecutan cuando el procesador no tiene que ejecutar
Consideraciones generales de los sistemas operativos
39
ap licaciones interactivas, y éstas cuando no hay que ejecutar aplicaciones suaves de tiempo real. Ejemplos de sistemas operativos híbridos son UNIX y Linux.
A.
Clasificación en función de la finalidad del computador
~~nie ndo -. ~ u ie ntes
en cuenta la finalidad del computador sobre el que se van a ejecutar es posible distinguir tipos de sistemas operativos:
•
istemas operativos para macrocomputadores. Los macrocomputadores son computadores de gran uunaño, pueden ocupar toda una sala, con una elevada capacidad de realización de operaciones de E S. No es extraño que dispongan de miles de discos duros con capacidad total para miles de terabytes de datos. Se suelen utilizar como centros de datos en grandes empresas. También no es raro 5U uso como servidores en sistemas transaccionales y servidores web. Los sistemas operativos para macrocomputadores se diseñan para poder procesar muchos trabajos a la vez, la mayoría de los .:- ua les requieren de muchas operaciones de E/S. Soportan procesamiento por lotes, por ejemplo la rención de demandas en una compañía de seguros. También soportan procesamiento de transac'IOnes, por ejemplo las transacciones bancarias procedentes de una red de cajeros automáticos o e reserva de billetes de líneas aéreas. Además soportan procesamiento de tiempo compartido, con :núltiples usuarios conectados al sistema simultáneamente, por ejemplo, en la consulta de una base J e datos . Un ejemplo de sistema operativo para macrocomputadores es OS/390.
•
is remas operativos para servidores de red. Los servidores de red se pueden implementar en 'omputadores personales de altas prestaciones, estaciones de trabajo o incluso en macrocompu,adores. Atienden a múltiples usuarios simultáneamente y posibilitan al usuario el poder compartir e ursas hardware y software. También suministran servicios de impresión, gestión de archivos y :;er,icios web. Ejemplos operativos típicos de este tipo son UNIX, Windows Server y Linux.
•
isremas operativos para computadores personales. Su principal objetivo es suministrar a un único usuario una interfaz adecuada para la ejecución de programas de aplicación, como hojas de 'álc ulo, navegadores web, correo electrónico, procesadores de texto, etc. Ejemplos destacados son \\'indows, Mac OS y Linux.
• Sistemas operativos para computadores de mano. Los sistemas operativos que se ejecutan en un computador de mano (PDAs, teléfonos móviles inteligentes,..) deben tener en cuenta las limitaciones de tamaño, potencia y memoria a la hora de ejecutar aplicaciones de tiempo real. Ejemplos de esre tipo de sistemas operativos son Palm OS, Windows CE, Symbian y Android. • Sistemas operativos integrados. Son aquellos que se ejecutan en un computador que forma parte de otro sistema, como por ejemplo: un televisor, un automóvil, un reproductor de MP3 , un reproductor de DVD, etc. Los sistemas operativos integrados atienden las peticiones de aplicaciones de tiempo real que se encuentran almacenadas típicamente en una memoria ROM, por lo que no disponen mecanismos de protección de memoria. Ejemplos de este tipo de sistemas operativos son QNX y VxWorks.
40
Fundamentos básicos de los sistemas operativos
1.4.5.
Otros tipos importantes de sistemas operativos
Aparte de los tipos de sistemas operativos descritos en las secciones anteriores, otros tipos importantes de sistemas operativos cuyas características conviene conocer son los siguientes:
• Sistemas operativos paralelos o sistemas multiprocesador. Son aquellos sistemas operativos que se ejecutan en sistemas informáticos que poseen múltiples procesadores, los cuales comparten el bus y el reloj, y en ocasiones la memoria y los dispositivos de E/S . A estos sistemas se les suele denominar como sistemas fuertemente acoplados. Los sistemas multiprocesador más comunes utilizan el multiprocesamiento simétrico, que consiste en que cada procesador utiliza una copia idéntica del sistema operativo. Dichas copias se comunican entre sí cuando resulta necesario. Las distribuciones modernas de UNIX, Linux y Windows Server soportan el multiprocesamiento simétrico . • Sistemas operativos distribuidos. Son aquellos que se ejecutan en sistemas informáticos distribuidos, los cuales se implementan mediante redes de computadores cuyos procesadores no comparten ni reloj ni memoria, y que se comunican entre sí mediante buses de alta velocidad o líneas telefónicas. A estos sistemas se les suele denominar como sistemas débilmente acoplados. En cada computador de la red se ejecuta un sistema operativo, los diferentes sistemas operativos cooperan estrechamente para dar a los usuarios la ilusión de que únicamente existe un único sistema operativo. Cuando un usuario ejecuta un programa no sabe si se está ejecutando en el procesador de su máquina o en el de otra de la red, y lo mismo se aplica al almacenamiento de archivos. Ejemplos de sistemas distribuidos son Sprite, Mach, Chorus y la distribución de UNIX Solaris-Me. • Sistemas operativos de red. Son aquellos que se ejecutan en redes de computadores y posibilitan que un usuario en un computador de la red conozca la existencia de los otros computadores conectados, y pueda interactuar con dichas máquinas para acceder a sus contenidos y compartir sus recursos. Un computador ejecutando un sistema operativo de red actúa de manera independiente y se comunica con los demás computadores de la red mediante el paso de mensajes. Ejemplos de sistemas operativos de red son: Novel! Netware, Personal Netware, Windows Server y UNIX.
1.5.
Llamadas al sistema
La mayoría de los procesadores disponen de dos modos de ejecución: modo núcleo o supervisor y modo usuario. Un programa ejecutándose en modo núcleo puede ejecutar cualquier instrucción del repertorio de instrucciones del procesador y, en consecuencia, acceder a todas las características del hardware. Por el contrario, un programa ejecutándose en modo usuario solo puede ejecutar un conjunto limitado de instrucciones del repertorio del procesador, con lo que tiene limitado el acceso al hardware. Típicamente las instrucciones privilegiadas no se pueden ejecutar en modo usuario, solo en modo supervisor. El sistema operativo siempre se ejecuta en modo núcleo lo cual le da un acceso completo al hardware. Por su parte, los programas de los usuarios (programas creados por el propio usuario, programas de aplicación o programas de utilidades di stribuidos junto con el sistema operativo) se ejecutan en modo
Consideraciones generales de los sistemas operativos
41
-, suario y su acceso al hardware está restringido. Para poder usar los recursos hardware, los programas de .: suario deben solicitar su uso al sistema operativo mediante la realización de llamadas al sistema, que :ünforman la interfaz entre los programas de usuario y el núcleo. Cada sistema operativo tiene su propio conjunto de llamadas al sistema, aunque los conceptos que '.lbyacen en todos ellos suelen ser bastante parecidos. Típicamente los programas de usuario pueden ~l\ oc ar a las llamadas al sistema de dos formas : • Mediante el uso de librerías de llamadas al sistema. En este caso las llamadas al sistema se invocan de forma similar a como se invoca a cualquier función de un programa escrito en un lenguaje de alto nivel. Existen librerías de llamadas al sistema que trasladan estas llamadas a las funciones plimitivas necesarias que permiten acceder al núcleo. Estas librerías se enlazan por defecto con el código de los programas en tiempo de compilación, formando así parte del archivo objeto asociado al programa. • De forma directa. Los programas escritos directamente en lenguaje ensamblador pueden invocar a las llamadas al sistema de forma directa sin necesidad de una librería de llamadas al sistema.
Cuando un programa de usuario invoca a una llamada al sistema se produce una trampa (ver sección que provoca la conmutación hardware de modo usuario a modo supervisor y transfiere el control _ . úcleo. El núcleo examina el identificador numérico de la llamada (cada llamada tiene asignado uno) y " parámetros de la llamada para poder localizar y ejecutar a la rutina del núcleo asociada a la llamada al '_':c ma. Cuando dicha rutina finaliza, almacena el resultado en algún registro y provoca la conmutación -=-~d\\' are de modo supervisor a modo usuario para que el proceso de usuario que invocó la llamada _:,::ninúe su ejecución. Como se ha comentado, el núcleo necesita acceder a los parámetros de la llamada al sistema. Existen ":"las formas de pasar estos parámetros al núcleo: ~ .2 ).
• Cargar los parámetros en registros. Es el método más sencillo, aunque puede suceder que el número de registros disponibles sea inferior al número de parámetros. • A lmacenarlos en un bloque o tabla de memoria. En este caso solo es necesario conocer la dirección de comienzo del bloque donde se van a almacenar los parámetros, dicha dirección se pasa como parámetro. • Almacenarlos en una pila. El proceso invocador de la llamada escribe los parámetros en la pila y el núcleo los lee de allí.
Ej emplo 1.2
:: ' :1sidérese el siguiente programa escrito en lenguaje C que invoca a la llamada al sistema crea t en -= ,istema operativo UNIX o Linux para crear un archivo: ::-_ :;. ::: name [] ~~ =- --
()
=
"prueba";
42
Fundamentos básicos de los sistemas operativos
int fd; fd = creat(name,0666)
Los parámetros de entrada de la llamada al sistema crea t son el nombre del archivo (name) y sus permisos de acceso (O 6 66), que otorgan permisos de lectura y escritura para todos los usuarios. Supóngase que el programa es compilado en un computador que tiene un procesador Motorola 68000. En la Figura lA se muestra una porción editada del código ensamblador generado por el compilador de C. Se observa que existen tres zonas diferenciadas: el código de la función main, el código de la función de librería asociada a la llamada al sistema creat, y el código de la función de librería para la notificación de errores en las llamadas al sistema. # Código para main 58: mov &Ox1b6, (%sp) 5e : mov &Ox204,-(%sp) 64:
jsr
Ox7a
# # # #
mover 0666 dentro de la pila mover puntero de la pila y mover la variab le "name" dentro de la pila llamada a la librería C para creat
# Código de la función de librería asociada a creat 7a: movq &Ox8, %dO # mover el valor del dato (8 ) # dentro del registro O 7c: trap &OxO # trap 7e: bcc &Ox6 <86> # bifurcación a la dirección 86 # si el bit de acarreo es O 80: jmp Ox13c # saltar a la dirección 13c 86: rts # volver de la subrutina
# Código de la función de noti ficaci ó n de errores en las llamadas al sistema %dO, &Ox20e 13c: mov # mover e l conten ido del regis tro O # a la posición 20e(errno) 142: movq &-Ox1, %dO # mover constante -1 # dentro del registro O 146: rts # volver de la subrutina
Figura 1.4 - Porción editada del código ensamblador generado por el compilador de programa del Ejemplo 1.l en un computador con procesador Motorola 68000
e al compilar el
En el código mostrado para la función main se observa (direcciones 58 y 5e) que se copian los parámetros de la llamada al sistema creat, es decir, la máscara de modo del archivo 0666 y la variable name , dentro de un marco de la pila asociada al proceso en ejecución. A continuación (dirección 64) se llama a la función de librería asociada a la llamada al sistema crea t, cuya dirección es 7 a. Aunque no aparece en la Figura lA se va a suponer que la dirección de retomo desde la función de librería es 6a. En el código mostrado para la función de librería asociada a la llamada al sistema crea t se observa que (dirección 7a) se mueve el identificador numérico (8) de la llamada al sistema, dentro del registro
Consideraciones generales de los sistemas operativos
43
- (registro de propósito general del procesador). A continuación (dirección 7c) se invoca una trampa - r a p) que produce una conmutación de modo usuario a modo núcleo y la invocación del algoritmo del , leo para el tratamiento de las llamadas al sistema. El algoritmo obtendrá del registro O el identificador érico 8 que le permitirá determinar qué la rutina a ejecutar es la de la llamada al sistema crea t. Cuando se vuelve a modo usuario, después de ejecutar la rutina asociada a creat, se continúa con la -ecución del código de la función de librería asociada a la llamada al sistema. En concreto, se retoma la instrucción cuya dirección es 7e , que comprueba si el bit de acarreo del registro de estado del sador está activado, es decir, si se produjo algún error durante la ejecución de la llamada al sistema. - - no hubo errores, salta de la dirección 7 e a la dirección 86, última instrucción de esta función, que ma la ejecución al código de la función main, en concreto a la dirección 6a . Su valor de retomo es contenido de los registros O y 1 el contrario, si está activado el bit de acarreo, el proceso salta a la dirección 13 c, que es la dirección comienzo del código de la función de librería para la notificación de errores en las llamadas al sistema. - el código asociado a dicha función se observa (dirección 13 e) que se mueve el código de error . ado en el registro O a la dirección 20e asociada a la variable global errno. A continuación ción 142) coloca el valor - 1 en el registro o. Finalmente (dirección 146) la función finaliza y se a la ejecución al código de la función de librería asociada a creat, en concreto a la dirección 86 . es la última instrucción de esta función que retoma la ejecución al código de la función main, en to a la dirección 6 a. Su valor de retomo es -1.
• Atendiendo a su finalidad las llamadas al sistema disponibles en un determinado sistema operativo eden agrupar de forma general en las siguientes categorías: • Control de programas en ejecución (procesos) . En esta categoría se incluyen las llamadas al sistema para crear, ejecutar, suspender un tiempo prefijado, abortar y terminar procesos. También se incluyen las llamadas para sincronizar la ejecución de un proceso con la aparición de un evento, las llamadas para obtener y establecer los atributos de un proceso, y las llamadas para asignar y liberar memoria. Administración de archivos o directorios. Dentro de esta categoría se consideran las llamadas al istema para crear, borrar, abrir, cerrar, leer, escribir archivos o directorios. También las llamadas para obtener y establecer los atributos de los archivos o directorios. Comunicaciones. Pertenecientes a esta categoría se encuentran las llamadas al sistema para crear o borrar una conexión de comunicación. También las llamadas para enviar o recibir mensajes o para conectarse a dispositivos remotos. , Gestión de dispositivos. En esta categoría se incluyenJas llamadas al sistema para solicitar, liberar, leer o escribir un dispositivo. También las llamadas para obtener y establecer los atributos del dispositivo.
44
Fundamentos básicos de los sistemas operativos
• Gestión de información del sistema. Dentro de esta categoría se encuentran las llamadas al sistema para obtener y configurar datos del sistema, o para obtener o modificar la fecha y la hora. En la Tabla 1.1 se recopilan a modo de ejemplo algunas llamadas al sistema de los sistemas operativos UNIX y Windows. Las llamadas al sistema de UNIX incluidas en esta tabla siguen el estándar de compatibilidad POSIX , mientras que las llamadas de Windows pertenecen al API Win32. Descripción Crear un proceso nuevo Esperar por la terminación de un proceso Finalizar la ejecución de un proceso Crear un archivo o abrir uno ya existente Cerrar un archivo Leer un archivo Escribir un archivo Mover el puntero de lectura/escritura de un archivo Obtener los atributos de un archivo Crear un directorio Borrar un directorio Cambiar el directorio de trabajo
UNIX fork waitpid exit open close read write lseek stat mkdir rmdir chdir
Windows CreateProcess WaitForSingleObject ExitProcess CreateFile CloseHandle ReadFile WriteFile SetFilePointer GetFileAttributeEx CreateDirectory RemoveDirectory SetCurrentDirectory
Tabla 1.1- Ejemplos de llamadas al sistema de UNIX y Windows
1.6.
Estructura del núcleo de un sistema operativo
1.6.1. Componentes principales del núcleo de un sistema operativo Un sistema operativo es una capa de software grande y compleja. La forma más eficiente de diseñar e implementar un sistema operativo consiste en descomponerlo en varios componentes o subsistemas más pequeños. No todos los sistemas operativos poseen la misma estructura, sin embargo, la mayoría de los núcleos de los sistemas operativos modernos suele disponer de los siguientes componentes: • Subsistema de control de procesos. Se encarga, entre otras tareas, de crear y eliminar procesos, suspender y continuar la ejecución de los procesos, proporcionar mecanismos para la sincronización y comunicación de los procesos, y manejar los interbloqueos . • Subsistema de administración de la memoria principal. Se encarga de llevar un registro de las partes de la memoria que se encuentran asignadas y a qué procesos. También se encarga de llevar un registro del espacio libre para poder asignarlo cuando se necesite, liberar memoria para asignarla a otros procesos y decidir qué procesos se van a cargar en memoria desde la memoria secundaria.
Consideraciones generales de los sistemas operativos
45
• Subsistema de gestión de archivos. Es el responsable de la gestión de los archivos de los diferentes sistemas de archivos existentes en la memoria secundaria. Además se encarga de fijar los tipos, los atributos, la estructura interna y los mecanismos de acceso de los archivos que soporta. También define la estructura de los directorios en los que lo usuarios y las aplicaciones organizan sus archivos, y los mecanismos de búsqueda de archivos permitidos dentro de dicha estructura de directorios. Asimismo proporciona al usuario las llamadas al sistema oportunas que le permitan operar (leer, escribir, crear, borrar, ... ) con archivos y directorios. Por otra parte, este subsistema se encarga de asignar espacio a los archivos y de administrar el espacio libre de la memoria secundaria, cuyo elemento más utilizado es el disco duro interno del computador. • Subsistema de E/S. Este componente oculta las particularidades del hardware de los dispositivos de E/S proporcionando una interfaz uniforme de forma que los programas de los usuarios puedan acceder a los dispositivos de E/S con un conjunto sencillo de llamadas al sistema de lectura y escritura. Para comunicarse con el hardware, el subsistema de E/S requiere un código específico para cada dispositivo denominado driver del dispositivo. Cuando un dispositivo termina una operación de E/S, el controlador de E/S avisa al driver correspondiente mediante la generación de una interrupción .
.6.2.
Tipos de estructuras del núcleo
El núcleo de un sistema operativo se puede considerar como un conjunto lógico de módulos soft.::re. Cada módulo contiene la información necesaria para cumplir con las funciones del subsistema : :ubsistemas que implementa. Además posee una interfaz bien definida, en términos de entradas que ~~pta y salidas que genera, que otros módulos pueden utilizar para solicitar y obtener servicios de dicho -:.:xi ulo. La estructura del núcleo de un sistema operativo queda definida por el número de módulos en que se .:=~ ~ o mpone y cómo se interrelacionan. Se distinguen principalmente los siguientes tipos de estructuras .:.el núcleo (ver Figura 1.5): estructura monolítica o simple, estructura en módulos, estructura en capas y -:---:nIctura extensible. ~ructura
monolítica
La estructura monolítica o simple se caracteriza porque todos los subsistemas y las estructuras de dadel núcleo están ubicadas en un único módulo lógico, no existiendo interfaces bien definidos entre los :,' sistemas. El software del núcleo está escrito como un conjunto de procedimientos. Hay un procedi- ~ nto principal, un conjunto de procedimientos de servicio y un conjunto de procedimientos auxiliares. -=- : ~i amente el procedimiento principal invoca al procedimiento de servicio requerido por una llamada _ si stema. A su vez el procedimiento de servicio invoca a los procedimientos auxiliares que necesita. '_':1 procedimiento es visible por todos los demás. La estructura monolítica puede ser bastante eficiente '. e· tá bien implementada. Sin embargo, suele ser difícil de entender y de mantener, por lo que no es .:-'..:-il determinar si funciona como se deseaba. Ejemplos de sistemas operativos con núcleos de estructura -.onolítica son MS-DOS y el UNIX tradicional. -:~
46
Fundamentos básicos de los sistemas operativos
Núcleo
Núcleo
r-OD D
L-DD a) Estructura monolítica
b) Estructura en módulos
Núcleo
Núcleo
CapaN
E = Extensión del núcleo
Capa N-I Micronúcleo Capa O c) Estructura en capas
d) Estructura extensible
Figura 1.5 - Principales estructuras del núcleo de un sistema operativo
Estructura en módulos La estructura en módulos o modular se caracteriza por la existencia de varios módulos que pueden contener uno o varios subsistemas. Tanto los módulos como los subsistemas que contienen tienen una interfaz bien definida en términos de entradas, salidas y funciones que realizan. Además se pueden implementar como tipos de datos y objetos abstractos. Un núcleo con estructura modular es mucho más fácil de mantener y modificar que un núcleo con estructura monolítica. Sin embargo, su eficiencia suele ser menor. Ninguno de los sistemas operativos más conocidos posee una estructura modular pura, aunque la estructura extensible utilizada por alguno de ellos podría considerarse como un caso especial de estructura modular. Estructura en capas o niveles La estructura en capas o niveles se caracteriza porque el núcleo estar organizado en una jerarquía de capas, cada una de las cuales subyace sobre la anterior. Cada capa i se implementa como un objeto abstracto que encapsula una serie de estructuras de datos y la implementación de las operaciones que pueden manipularlas. Dichas operaciones pueden ser invocadas por las capas de mayor nivel i + 1, i + 2,... Asimismo la capa i puede invocar a las operaciones de las capas de los niveles inferiores i - 1, i - 2,.. . El primer sistema operativo con núcleo de estructura en capas fue el sistema operativo THE desarrollado en 1968 por E. W. Dijkstra y sus estudiantes. THE es un sistema operativo por lotes que consta
Consideraciones generales de los sistemas operativos
47
::' seis capas. En la capa O, la más interna, están los controladores del hardware del computador. En .~ capa 1 se implementan los mecanismos de control, sincronización y comunicación de procesos. La ~ -"'pa 2 contiene los mecanismos de gestión de memoria. En la capa 3 se implementan los mecanismos ::' ' omunicación entre cada proceso y el operador de la consola. Cada proceso tiene su propio operador ~ ' onsola. La capa 4 se encarga de la gestión de la E/S. Finalmente en la capa 5 se encuentran los ::-:-ogramas de usuario. La principal ventaja de la estructura de capas, aparte de la sencillez de su diseño, es que simplifica ~ . proceso de depuración y verificación del sistema operativo. Cuando se verifica y depura la capa i, se - _::xme que el funcionamiento de la capa inferior i - 1 es correcto, ya que ha sido previamente depurada. La mayor dificultad de la estructura en capas se encuentra en definir adecuadamente los servicios :c .::ada capa, ya que se debe tener en cuenta que una capa solo puede utilizar los servicios ubicados en ~ ' apas inferiores. Por otra parte, la estructura en capas suele ser menos eficiente que otras estructuras, _.:. ue cada capa agrega un trabajo a la llamada original, lo que repercute en que la llamada al sistema =='t- lea más tiempo en ser atendida que en un sistema sin estructura en capas. Por ejemplo, cuando - :)fograma de usuario ejecuta una operación de E/S, ejecuta una llamada al sistema que activa una =:;:TUpción software que se comunica a la capa de E/ S. Ésta llama a la capa de administración de =r.':nona, la cual llama a la capa de planificación de la CPU, que luego controla el hardware . .-\1 igual que sucede con la estructura modular, ninguno de los sistemas operativos más conocidos : - ~~ e una estructura en capas pura. Sin embargo, la agrupación en capas es una meta hacia la cual _~:::de n. en un nivel de abstracción u otro, la mayoría de los sistemas operativos. L-rructura extensible La estructura extensible se puede considerar como un caso especial de la estructura modular. Se --=-:.-::.:tenza por la existencia de un módulo esencial denominado núcleo extensible o micronúcleo y varios '::= :uulos accesorios denominados extensiones del núcleo. El micronúcleo se encarga de realizar únicamente los servicios absolutamente esenciales del sistema : -,:uivo, aquellos que dependen de la arquitectura de la máquina y que son independientes del tipo de :ema operativo, como por ejemplo, la gestión de memoria a bajo nivel, la comunicación entre procesos, ~e s tió n de la E/S y la gestión de las interrupciones. Dichos servicios se ejecutan en modo núcleo. Los servicios menos esenciales del sistema operativo, aquellos que son independientes de la arqui·F-~:ura de la máquina y que dependen del tipo de sistema operativo, como por ejemplo la gestión de la -emoria virtual, la administración de los sistemas de archivos o servicios de seguridad y protección, etc, ; Jl1plementan como extensiones del núcleo y se ejecutan en modo usuario. l" sualmente las aplicaciones de usuario y las extensiones del núcleo interactúan entre ellas mediante - esquema del tipo cliente/servidor (ver Figura 1.6). Para solicitar un servicio, un proceso de usuario "T_ ' eso cliente) envía la petición a una extensión del núcleo (proceso servidor) . Cuando el servidor -~za su trabajo devuelve al cliente la respuesta. De esta forma, si una aplicación desea abrir un archivo, - o da una petición al servidor del sistema de archivos o si quiere crear un proceso manda una petición _ . ~f\ idor de procesos. También las extensiones del núcleo interactúan entre ellas con un modelo de este _I~.
48
Fundamentos básicos de los sistemas operativos
Ejecución en modo usuario
Ejecución en modo núcleo
Proceso cliente
Proceso cliente
- --
Servidor de ficheros
Servidor de memOrIa
Servidor de procesos
T
I Mensaje de petición
Micronúcleo
Mensaje de respuesta
Figura 1.6 - Modelo cliente-servidor utilizado en la estructura de tipo extensible
La comunicación cliente/ servidor se realiza mediante el paso de mensajes a través del micronúcleo, que se encarga de validar los mensajes, pasarlos a sus destinatarios y otorgar el acceso al hardware. Entre las ventajas que presenta un núcleo con estructura extensible destacan las siguientes: • Manejabilidad. Cada extensión del núcleo se encarga de un servicio del sistema. Esto posibilita la
división del sistema en partes pequeñas, lo que facilita su modificación y depuración.
• Extensibilidad. Es posible añadir nuevas características al sistema operativo. Simplemente hay que añadirle alguna nueva extensión del núcleo o modificar alguna ya existente. • Fiabilidad. Puesto que los servicios prestados por las extensiones del núcleo se ejecutan como
procesos de usuario, si algún servicio falla el resto puede seguir disponible .
• Soporte simultáneo de múltiples sistemas operativos. El micronúcleo proporciona una interfaz de máquina virtual de bajo nivel, esto posibilita el poder soportar en una misma máquina diferentes sistemas operativos, simplemente hay que añadir las extensiones del núcleo adecuadas para cada sistema operativo (ver Figura 1.7). • Portabilidad. El micronúcleo es la parte del núcleo que contiene todo el código dependiente del hardware. Si se desea portar un núcleo con estructura extensible a otra arquitectura hardware solo hay que modificar el micronúcleo. Las modificaciones necesarias suelen ser menores. La principal desventaja de un núcleo con estructura extensible es su menor rendimiento en comparación con otros tipos de estructuras. Entre las causas que contribuyen a este menor rendimiento destaca el uso del paso de mensajes como esquema de solicitud de servicios. La construcción de un mensaje de petición por un cliente, su envío al servidor, su procesamiento por el servidor, la construcción del mensaje de respuesta y su envío al cliente lleva más tiempo que realizar una simple llamada a un servicio. Ejemplos de sistemas operativos con estructura extensible son Mach, Chorus, Digital UNIX, que proporciona una interfaz UNIX pero que está implementado sobre un micronúcleo Mach, MacOS X Server de Apple, que también se basa en un micronúcleo Mach, y el sistema operativo Windows NT.
Consideraciones generales de los sistemas operativos
49
Extensión del núcleo perteneciente al sistema operativo 1
88--
----2
El -----_. ~
Núcleo
/
88--8
Micronúcleo
I
I Hardware
Figura 1.7 - Diagrama de una estructura extensible que soporta múltiples sistemas operativos
1.7.
Resumen
Un sistema operativo se define como una capa de software que gestiona de forma eficiente a todos di spositivos hardware de un computador, y además suministra a los usuarios una interfaz cómoda con =[ hardware. Los principales servicios que proporciona un sistema operativo pueden agruparse en: ejecución de ;,~ogramas, acceso a los dispositivos de E/S, manipulación del sistema de archivos, comunicación y -: cronización, detección y respuesta a errores, protección y seguridad, y contabilidad. Los sistemas operativos han ido evolucionando desde su creación a mediados de la década de los ~m uenta. Dicha evolución ha estado marcada por la evolución del hardware de los computadores. Ini~ l a1 mente trabajaban con un esquema de operación denominado procesamiento serie, que consistía en =_' ''~ utar un trabajo cuando finalizaba otro. Luego se introdujo el procesamiento por lotes, que consistía ::J agrupar en lotes los trabajos con necesidades similares. Hasta que un lote no finalizaba no comenzaba .: "j ecutarse otro. Posteriormente los sistemas operativos adoptaron la técnica conocida como multiprogramación, que :~)ns i s te en mantener cargados en memoria principal varios trabajos simultáneamente. Esto requiere que ::: sistema operativo sea capaz de gestionar la memoria principal y la memoria secundaria, y disponga ::~ un algoritmo de planificación de trabajos. Usando multiprogramación el procesamiento por lotes realiza de forma bastante eficiente. Una variante de la multiprogramación es la técnica de tiempo _ l/ll partido, en la que el uso del procesador se comparte equitativamente entre los trabajos de múltiples _,u arios con objeto de obtener unos tiempos de respuesta pequeños para todos los usuarios. Los sistemas operativos se pueden clasificar en función de diferentes criterios, como por ejemplo, :: número de usuarios que pueden acceder simultáneamente al sistema (sistema operativo monusuario _~ ~
.>
SO
Fundamentos básicos de los sistemas operativos
y sistema operativo multiusuario), el número de programas cargados en la memoria principal (sistema operativo monoprogramado y sistema operativo multiprogramado), los requisitos temporales de los
programas (sistema operativo por lotes o batch, sistemas de tiempo compartido o interactivos, sistemas operativos en tiempo real y sistemas híbridos), y la finalidad del computador (microcomputadores, servidores de red, computadores personales, computadores de bolsillo, ... ). Otros tipos importantes de sistemas operativos son: los sistemas operativos paralelos o multiprocesador, los sistemas operativos distribuidos, y los sistemas operativos de red. Para poder usar los recursos hardware, los programas de usuario deben solicitar su uso al sistema operativo mediante la realización de llamadas al sistema, que conforman la interfaz entre los programas de usuario yel núcleo. Los programas de usuario pueden invocar a las llamadas al sistema de dos formas : mediante el uso de librerías de llamadas al sistema, y de forma directa. Cuando un proceso asociado a un programa de usuario invoca a una llamada al sistema se produce una trampa , que provoca la conmutación hardware de modo usuario a modo supervisor, y transfiere el control al núcleo. El núcleo examina los parámetros de la llamada (los carga bien en registros, en una tabla de memoria, o en una pila), y atiende el servicio requerido. Cuando finaliza, almacena el resultado en algún registro y provoca la conmutación hardware de modo supervisor a modo usuario para que el proceso continúe su ejecución. Atendiendo a su finalidad, las llamadas al sistema disponibles en un determinado sistema operativo pueden agruparse de forma general en: control de procesos, administración de archivos o directorios, comunicaciones, gestión de dispositivos, y gestión de información al sistema. Un sistema operativo se descompone en varios subsistemas o componentes: subsistema de control de procesos, subsistema de administración de la memoria principal, subsistema de administración de archivos y subsistema de entrada/salida. El núcleo de un sistema operativo se puede considerar como un conjunto lógico de módulos software. Cada módulo contiene la información necesaria para cumplir con las funciones del subsistema o subsistemas que implementa. La estructura del núcleo queda definida por el número de módulos en que se descompone y cómo se interrelacionan. Principalmente, se distinguen los siguientes tipos de estructuras: estructura monolítica o simple, estructura en módulos, estructura en capas y estructura extensible.
1.8.
Lecturas recomendadas
Si se desea obtener una explicación adicional de los contenidos tratados en este capítulo se pueden consultar, por ejemplo: el capítulo 1 de [Tanenbaum, 2009], el capítulo 2 de [Stallings, 2005], el capítulo 3 de [Silberschatz et. al, 2002], el capítulo 1 de [Nutt, 2006] y el capitulo 1 de [Milenkovic, 1994].
1.9.
Autoevaluación
1.1. ¿Qué es un sistema operativo? ¿Cuáles son sus principales objetivos? (Respuesta en sección 1.2.1) 1.2. ¿Qué función tiene el núcleo de un sistema operativo? (Respuesta en sección 1.2.1) 1.3. ¿Cuáles son los principales servicios de un sistema operativo? (Respuesta en sección 1.2.2)
Consideraciones generales de los sistemas operativos
51
- . LEn qué consiste el procesamiento por lotes o batch? (Respuesta en sección 1.3.1) .:
En qué consiste la técnica de multiprogramación? (Respuesta en sección 1.3.2)
L
~ Qué
-
L
Qué es un sistema monoprogramado? (Respuesta en sección 1A.2)
l
Qué define el grado de multiprogramación? (Respuesta en sección l.4.2)
es un sistema multiusuario? (Respuesta en sección 1A.l)
~Có mo (1
se realiza la gestión de memoria principal y de archivos en los sistemas operativos por lotes batch? (Respuesta en sección 1.4.3)
"
~. C uáles
~
~ Q ué
son los requisitos de un sistema operativo de tiempo compartido? Respuesta en sección 1A.3) tipo de algoritmo de planificación emplean los sistemas operativos de tiempo real? Respuesta en sección 1A.3)
En umerar por orden las prioridades de ejecución de trabajos en un sistema operativo híbrido, y señalar algún ejemplo de sistema operativo de este tipo. (Respuesta en sección 1A.3) -
~. Qué
tipos de sistemas operativos se distinguen en función de la finalidad del computador? I Re spuesta en sección 1AA)
- Señalar las principales diferencias entre los sistemas operativos paralelo o multiprocesador, y los sistemas operativos distribuidos. (Respuesta en sección 1.4.5) (. Qué son las llamadas al sistema? (Respuesta en sección 1.5) ¿Cómo pueden invocar los programas de usuario a las llamadas al sistema? I Respuesta en sección 1.5) l. Enumerar la secuencia de eventos que se producen cuando un programa de usuario invoca a una llamada al sistema. (Respuesta en sección 1.5)
52
Fundamentos básicos de los sistemas operativos
1.22. ¿En qué categorías se pueden agrupar las llamadas al sistema atendiendo a su finalidad? (Respuesta en sección 1.5) 1.23. ¿Cuáles son los subsistemas o componentes principales del núcleo de un sistema operativo? (Respuesta en sección 1.6.1) 1.24. ¿Qué factores definen la estructura del núcleo, y qué tipos se distinguen en función de éstos? (Respuesta en sección 1.6.2) 1.25. ¿Cómo funciona un núcleo con estructura monolítica? (Respuesta en sección 1.6.2) 1.26. Comparar la estructura monolítica con la estructura en módulos. (Respuesta en sección 1.6.2) 1.27. ¿Por qué se caracteriza la estructura en capas? ¿Cuáles son sus principales ventajas e inconvenientes? (Respuesta en sección 1.6.2) 1.28. Para el caso de un núcleo con estructura extensible explicar qué es y de qué tareas se encarga: a) El micronúcleo. b) Una extensión del núcleo. (Respuesta en sección 1.6.2) 1.29. Señalar las principales ventajas y los inconvenientes de un núcleo con estructura extensible. (Respuesta en sección 1.6.2)
apítulo 2
escripción y control de procesos ~ etivos ::...~ :
docentes
objetivos docentes de este capítulo son los siguientes:
• - aber qué es un proceso. Conocer cuáles son las regiones en que se descompone el espacio de direcciones lógicas de un roceso. • Distinguir los diferentes tipos de procesos. • Conocer cuáles son los principales estados en que puede encontrarse un proceso. • Conocer las principales estructuras de datos que utiliza el sistemas operativo para controlar a los ,..focesos . • Conocer las causas que motivan la creación de un proceso y las acciones que conlleva. '1
Conocer las acciones que conlleva la terminación de un proceso.
• - aber qué es un cambio de proceso o contexto, y cuáles son las principales causas que lo producen. • - aber qué es la sobrecarga del sistema. • Conocer las características del modelo de proceso multihilo. • Distinguir los diferentes tipos de hilos. • Conocer las características de las principales configuraciones que se pueden tener en función del número y tipo de hilos soportados por un sistema operativo. 53
54
Fundamentos básicos de los sistemas operativos
2.1.
Introducción
Uno de los principales servicios que debe proporcionar un sistema operativo es posibilitar la ejecución de los programas de los usuarios. Para lograr este objetivo utiliza el modelo de proceso. Un proceso es una instancia de un programa en ejecución que requiere la asignación de diferentes recursos para poder existir y progresar. Los procesos van pasando durante su tiempo de existencia por diferentes estados. El sistema operativo se encarga de controlar las transiciones entre dichos estados; para ello debe mantener diferentes estructuras de datos en su espacio de direcciones. Además el sistemas operativo gestiona la creación de procesos, su finalización y el cambio de proceso, que consiste en interrumpir o finalizar la ejecución de un proceso e iniciar o retomar la ejecución de otro proceso. llara poc\er rea\12ar estas tareas e\ sistema operaúvo c\ene ejecutarse en e\ procesac\m. El modelo de proceso tradicional considerado supone que un proceso únicamente sigue una determinada traza o ruta de instrucciones en su ejecución, es decir, tiene un único hilo de control. Sin embargo los sistemas operativos más modernos utilizan un modelo de proceso multihilo, ya que mejora el rendimiento del sistema. En este capítulo en primer lugar se trata la descripción de los procesos, es decir, su definición, tipos y estados. En segundo lugar se describen las estructuras de datos y las principales tareas del sistema operativo asociadas con el control de procesos. En tercer lugar se realizan diversas consideraciones relativas a la ejecución del sistema operativo. La parte final del capítulo está dedicada a presentar el modelo de proceso multihilo.
2.2.
Descripción de los procesos
2.2.1.
Definición de proceso
Un programa es un archivo ejecutable que típicamente se encuentra almacenado en memoria secundaria. Considerado como archivo, un programa es una entidad pasiva o estática. Cuando un programa es ejecutado se convierte en una entidad activa o dinámica denominada proceso que va pasando por diferentes estados y utilizando distintos recursos del computador. En conclusión, un proceso es un programa en ejecución. También se define el término proceso como la entidad que se puede asignar y ejecutar en un procesador, es por tanto la unidad básica de trabajo de un sistema informático. Cada vez que se ejecuta un programa el sistema operativo crea un proceso asociado con dicho programa. En consecuencia, si se ejecutan varias copias de un mismo programa, bien porque diferentes usuarios hayan invocado al mismo programa o porque un mismo usuario haya invocado varias veces al mismo programa, cada copia tendrá asociada su propio proceso. Se dice que un proceso se ejecuta en primer plano (foreground) si los usuarios pueden interaccionar con el proceso durante su ejecución. Por el contrario se dice que un proceso se ejecuta en segundo plano (background) si un usuario no puede interaccionar con el proceso durante su ejecución.
Descripción y control de procesos
_.2. 2.
55
Espacio de direcciones de memoria lógica o virtual de un proceso
Un proceso está constituido por un conjunto de elementos que permiten al sistema operativo realizar controlar la ejecución del proceso desde su inicio hasta su finalización. Estos elementos son básica-:-'cnte el contenido asociado a dicho proceso en las estructuras de control del sistema operativo, cuya .:=scri pción se realizará en la sección 2.3.1 , y el espacio de direcciones de memoria lógica del proceso. El espacio de direcciones de memoria lógica o virtual de un proceso, también a veces denominado .....agen del proceso o espacio de direcciones de usuario, se divide en varias regiones, cada una de las _--2.1 e s delimita un área de direcciones contiguas de memoria lógica. De forma general se suelen distinguir _ :nenos tres regiones: la región de código (también denominada región de texto), la región de datos y . ~eg ión de pila. Adicionalmente pueden existir regiones de memoria compartida y regiones asociadas a _::Terías. Las regiones de código y de datos se corresponden con las zonas de código y datos del archivo =.:-' utable. La región de datos se divide en dos regiones: la región de datos inicializados y la región de ~0 S no inicializados. La región de datos inicializados tiene un tamaño fijo. Por su parte la región de ~: .1 - 110 inicializados tiene un tamaño que puede variar durante la ejecución de un proceso. La región de pila se crea automáticamente y su tamaño es ajustado dinámicamente en tiempo de =. :- ' u ión por el sistema operativo. La pila está constituida por marcos de pila lógicos. Un marco se añade _ .:. pila cuando se llama a una función y se extrae cuando se vuelve de la misma. El registro puntero de - ..; del procesador almacena, dependiendo de la arquitectura del computador, la próxima entrada libre .:e ~ a pila o la última utilizada. Análogamente, la máquina indica la dirección de crecimiento de la pila, - :1 a las direcciones altas o bajas. e n marco de pila contiene usualmente la siguiente información: los parámetros de la función , sus ':"'Ilables locales y las direcciones almacenadas en diferentes registros especiales de la máquina, como _:-:- ej emplo, el contador del programa y el puntero de la pila. Salvar el contenido del contador del _ =-g:rama permite conocer la dirección de retorno donde debe continuar la ejecución una vez que se ha _.'=- ' mado la función. Mientras que salvar el contenido del registro de pila permite conocer la ubicación .:e: marc o de pila anterior o del siguiente libre. Puesto que el tamaño de la región de pila y de la región de datos no inicializados puede variar durante =_e ución de un proceso se deben reservar regiones libres adyacentes a dichas regiones . Ej emplo 2.1
=.::. la Figura
2.1 se representa, a modo de ejemplo, un diagrama del espacio de direcciones lógicas de _ cierto proceso A. Para cada región se especifica su dirección lógica de inicio DirLo , su nombre y su -=.año. Se observa que el proceso posee cuatro regiones:
• Región de código. Tiene un tamaño de 32 Ki Y ocupa las direcciones lógicas DirLO = O a DirLF = 32 Ki -1 = 32767. Donde DirLF hace referencia a la última dirección lógica asociada a la región . • Región de datos inicializados. Tiene un tamaño de 32 Ki Y ocupa las direcciones lógicas DirLo = 32 Ki = 32768 a DirLF = 64 Ki - 1 = 65535 .
56
Fundamentos básicos de los sistemas operativos
o Código [32 Ki] 32Ki Datos inicializados [32 Ki] 64Ki Datos no inicializados [16 Ki] 80Ki
I
Sentido de
i
Sentido de crecimiento
+ crecimiento
Libre [34 Ki] 114 Ki Pila [20 Ki]
Figura 2.1- Diagrama del espacio de direcciones de memoria lógica del proceso A del Ejemplo 2.1
• Región de datos no inicializados. Tiene un tamaño de 16 Ki Yocupa las direcciones lógicas DirLO = 64Ki = 65536 a DirLF = 80Ki - 1 = 81919. Esta región puede crecer hacia direcciones lógicas más altas • Región de pila. Tiene un tamaño de 20 Ki Yocupa las direcciones lógicas DirLO = 114 Ki = 116736 a DirLF = 134 Ki - 1 = 137215. Esta región puede crecer hacia direcciones lógicas más bajas.
Además se observa la existencia de una región de direcciones de memoria lógica libre (no asignada) que ocupa las direcciones lógicas DirLo = 80 Ki = 81920 a DirLF = 114 Ki - 1 = 116735. El espacio de esta región irá siendo asignado a la región de datos no inicializados y a la región de pilas según vayan creciendo estas regiones.
• Aparte de las regiones del espacio de direcciones de memoria lógicas de un proceso descritas, a las que se accede en modo usuario, existen otras regiones a las que se accede en modo núcleo. Dichas regiones son utilizadas por el sistema operativo para ubicar estructuras de datos relativas al proceso que le permiten controlar su ejecución. El nombre y número de estas estructuras, así como la información que contienen, depende de cada sistema operativo.
Descripción y control de procesos
2..2.3.
57
Tipos de procesos
De forma general se pueden distinguir tres tipos de procesos:
• Procesos de usuario. Son procesos asociados a la ejecución de programas invocados por los usuarios. Se ejecutan en modo usuario excepto cuando realizan llamadas al sistema que pasan a ser ejecutados en modo supervisor (realmente se ejecuta el sistema operativo pero en el nombre del proceso). Además se pueden ejecutar en primer plano o en segundo plano. • Procesos demonio . Son procesos no asociados a ningún usuario que realizan tareas periódicas relacionadas con la administración del sistema, como por ejemplo, la administración y control de redes, y la administración de trabajos de impresión. Los procesos demonio al igual que los procesos de usuario se ejecutan en modo usuario excepto cuando realizan llamadas al sistema que se ejecutan en modo supervisor (realmente se ejecuta el sistema operativo pero en el nombre del proceso). Además se suelen ejecutar en segundo plano. Conviene aclarar que los procesos demonios reciben este nombre en los sistemas operativos basados en UNIX. En otros sistemas operativos reciben otros nombres, por ejemplo en Windows se les denomina servicios. • Procesos del sistema operativo, también denominados simplemente como procesos del sistema. Son procesos que realizan tareas de administración del sistema operativo, como por ejemplo, el intercambio de procesos desde memoria principal a memoria secundaria. Se ejecutan normalmente en modo supervisor. Además se suelen ejecutar en segundo plano. ~ A.
Estados de un proceso
El tiempo de vida de un proceso, es decir, el tiempo comprendido desde su creación hasta su finalipuede ser conceptualmente dividido en un conjunto de estados que describen el comportamiento .==: proceso. Aunque el número de estados y su nombre depende de cada sistema operativo, algunos de ~ , "stados más habituales en que puede encontrarse un proceso son los siguientes:
~ 'Ió n.
• Nuevo. El proceso acaba de ser creado pero todavía no se encuentra preparado para ser ejecutado, puesto que aunque se le han asignado algunas estructuras de datos aún no se encuentra cargado en la memoria principal. • Preparado. El proceso está listo para ser ejecutado tan pronto como el planificador del sistema operativo lo considere oportuno. • Ejecutándose. El proceso está siendo ejecutado en el procesador. En un computador con un único procesador solo puede existir en un determinado instante de tiempo un único proceso en este estado. • Bloqueado. El proceso tiene que esperar hasta que se produzca un determinado evento, como por ejemplo, la finalización de una operación de E/ S.
58
Fundamentos básicos de los sistemas operativos
• Terminado. El proceso ha finalizado su ejecución. Los posibles estados en que puede encontrarse un proceso en un determinado sistema operativo y las transiciones permitidas entre dichos estados pueden representarse de forma gráfica mediante un diagrama de transición de estados. Los nodos del diagrama representa los estados y las líneas de conexión representan las posibles transiciones entre los estados . Las líneas de conexión se rotulan con el evento que produce que un proceso pase de un estado a otro. Una transición entre dos estados solo está permitida si existe una línea de conexión en el sentido adecuado que las una. En la Figura 2.2 se representa el diagrama de transición de estados para un sistema operativo con los cinco estados descritos. Cuando un proceso es creado entra en el estado nuevo. El proceso puede pasar al estado preparado cuando existe memoria suficiente para poder ser cargado. Una vez en este estado el proceso debe esperar a ser seleccionado por el planificador para ser ejecutado. Cuando es planificado entra en el estado ejecutándose. Aquellos sistemas operativos cuyo planificador implementa un algoritmo de planificación de tumo rotatorio cuando un proceso A en el estado ejecutándose consume el tiempo máximo de ejecución ininterrumpida se le expropia el procesador para que pueda utilizarlo otro proceso B. En dicho caso el proceso A vuelve al estado preparado. También, en algunos sistemas operativos, esta expropiación se produce si entra en el estado preparado un proceso con una mayor prioridad de ejecución que el proceso actual.
Expropiación
Existe memoria disponible
Espera por un evento
Se produce el evento
Figura 2.2 - Diagrama de transición de estados de un sistema operativo con cinco posibles estados por proceso
Descripción y control de procesos
59
Si un proceso no puede continuar su ejecución porque debe esperar a que se produzca un determinado _ enro. como por ejemplo, que se complete una operación de E / S que había solicitado mediante una "",-.:nada al sistema, entonces pasa al estado bloqueado. Cuando el evento por el que esperaba el proceso ; ?roduzca entonces pasará de nuevo al estado preparado. El último estado por el que pasa un proceso es el estado terminado , al que accede cuando se produce :ernllnación del proceso por parte del sistema operativo. Esta terminación puede ser voluntaria, es J:"':U. el proceso invoca explícitamente o implícitamente una llamada al sistema para finalizar, o puede ~ 'orzada: el sistema operativo debe abortar el proceso debido a alguna condición de error o a que otro __ ' eSO con la prioridad suficiente ha solicitado la finalización del proceso . .-\parte de los cinco estados descritos, otros dos estados importantes definidos en algunos sistemas _~rativos son (ver Figura 2.3): preparado en memoria secundaria y bloqueado en memoria secundaria. ""'-Si ' amente se trata de procesos en el estado preparado o en el estado bloqueado que han sido intercam~o s total o parcialmente desde la memoria principal a la memoria secundaria, para reducir el grado de = _Iti programación o hacer sitio para nuevos procesos. Posteriormente un proceso en memoria secunda-
=
Terminación
Existe memoria disponible Nuevo
Intercambio
Intercambio Intercambio
Intercambio
Se produce el evento
Figura 2.3 - Diagrama de transición de estados de un sistema operativo con siete posibles estados por
proceso
Fundamentos básicos de los sistemas operativos
60
ria puede ser intercambiado de vuelta a la memoria principal. Asimismo al área de memoria secundaria donde se intercambian los procesos se le denomina área o espacio de intercambio.
2.3.
Control de los procesos
2.3.1.
Estructuras de control del sistema operativo
El sistema operativo, para poder controlar a los procesos y gestionar los recursos del computador, debe mantener información sobre el estado de cada proceso y cada recurso. Básicamente, el sistema operativo de un sistema operativo almacena esta información en diferentes tablas, que son arrays de estructuras. El número, nombre, organización e implementación de estas tablas depende de cada sistema operativo, pero de forma general se pueden distinguir cuatro tipos de tablas: tabla de procesos, tablas de memoria, tablas de E/S y tablas de archivos. La tabla de procesos es una estructura del sistema operativo que almacena información de control relevante sobre cada proceso existente. Cada entrada de la tabla de procesos, comúnmente denominada bloque de control del proceso (process control block, PCB), contiene distintos campos con información asociada a un determinado proceso, como por ejemplo: • Identificador del proceso. Es un número entero positivo que es único para cada proceso y permite distinguirlo del resto. • Identificador de usuario. Es un número entero positivo que es único para cada usuario y permite conocer a qué usuario pertenece el proceso. • Estado del proceso. • Contenido de algunos registros del procesador. Como por ejemplo, el contador del programa, el registro de estado del procesador, el puntero de pila y los registros de propósito general. Cuando la ejecución de un proceso es interrumpida antes de su finalización, es necesario disponer del contenido de estos registros para poder continuar la ejecución del proceso justo desde el punto donde fue interrumpida. • Información de planificación del procesador. Esta información incluye la prioridad de planificación del proceso, punteros para enlazar a los procesos en diferentes colas (cola de proceso preparados para ejecución, cola de procesos bloqueados, etc) y cualquier otro parámetro de planificación • Información de localización de la memoria principal asignada al proceso. Como por ejemplo. punteros a tabla de regiones, tablas de páginas o tablas de segmentos. En general esta información depende del esquema de administración de memoria. • Información de tipo estadístico. Como por ejemplo, el tiempo de ejecución del proceso y el tiempo de utilización de los recursos de la máquina. Estas informaciones son usadas por el sistema operativo, entre otras cosas, para el cálculo del valor de la prioridad de planificación del proceso.
Descripción y control de procesos
61
• Información de estado de E/ S. Como por ejemplo, una lista de dispositivos de E / S asignados al proceso, una lista de archivos abiertos por el proceso, etc . • [¡iformación sobre el evento por el que el proceso ha entrado en el estado bloqueado. Las tablas de memoria contienen información sobre el espacio asignado y el espacio libre de la -:::11oria principal y del área de intercambio. El número de tablas y la información que contienen cada -=-:. de ellas depende del esquema de administración de memoria utilizado. Las tablas de E / S se utilizan para gestionar los dispositivos de E/S. Contienen información sobre Jn dispositivo está disponible o no y qué proceso lo está utilizando. También contienen información ~ _ :-~ el estado de una operación de E / S y el área de memoria principal usada como fuente o destino de , uansferencia de E/S. Las tablas de archivos contienen información sobre los archivos abiertos por los procesos, su ubicaen el almacenamiento secundario, su estado actual y otros atributos . .-\parte de estas tablas el sistema operativo también mantiene una o varias pilas denominadas pilas -.: :onrrol del sistema o pilas del sistema operativo, en cuyos marcos se almacenan parámetros y datos ..:. -iados a la funciones o rutinas del sistema operativo. También puede tener una pila de interrupciones _--z es utilizada por todos los manejadores de interrupciones . .-\demás el sistema operativo mantiene diferentes colas para consultarlas durante la planificación de :: procesos o cuando se produce algún evento. Así pueden existir colas de procesos preparados, colas .:c procesos bloqueados por determinados eventos, etc. :: 2.
, Ej emplo 2.2 forma bastante usual de implementar una cola es mediante una lista enlazada. En la cabecera de la hay un puntero al PCB del primer proceso de la lista y otro puntero al PCB del último. Además .:c-::1tfO del PCB de cada proceso se incluye un puntero al siguiente proceso de la lista. ___-::3.
~:2
=- la Figura 2.4 se representa un posible ejemplo de cola de procesos preparados implementada como ~:3
enlazada. En esta cola hay tres procesos cuyos identificadores numéricos son: 101 , 18 Y 56. Ob_ ~. ese como la cabecera de la cola apunta al proceso nO 101, que es el primer proceso de la cola y al -eso nO 56 que es el último.
=-'-
Cabecera
I
Bloque de control del proceso n° 101 [peB lol ]
Figura 2.4 - Ejemplo de implementación de la cola de procesos preparados
62
Fundamentos básicos de los sistemas operativos
En la Figura 2.5 se muestra una posible representación de una cola de procesos. Se ha denotado como PA al proceso n° 101, como PB al proceso n° 18 y como Pe al proceso n° 56.
Figura 2.5 - Posible representación de una cola de procesos
• 2.3.2.
Creación de procesos
El sistema operativo es el responsable de la creación de los procesos que se van a ejecutar. Las acciones que se deben realizar para crear un proceso dependen de cada sistema operativo, aunque de forma general se pueden distinguir las siguientes: 1. Comprobar si el proceso puede ser creado. El sistema operativo comprueba si existe suficiente
espacio en memoria principal para crear otro proceso y si el usuario no ha excedido el número máximo de procesos que puede tener ejecutándose. Algunos sistemas operativos establecen un límite al número máximo de procesos que un usuario puede estar ejecutando para evitar exceder la capacidad de la tabla de procesos. 2. Asignar una entrada de la tabla de procesos para el nuevo proceso. En este instante se le asigna un identificador numérico al proceso. 3. Reservar espacio en memoria para el proceso. Se debe reservar espacio en memoria principal para el espacio de direcciones de memoria lógica del proceso y para la información de control del proceso. 4. Inicializar el bloque de control del proceso. Los campos de la entrada asociada al proceso en la tabla de procesos se inicializan con los valores adecuados. 5. Establecer los enlaces apropiados. El sistema operativo debe configurar los punteros adecuados para enlazar la información del proceso en las diferentes listas, tablas y colas que mantiene. Por ejemplo, el sistema operativo suele colocar al proceso creado en la cola de procesos preparados para que así puede ser planificado.
Existen diferentes causas que originan la creación de un proceso por parte del sistema operativo, algunas de las más importantes son las siguientes: • Arranque del sistema operativo. Al arrancar el sistema operativo se crean diversos procesos. Algunos son procesos que se ejecutan en segundo plano, como es el caso de los procesos demonio y los procesos del sistema. Otros son procesos que se ejecutan en primer plano, como por ejemplo, los intérpretes de comandos y los gestores de ventanas.
Descripción y control de procesos
63
• Interacción del usuario con un intérprete de comandos o un entorno de ventanas. En sistemas operativos interactivos, cuando un usuario teclea una orden en un intérprete de comandos o hace clic con el ratón sobre un icono de una ventana se crea un nuevo proceso para atender la petición del usuario. • Inicio de un trabajo por lotes. Cada vez que se inicia un trabajo por lotes se crea un proceso asociado a la ejecución de dicho trabajo. • Un proceso en ejecución invoca a una llamada al sistema para crear otro proceso. Una determinada tarea puede plantearse para ser realizada en varias fases independientes, cada una de las cuales puede ser realizada por un proceso. Así un proceso puede realizar llamadas al sistema para solicitar la creación de otros procesos que le ayuden en la realización de una tarea.
La última causa enumerada de creación de un proceso merece la realización de algunos comentarios .::.dicionales. En primer lugar, al proceso que invoca la llamada al sistema para crear un proceso se le enomina proceso padre y al proceso que se crea se le denomina proceso hijo. Un proceso solo tiene un ;:>adre pero puede tener varios hijos. En segundo lugar, en algunos sistemas operativos, el espacio de direcciones de memoria lógica del ~ roceso hijo es un duplicado del espacio de direcciones de memoria lógica del padre. En UNIX y Linux, ;x¡r ejemplo, para solicitar la creación de un proceso se utiliza la llamada al sistema f ork. El proceso . j o que se crea con esta llamada es una copia exacta del proceso padre, es decir, tienen el mismo espacio Je direcciones de memoria lógica, los mismos archivos abiertos, etc. Posteriormente el proceso hijo :uando es planificado para ser ejecutado suele invocar una llamada al sistema execve para cargar otro ~ rograma, es decir, para cambiar su espacio de direcciones lógicas por el de otro archivo ejecutable que _~ desee ejecutar. En otros sistemas operativos, el espacio de direcciones de memoria lógica del proceso hijo es dife~t'nte al del proceso padre desde su creación, ya que el espacio de direcciones lógicas del programa que :~ desea ejecutar se carga en el proceso hijo que se crea. Esto ocurre, por ejemplo, cuando se invoca la .lamada al sistema CreateProcess del sistema operativo Windows. Una vez creados uno o varios procesos hijos el proceso padre dispone de tres posibilidades en térmi-.os de su ejecución: finalizar su ejecución, continuar ejecutándose concurrentemente con sus procesos :..lj os, bloquearse en espera de que alguno o todos sus procesos hijos hayan finalizado.
_.3.3.
Terminación de procesos
Normalmente un proceso termina cuando ha concluido de realizar la tarea para la que fue creado. Para : 1licitar al sistema operativo su terminación, un proceso puede invocar explícitamente una llamada al -¡stema, como exi t en UNIX o Exi tProcess en Windows. Asimismo, el sistema operativo procede ':t' forma implícita a la finalización de un proceso después de ejecutar la última instrucción del código ':d proceso. El sistema operativo también puede terminar un proceso debido a la aparición de un excepción duran:;:> su ejecución, como por ejemplo, intentar ejecutar una instrucción ilegal, una división por cero, acceso
64
Fundamentos básicos de los sistemas operativos
a una posición de memoria prohibida o no existente, etc. Además, un proceso A puede terminar porque otro proceso B, con los permisos adecuados, invoca una llamada al sistema para solicitar la terminación del proceso A. En UNIX, se dispone de la llamada al sistema ki 11 para realizar esta operación. Mientras que en Windows, se dispone de la llamada al ~~emaTerminateProcess.
La terminación de un proceso, independientemente de la causa que la origine, requiere que el sistema operativo pase al proceso al estado terminado y libere todos los recursos asignados al mismo (memoria, archivos abiertos, buffers de E/S, ... ). La información asociada al proceso en las estructuras de control del sistema operativo no es borrada inmediatamente, sino que se mantiene temporalmente para que otros procesos auxiliares que realizan tareas de auditoría o de análisis de rendimiento puedan extraer toda la información estadística que necesiten. En algunos sistemas operativos, como VMS, cuando se termina un proceso se procede a terminar también a todos su procesos hijos. En otros, como UNIX o Windows, los procesos hijos pueden seguir existiendo. En UNIX cuando un proceso termina sus procesos hijos son adoptados por el proceso inicial o proceso ini t , que es un proceso del sistema que se crea al arrancar este sistema operativo.
2.3.4.
Cambio de proceso
U na de las operaciones más frecuentes que debe realizar un sistema operativo es la interrupción de la ejecución de un proceso A para iniciar o continuar la ejecución de otro proceso B. A esta operación se le denomina cambio de proceso o cambio de contexto. Entre las principales causas que motivan un cambio de contexto se encuentran las siguientes:
• El proceso en ejecución pasa al estado bloqueado. Un proceso A pasa al estado bloqueado cuando debe esperar por la aparición de algún evento. Mientras llega a producirse dicho evento se puede ejecutar otro proceso B. • La terminación (voluntaria o forzada) del proceso en ejecución. Obviamente si un proceso termina se puede pasar a ejecutar otro.
• El sistema operativo termina de atender una interrupción y existe un proceso B en estado preparado de mayor prioridad que el proceso actual A. En dicho caso dependiendo de la política de planificación que siga el sistema operativo, se puede ejecutar dicho proceso B más prioritario o continuar con el proceso A que se estaba ejecutando. • El proceso A en ejecución ha excedido el tiempo máximo de ejecución ininterrumpida. En lo sistemas de tiempo compartido, a cada proceso se le asigna un tiempo máximo de ejecución ininterrumpida con objeto de poder atender las peticiones de todos los usuarios conectados al sistema. Superado dicho tiempo se produce un cambio de proceso, el proceso A en ejecución pasa al estado preparado y un proceso B en dicho estado pasa al estado ejecutándose. Para poder realizar un cambio de proceso, el sistema operativo debe guardar información del proce o A cuya ejecución va a interrumpir y cargar información del proceso B cuya ejecución va a iniciar o
Descripción y control de procesos
65
_ ~nt i nuar. Se denomina contexto de un proceso a toda aquella información relativa a un proceso que el
l. Salvar el contexto del proceso A en ejecución en su PCB .
., Ejecutar el algoritmo del sistema operativo de planificación del procesador para seleccionar el proceso B que se va a ejecutar. .:;. Cargar desde su PCB el contexto del proceso B seleccionado. La operación de cambio de proceso no es ni mucho menos inmediata, sino que consume un cierto =- ::mpo. denominado tiempo de conmutación . La magnitud de este tiempo depende principalmente de -_::ores asociados al hardware del computador como por ejemplo, la velocidad de lectura/escritura de :nemoria principal, el número de registros del procesador cuyo contenido hay que salvar o cargar, la :-!L ~ idad del procesador y la existencia de instrucciones especiales en el repertorio del procesador para -..c..r\ ar o cargar todos los registros.
_,·t
Ejecución del sistema operativo
En un computador con un único procesador, el uso del mismo se va alternando entre el sistema ;"Crativo, que principalmente se ejecuta en modo supervisor, y los distintos tipos de procesos que se :: ::\.::utan en modo usuario. En función de la tarea o servicio realizado, el tiempo que el sistema operativo usa el procesador puede ~~ ' ontabilizado o no a un determinado proceso. Por ejemplo, la atención de las llamadas al sistema por :":"le del sistema operativo repercute en el progreso del proceso que invocó la llamada. Por eso, aunque -::.2lme nte es el código del sistema operativo el que se está ejecutando en el procesador para atender la _:"'l1ada, dicho tiempo de uso del procesador se contabiliza al proceso que la realizó. Por el contrario, el tiempo que el sistema operativo usa el procesador para realizar tareas y servicios .:.~ administración no se pueden contabilizar a ningún proceso en particular. Ejemplos de estas tareas :1 la planificación de procesos, los cambios de procesos, el intercambio total o parcial de procesos a -:::.;:moria secundaria o la atención de fallos de página. Se denomina sobrecarga del sistema, o simplemente sobrecarga (overhead), al tiempo que el pro_=sador se encuentra ocupado ejecutando código del sistema operativo asociado a tareas y servicios de -=ministración que no se pueden contabilizar a ningún proceso en particular. Obviamente lo deseable es ~': e la sobrecarga sea lo menor posible para que las peticiones de uso de procesador de los procesos de _,u ario se atiendan rápidamente. El tiempo de ejecución de otras tareas del sistema operativo no es sencillo asignárselo a un proceso en : .micular. Este es el caso, por ejemplo, de la atención de las interrupciones hardware debido a su carácter
66
Fundamentos básicos de los sistemas operativos
asíncrono. Algunos sistemas operativos, como por ejemplo los basados en UNIX, optan por asignar el tiempo de atención de una interrupción hardware al proceso que se encontraba en el estado ejecutándose en el momento de producirse la interrupción, aunque dicha interrupción no esté asociada a la ejecución de dicho proceso .
• Ejemplo 2.3 Supóngase que en el instante t = O ut se comienza a ejecutar un cierto proceso A que requiere un tiempo de servicio de 5 ut. Supóngase que en t = 2 ut el proceso A realiza una llamada al sistema, entonces se producirá un cambio de modo usuario a modo núcleo y el sistema operativo (SO) atenderá la llamada. Supóngase que dicha llamada no requiere bloquear el proceso y que se termina de atender en t = 3 ut. El sistema operativo se ha ejecutado durante 1 ut que se contabilizan como uso del procesador del proceso A, puesto que se ha realizado una tarea que repercute en el progreso de dicho progreso. En t = 3 ut se produce un cambio de modo núcleo a modo usuario y se continúa (si no existen interrupciones pendientes ni otro proceso más prioritario) con la ejecución del código del proceso A hasta su finalización en t = 5 ut. Al finalizar el proceso A se produce un cambio de modo usuario a modo núcleo para ejecutar el planificador del sistema operativo, que selecciona otro proceso B para ser ejecutado y carga el contexto del proceso B. Supóngase que la realización de estas tareas de administración requieren 0,5 ut, este tiempo de uso del procesador no se contabiliza a ningún proceso. En t = 5,5 ut se comenzaría a ejecutar el proceso B. Uso CPU Modo Usuario
A
~_A~I ~I_____ B____~
Uso CPU Modo Supervisor
o
5 Tiempo (ut)
10
Figura 2.6 - Diagrama de uso del procesador del Ejemplo 2.3
En la Figura 2.6 se muestra el diagrama de uso del procesador distinguiendo el uso del procesador en modo supervisor y en modo usuario. Durante las 10 ut de uso del procesador consideradas la sobrecarga ha sido de 0,5 ut, es decir, del 5 %. Por otra parte, el tiempo de uso de procesador que se contabiliza al proceso A es 5 ut, 4 ut en modo usuario y 1 ut en modo supervisor (cuando el sistema operativo atendió la llamada al sistema). Mientras que el tiempo de uso del procesador que se contabiliza al proceso B es 4,5 ut.
•
Descripción y control de procesos _ . ~.
!3 .1.
67
Procesos multihilos Concepto de hilo
e n proceso se puede considerar como una entidad computacional básica que tiene asignado un con--=:; o de recursos y que durante su existencia sigue una determinada ruta o traza de ejecución. Así un _ '- ' eSO queda caracterizado por dos elementos que se pueden tratar de forma independiente:
• Conjunto de recursos asignados. Un proceso tiene asociado un espacio de direcciones de memoria (código, datos, pila) y otros recursos, tales como archivos abiertos, procesos hijos, manejadores de señales, información de contabilidad, etc. • Traza de ejecución. También denominada hilo de controlo simplemente hilo o hebra (thread). Hace referencia a las instrucciones que ejecuta el proceso durante su tiempo de vida. El hilo tiene as ignado un contador de programa que indica la dirección de la próxima instrucción que hay que ejecutar. También requiere otros registros para el almacenamiento temporal de variables y un registro de pila para controlar el funcionamiento de la pila de usuario, que posee un marco por cada función invocada de la cual no se ha retornado todavía.
Los sistemas operativos tradicionales tales como las primeras distribuciones de UNIX o MS-DOS : am ente consideraban que un proceso constaba de un único hilo de ejecución. Sin embargo, los siste- ~ " operativos desarrollados con posterioridad tales como Windows, Solaris, Mach y OS/2 introdujeron _ ~ode lo de proceso multihilo, es decir, un proceso podía estar formado por múltiples hilos. Los sistemas operativos que soportan un modelo de proceso multihilo utilizan los procesos como .iJd de gestión de recursos mientras que utilizan a los hilos como unidad de asignación del proce- J r. Por lo tanto, un hilo se puede definir como una unidad elemental de asignación del procesador ..c :igue una determinada traza de ejecución y que tiene asignado una pila de usuario, un espacio de - .:'enamiento y un bloque de control de hilo. Dicho bloque contiene, entre otras informaciones, un ificador numérico del hilo, el estado del hilo, la prioridad de ejecución del hilo y los valores de los =-;:~U'os (contador de programa, registro de pila, etc). Puesto que un hilo queda caracterizado con parte .L .0 5 recursos de un proceso, a veces se le denomina proceso ligero (lightweight process). En la Figura 2.7 se ilustra la diferencia entre el modelo tradicional de proceso con un solo hilo y el - :....,c\o de proceso multhilo. Cada hilo perteneciente a un proceso comparte con los restantes hilos del mismo proceso el espacio .L jlfecciones virtuales del proceso (secciones de código y datos), el bloque de control del proceso, los _.: : \O S. los recursos de E/ S, etc. En consecuencia, todos los hilos de un proceso comparten el estado y ursos de ese proceso, se localizan en el mismo espacio de direcciones y tienen acceso a los mismos
".2.
Ventajas e inconvenientes
El hecho de considerar procesos multihilo posibilita que puedan tener lugar, en el entorno del mismo múltiples ejecuciones con un alto grado de independencia entre ellas. Sin embargo, la ejecución
_ : ' eSO .
68
Fundamentos básicos de los sistemas operativos
Espacio de direcciones del núcleo /
•
Espacio de direcciones de usuario del Proceso A
:?
Bloque de control del proceso A
I Código I
B
Pila de usuario
(a) Espacio de direcciones de usuario del Proceso A
Espacio de direcciones del núcleo
•
Bloque de control del proceso A
V'
Hilo 1
Hilo 2
-------------,
----- -- ------,
I Código I
Bloque de control hilo 1
Bloque de control hilo 2
B
Pila de usuario hilo l
Pila de usuario hilo 2
-------------
-------------
(b)
Figura 2.7 - Modelo de proceso: tradicional con un único hilo (a) y multihilo (b)
de múltiples hilos ejecutándose en paralelo en un proceso es análoga a la ejecución de múltiples proceso en paralelo .
• Ejemplo 2.4 Supóngase una aplicación que debe realizar varias tareas distintas, por ejemplo, una hoja de cálculo Usando el modelo tradicional de proceso ésta podría implementarse con varios procesos. Por ejemplo un proceso se encargaría de mostrar la ventana y menús de la aplicación y leer la entrada de usuario mientras que otro proceso ejecutándose en segundo plano se encargaría de atender las órdenes del usuari< y actualizar la hoja de cálculo. Utilizando un modelo de proceso multihilo, la hoja de cálculo podría implementarse con un único procesl
Descripción y control de procesos
69
~ ":e
ruviera dos hilos. Un hilo para mostrar la ventana y los menús de la aplicación, y leer la entrada de -5:.tario; mientras que otro hilo se encargaría de atender las órdenes del usuario y actualizar la hoja de
~~ .:'ul o.
• Ej emplo 2.5 de procesos multihilo también se puede utilizar para implementar aplicaciones que tienen que zar varias tareas similares. Por ejemplo, supóngase un servidor que aloja una base de datos y debe -=:==:Ider las peticiones de los usuarios (clientes) que desean consultarla. Cada petición puede ser conside--=-..: 'o mo una unidad de ejecución independiente, cada una de las cuales podrían ejecutarse en paralelo. -
J SO
-=~
:. ::.jzando el modelo tradicional de proceso, esta aplicación se podría implementar con un proceso (ser_ .:~rl que recibe las peticiones y crea múltiples procesos (clientes), uno por cada petición a atender. _:::l.J zando el modelo de proceso con múltiples hilos, esta aplicación se podría implementar con un único _ : ' e -o que tenga un hilo (servidor) para recepcionar las peticiones y que crea múltiples hilos (clientes) ~ )X)r cada petición a atender.
• .-\nte esta analogía surge la pregunta de qué ventajas tiene implementar una determinada aplicación _ -=0 uno o varios procesos multihilos en vez de como múltiples procesos tradicionales . Las principales ~:.3j as
son las siguientes:
• Alimento del rendimiento del sistema. La creación de un hilo nuevo dentro de un proceso ya existente requiere de menos tiempo que la creación de un nuevo proceso. En algunos sistemas crear un hi lo es varios órdenes de magnitud más rápido que crear un proceso. Asimismo el tiempo necesario para finalizar un hilo es menor que el tiempo necesario para finalizar un proceso. Además, un cambio de proceso requiere más tiempo que un cambio de hilo dentro de un mismo proceso. • Ahorro de recursos. La creación de un hilo nuevo dentro de un proceso ya existente requiere menos rec ursos del sistema que la creación de un proceso nuevo. • Comunicación más eficiente. La comunicación entre dos procesos independientes requiere la intervención del sistema operativo para proporcionar los mecanismos necesarios de comunicación y protección. Por el contrario, como los hilos de un proceso comparten memoria y archivos se pueden comunicar entre ellos sin la intervención del sistema operativo. • 'v/avor aprovechamiento de las arquitecturas multiprocesador. En un proceso multihilo cada hilo podría estar ejecutándose en paralelo en cada uno de los procesadores de la máquina. Por el ontrario un proceso tradicional solo puede usar un único procesador a la vez. • Simplificación de la estructura de las aplicaciones. El uso de múltiples hilos generalmente ayuda a simplificar la estructura de aplicaciones software que tienen que realizar varias tareas diferentes.
70
Fundamentos básicos de los sistemas operativos
El uso de un proceso de múltiples hilos para implementar una aplicación introduce diversas complicaciones en la programación de la aplicación, la mayoría asociadas a la necesidad de sincronización en el acceso a las estructuras de datos que comparten los hilos. Estas complicaciones se pueden resolver diseñando con cuidado la ejecución de los múltiples hilos y utilizando mecanismos de sincronización.
2.5.3.
Control de hilos
Como sucede con los procesos, un hilo puede encontrarse durante su tiempo de vida en diferente estados, por ejemplo: preparado, ejecutándose, bloqueado y terminado. En un determinado instante de tiempo, un proceso se encontrará en un determinado estado que no tiene por qué coincidir con el estado de sus hilos. Obviamente el estado del proceso limita los estados en que pueden encontrarse sus hilos. Por ejemplo, si el estado del proceso es preparado, ninguno de sus hilos puede encontrarse en el estado ejecutándose. Cuando se crea un proceso nuevo, éste se crea con un único hilo. Posteriormente dicho hilo puede crear otros hilos. A cada hilo creado se le asigna su propia pila de usuario y bloque de control de hilo, y es colocado en la cola de hilos en el estado preparado. La planificación se realiza a nivel de hilo. Cuando un hilo termina su ejecución éste simplemente desaparece y ya no es planificable. Cuando un hilo entra en el estado bloqueado, se puede planificar otro hilo del mismo proceso o de otro proceso distinto. En el primer caso simplemente hay que realizar un cambio de hilo dentro del mismo proceso, mientras que en el segundo caso hay que realizar un cambio de proceso. Como ya se comentó, un cambio de proceso requiere de más tiempo y consume más recursos que un cambio de hilo dentro del mismo proceso. El poder realizar un cambio de hilo dentro de un mismo proceso cuando un hilo entra en el estado bloqueado depende, como se verá en la próxima sección, del tipo e implementación de hilos que soporte el sistema operativo. En algunas implementaciones si un hilo de un proceso se bloquea entonces se bloquea el proceso completo. Cuando sucede el evento por el que uno o más hilos estaban esperando en el estado bloqueado, dicho hilos son pasados al estado preparado y colocados en la cola de hilos preparados. En el momento que un hilo finaliza su ejecución sus recursos asignados son liberados. Un proce o no puede entrar en el estado terminado hasta que no finalizan todos sus hilos .
2.5.4.
Tipos de hilos
Se pueden distinguir dos tipos de hilos: hilos a nivel de usuario e hilos a nivel de núcleo. En las siguientes secciones se describen las características, ventajas y desventajas de cada uno de estos tipos d hilos. Hilos a nivel de usuario Los hilos a nivel de usuario o más abreviadamente hilos de usuario son implementados por una biblioteca de hilos que se ejecuta a nivel de usuario. Esta biblioteca es un paquete de rutinas para 1
Descripción y control de procesos
71
i;: )rión (creación, planificación, terminación, comunicación, etc) de los hilos de usuario. Cualquier aplicación puede programarse como un proceso multihilo mediante el uso de una biblioteca := hj los, como por ejemplo la biblioteca Pthreads de POSIX. La forma de operar con la biblioteca de hilos es la siguiente: una aplicación comienza inicialmente _ :no un proceso de un solo hilo. Cuando se está ejecutando el proceso en modo usuario, éste puede _~~.lf otro hilo invocando a la función apropiada de la biblioteca de hilos. Dicha función, que también se := =' u(a en modo usuario, asigna las estructuras de datos para el nuevo hilo e invoca a su vez a otra función :- ":"-.1 planificar a un hilo del proceso. Cada vez que se pasa el control a una función de la biblioteca de =-_,-), es necesario salvar en el espacio de usuario el contexto del hilo que se estaba ejecutando. Asimismo _~ do la función de la biblioteca de hilos termina de ejecutarse cede el control a un hilo cuyo contexto ,.:- ebe restaurar. La implementación de los hilos de usuario requiere que cada proceso tenga una tabla de hilos. Cada =T3.da de la tabla, también denominada bloque de control del hilo, mantiene información asociada a un _ .., del proceso: contador del programa, registro de pila, estado, prioridad de ejecución, etc. Esta tabla =- ie -(ionada por rutinas de la biblioteca de hilos. Cuando un hilo pasa al estado preparado o al estado eado, la información necesaria para iniciar o reanudar su ejecución se encuentra almacenada en su :: -'1 e de control de hilo. En definitiva una tabla de hilos es similar a la tabla de procesos mantenida por :: -¡s(ema operativo. Cuando un hilo realiza alguna acción que le podría hacer entrar en el estado bloqueado, por ejemplo, _ ;-crar a que otro hilo finalice su ejecución, entonces invoca a una rutina de la biblioteca de hilos. Esta -_-= a comprueba si el hilo invocador debe entrar en el estado bloqueado. En caso afirmativo almacena ~e = i s tros del procesador en el bloque de control del hilo, invoca a una rutina para planificar a otro hilo _ _2'ga los registros de la máquina con los valores del hilo seleccionado para planificar. En el momento ~ e el contador de programa y el registro de pila han sido cargados, el hilo comienza a ejecutarse. Si -~ I1orio de instrucciones del procesador dispone de instrucciones para almacenar y cargar todos los =-~ , ([O S a la vez, entonces la rutina puede hacer el cambio de hilo ejecutando unas pocas instrucciones. La realización del cambio de hilo dentro de un mismo proceso se realiza sin necesidad de realizar un ::..-=- io de modo y un cambio de contexto. En consecuencia es más rápido que un cambio de proceso. Puesto que toda esta actividad tiene lugar en modo usuario dentro del proceso en ejecución, el sistema _cT.1(i\'o no interviene para nada en la realización de estas tareas, de hecho ignora por completo la _ - enc ia de los hilos de usuario. Esta característica proporciona a los hilos de usuario las siguientes :=-:J.J as: • Po rtabilidad. Puesto que el uso de hilos de usuario no requiere la intervención del sistema operarivo, una aplicación diseñada como un proceso de múltiples hilos de usuario podría ejecutarse en cualquier sistemas operativo que soportase la biblioteca de hilos que utilice dicha aplicación. • .'-1ejora del rendimiento del sistema. Como toda la gestión de los hilos de usuario se realiza en modo usuario no es necesario realizar cambios de modo usuario a modo núcleo y viceversa, lo cual disminuye la sobrecarga del sistema. • Planificación independiente. Los hilos de usuario de un proceso puede planificarse con el algorit-
72
Fundamentos básicos de los sistemas operativos
mo de planificación que se considere más oportuno. Dicho algoritmo puede ser distinto al algoritmo de planificación de los hilos de otro proceso y del algoritmo de planificación de procesos que utilice el sistema operativo. La principal desventaja de los hilos de usuario se manifiesta en aquellos sistemas operativos que únicamente soportan un único hilo del núcleo. En estos sistemas cuando un hilo de usuario de un proceso entra en el estado bloqueado, entonces todo el proceso completo entra en el estado bloqueado. Recuérdese que el sistema operativo no distingue la existencia de hilos de usuario. Otra desventaja de los hilos de usuario es que cuando un hilo se está ejecutando, no se puede planificar otro hilo de usuario del mismo proceso hasta que el primero no cede voluntariamente el uso del procesador. Debe tenerse en cuenta que no se pueden utilizar las interrupciones de reloj para implementar unos cuantos de ejecución (ver sección 3.6.4), ya que el tratamiento de las mismas requiere la intervención del sistema operativo. Hilos a nivel de núcleo
Los hilos a nivel de núcleo o más abreviadamente hilos del núcleo, son implementados y gestionados directamente por el núcleo del sistema operativo. No requieren de la existencia de una biblioteca de hilos. El sistema operativo mantiene una única tabla de hilos que contienen los bloques de control de todos lo hilos del núcleo existentes. Esta tabla es implementada en el espacio de direcciones del núcleo. - La principal ventaja que tienen los hilos del núcleo, es que si uno se bloquea se puede planificar otro del mismo proceso o de otro proceso distinto. Además, en sistemas multiprocesador es posible ejecutar varios hilos del núcleo simultáneamente, cada uno de ellos en un procesador distinto. Por otra parte, el principal inconveniente de los hilos del núcleo radica en que su gestión contribuye a la sobrecarga del sistema. Para resolver este problema, muchos sistemas limitan el número de hilo del núcleo que se pueden crear, y además reciclan los hilos del núcleo ya existentes. Cuando un hilo del núcleo es destruido, se marca en su bloque de control como no planificable, pero sus estructuras de dato no son eliminadas. Posteriormente, cuando se requiere crear un nuevo hilo del núcleo, lo que se hace e reactivar un hilo del núcleo marcado como no planificable con el objetivo de ahorrarse la sobrecarga de asignar estructuras de datos al nuevo hilo.
2.5.5.
Principales configuraciones en función del número y tipo de hilos soportados por un sistema operativo
Dependiendo del número y tipo de hilos soportados por un sistema operativo se pueden distinguir principalmente las siguientes configuraciones (ver Figura 2.8): • Múltiples hilos de usuario sin soporte de hilos del núcleo. En esta configuración la gestión de lo hilos de usuario de un proceso se realiza mediante una biblioteca de hilos que se ejecuta en modo usuario. Cuando un hilo de un proceso realiza una llamada al sistema comienza a ejecutarse el sistema operativo. Si la realización de dicha llamada al sistema requiere el bloqueo del hilo de
Descripción y control de procesos
73
Espacio de direcciones de
':c hilos ?:-üceso
=5pacio de direcciones del núcleo (a)
(b)
(c)
a 2.8 - Principales configuraciones en función del número y tipo de hilos soportados por un sistema -':"crativo: múltiples hilos de usuario sin soporte de hilos del núcleo (a), un hilo del núcleo por cada hilo - - ~s u ario (b) , Y menor número de hilos del núcleo que hilos de usuario (c)
ario entonces se bloquea todo el proceso completo_ Además aunque el sistema soporte multi~ e s amiento no es posible_3ue varios hilos se ejecuten simultáneamente ya que solamente uno ':e ellos puede acceder a la vez al sistema operativo _ En esta configuración el sistema operativo ;-'.mifica procesos, cada proceso está constituido por uno o varios hilos de usuario. -S
~ -7)
hilo del núcleo por cada hilo de usuario. En esta configuración el sistema operativo crea un ~o del núcleo asociado a cada hilo de usuario. En consecuencia no es necesario la utilización ~ una biblioteca de hilos por parte de la aplicación, basta con una interfaz de programación de ~ li ~ ac iones para acceder a las utilidades de hilos del núcleo_ Ejemplos de sistemas operativos que _- uzan esta configuración son: Solaris 10, Windows NT y OS/2.
:....: principal ventaja de esta configuración es que si un hilo de usuario de un proceso se bloquea ~ :3. espera de la finalización de una llamada al sistema se puede planificar otro hilo del mismo ;-:<..-x:eso, ya que cada uno tiene asignado un hilo del núcleo distinto. El sistema operativo planifica :::..:.íos del núcleo, cada uno asociado a un hilo de usuario.
=-- mayor inconveniente de esta configuración radica en que cada vez que se crea un hilo de usuario ~
necesario crear un hilo del núcleo asociado lo que produce sobrecarga. Por este motivo los -:SIe mas operativos limitan el número de hilos que es posible crear. t.Jt'llor número de hilos del núcleo que hilos de usuarios. En esta configuración el número de hilos ~: núcleo que soporta el sistema operativo está limitado y es inferior al número de hilos de usuario. " 8'a su implementación se requiere una biblioteca de hilos para gestionar los hilos de usuario. Los .::.:::-~ re nte s hilos de usuario de un proceso se asocian a un número menor o igual de hilos del núcleo.
74
Fundamentos básicos de los sistemas operativos
Es el programador de la aplicación el que se encarga de establecer el número de hilos del núcleo que requieren los hilos de usuario en que ha descompuesto su aplicación. Un ejemplo de sistema operativo que soportaba esta configuración era la versión 7 (y anteriores) de Solaris. Esta configuración, si está bien diseñada, tiene las ventajas de la configuración múltiples hilos de usuario sin soporte de hilos del núcleo y de la configuración un hilo del núcleo por cada hilo de usuano.
2.6.
Resumen
Un programa es un archivo ejecutable que típicamente se encuentra almacenado en un dispositivo de almacenamiento secundario. Considerado como archivo, un programa es una entidad pasiva o estática. Cuando un programa es ejecutado se convierte en una entidad activa o dinámica denominada proceso que va pasando por diferentes estados (nuevo, preparado, ejecutándose, bloqueado, terminado, etc) y utilizando distintos recursos del computador. En conclusión, un proceso es un programa en ejecución. El sistema operativo, para poder controlar a los procesos y gestionar los recursos del computador. debe mantener información sobre el estado de cada proceso y cada recurso. Básicamente, el sistema operativo almacena esta información en diferentes tablas. El número, nombre, organización e implementación de estas tablas depende de cada sistema operativo, pero de forma general se pueden distinguir cuatro tipos de tablas: tabla de procesos, tablas de memoria, tablas de E/ S y tablas de archivos. La tabla de procesos almacena información de control relevante sobre cada proceso existente (identificador del proceso, identificador del usuario, estado del proceso, contenido de algunos registros del procesador, localización de la memoria asignada, prioridad de ejecución, etc). A cada entrada de la tabla de procesos se le denominada bloque de control del proceso o PCB. Las tablas de memoria contienen información sobre el espacio asignado y el espacio libre de la memoria principal y memoria secundaria Las tablas de E/ S se utilizan para gestionar los dispositivos de E/S. Finalmente las tablas de archivos contienen información sobre los archivos abiertos por los procesos. El sistema operativo gestiona la creación y terminación de procesos. El sistema operativo crea un proceso por diferentes causas, entre ellas: arranque del sistema operativo, interacción del usuario con un intérprete de comandos o un entorno de ventanas, inicio de un trabajo por lotes, o invocación de una llamada al sistema para crear otro proceso. En este último caso, el proceso que invoca la llamada e conoce corñó proceso padre, y el proceso que se crea es el proceso hijo. Un proceso normalmente finaliza cuando la tarea para la que fue creado concluye. También, un proceso puede solicitar explícitamente al sistema operativo su terminación. Otras causas que producen la terminación de un proceso son la aparición de una excepción, o que otro proceso, con los permiso adecuados, solicite la terminación del proceso. El sistema operativo también gestiona el cambio de proceso, también denominado cambio de contexto, que consiste en interrumpir o finalizar la ejecución de un proceso e iniciar o retomar la ejecución de otro proceso. Las principales causas que originan un cambio de proceso son: el proceso en ejecución pasa al estado bloqueado, la terminación (voluntaria o forzada) del proceso en ejecución, el sistema operatim
Descripción y control de procesos
75
a de atender una interrupción y existe otro proceso en estado preparado de mayor prioridad que el o actual, y el proceso en ejecución ha excedido el tiempo máximo de ejecución ininterrumpida. Un cambio de proceso contribuye a la sobrecarga del sistema, que es el tiempo que el procesador uentra ocupado ejecutando código del sistema operativo asociado a tareas y servicios de adminis. ' n que no se pueden contabilizar a ningún proceso en particular. Obviamente lo deseable es que la =":,....,.".,rga sea lo menor posible para que las peticiones de uso de procesador de los procesos de usuario ..endan rápidamente. n proceso queda caracterizado por dos elementos que se pueden tratar de forma independiente: su to de recursos asignados y su traza o ruta de ejecución, que hace referencia a las instrucciones que •• 1-.......w el proceso. El modelo de proceso de un único hilo (o hebra) supone que un proceso únicamente sigue una deter~_~ traza en su ejecución. Para mejorar el rendimiento del sistema, se emplea el modelo de proceso . ilo, que considera que un proceso está formado por varios hilos. Cada hilo tiene asignado su conde programa, su registro de pila, y otros registros para el almacenamiento temporal de variables. Lo sistemas operativos modernos que utilizan el modelo de proceso multihilo utilizan los procesos unidad de gestión de recursos, y los hilos como unidad de asignación del procesador. Las ventajas de la ejecución de un proceso multihilo frente a la ejecución de múltiples procesos J:i:DlIbil· o en paralelo son: aumento del rendimiento del sistema, ahorro de recursos, comunicación más . te, mayor aprovechamiento de las arquitecturas multiprocesador, y simplificación de la estructura - aplicaciones. El uso de un proceso de múltiples hilos para implementar una aplicación introduce diversas complies en la programación de la aplicación, la mayoría asociadas a la necesidad de sincronización en o a las estructuras dé datos que comparten los hilos. Estas complicaciones se pueden resolver .a::.a-l3Ddo con cuidado la ejecución de los múltiples hilos y utilizando mecanismos de sincronización. pueden distinguir dos tipos de hilos: hilos a nivel de usuario e hilos a nivel de núcleo. Los hilos J de usuario o más abreviadamente hilos de usuario son implementados por una biblioteca de
que se ejecuta a nivel de usuario. Esta biblioteca es un paquete de rutinas para la gestión (creación, . cación, terminación, comunicación, etc) de los hilos de usuario. ~O hilos a nivel de núcleo o más abreviadamente hilos del núcleo, son implementados y gestionados Íxcamente por el núcleo del sistema operativo. No requieren de la existencia de una biblioteca de El sistema operativo mantiene una única tabla de hilos que contienen los bloques de control de los hilos del núcleo existentes. Esta tabla es implementada en el espacio de direcciones del sistema
Dependiendo del número y tipo de hilos soportados por un sistema operativo se pueden distinguir . almente las siguientes configuraciones: múltiples hilos de usuario sin soporte de hilos del núcleo, o del núcleo por cada hilo de usuario y menor número de hilos del núcleo que hilos de usuarios.
76
2.7.
Fundamentos básicos de los sistemas operativos
Lecturas recomendadas
Si se desea obtener una explicación adicional de los contenidos tratados en este capítulo se pueden consultar, por ejemplo: el capítulo 2 de [Tanenbaum, 2009], los capítul os 3 y 4 de [Stallings, 2005]. y los capítulos 4 y 5 de [Silberschatz et. al, 2002]. Asimismo en cualquiera de estos libros, se pueden encontrar numerosas referencias adicionales con contenidos más avanzados sobre la descripción y control de procesos.
2.8.
Autoevaluación
2.1. ¿Qué es un proceso? (Respuesta en sección 2.2.1) 2.2. ¿Cuál es la principal diferencia entre un proceso ejecutándose en primer plano y otro ejecutándose en segundo plano? (Respuesta en sección 2.2.1) 2.3. ¿Qué regiones se diferencian en el espacio de direcciones de memoria lógica o virtual de un proceso? (Respuesta en sección 2.2.2) 2.4. ¿Qué información contiene un marco de la región de pila del espacio de direcciones de memoria lógica de un proceso? (Respuesta en sección 2.2.2) 2.5. Describir brevemente los tres tipos de procesos que se pueden distinguir. (Respuesta en sección 2.2 .3 ) 2.6. Describir brevemente cada uno de los principales estados en los que se puede encontrar un determinado proceso. (Respuesta en sección 2.2.4) 2.7. ¿Qué representa un diagrama de transición de estados? (Respuesta en sección 2.2.4) 2.8. Enumerar y describir las principales estructuras de control del sistema operativo. (Respuesta en sección 2.3.1) 2.9. Enumerar las acciones que debe realizar el sistema operativo para crear un proceso. (Respuesta en sección 2.3.2) 2.10. Enumerar y describir las principales causas que originan la creación de un proceso. (Respuesta en sección 2.3.2) 2.11. ¿Cuáles son las principales causas por las que un proceso finaliza? (Respuesta en sección 2.3.3) 2.12. ¿Qué es un cambio de contexto o proceso? ¿Cuáles son las principales causas que motivan un cambio de proceso? (Respuesta en sección 2.3.4)
2.13. ¿Qué es el tiempo de conmutación y de qué factores depende ? (Respuesta en sección 2.3.4) 2.14. ¿Qué se entiende por sobrecarga del sistema? (Respuesta en sección 2.4)
Descripción y control de procesos
77
- J etl nir traza de ejecución. (Respuesta en sección 2.5.1) ué es un proceso multihilo? (Respuesta en sección 2.5.1) • ::numerar las ventajas y los inconvenientes de los procesos multihilos . (Respuesta en sección 2.5.2) ::numerar las ventajas y los inconvenientes de los hilos a nivel de usuario . . ,,"spuesta en sección 2.5.4) ::. umerar las ventajas y los inconvenientes de los hilos a nivel de núcleo . . ,,",puesta en sección 2.5.4) J,:-scribir las principales configuraciones en función del número y tipo de hilos soportados por un -> ema operativo. (Respuesta en sección 2.5.5)
Problemas ' has sistemas operativos fijan un límite máximo al número de entradas que puede tener la tabla rocesos. Explique razonadamente las principales consecuencias de esta limitación. -,,' ujar el diagrama de transiciones de estado de un sistema operativo que soporta los siguientes ::--:..::dos para un proceso: ejecutándose en modo usuario, ejecutándose en modo núcleo, preparado :..:...J ejecución en memoria principal, bloqueado o dormido en memoria principal, preparado para c~=' u ció n en memoria secundaria, bloqueado o dormido en memoria secundaria, creado (equiva=:-:: ~ a nuevo) y zombi (equivalente a terminado) . .::.:: un cierto computador se ha monitorizado el uso del procesador durante un intervalo de obser~:Ió n de 125 ut. Determinar la sobrecarga (expresada en tanto por ciento) asociada a la ejecución .:.:= :.areas administrativas del sistema operativo si se sabe que el procesador no ha sido utilizado du-~ e 5 ut, y que dos procesos A y B han sido ejecutados exclusivamente en modo usuario durante - :lempo de 95 ut. .:: . . rocesador de un computador recibe una interrupción del reloj hardware cada 10 ms. Cuando -=-: e la interrupción el sistema operativo salva el contexto del proceso en ejecución, ejecuta la rude reconocimiento de interrupciones y ésta invoca a la rutina de tratamiento de la interrupción .::é ~eloj. Cuando finaliza de atenderse la interrupción de reloj se restaura el contexto del proceso -:¿> rru mpido y se continua con su ejecución. Si un proceso finaliza se ejecuta el planificador del -:~m a operativo, que se encarga de seleccionar el próximo proceso que será ejecutado en el pro_::- .ador. y se realiza un cambio de proceso. En la Tabla 2.1 se muestran los tiempos promedios que :...:jan en ejecutarse cada una de estas tareas del sistema operativo.
==2
':' 1
Determinar el instante de finalización del proceso A (expresado en J1s) supuesto que en el instante de tiempo TI = 100 s llega una interrupción de reloj mientras se estaba ejecutando
78
Fundamentos básicos de los sistemas operativos
un proceso A al que le restaban 0,8 s de ejecución, y que durante la ejecución de dicho proceso únicamente llegan interrupciones de reloj . b) Durante el intervalo de tiempo comprendido entre TI = 100 s y T2 = 101 s determinar el porcentaje de tiempo que el procesador no ha podido ser utilizado para la ejecución de procesos sino para la ejecución de tareas del sistema operativo. Suponer que al finalizar el proceso A el planificador selecciona para ejecución a un proceso F que requiere un tiempo de servicio de 1,6 s.
Tareas del sistema operativo Salvar el contexto de un proceso Restaurar el contexto de un proceso Cambio de proceso Reconocimiento de interrupciones Tratamiento de la interrupción del reloj Planificador
Tiempo de ejecución promedio (¡Js) 1,25 1,25 6 2 2 4
Tabla 2.1 - Tiempo promedio de ejecución de algunas tareas del sistema operativo del Problema 2.4
2.5. Durante un cierto intervalo de observación de 100 ut, la CPU y los dispositivos de E/S de un computador han sido utilizados por el sistema operativo y varios procesos de usuarios de acuerdo con el diagrama de uso de la Figura 2.9. Dibujar y comentar el diagrama de Kiviatt - Kent asociado a este sistema informático. Suponer que el tiempo de ejecución en modo supervisor ha sido de ut. /'
CPU
E/S
o
10 20
30 40 50 60 70 80 90 100 Tiempo (ut)
Figura 2.9 - Diagrama de uso de la CPU y de la E/ S
Nota: un diagrama de Kiviatt - Kent es un gráfico circular (ver Figura 2.10) en cuyos ejes radiales se representan ocho Índices asociados al rendimiento de un sistema informático. Los índices: epe ocupada (CPU), uso simultáneo de CPU y di spositivos de E/S (CPU * E/S), uso de dispositivos de
Descripción y control de procesos
79
=:
S (E/ S), Y CPU ejecutándose en modo usuario (CPUu), son considerados Índices positivos en el que es beneficioso para el sistema que tengan un valor elevado. Por el contrario los Índices: ~_o de CPU sin solape con E/S (CPU * E/S), uso de E/S sin solape con la CPU (CPU * E/S), CPU :lJ~ tiva (CPU) y CPU ejecutando en modo supervisor (CPUs), son considerados Índices negativos, :J consecuencia su valor conviene que sea pequeño. ~nt i do
CPU CPU
CPU u
* E/S
f-+-...;..--i----'---*~----'--i--+--l
CPU
* E/S
E/S
Figura 2.10 - Diagrama de Kiviatt-Kentt
=::1 el caso de un modelo de proceso multihilo explicar razonadamente cuáles de las siguientes ,,::;:·ürrnaciones deben almacenarse en un bloque de control del proceso y cuáles en un bloque de ~ . ntrol de hilo: nombre de usuario propietario, estado, prioridad de ejecución, valor de registros :: ) ntador de programa y puntero de pila), memoria primaria asignada y archivos abiertos.
apítulo 3
anificación de procesos ~etivos ~
docentes
objetivos docentes de este capítulo son los siguientes:
Conocer y distinguir los diferentes niveles de planificación de procesos existentes en un sistema operativo. Saber qué criterios generales se consideran en la planificación de procesos en general y en la planificación del procesador en particular. Conocer el funcionamiento y las características de los principales algoritmos de planificación de procesos. Conocer las particularidades de la planificación de hilos.
Introducción En un sistema con multiprogramación se pueden ejecutar concurrentemente varios procesos. Si la __._·_a dispone de un único procesador, en un determinado instante de tiempo solamente un proceso hilo) puede usarlo. El sistema operativo se encarga de planificar qué proceso debe ejecutarse en ador siguiendo diferentes criterios de planificación. La parte del sistema operativo que se en- de la planificación de procesos se denomina planificador y realiza está tarea a diferentes niveles ementando uno o varios algoritmos de planificación. En este capítulo en primer lugar se describen los diferentes niveles de planificación existentes. A . nación se enumeran y explican los criterios generales considerados en la planificación de procesos. er lugar se analiza cómo afecta en la planificación la expropiación del procesador. En cuarto se describe el funcionamiento y las características de los principales algoritmos de planificación de os. Finalmente se analiza la planificación de hilos. 81
82
Fundamentos básicos de los sistemas operativos
3.2.
Niveles de planificación
Un sistema operativo con multiprogramación debe distribuir y planificar adec uadamente el uso de los recursos del computador entre todos los procesos existentes. Para ayudarse en esta función mantiene diferentes colas de procesos. El número y el nombre estas colas depende de cada sistema operativo, pero de forma general se pueden distinguir las siguientes colas (ver Figura 3.1): • Cola de procesos en el estado preparado. En ella se encuentran aquellos procesos que desean acceder al procesador para iniciar o continuar su ejecución. Esta cola no tiene por qué ser única: pueden existir varias colas de procesos en el estado preparado para ejecución, cada una de las cuales contiene procesos con un determinado rango de nivel de prioridad de ejecución. • Cola de procesos en el estado preparado en memoria secundaria. Contiene procesos que están a la espera de regresar a la memoria principal al estado preparado. • Cola de procesos en el estado bloqueado. Los procesos que pertenecen a esta cola están a la espera de poder volver al estado preparado tan pronto ocurra el evento por el que han entrado en el estado bloqueado. Esta cola no tiene por qué ser única. Una posibilidad es disponer de una cola por cada evento posible. Otra opción es disponer de colas por grupos de eventos asociados a algún recur o del sistema, si se trata de un dispositivo a dicha cola se le denomina cola del dispositivo. • Cola de procesos en el estado bloqueado en memoria secundaria. Contiene procesos que están a 1 espera de pasar al estado preparado en memoria secundaria, si ocurre el evento por el que entraron en el estado bloqueado. • Cola de trabajos por lotes o cola de entrada. Se almacena en memoria secundaria y contiene lo nuevos trabajos que llegan a un sistema operativo por lotes o a la parte por lotes de un sistema operativo híbrido. Cada trabajo se encuentra a la espera de que el sistema operativo cree un nue\"o proceso para atenderlo.
Un proceso durante su existencia puede pasar por varias colas. El sistema operativo debe determinar cuándo un proceso abandona una cola para acceder a un recurso o para ingresar en otra cola. A es actividad del sistema dperativo se le denomina planificación de procesos y al componente que la realiza se le denomina planificador. Se distinguen de forma general tres niveles de planificación (ver Figura 3.1): • Planificación a corto plazo. Decide qué proceso en la cola de preparados será ejecutado a continuación en el procesador. • Planificación a medio plazo. Decide qué proceso en una cola de memoria principal es intercambiado a una cola de memoria secundaria, o viceversa. • Planificación a largo plazo. Decide qué trabajo de la cola de trabajo por lotes pasa a ser ejecutado en el sistema mediante la creación de un proceso.
Planificación de procesos
Sucede evento
83
En espera de un evento
Cola de bloqueados [PMP]
Cola de bloqueados en memoria secundaria
Sucede evento
[PMP] Cola de preparados en memoria secundaria
[PMP]
!:::=;:::=:==fTIllíffl-----1
pusuarios eticiones ____ interactivos
Cola de preparados
[PLP]
[PCP]
Procesador
Finalización
Cola de trabajos por lotes [PCP] Transición regulada por el planificador a corto plazo. [PMP] Transición regulada por el planificador a medio plazo. [PLP] Transición regulada por el planificador a largo plazo. Figura 3.1 - Colas de planificación
Cada nivel de planificación es implementado por su correspondiente planificador. Los nombres utipara distinguir a los diferentes niveles de planificación están relacionados con la frecuencia con ] planificador correspondiente tiene que ser invocado. Así, el planificador a corto plazo es el que _: uta más frecuentemente, luego le sigue el planificador a medio plazo y a continuación el planifia largo plazo. Con el fin de reducir la sobrecarga del sistema y mejorar el rendimiento del mismo -ene que los planificadores sean rápidos y eficientes . •-\parte de estos tres niveles de planificación se puede distinguir un cuarto nivel, la planificación de ~ S que decide qué proceso en una cola de un dispositivo de E/S pasa a utilizar dicho dispositivo.
Planificador a corto plazo . ·onnalmente, en un sistema operativo con multiprogramación existen varios procesos en la cola de ---·~n.s' preparados. Si el computador únicamente dispone de un procesador, solamente podrá existir determinado instante de tiempo un único proceso en el estado ejecutándose. En consecuencia en -stema de estas características la ejecución concurrente, es decir, simultánea, de varios procesos es
84
Fundamentos básicos de los sistemas operativos
simplemente una ilusión proporcionada por la conmutación rápida del procesador entre los diferentes procesos. La elección del proceso perteneciente a la cola de procesos en el estado preparado que pasará al estado ejecutándose es realizada por un componente del sistema operativo denominado planificador a corto plazo, más conocido como planificador del procesador o simplemente planificador (scheduler). Desde un punto de vista lógico, todo planificador se puede dividir en tres componentes o elementos: • Encolador (enqueuer). Cuando un proceso entra en el estado preparado, el encolador se encarga de incIuir al proceso en la cola de procesos preparados mediante la configuración de los punteros necesarios en el bloque de control del proceso. También puede asignarle una prioridad de ejecución a dicho proceso. • Conmutador de contexto (context switcher). Se encarga de guardar el contexto del proceso que va a ser desalojado del procesador y cargar el contexto del proceso que ha sido planificado para ser ejecutado. • Distribuidor o despachador (dispatcher). Se encarga de seleccionar un proceso de la cola de procesos preparados de acuerdo con un determinado algoritmo de planificación. También se encarga de cederle el control del procesador, para ello el distribuidor debe invocar al conmutador de contexto. Al tiempo promedio que tarda el distribuidor en detener un proceso y comenzar la ejecución de otro se le denomina latencia de despacho. Sin duda es deseable que la latencia de despacho sea 10 más pequeña posible. Sin embargo muchos sistemas operativos, con objeto de asegurar la integridad de sus estructuras de datos, no permiten que se pueda expropiar un proceso en modo núcleo que esté realizando una llamada al sistema, hasta que ésta no se complete o el proceso entre en el estado bloqueado. Tales sistemas operativos se dicen que son de núcleo no expropiable. En dicho caso la latencia de despacho puede ser larga ya que algunas llamadas al sistema son complejas. Existen diferentes circunstancias que requieren la invocación del planificador a corto plazo, como por ejemplo: • Cuando se ha terminado de crear un nuevo proceso hijo. En este caso el planificador debe decidir si continúa ejecutanClo al proceso padre o comienza la ejecución del proceso hijo. • Cuando un proceso entra en el estado bloqueado en espera de que se produzca algún evento. En este caso dicho proceso ya no requiere utilizar el procesador por lo que el planificador debe decidir qué proceso ejecutar. • Cuando se termina de atender una interrupción. Por ejemplo, si llega una interrupción para avisar que se ha completado una operación de E/S con el disco por la que estaba esperando en el estado bloqueado un cierto proceso. En este caso, el planificador debe decidir si se planifica a dicho proceso, se continúa con la ejecución del proceso que fue interrumpido cuando llegó la interrupción y que fue pasado al estado preparado, o se planifica a otro proceso distinto.
Planificación de procesos
85
• Cuando un proceso finaliza. Si un proceso ha entrado en el estado terminado obviamente ya no utilizará el procesador por lo que el planificador debe decidir qué proceso será ejecutado a continuación.
Muchas de estas circunstancias son las mismas que se enumeraron como causa de un cambio de o en la sección 2.3.4. Esto es lógico ya que siempre que se requiere hacer un cambio de proceso _ que invocar al planificador. Por otra parte, dado que el planificador del procesador se ejecuta muy frecuentemente, éste debe ser : rápido y eficiente con objeto de no aumentar la sobrecarga y empeorar el rendimiento del sistema.
Planificador a medio plazo El planificador a medio plazo, también conocido como planificador de memoria o intercambiador, es mponente del sistema operativo que se encarga de decidir qué procesos en memoria principal de los ecientes a la cola de procesos en el estado preparado o la cola de procesos en el estado bloqueado • intercambiados a memoria secundaria, pasando a formar parte de la cola de procesos preparados moria secundaria o de la cola de procesos bloqueados en memoria secundaria, respectivamente. ién se encarga de realizar la decisión contraria, es decir, qué procesos en las colas de memoria ~::m
Planificador a largo plazo - planificador a largo plazo, también denominado planificador de trabajos o planificador de ad• . e encarga de decidir qué trabajo de los existentes en la cola de trabajos por lotes será admitido . tema para ser ejecutado. Además, debe decidir cuándo se pueden admitir nuevos trabajos. La - -ón de un trabajo consiste en la creación de un proceso para el procesamiento de dicho trabajo, el a a la cola de procesos en el estado preparado o la cola de procesos en el estado preparado en ria secundaria. planificador a largo plazo permite regular el grado de multiprogramación deseado en el sistema. Se ~ invocar cuando se termina un trabajo o cuando se detecta que el procesador permanece un cierto inactivo. -na propiedad observada en la mayoría de los procesos, que conviene tener en cuenta en la planificalargo plazo, es que la ejecución de un proceso comienza con una ráfaga de CPU, es decir, usando ador de forma ininterrumpida durante un cierto tiempo. Después realiza una llamada al sistema realizar una operación de E/S con algún archivo, con lo que el proceso entra en el estado bloqueado ra de que se complete la operación de E/S. Cuando la operación de E/S sea completada y el sea planificado de nuevo para ser ejecutado, realizará otra ráfaga de CPU, a ésta le seguirá otra de E/ S, a ésta otra ráfaga de CPU, etc.
86
Fundamentos básicos de los sistemas operativos
Si un proceso emplea la mayor parte de su tiempo haciendo cálculos en el procesador, se dice que es un proceso limitado por CPU. Un proceso de este tipo (ver Figura 3.2a) se caracteriza de forma general por realizar ráfagas largas de CPU y pocas esperas de E/S. Por el contrario, si un proceso emplea la mayor parte de su tiempo esperando por la realización de operaciones de E/S se dice que es un proceso limitado por E/S. Un proceso de este tipo (ver Figura 3.2b) se caracteriza de forma general por realizar ráfagas cortas de CPU y muchas esperas de E/S.
Ráfaga de CPU
A
CPU
A
E/S
A
I~
A A
Espera de E/S
Tiempo (ut)
(a)
CPU
E/S
B
[J[J I
B
[J[J [J[J I
(b)
B
Tiempo (ut)
Ejemplo~e diagrama de uso de recursos de un proceso limitado por CPU (a) y de un proceso limitado por El S (b)
Figura 3.2 -
El planificador a largo plazo debe intentar seleccionar trabajos de tal forma que en el sistema exista una mezcla adecuada de procesos limitados por CPU y procesos limitados por E/S. Si la mayoría de lo trabajos seleccionado están limitados por CPU, entonces los dispositivos de E/S se encontrarían la mayor parte del tiempo inactivos. Por el contrario, si la mayoría de los trabajos seleccionados están limitado por E/S , sería el procesador el que se encontraría la mayor parte del tiempo inactivo. En ambos casos se estaría produciendo un desequilibrio no deseable en el uso de los recursos del sistema. Algunos sistemas operativos, como por ejemplo los basados en UNIX, no tienen planificador a largo plazo. En estos sistemas los trabajos son admitidos mientras exista memoria principal disponible.
Planificación de procesos
_-.3 .
87
Criterios generales considerados en la planificación de procesos
:"'1 ependientemente del tipo de sistema operativo (por lotes, de tiempo compartido, o de tiempo real), : ~ Jetivos deseables que debe cumplir la función de planificación de procesos de un sistema operativo
• Equidad. En ausencia de un esquema de prioridades preestablecido, los procesos con requisitos j milares deben obtener un uso de los recursos similares. Es decir, ningún proceso debe sufrir manición. • Previsibilidad. Trabajos con características similares deben ejecutarse en tiempos similares usando r ~c ursos similares. L-50 equilibrado de los recursos. Se debe intentar mantener ocupados todos los recursos del compuAdor. Para cumplir con este objetivo se debe procurar que los programas cargados en memoria sean na mezcla de programas limitados por CPU y programas limitados por E / S. • Proporcionalidad. Las peticiones que son percibidas por el usuario como sencillas deben emplear menos tiempo de respuesta que las complejas ya que de lo contrario el usuario se irrita o considera ue el sistema se ha colgado.
Criterios considerados en la planificación del procesador ::::_ :n{al1ificador del procesador fundamenta su elección del próximo proceso que pasará a ser eje- : ~n el procesador en la optimización simultánea de alguno o algunos de los siguientes criterios -JUYos:
• e ili~ación
del procesador o eficacia. Fijado un cierto tiempo de observación, hace referencia al JI1to por ciento de dicho tiempo que el procesador ha estado activo.
• ,:Jroductividad (throughput) o rendimiento. Es el número de trabajos completados por unidad de - empo (típicamente una hora). Esta medida depende obviamente de la longitud de los procesos . Tiempo de entrega (turnaround time), también denominado tiempo de retorno o tiempo de es-.lllcia . Es el tiempo medio que transcurre desde que se lanza un proceso hasta que finaliza. Se .:llcula como la suma del tiempo de ejecución y el tiempo de espera por los recursos, incluyendo ;: 1 procesador. • Tiempo de espera. Es la suma de los tiempos que un proceso pasa esperando en las diferentes colas i el sistema por la obtención de recursos. •
~empo
de respuesta (response time). Es el tiempo transcurrido desde que un usuario manda una Jrden desde su terminal hasta que comienza a recibir la respuesta. Obviamente se encuentra limiJ do por la velocidad de los dispositivos de E/S .
88
Fundamentos básicos de los sistemas operativos
• Plazo de finalización (deadline). Hace referencia al tiempo máximo preestablecido que un proceso tiene para ser completado en un sistema de tiempo real.
La elección de los criterios a optimizar depende del tipo de sistema operativo. Por ejemplo, e! planificador de un sistema por lotes debe intentar maximizar la utilización de! procesador y la productividad. Además debe intentar minimizar el tiempo de entrega. Por su parte, el planificador de un sistema de tiempo compartido debe intentar minimizar el tiempo de respuesta, mientras que el planificador de un sistema de tiempo real debe intentar maximizar el número de plazos de finalización cumplidos. Normalmente el planificador optimiza los valores medios de los criterios que considera. Sin embargo. puede ser interesante optimizar los valores mínimos o máximos. Por ejemplo, para garantizar que todo los usuarios reciben un buen servicio quizás puede interesar minimizar el tiempo de respuesta máximo. Investigaciones realizadas han sugerido que es más importante minimizar la varianza en el tiempo de respuesta que minimizar el tiempo de respuesta promedio. Un sistema con un tiempo de respuesta razonable y predecible puede ser más atrayente que un sistema que es más rápido en promedio, pero que es altamente variable. Cuando se intentan optimizar varios criterios simultáneamente, se debe tener en cuenta que pueden ser incompatibles entre sí. Por ejemplo un planificador que maximiza la productividad puede no estar minimizando el tiempo de entrega. Supóngase que se dispone de una mezcla de trabajos cortos y largo . Si el planificador únicamente ejecuta los cortos y nunca los largos la productividad puede ser muy buena (muchos trabajos cortos por hora ejecutados), pero a expensas de tener un tiempo de entrega muy alto para los trabajos largos. En este caso, e! planificador debe otorgar un determinado peso a cada criterio para llegar a un compromiso. El valor de dicho peso dependerá del tipo y uso del sistema operativo.
3.S. Expropiabilidad del procesador La planificación del procesador en función de si permite que un proceso pueda usar e! procesador ininterrumpidamente todo el tiempo que desee se puede clasificar en dos tipos: planificación expropiatim o planificación no expropiativa. La planificación del procesador es no expropiativa (nonpreemptive) si permite que un proceso pueda estar ejecutándose en el procesador ininterrumpidamente hasta que termine o se bloquee en espera de un evento. Por el contrario la planificación del procesador es expropiativa (preemptive) si el proceso que se es ' ejecutando en el procesador puede ser interrumpido en cualquier momento y pasado al estado preparado para proceder a ejecutar otro proceso distinto. La decisión de expropiar el procesador a un proceso se puede tomar cuando: llega un nuevo proce o. llega una interrupción que produce que un proceso pase del estado bloqueado al estado preparado. periódicamente. En este último caso, el computador debe disponer de un reloj que produzca una interrupción cada cierto intervalo de tiempo. El planificador se puede invocar en cada interrupción de reloj_ También existe la posibilidad de invocarlo únicamente cuando se han acumulado varias interrupciones eL: reloj, es decir, cuando un proceso se ha ejecutado ininterrumpidamente durante un cierto tiempo máximo. A dicho tiempo máximo de ejecución ininterrumpida se le denomina cuanto (quantum).
Planificación de procesos
89
Una planificación expropiativa produce una mayor sobrecarga al sistema que una no expropiativa, que se ejecuta con mayor frecuencia el planificador y se realizan más cambios de proceso; pero rciona un mejor servicio a la población de procesos ya que previene que un proceso monopolice del procesador. Además, la realización de una planificación expropiativa requiere que el núcleo . tema operativo disponga de mecanismos de sincronización para evitar la posible corrupción de sus cturas de datos. La decisión de elegir una planificación expropiativa o no expropiativa depende en gran medida de requisitos temporales de los programas que se van a ejecutar. En un sistema operativo por lotes una elección es utilizar una planificación no expropiativa o una planificación expropiativa con cuantos es para cada proceso, ya que no existen usuarios que se encuentren esperando impacientemente en rminales por una respuesta rápida a sus peticiones. Por su parte, en un sistema de tiempo compartido o interactivo se debe utilizar planificación expro- ·a con objeto de poder atender las peticiones de todos los usuarios. En el caso de los sistemas de tiempo real, por extraño que parezca, a veces no es necesario una . cación expropiativa ya que los procesos saben que no pueden ejecutarse durante largos periodos -empo, por ello realizan su trabajo y se bloquean frecuentemente.
Algoritmos de planificación L-a función de planificación de un sistema operativo se implementa mediante la utilización de uno o algoritmos de planificación. En las siguientes subsecciones se describen las características de los =: ·tmos de planificación más usuales .
.1. Algoritmo de planificación del primero en llegar - primero en ser servido Sin duda el algoritmo de planificación más sencillo de entender y de programar es el algoritmo del . e ro en llegar - primero en ser servido o abreviadamente algoritmo FCFS (First-Come First-Served). ~ =a algoritmo cede el uso del procesador al primer proceso que lo solicite, éste puede utilizarlo ininpidamente hasta que termine o se bloquee en espera de un evento. En consecuencia el algoritmo es no expropiativo. La implementación de este algoritmo únicamente requiere una cola de procesos preparados con una :rganización del tipo primero en entrar - primero en salir es decir una cola FIFO (First Input - First ut). Cuando un proceso entra en el estado preparado su bloque de control se enlaza al final de cola. Asimismo cuando hay que escoger un nuevo proceso para ejecutar, se elige siempre al primer eso de la cola. Una vez seleccionado es eliminado de la cola. El algoritmo FCFS presenta las siguientes desventajas: • El tiempo de espera promedio de los procesos es bastante grande y puede variar de forma importante si los tiempos de ejecución de los procesos son muy diferentes. • Funciona mucho mejor para procesos largos que para procesos cortos.
90
Fundamentos básicos de los sistemas operativos
• Favorece a los procesos limitados por el procesador frente a los procesos limitados por la E/S. Ello produce una utilización poco eficiente del procesador y de los dispositivos de E/S. Por ejemplo supóngase que existe un proceso A limitado por el procesador y tres procesos B, C y D limitados por la E/S . Cuando A se está ejecutando los restantes procesos tienen que esperarse. Puede suceder que mientras se ejecuta A los otros tres procesos finalicen sus operaciones de E/S, con lo que pasarán de la cola de procesos bloqueados a la cola de procesos preparados. Los dispositivos de E/S pueden ser utilizados pero están inactivos porque los procesos B, C y D no son planificados. Cuando A abandona el procesador, los procesos B, C y D son ejecutados y luego se volverán a bloquear mientras finalizan sus operaciones de E/S. Si el proceso A se encuentra también en el estado bloqueado, el procesador permanecerá inactivo. Las desventajas que presenta el algoritmo FCFS desaconsejan su uso como único algoritmo de planificación del sistema, aunque puede ser eficaz utilizarlo en combinación con otros algoritmos de planificación, como por ejemplo, el algoritmo de planificación basado en prioridades. Desde luego, conocida sus desventajas, si se decide utilizarlo como único algoritmo de planificación, es preferible usarlo en un sistema por lotes que en un sistema de tiempo compartido .
• Ejemplo 3.1 En la Tabla 3.1 se muestran el tiempo de llegada y el tiempo de servicio o ejecución expresado en unidades de tiempo (ut) de cuatro procesos A, B, C y D. Si se considera que estos cuatro procesos están asociados cada uno de ellos a un trabajo por lotes, entonces el tiempo de servicio es igual al tiempo de ejecución estimado para cada trabajo. Por otra parte, si se considera que son procesos en curso que van alternado ráfagas de CPU con esperas de E/S, entonces el tiempo de servicio hace referencia a la duración de la próxima ráfaga de CPU. Se va a considerar además que la sobrecarga es despreciable. Además se utiliza en la planificación el algoritmo FCFS.
Proceso A
B C D
Tiempo de llegada (ut) O 1 2 3
Tiempo de servicio (ut) 5 3 4 2
Tabla 3.1- Tiempo de llegada y servicio de los procesos A, B, e y D del Ejemplo 3.1
Cuando llega el proceso A en t = O ut, puesto que no hay procesos en la cola de preparados, se planifica inmediatamente hasta que finaliza en t = 5 ut. En este instante en la cola de preparados hay tres procesos B, C y D, luego se planifica el proceso B ya que es el primero de la cola. B se ejecuta hasta finalizar en t = 8 ut. En ese instante de tiempo en la cola de preparados hay dos procesos C y D. Se planifica el proceso C que se ejecuta hasta finalizar en t = 12 ut. Finalmente se planifica el proceso D, cuya ejecución finaliza en t = 14 ut. En la Figura 3.3 se representa el diagrama de utilización del procesador, también denominado diagrama de Gantt. Se han añadido al mismo unas flechas para resaltar los instantes de llegada y finalización de cada proceso.
91
Planificación de procesos
A
B
C
++++ t
t
t t
A B C D
Uso del procesador
A
B
I
I
O
5
D
C
I
D
I
I
I
10
I
15
Tiempo (ut)
Figura 3.3 - Diagrama de uso del procesador para los procesos de la Tabla 3.1 con el algoritmo de planificación FCFS
la información disponible es posible calcular el tiempo de retomo TR Y el tiempo de espera TE de de cada proceso. El tiempo de retomo se calcula como la diferencia entre el tiempo de finalización - ':' ~ el tiempo de llegada T LL :
(3 .1)
tras que el tiempo de espera TE se calcula como la diferencia entre el tiempo de retomo T R Y el de servicio o ejecución T s : (3.2) Tabla 3.2 se muestran los valores de TLL, TF, TR, Ts Y TE para los procesos A, B, C y D. Se puede m bar que los valores promedios del tiempo de retomo y del tiempo de espera son 8,25 ut y 4,75 ut, tivamente.
Procesos
T LL (ut)
A B C D
O 1 2
3
TF (ut) 5 8 12 14
T R (ut) 5 7 10 11
Ts (ut) 5
TE (ut)
3
4 6 9
4 2
O
Tabla 3.2 - Tiempo de llegada, finalización, retomo, servicio y espera de los procesos de la Tabla 3.1 usando planificación FCFS
• PlanificacióiI de primero el proceso más corto El algoritmo de primero el proceso más corto, abreviadamente algoritmo SJF (Shortest Jop First) o - 'tmo SPN (shortest process next), es un algoritmo de tipo no expropiativo que selecciona para ser tado al proceso con tiempo de procesamiento más corto. Si dos o más procesos tienen el mismo de procesamiento entonces se les aplica el algoritmo FCFS .
92
Fundamentos básicos de los sistemas operativos
Conviene recordar que en el caso de sistemas por lotes el tiempo de procesamiento de un proceso se refiere al tiempo de ejecución total del un trabajo. Mientras que en el caso de sistemas de tiempo compartido, hace referencia a la duración de la próxima ráfaga de procesador del proceso. Se puede demostrar que el algoritmo de planificación SJF minimiza el tiempo de espera medio de un conjunto dado de procesos. Puesto que, a diferencia del algoritmo FCFS, el algoritmo SJF favorece a los procesos cortos frente a los procesos largos, el tiempo de espera de los procesos cortos disminuye más de lo que se aumenta el tiempo de espera de los procesos largos. Por lo tanto, el tiempo de espera promedio se decrementa. El algoritmo de planificación SJF se suele utilizar en sistemas operativos por lotes tanto en la planificación a largo plazo como a corto plazo . • Ejemplo 3.2 Considérense los cuatro procesos A, B, C y D del Ejemplo 3.1 cuyos tiempos de llegada y servicio se daban en la Tabla 3.1. Supóngase que la sobrecarga es despreciable, y que se utiliza en la planificación el algoritmo SJF. D
B
e
++++ t t
t
t
A B
Uso del procesador
e
D
A
A
I
I
O
5
e
B
D
I
I
I
10 Tiempo (ut) 15
Figura 3.4 - Diagrama de uso del procesador para los procesos de la Tabla 3.1 con el algoritmo de planificación SJF
Cuando llega el proceso A en t = O ut, puesto que no hay procesos en la cola de preparados, se planifica inmediatamente hasta que finaliza en t = 5 ut. En este instante, en la cola de preparados hay tres procesos B, C y D. Si se ordenan por tiempo de ejecución más corto se tendría la ordenación D, B, C. En consecuencia se planifica el proceso D, que se ejecuta hasta finalizar en t = 7 ut. Durante este tiempo no ha llegado a la cola de preparados ningún proceso, luego se planifica B, que se ejecuta hasta finalizar en t = 10 ut. Finalmente se planifica el proceso C, cuya ejecución finaliza en t = 14 ut. En la Figura 3.4 se representa el diagrama de utilización del procesador. En la Tabla 3.3 se muestran los valores de T LL , T F , T R , T s YTE para los procesos A, B, C YD. Se puede comprobar que los valores promedios del tiempo de retomo y del tiempo de espera son 7,5 ut y 4,0 ut, respectivamente.
•
Planificación de procesos
Procesos A B C D
TLL (ut)
O 1 2 3
TF (ut)
TR (ut)
Ts (ut)
TE (ut)
5
5 9 12 4
5 3 4 2
O 6 8 2
10
14 7
93
Tabla 3.3 - Tiempo de llegada, finalización, retorno, servicio y espera de los procesos de la Tabla 3.1 usando planificación SJF
__
Una de las principales desventajas que presenta el algoritmo SJF es la necesidad de conocer por tado el tiempo de procesamiento de cada proceso. En general, salvo en ciertos casos deterministas .ales, el comportamiento futuro de un proceso es desconocido y difícil de estimar con exactitud. En el caso de sistemas operativos por lotes, el sistema puede requerir que el usuario que solicita la . ción de un trabajo proporcione una estima del tiempo de procesamiento del mismo. Conviene que tima proporcionada sea lo más exacta posible, ya que si el tiempo de ejecución del trabajo supera or estimado, el trabajo podría ser abortado por el sistema y tendría que ser colocado otra vez en la de entrada de trabajos. Esto, en general, no suele ser un problema porque en entornos de producción _ elen ejecutar frecuentemente el mismo tipo de trabajos y se almacenan estadísticas. Por ejemplo, compañía de seguros, se puede estimar con facilidad cuánto tardará en procesarse un lote de 500 ya que todos los días hacen el mismo trabajo. En el caso de sistemas de tiempo compartido, el sistema puede estimar la duración de las siguientes -="'~ de CPU utilizando la duración de las ráfagas anteriores, las cuales son medidas y almacenadas istema en el bloque de control de cada proceso. Una forma bastante común de predecir valores usando valores pasados es usando un predictor promedio exponencial: Mn+l
= a ·tn + (1 -
a)·Mn
(3.3)
En la ecuación anterior, n = 1,2, ... , Mn+l es el valor promedio estimado para la próxima ráfaga de ador, M n es el valor promedio estimado para la última ráfaga de procesador, tn es la duración de la ráfaga de procesador y a es un parámetro comprendido entre O y 1 que permite controlar el peso historia reciente y pasada en la predicción. Por ejemplo si a = O entonces M n + 1 = M n , es decir, tiene en cuenta la información presente proporcionada por tn . Por el contrario, si a = 1 entonces 1 = tn con lo que no se tiene en cuenta la información pasada proporcionada por M n . Cuanto más o a 1 sea a la estima responderá más rápidamente a posibles cambios en los valores medidos. La ecuación recursiva (3.3) se puede expresar en la forma: Mn+l
= a·tn + (1 -
a)·tn- l + ... + (1 - a)i·a·tn_i + ... + MI
(3.4)
Donde MI es un valor inicial que se fija a priori. Se observa que en el cálculo del valor promedio . ado para la próxima ráfaga de procesador se consideran los valores pasados de la duración ti de ráfagas del procesador. Puesto que el parámetro a es menor que uno, conforme más antigua es una .da menos contribuye a la estima.
94
Fundamentos básicos de los sistemas operativos
• Ejemplo 3.3 Supóngase que la duración medida de las cinco primeras ráfagas de procesador de un proceso son: t[ = 5 ut, t2 = 6 ut, t3 = 7 ut, t4 = 10 ut y ts = 7 ut Se desea calcular el valor promedio estimado para la ráfagas Mi+l con i = 1,2,3 Y 4 considerando que a = 0,7 Y MI = Out. Sustituyendo valores en la ecuación (3.3) se obtienen los siguientes resultados: M2 = 3,5 ut, M3 = 5,25 ut, M4 = 6,475 ut y Ms = 8,942 ut. Se observa que las estimas de las duraciones de las ráfagas poseen un error respecto del valor real medido. Por ejemplo, la duración estimada de la segunda ráfaga M2 difiere en 2,5 ut del valor real medido t2 .
• La implementación del algoritmo SJF requiere la obtención de medidas bastante precisas de la duración de las ráfagas de procesador, así como del cálculo del predictor promedio exponencial. Además. se requieren mecanismos de realimentación adicionales para corregir el error de la estima del predictor cuando ésta se desvía bastante de los valores medidos. En consecuencia, este algoritmo produce una sobrecarga en el sistema. Cuanto más precisa se desee que sean las estimas más sobrecarga se produce. Otra desventaja del algoritmo SJF es que los procesos largos pueden sufrir inanición, es decir, si continuamente están llegando a la cola de procesos preparados procesos cortos, los procesos largos puede que no lleguen nunca a ser ejecutados.
3.6.3.
Planificación del proceso con menor tiempo restante
El algoritmo de a continuación el proceso con menor tiempo restante, abreviadamente algoritmo SRT (Shortest Remaining Time Next), es la versión expropiativa del algoritmo SJF. Este algoritmo siempre selecciona para ser ejecutado al proceso con menor tiempo restante de ejecución. Si mientras se está ejecutando en el procesador un proceso A llega a la cola de preparados un proceso B con menor tiempo restante de ejecución, el planificador expropia el procesador al proceso A y se lo cede al proceso B. El algoritmo SRT, al igual que SJF, se suele utilizar en sistemas por lotes. También requiere una estimación de los tiempos restantes de ejecución de la población de procesos. Además puede producir inanición a los procesos largos .
• Ejemplo 3.4 Considérense los cuatro procesos A, B, C y D del Ejemplo 3.1 cuyos tiempos de llegada y servicio se daban en la Tabla 3.l. Supóngase que la sobrecarga es despreciable y que se utiliza en la planificación el algoritmo SRT. Cuando llega el proceso A en t = Out, como no hay procesos en la cola de preparados, se planifica inmediatamente. En t = 1 ut llega el proceso B, como su tiempo de servicio (3 ut) es menor que el tiempo de servicio que le falta al proceso A (4 ut) , se interrumpe el proceso A y se comienza a ejecutar el proceso B . En t = 2 ut llega el proceso C, como su tiempo de servicio (4 ut) es mayor que el tiempo de servicio que le falta al proceso B (2 ut) , continúa ejecutándose B . En t = 3 ut llega el proceso D, como su tiempo de servicio (2 ut) es mayor que el tiempo de servicio que le falta al proceso B (l ut), continúa ejecutándose B.
Planificación de procesos
A B
Uso del procesador
e
D B
+ + ++
t~
H
:
B
O
D
A
e
t
t
t
D
e
A
I
I
95
I
10 Tiempo (ut) 15
5
Figura 3.5 - Diagrama de uso del procesador para los procesos de la Tabla 3.1 con el algoritmo de lanificación SRT .
= 4 ut finaliza el proceso B. En la cola de preparados se encuentran los procesos A, C y D cuyos de servicio restantes son 4, 4 Y 2 ut, respectivamente. Se planifica el proceso D por tener el menor de ejecución restante.
- = 6 ut finaliza el proceso D y se planifica el proceso A, ya que está antes en la cola que el proceso onviene recordar que en igualdad de tiempo de servicio restante se aplica la planificación FCFS.
= 10 ut finaliza el proceso A y se planifica el proceso C, cuya ejecución finaliza en t = 14 ut. Figura 3.5 se representa el diagrama de utilización del procesador. Asimismo en la Tabla 3.4 se -r::;;;:esrran los valores de TLL, TF, TR, Ts Y TE para los procesos A, B, C Y D. Se puede comprobar que ores promedios del tiempo de retorno y del tiempo de espera son 7 ut y 3,5 ut, respectivamente.
Procesos A B C D
T LL (ut) O 1 2 3
10 4
14 6
10 3 12 3
Ts (ut) 5 3 4
2
5 O 8 1
la 3.4 - Tiempo de llegada, finalización, retomo, servicio y espera de los procesos de la Tabla 3.1 do planificación SRT
• Planificación de turno rotatorio - algoritmo de planificación de turno rotatorio (round robin) o cíclico, es un algoritmo similar al a;::'Cnuo FCFS pero de tipo expropiativo. Este algoritmo asigna el uso ininterrumpido del procesador a o durante una cantidad fija de tiempo denominada cuanto (quantum) o rodaja de tiempo (time Finalizado el cuanto, se genera una interrupción de reloj que produce que la ejecución del proceso sea interrumpida y se pase a ejecutar el primer proceso de la cola de preparados, como en la -===-icalción FCFS. El proceso interrumpido se coloca al final de dicha cola y tendrá que esperar turno olver a utilizar el procesador.
96
Fundamentos básicos de los sistemas operativos
Si un proceso termina de usar el procesador antes de consumir su cuanto, entonces se planifica el primer proceso de la cola preparados sin esperar a que finalice el cuanto. Por otra parte, si finaliza un cuanto y no existen procesos en la cola de preparados, entonces el proceso que se estaba ejecutando puede seguir usando el procesador.
• Ejemplo 3.5 Considérense los cuatro procesos A, B, C y D del Ejemplo 3.1 cuyos tiempos de llegada y servicio se daban en la Tabla 3.1. Supóngase que la sobrecarga es despreciable y que se utiliza en la planificación el algoritmo de turno rotatorio con un cuanto q = 2 ut. Supóngase también que si un proceso X llega a la cola de preparados en el mismo instante en que termina el cuanto de un proceso Y, entonces X se coloca antes que Y en la cola de procesos preparados. A B
e
D
D B
tt tt
~ ~ ~ ~ Uso del procesador
A
I O
B
I
D A
I
e 5
A
I
D
I
IBI
e
H
10 Tiempo (ut) 15
Figura 3.6 - Diagrama de uso del procesador para los procesos de la Tabla 3.1 con el algoritmo de planificación de turno rotatorio de cuanto q = 2 ut Cuando llega el proceso A en t = O ut se planifica inmediatamente, puesto que no hay procesos en la cola de procesos preparados. En t = 1 ut llega el proceso B y se coloca en la cola de procesos preparado . En t = 2 ut llega el proceso C y se termina el cuanto asignado a A. En la cola de preparados el proceso C se coloca antes que el proceso A, al que le restan 3 ut de servicio. Se planifica el proceso B por estar primero en la cola. En t = 4 ut llega el proceso D y se termina el cuanto asignado a B. Como en la cola de preparados se encuentran los procesos C, A y D, se planifica el proceso C por estar primero y el proceso B se coloca al final de la cola. Al proceso B le resta 1 ut de servicio. En t = 6 ut se termina el cuanto asignado a C. Como en la cola de preparados se encuentran los proceso A, D Y B se planifica el proceso A por estar primero y el proceso C se coloca al final de la cola. Al proceso C le restan 2 ut de servicio. En t = 8 ut se termina el cuanto asignado a A. Como en la cola de preparados se encuentran los proceso D, B Y C se planifica el proceso D por estar primero y el proceso A se coloca al final de la cola. proceso A le resta 1 ut de servicio. En t = 10 ut finaliza el proceso D. Como en la cola de preparados se encuentran los procesos B, C y A, se planifica el proceso B por estar primero. En t = 11 ut termina el proceso B. Como en la cola de preparados se encuentran los procesos C y A, planifica el proceso C por estar primero, su ejecución termina en t = 13 ut. Finalmente se planifica el proceso A, cuya ejecución termina en t = 14 ut.
Planificación de procesos
97
- - _.: Figura 3.6 se representa el diagrama de utilización del procesador. Asimismo en la Tabla 3.5 se >iIan los valores de T LL , T F , T R , Ts Y TE para los procesos A, B , e y D. Se puede comprobar que .:.lores promedios del tiempo de retorno y del tiempo de espera son 10,5 ut y 7 ut, respectivamente.
Procesos A B
e D
T LL (ut) O 1 2 3
T F (ut)
TR (ut) 14
14 11 13
Ts (ut)
TE (ut)
5 3 4 2
9 7 7 5
10 11 7
10
Tab la 3.5 - Tiempo de llegada, finalización , retorno, servicio y espera de los procesos de la Tabla 3.1 _~an do planificación de turno rotatorio con q = 2 ut
=:
• ~l e mento
clave al implementar un algoritmo de turno rotatorio es la elección del tamaño del -:: Si el cuanto es muy pequeño, se producen cambios de contexto frecuentemente lo que aumenta :-::-ecarga. Por el contrario si es muy grande, el algoritmo de turno rotatorio degenera en un algoritmo
=)dIl plo 3.6 que el tiempo promedio asociado a un cambio de proceso es s :.:'nces el porcentaje de sobrecarga en el tiempo s + q es:
: ;::.~ ase
= 1 ut y que el cuanto es q = 3
s 1 --100 = - 100 = 25 % s+q 4
_-=-: supone un rendimiento muy pobre del sistema. "..:.dIl to fuese q = 99 ut entonces la sobrecarga sería solo del 1 %, lo cual mejora notablemente el ___~-~- e nto. Sin embargo, este valor del cuanto podría suponer un tiempo de respuesta excesivo para las - : :,~s de los usuarios interactivos.
-
~as e
que hay diez usuarios que pulsan simultáneamente la tecla de retorno, y que ello genera la de diez procesos : A, B, e, D, E, F, G , H , 1 Y J, que serán colocados en la cola de preparados, es gestionada con el algoritmo de turno rotatorio. Si el procesador no estaba siendo utilizado el
~"
q "_ ,..:> de l -'"~5a d o r
1"
o -:-
,~" ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ,~, ~ ,
'"
'"
'"
,,,
'"
,"
'"
'"
,,,
,,,
Tiempo (ms)
,,,
,,,
,,
,,
, , , ,1,
~
, , , , , , ,J, , , , I 999
ra 3.7 - Diagrama de uso del procesador de diez procesos interactivos con algoritmo de planifica-
_-=de turno rotatorio con q = 99 ms y tiempo promedio de cambio de proceso T cp = 1 ms
98
Fundamentos básicos de los sistemas operativos
proceso A será atendido inmediatamente, el proceso B al cabo de 100 ut, el proceso C al cabo de 200 ut, etc. En consecuencia si se considera que la unidad de tiempo es el milisegundo, el último proceso no comenzará a ser ejecutado hasta transcurridas 900 ms, es decir 0,9 s (ver Figura 3.7). Con lo que el tiempo de respuesta para el usuario cuya petición ha sido atendida en último lugar será superior a un segundo, que resulta inaceptable considerando el tipo de petición realizada.
• Lo recomendable es que el cuanto sea ligeramente superior al tiempo promedio de duración de una ráfaga de procesador, ya que si fuese menor la mayoría de los procesos necesitarían al menos usar dos cuantos de tiempo para completar una ráfaga de procesador. Configurando el cuanto de esta forma el número de cambios de contexto se reduce bastante y disminuye la sobrecarga del sistema .
• Ejemplo 3.7 Considérense los cuatro procesos A, B, C Y D del Ejemplo 3.1 cuyos tiempos de llegada y servicio se daban en la Tabla 3.1. El tiempo promedio de servicio requerido es de 3,5 ut. En el Ejemplo 3.se aplicaba para su planificación el algoritmo de turno rotatorio con cuanto q = 2 ut, que es inferior al tiempo promedio de servicio. De acuerdo con la Figura 3.6 se producen siete cambios de proceso. Además, de acuerdo con la Tabla 3.5, los valores promedios del tiempo de retorno y del tiempo de espera son 10,5 ut y 7 ut, respectivamente. Supóngase ahora que se aplica el algoritmo de planificación de turno rotatorio con un cuanto de q = 4 ut que es ligeramente superior al tiempo de servicio promedio. En la Figura 3.8 se representa el diagrama de uso del procesador. Se observa que en este caso el número de cambios de contexto se reduce a cuatro.
A B
e
D
++++ Uso del procesador
I
A
O
B
e
D A
t
t
t t
e
B
I
D
H
10 Tiempo (ut) 15
5
Figura 3.8 - Diagrama de uso del procesador para los procesos de la Tabla 3.1 con el algoritmo de planificación de turno rotatorio de cuanto q = 4 ut
Procesos A B
T LL (ut)
T F (ut)
T R (ut)
Ts (ut)
T E (ut)
O 1
C D
2
14 7 11 13
14 6 9 10
5 3 4
9 3 5 8
3
2
Tabla 3.6 - Tiempo de llegada, finalización , retorno, servicio y espera de los procesos de la Tabla 3.1 usando planificación de turno rotatorio con q = 4 ut
Planificación de procesos
99
oo-a parte, de acuerdo con la Tabla 3.6, los valores promedios del tiempo de retorno y del tiempo de on 9,75 ut y 6,25 ut, respectivamente. nsecuencia, al haber fijado un cuanto ligeramente superior al tiempo medio de servicio se ha reel número de cambios de contexto, con lo que disminuye la sobrecarga del sistema (aunque en "jemplo no se haya cuantificado) y se mejora el tiempo de retorno promedio y el tiempo de espera .................-i o.
• - algoritmo de turno rotatorio es un algoritmo sencillo que fue diseñado para los sistemas de tiempo .=::t:::;l1lrtÍ· do. Además, es un algoritmo justo, ya que a todos los procesos, independientemente de su eza, les asigna el mismo tiempo de uso del procesador. Sin embargo, el tiempo de respuesta .o, el tiempo de retorno promedio y el tiempo de espera promedio pueden ser largos.
Planificación basada en prioridades El algoritmo de planificación basada en prioridades asigna a cada proceso en el momento de su °ón una determinada prioridad de ejecución en la forma de un número entero positivo. Dependiendo istema, la máxima prioridad puede corresponder a un número pequeño, típicamente 0, o a un 'Jil:::::eIU grande. Siempre se planifica para ejecución al proceso de mayor prioridad. En caso de que varios :E:C=:;OS posean la misma prioridad éstos se deben planificar mediante otro algoritmo distinto, como por 0, FCFS o SJF. Nótese que el algoritmo SJF se puede considerar como un algoritmo basado en J!O[;;¡:°!Ua1des, donde la prioridad más alta corresponde a los procesos de tiempo de servicio estimado más asignación de prioridades a los procesos se puede realizar en función de factores internos del siscomo por ejemplo: requerimientos de memoria, duración promedio de la ráfaga de procesador o de !!a de E/S, modo de ejecución, limitaciones temporales y el número de archivos abiertos. También en utilizar factores externos al sistema, como por ejemplo: el tipo de proceso y la importancia del °o al que pertenece el proceso . .uIando se crea un proceso se le asigna una determinada prioridad de ejecución. Si dicha prioridad modifica durante el tiempo de vida del proceso, entonces se dice que la asignación de prioridades •. ca. Por el contrario, en un asignación de prioridades dinámica, la prioridad se va modificando de con algunos de los factores internos comentados. - 51e algoritmo puede ser expropiativo o no expropiativo. En su implementación expropiativa, si llega :::ola de procesos preparados un proceso B con una prioridad mayor que la del proceso actual A, ~~ces se interrumpe la ejecución de A y se planifica inmediatamente al proceso B. Un algoritmo de ° cación basado en prioridades expropiativo se dice que está guiado por eventos (event-driven). r el contrario en su implementación no expropiativa la planificación del proceso B solo se realiza el proceso A se bloquea o finaliza. plo 3.8 °dérense los cuatro procesos A, B, C Y D del Ejemplo 3.1 cuyos tiempos de llegada y servicio se en la Tabla 3.1. Supóngase que la prioridad de estos procesos es 2, 1, Y 2, respectivamente,
°
100
Fundamentos básicos de los sistemas operativos /
siendo O la prioridad más alta. Supóngase que la sobrecarga es despreciable y que se utiliza el algoritmo de planificación basada en prioridades con expropiación. A B
e
e
D
HB!
e
B
! !
t t A
D
! !
10 Tiempo (ut) 15
5
O
D
A
t t
~ ~ ~ ~ Uso del procesador
B
Figura 3.9 - Diagrama de uso del procesador para los procesos de la Tabla 3.1 con el algoritmo de planificación basada en prioridades Cuando llega el proceso A en t = O ut, puesto que no hay procesos en la cola de preparados se planifica inmediatamente. En t = 1 ut llega el proceso B y se planifica, ya que es más prioritario que el proceso A. que se coloca al final de la cola de preparados. Al proceso A le restan 4 ut de servicio. En t = 2 ut llega el proceso C. Al ser éste más prioritario que el proceso B, se planifica y el proceso B se coloca al final de la cola de preparados. Al proceso B le restan 2 ut de servicio. Procesos A B C D
TLL (ut)
TF (ut)
TR (ut)
Ts (ut)
O 1 2 3
12 8
12
6
4 11
5 3 4 2
14
7
TE (ut) 7
4 O 9
Tabla 3.7 - Tiempo de llegada, finalización, retorno, servicio y espera de los procesos de la Tabla 3.1 usando planificación basada en prioridades En t = 3 ut llega el proceso D. Como es menos prioritario que el proceso C, se coloca al final de la cola de preparados. En t = 6 ut termina el proceso C y se planifica el proceso B, ya que de los procesos que hay en la cola (A, B Y D) es el de mayor prioridad. En t = 8 ut termina el proceso B y se planifica el proceso A ya que está primero en la cola. En t = 12 ut termina el proceso A y se planifica el proceso D. que finaliza en t = 14 ut. En la Figura 3.9 se representa el diagrama de uso del procesador. Asimismo en la Tabla 3.7 se muestran los valores de TLL, Tp, TR, Ts Y TE para los procesos A, B, C Y D. Se puede comprobar que los valores promedios del tiempo de retorno y del tiempo de espera son 8,5 ut y 5 ut, respectivamente.
•
Uno de los problemas que presenta el algoritmo de planificación basada en prioridades es que un proceso con una prioridad baja puede sufrir inanición. Efectivamente, si continuamente están llegando al sistema procesos de prioridad alta, un proceso de prioridad baja nunca llegará a obtener el uso del procesador. Una solución a este problema lo proporciona la técnica conocida como envejecimiento de
Planificación de procesos
101
/
esos (aging), que consiste en ir aumentando la prioridad de los procesos conforme más tiempo están ~ istema en espera del procesador. De esta forma se garantiza que cualquier proceso, aunque su -dad inicial sea baja, obtendrá el uso del procesador transcurrido un cierto tiempo de espera. Otra forma de prevenir la inanición es disminuir en cada interrupción de reloj la prioridad del procealta prioridad en ejecución. Así, transcurrido un cierto tiempo, dicho proceso tendrá una prioridad que la de los procesos en la cola de espera y si el algoritmo se ha implementado de forma expro-'a se puede planificar otro proceso. Otra alternativa de prevención de la inanición es permitir que un o, independientemente de su prioridad, solo se pueda ejecutar durante un determinado cuanto de . Cuando el cuanto finaliza se planifica el siguiente proceso más prioritario. Orro problema que puede presentar el algoritmo de planificación basado en prioridades es el fenóconocido como inversión de prioridades, que se produce cuando un proceso de mayor prioridad que esperar un tiempo largo para usar un recurso ya que está siendo usado por un proceso de menor -dad. Por ejemplo, si un proceso A de menor prioridad ha bloqueado un determinado recurso del y un proceso B de mayor prioridad desea utilizarlo, B tendrá que esperar en el estado bloqueado que A libere el recurso. Esta situación puede ser realmente problemática en un sistema de tiempo ~cto donde los procesos se deben ejecutar dentro de unos plazos de tiempo determinados. Este ma se puede resolver mediante la técnica conocida como traspaso o herencia de prioridad. Esta consiste en que cuando un proceso B de mayor prioridad se bloquea en espera del uso de un rebloqueado por un proceso A de menor prioridad, el proceso B traspasa temporalmente su prioridad eso A, con objeto de que A, al haber aumentado su prioridad, pueda terminar de usar el recurso antes y lo libere. Cuando el recurso es finalmente liberado, el proceso A recupera la prioridad que
- ' - " " - u JL
Planificación basada en múltiples colas de prioridad :2n el algoritmo de planificación basada en prioridades se suponía la existencia de una única cola
esos preparados. Otra alternativa es implementar varias colas de procesos preparados o colas de cada una de las cuales solo pueda contener procesos con una determinada prioridad o dentro rango de prioridades. En este caso se dice que se utiliza un algoritmo de planificación basada en . les colas de prioridad. Con este algoritmo siempre se ejecuta un proceso perteneciente a la cola de preparados con mayor -dad. Sólo cuando dicha cola está vacía se puede planificar un proceso perteneciente a una cola de -.....nrndos de menor prioridad. Un proceso a lo largo de su vida solo puede pertenecer a una determinada de preparados. Además para planificar cada cola se puede utilizar un algoritmo distinto: FCFS, SJF, rotatorio, etc. Este algoritmo puede producir la inanición de los procesos pertenecientes a las colas de menor prioi las colas de mayor prioridad nunca se quedan vacías. Para evitar este problema se puede asignar procesos de cada cola un determinado porcentaje de tiempo de uso del procesador. El rendimiento de este algoritmo depende del número de colas de prioridad y del algoritmo de plani·ón que se seleccione para cada cola. Además depende de la existencia de mecanismos para prevenir .ción de procesos. ~:!"rl,1nf1,
102
Fundamentos básicos de los sistemas operativos
• Ejemplo 3.9 Considérense que el planificador utiliza un algoritmo de planificación no expropiativa basado en tres colas de prioridad (ver Figura 3.10): la cola CPo de procesos preparados con prioridad O (que se supone que es la mayor prioridad), la cola CPi de procesos preparados con prioridad 1 y la cola CP2 de procesos preparados con prioridad 2. Cada cola se planifica con un algoritmo FCFS . FCFS
Finalización
".
Procesador
1
CP o: cola de preparados con prioridad O
1
1 1
FCFS
Llegada de nuevos procesos preparados
11111
~!~-~
1
CP 1: cola de preparados con prioridad 1 FCFS
1--
1
1
1
1 1
1 1
-
I-----+]IIIIF~ ~ CP 2 : cola de preparados con prioridad 2
[1] Planificación posible solo si CPo está vaCÍa. [2] Planificación posible solo si CPo Y CP 1 está vaCÍa. Figura 3.10 - Planificación basada en tres colas de prioridad
Supónganse seis procesos preparados A, B, C, D, E y F cuyos tiempos de servicio son 2, 3, 5, 5, 6 8 ut, respectivamente. Los procesos A y B están en la cola CPo, siendo A el primero de la cola. Lo procesos C, D y E están en la cola CPi, siendo C el primero de la cola. Por su parte, el proceso F está en la cola CP2. Supóngase además que el procesador estaba inactivo y que el tiempo promedio de cambio de proceso es despreciable. En t = O ut se ejecutará el proceso A. Cuando finalice en t = 2 ut se ejecutará el proceso B hasta su finalización en t = 5 ut. Si cuando finalice B no han entrado nuevos procesos en CPo, es decir, la cola está vacía, entonces se ejecutará el proceso C. Al terminar C en t = 10 ut si la cola CPo sigue vacía, entonces se ejecutará el proceso D. Cuando termine D en t = 15 ut, si CPo continua vacía, se ejecutará el proceso E. Si cuando finalice E en t = 21 ut CPo Y CPi están vacías, entonces se ejecutará el proceso F hasta su finalización en t = 29 ut.
•
Planificación de procesos
103
7. Planificación basada en múltiples colas de prioridad y realimentación En el algoritmo de planificación basada en múltiples colas de prioridad un proceso solo puede perr a una determinada cola de preparados o cola de prioridad durante su tiempo de vida. En conncia, posee una prioridad estática. Esta restricción simplifica la implementación del algoritmo pebién lo hace poco flexible. Si se levanta esta restricción y se permite que un proceso pueda ir iando de cola de prioridad durante su existencia, es decir, que su prioridad pueda ser modificada • .camente, se dice que el algoritmo posee realimentación. implementación de la realimentación requiere definir un mecanismo que regule cómo se modifica • .camente la prioridad de los procesos durante su tiempo de existencia. O visto de otra forma, o e produce la transición de un proceso de una cola de prioridad a otra . •n posible mecanismo de regulación de la prioridad es el siguiente: cuando un proceso llega al se coloca en la cola de mayor prioridad CPo. Cuando es planificado puede usar el procesador e un cuanto. Al finalizar el cuanto es colocado en la siguiente cola de menor prioridad CPl. La idea cada vez que el proceso consume un cuanto sea colocado en la siguiente cola de menor prioridad. forma, un proceso con una ráfaga corta de procesador se ejecutará rápidamente, con lo que no • por muchas colas de prioridad, es decir, su prioridad no disminuirá mucho. Por el contrario, un --..--:".., con una ráfaga larga de procesador irá disminuyendo su prioridad gradualmente, es decir, pasará nchas colas de prioridad. Cuando un proceso llega a la cola de menor prioridad, cada vez que consuma un cuanto volverá a ta que consiga completarse. En consecuencia, el algoritmo de planificación de la cola de menor -dad es de tipo tumo rotatorio. El resto de colas se pueden planificar internamente con un algoritmo - , " - , - - - - "LU
n esta implementación de la realimentación se favorece a los procesos nuevos cortos frente a los n::::ce!~S viejos y largos. En consecuencia, el tiempo de retomo de un proceso largo se puede alargar exente, incluso puede darse inanición de procesos si las colas de mayor prioridad nunca se quedan ·na posible mejora consiste en asignar a cada cola de prioridad un cuanto de mayor tamaño. Así, - mplo, a la cola más prioritario CPo se le puede asignar un cuanto de 20 ut. A la siguiente cola nor prioridad CP 1 se le puede asignar un cuanto de 2 1 ut. A la cola CP2 se le puede asignar un de 22 ut, y así sucesivamente. Sin embargo, esta mejora no garantiza que no se puede producir .ón de proceso. Para evitarla se puede usar la técnica del envejecimiento de procesos comentada sección 3.6.5.
plo 3.10 érese que el planificador utiliza un algoritmo de planificación no expropiativa basado en tres colas -oridad con realimentación (ver Figura 3.11). La cola CPo de procesos preparados con prioridad e supone que es la mayor prioridad) se planifica con un algoritmo de tumo rotatorio de cuanto = 1 ut, la cola CP 1 de procesos preparados con prioridad 1 se planifica con un algoritmo de tumo .o de cuanto ql = 2 ut, y la cola CP2 de procesos preparados con prioridad 2 se planifica con un o de tumo rotatorio de cuanto q2 = 4 ut.
104
Fundamentos básicos de los sistemas operativos
Finalización
qo= 1 u t L legada de nuevos Procesos preparados
~
11111
~
Procesador
CP o: cola de preparados con prioridad O Procesos preparados procedentes de CPo
¡--
ql=2 ut
m-Lll_~
CP 1: cola de preparados con prioridad 1 Procesos preparados procedentes de CP I o CP 2
q2=4 ut
JIIII]-_
~2_~
CP 2: cola de preparados con prioridad 2
[1] Planificación posible solo si CPo está vacía. [2] Planificación posible solo si CPo Y CP I está vacía Figura 3.11 - Planificación basada en tres colas de prioridad con realimentación
Todos los procesos cuando son creados reciben la máxima prioridad, es decir, una prioridad igual a O. e ingresan en la cola CPo. Cuando son planificados consumen un cuanto qo = 1 ut. Si un proceso no finaliza en ese tiempo, se aumenta su prioridad a 1 y pasa a la cola CPI. Un proceso de la cola CPI será planificado únicamente si no existen procesos de prioridad O, es decir, la cola CPo está vacía. Además cuando se planifica recibe un cuanto ql = 2 ut. Si no finaliza en ese tiempo. se aumenta su prioridad a 2 y pasa a la cola CP2. Un proceso de la cola CP2 se planifica únicamente si las colas CPo y CP I están vacías. Además, permanece en la misma hasta que se complete su ejecución. Cada vez que un proceso de CP2 es planificado recibe un cuanto q2 = 4 ut. Supóngase que la sobrecarga es despreciable y que se tienen que atender tres procesos A, B Y C, cuyo tiempos de servicio son de 10, 3 Y 2 ut, respectivamente. Estos procesos ingresan en la cola CPo en lo instantes O, 1 Y 5 ut, respectivamente. En t = O ut se planifica el proceso A. Cuando en t = 1 ut expira el cuanto qo de ejecución asignado al proceso A, éste es colocado en la cola CPI. Todavía le restan 9 ut de tiempo de servicio. En t = 1 ut ingresa el proceso B en CPo y es planificado. Cuando en t = 2 ut expira el cuanto qo de ejecución asignado al proceso B, éste es colocado en la cola CPI. Todavía le resta 1 ut de tiempo de servicio.
/ Planificación de procesos
105
mo en t = 2 ut CPo está vacía, se planifica el primer proceso de la cola CP I , es decir, el proceso A. nando en t = 4 ut expira el cuanto qI de ejecución asignado al proceso A , éste es colocado en la cola _. Todavía le restan 7 ut de tiempo de servicio.
'::" t = 4 ut CPo sigue vacía, por ello se planifica el primer proceso de la cola CPI, que ahora es el so B. En t = 5 ut ingresa en la cola CPo el proceso C , pero como se está ejecutando el proceso B y planificación es no expropiativa continúa ejecutándose B hasta que finaliza en t = 6 ut. En t = 6 ut se . ca el proceso C. Cuando en t = 7 ut expira el cuanto qo de ejecución asignado al proceso C, éste colocado en la cola CPI. Como CPo está vacía C es planificado y finaliza su ejecución en t = 8 ut. o que CPo y CPI están vacías se planifica el proceso A. En t:::::: 12 ut expira el cuanto q2, pero como colas CPo, CPI y CP2 están vacías, continúa ejecutándose el proceso A hasta que finaliza en t = 15 - la Figura 3.12 se representa el diagrama de uso del procesador asociado a la ejecución de los procesos By C.
Uso del procesador
A B
e
e
A
++
+t t
t
B
HBI I I e I A
O
B
5
A
I
10 Tiempo (ut) 15
Figura 3.12 - Diagrama de uso del procesador de los procesos A, B Y e del Ejemplo 3.10
• Orra forma de implementar la realimentación, similar a la utilizada en las distribuciones clásicas ~, es la siguiente: a cada proceso se le asigna, cuando es creado, una determinada prioridad ción de algún criterio externo como por ejemplo, el tipo de proceso (si es del sistema o de un '0, o si se ejecuta en primer plano o en segundo plano). Esto hace que ingrese inicialmente en una ihemni'lllada cola de prioridad. Cada vez que se acumula un cierto número de interrupciones del reloj o se a un cuanto, las prioridades son recalculadas en función de algún factor interno como por ejemplo: ~po de uso del procesador, el tiempo de espera o el modo de ejecución (usuario o supervisor) . Así -oridad de un proceso puede aumentar o disminuir. En función de su nueva prioridad, cada proceso locado en la cola de prioridad que le corresponde. Los dos mecanismo de realimentación descritos, por existir un cuanto que regula el uso del proor, definen una planificación que sería del tipo turno rotatorio con múltiples colas de prioridad y - entación. El algoritmo de planificación basada en varias colas de prioridad con realimentación es un algoritmo _ flexible ya que puede ser ajustado a las necesidades de cada tipo de sistema ajustando sus numerosos , etros de diseño. Obviamente esta flexibilidad implica también una implementación más compleja.
106
Fundamentos básicos de los sistemas operativos
3.6.8. Planificación por tiempo límite En los sistemas de tiempo real estrictos el tiempo de servicio de algunos procesos deben completarse en un determinado plazo (deadline) o tiempo límite . En estos sistemas la velocidad de ejecución de un proceso es un factor secundario, lo importante es completar los procesos en los plazos preestablecido . Para lograr este objetivo el planificador solo admite un proceso en la cola de procesos preparados i es capaz de garantizarle que su tiempo de servicio se atenderá dentro de su tiempo límite, teniendo en cuenta los tiempos de servicio y plazos de los procesos ya existentes en dicha cola. En consecuencia el planificador de estos sistemas debe conocer por adelantado para cada proceso su tiempo de servicio y su tiempo límite de ejecución. Puede demostrarse que el algoritmo de planificación de primero el proceso de tiempo límite más cercano minimiza el número de procesos que no se ejecutan dentro de su plazo .
• Ejemplo 3.11 Considérense cuatro procesos A, B , C Y D que llegan al sistema en el mismo instante t = O ut Y cuyo tiempos de servicio y tiempo límite de ejecución se muestran en la Tabla 3.8. Supóngase que la sobrecarga es despreciable y que se utiliza el algoritmo de planificación de primero el proceso de tiempo límite más cercano.
Proceso
Tiempo de servicio (ut)
Tiempo límite (ut)
A B C D
4 2 5
7
6 11 Ninguno
1
Tabla 3.8 - Tiempo de llegada y de servicio de los procesos del Ejemplo 3.11 De acuerdo con este algoritmo primero se planificaría el proceso B cuyo plazo finaliza en t = O + 6 = 6 ut. Su ejecución finaliza en t = 2 ut. En segundo lugar se planificaría el proceso A cuyo plazo finaliza en t = O + 7 = 7 ut. Su ejecución finaliza en t = 6 ut. En tercer lugar se planificaría el proceso C cuyo
e
A,B,C,D B
+ t Uso del procesador
I O
B
I
e
A
tt
+t A 5
I B A
D
e
IDI 10
e
15
Tiempo (ut) Figura 3.13 - Diagrama de uso del procesador para los procesos de la Tabla 3.8 con el algoritmo de primero el proceso con tiempo limite más cercano
Planificación de procesos
107
finaliza en t = O + 11 = 11 ut. Su ejecución finaliza en t = 11 ut. Finalmente se planificaría el o D que no tenía tiempo límite de ejecución. Su ejecución finaliza en t = 12 ut. En la Figura 3.13 ;;!presenta el diagrama de uso del procesador, se han añadido al mismo unas flechas de trazo continuo resaltar los instantes de llegada y finalización de cada proceso. Asimismo se utilizan segmentos es discontinuos para marcar los tiempos límite.
•
Elección del algoritmo de planificación Cuando se diseña el planificador de un determinado sistema operativo surge la cuestión no trivial "" eccionar el algoritmo de planificación más apropiado. Para ello en primer lugar, se deben fijar los ' 0 de selección (ver sección 3.4), y a continuación evaluar los posibles algoritmos de planificación algún método de evaluación. Entre los métodos de evaluación más comunes se encuentran los entes: Modelado determinista. Este método consiste en evaluar cada algoritmo de planificación candidato usando una carga de trabajo (conjunto de programas a ejecutar) predeterminada e idéntica para todos ellos. Aunque es un método sencillo y rápido, presenta como mayor dificultad el establecer una carga que sea suficientemente representativa del funcionamiento real del sistema y que además ea lo suficientemente reducida para ser manejable. Modelado analítico mediante sistemas de colas. Este método consiste en obtener un modelo analítico del sistema que pueda ser expresado mediante un conjunto de ecuaciones cuya resolución permite obtener los índices de prestaciones del sistema (productividad, utilización de cada recurso, tiempo de espera promedio, etc). Cada recurso hardware del sistema y su cola software asociada e modela como una estación de servicio que consta de dos elementos: un servidor y una cola de espera. Cada estación de servicio tiene como parámetros una determinada tasa de llegada y una laSa de servicio de peticiones. El conjunto formado por las estaciones de servicio y sus 'clientes (los usuarios) forma un sistema de colas. Dicho modelo se puede analizar usando la teoría de colas. La principal desventaja de este método de evaluación reside en las simplificaciones que introduce la teoría de colas con respecto al sistema real, que hacen que los resultados que se obtiene puedan no er muy exactos. Simulación. Consiste en la construcción de un programa que reproduce el comportamiento temporal del sistema basándose en sus estados y sus transiciones. Los resultados se obtienen por extracción de estadísticas del comportamiento simulado del sistema. Requieren mucho más tiempo de cálculo y puesta a punto que los dos métodos anteriores.
Planificación de hilos La planificación de los hilos depende de los tipos de hilos soportados por el sistema operativo. Si ente se soportan hilos a nivel de usuario, el sistema operativo no es consciente de la existencia de
108
Fundamentos básicos de los sistemas operativos
estos hilos y por ello realiza una planificación global a nivel de proceso de acuerdo con un determinado algoritmo de planificación. Una vez que un proceso está siendo ejecutado en modo usuario es el hilo de planificación dentro de dicho proceso el que decide qué hilo va a ser ejecutado. Por lo tanto cada proceso puede planificar sus hilos con el algoritmo de planificación que considere más oportuno. Puesto que en modo usuario no se pueden tratar las interrupciones, no existen interrupciones de relo disponibles para establecer el cuanto de un hilo. Éste se ejecuta hasta que voluntariamente decide ceder el uso del procesador o expira el cuanto del proceso. En dicho caso el sistema operativo debe seleccionar otro proceso para ser ejecutado.
• Ejemplo 3.12 Considérese un sistema operativo que soporta exclusivamente hilos a nivel de usuario. Supónganse d procesos A y B, el proceso A llega en el instante t = O ut y requiere un tiempo de servicio de 5 ut; "descompone en tres hilos HA! , H A2 Y H A3 (el subíndice aparte de para diferenciar cada hilo indica prioridad de ejecución, la máxima prioridad es 1) cuyos tiempos de servicio son 1, 2 Y 2 ut, respectivamente. El proceso B llega en el instante t = 1 ut y requiere un tiempo de servicio de 4 ut; se descompone en dos hilos HBI y HB2 cuyos tiempos de servicio son de 2 ut cada uno. La planificación local a nivel ~ hilo es idéntica en los dos procesos y está basada en prioridades. Por su parte la planificación global de sistema operativo utiliza un algoritmo del tipo tumo rotatorio con un cuanto q = 2 ut. En la Figura 3.14 se muestra el diagrama de uso del procesador desde el punto de vista de la planificaci global de procesos realizada por el sistema operativo. Además se detalla la planificación local de los hil dentro de cada proceso. Se ha despreciado el tiempo necesario para realizar un cambio de hilo gestiona por código de la biblioteca de hilos y el tiempo necesario para realizar un cambio de proceso gestiona por código del sistema operativo. A
B
B
~ ~ A
A
t t B
A
I
B
lA
I
Uso del procesador H A l H A2 H Bl H B l H A2 H A3 H B2 H B2 H A3
o
9
5 Tiempo (ut)
Figura 3.14 - Diagrama de uso del procesador para los procesos y los hilos del Ejemplo 3.1 2
Planificación de procesos
109
i se soportan hilos del núcleo, el sistema operativo planifica estos hilos usando algún determinado =- ·tmo de planificación. El planificador puede tener en cuenta consideraciones relativas al rendimiento . ema a la hora de planificar hilos del núcleo de igual prioridad. Por ejemplo, si se está ejecutando o del núcleo perteneciente a un cierto proceso A, produce una mayor sobrecarga pasar a ejecutar o del núcleo perteneciente a otro proceso B que pasar a ejecutar otro hilo del núcleo del mismo ~ces;o A. En el primer caso es necesario realizar un cambio de proceso, mientras que en el segundo ........-.<:ULllente se realiza un cambio de hilo dentro del mismo proceso.
plo 3.13 - érese un sistema operativo que soporta hilos del núcleo y que los planifica usando un algoritmo del o rotatorio con cuanto q = 2 ut. Supóngase que en el instante t = O ut se crea el hilo del sistema ·vo HN 1, asociado a un proceso A, cuyo tiempo de servicio es de 3 ut. En el instante t = 1 ut entra tado preparado el hilo del sistema operativo HN2, asociado al mismo proceso, cuyo tiempo de cio es de 4 ut. En la Figura 3.15 se muestra el diagrama de uso del procesador. Se ha despreciado el necesario para que el sistema operativo realice un cambio de hilo dentro del mismo proceso. Uso del procesador
o
2
5 Tiempo (ut) 4
7
Figura 3.15 - Diagrama de uso del procesador de los hilos del Ejemplo 3.13
• otra parte, en sistemas con una configuración del tipo menor número de hilos del núcleo que hilos ·os, aparte de las dos planificaciones comentadas, es necesario implementar con la biblioteca de planificación local para establecer qué hilo de usuario puede usar un hilo del núcleo.
Resumen istema operativo con multiprogramación debe planificar y distribuir el uso de los recursos del "t:::;;J~dor entre todos los procesos existentes. Para ello, mantiene diferentes colas de procesos, como plo: la cola de procesos en el estado preparado, la cola de procesos en el estado preparado oria secundaria, la cola de procesos en el estado bloqueado, la cola de procesos en el estado 1IIc~2do en memoria secundaria y la cola de trabajos por lotes o cola de entrada - planificador es la parte del sistema operativo que controla cuándo un proceso abandona una cola . .""."'..........-uer a un recurso o para ingresar en otra cola. A la actividad que realiza se le llama planificación esos. Se distinguen de forma general tres niveles de planificación: planificación a corto plazo, -,""';;-";"""',rión a medio plazo y planificación a largo plazo. Cada nivel de planificación es implementado correspondiente planificador.
110
Fundamentos básicos de los sistemas operativos
El planificador a corto plazo, también conocido como planificador del procesador o simplemente como planificador, decide qué proceso en la cola de preparados será ejecutado a continuación en el procesador. El planificador a medio plazo, también denominado planificador de memoria o intercambiador decide qué proceso en una cola de memoria principal es intercambiado a una cola de memoria secundaria, o viceversa. El planificador a largo plazo, también denominado planificador de trabajos o planificador de admisión, decide qué trabajo de la cola de trabajo por lotes pasa a ser ejecutado en el sistema mediante la creación de un proceso. Los objetivos deseables que debe cumplir la función de planificación de procesos de un sistema operativo son: equidad, previsibilidad, uso equilibrado de los recursos y proporcionalidad. El planificador del procesador fundamenta su elección del próximo proceso que pasará a ser ejecutado en el procesador en la optimización simultánea de alguno o algunos de los siguientes criterio cuantitativos: utilización del procesador o eficacia, productividad, tiempo de entrega, tiempo de espera. tiempo de respuesta y plazo de finalización. La elección de los criterios a optimizar depende del sistema operativo. Así por ejemplo, el planificador de un sistema operativo por lotes intenta maximizar la utilización del procesador y la productividad, a la vez que intenta minimizar el tiempo de entrega. Por su parte. el planificador de un sistema de tiempo compartido intenta minimizar el tiempo de respuesta. Asimismo el planificador de un sistema de tiempo real intenta maximizar el número de plazos de finalización cumplidos. En función de si un proceso tiene permitido el uso del procesador ininterrumpidamente todo el tiempo que desee, la planificación puede ser no expropiativa o expropiativa. La planificación es no expropiativa. si permite que un proceso pueda estar ejecutándose en el procesador de forma ininterrumpida hasta que termina o se bloquea. Por el contrario, la planificación es expropiativa si el proceso puede ser interrumpido en cualquier momento. Se puede decidir expropiar un proceso cuando llega un nuevo proceso, una interrupción, o transcurrido un cierto tiempo fijo de ejecución ininterrumpida denominado cuanto. Una planificación expropiativa produce una mayor sobrecarga al sistema que una no expropiativa. pero proporciona un mejor servicio a la población de procesos. La decisión de elegir un tipo de planificación u otra depende en gran medida de los requisitos temporales de los programas a ejecutar. La función de planificación de un sistema operativo se implementa mediante la utilización de uno o varios algoritmos de planificación. Los algoritmos de planificación más usuales son los siguientes: planificación de primero en llegar primero en ser servido (FCFS), planificación de primero el proceso más corto (SJF), planificación del proceso con menor tiempo restante (SRT), planificación de turno rotatorio. planificación basada en prioridades, planificación basada en múltiples colas de prioridad, planificación basada en múltiples colas de prioridad y realimentación, y planificación por tiempo límite. Para seleccionar el algoritmo de planificación más apropiado, en primer lugar se deben fijar los criterios de selección, y a continuación evaluar los posibles algoritmos de planificación mediando el empleo de algún algoritmo de evaluación, como puede ser el modelado determinista, el modelado analítico mediante sistemas de colas, o la simulación. La planificación de hilos depende del tipo de hilo soportado por el sistema. Si un sistema soporta solo
Planificación de procesos
111
a nivel de usuario, el núcleo realiza una planificación global a nivel de proceso, y no es consciente existencia de los hilos. Es el hilo de planificación dentro de un proceso el que decida qué hilo va a _- utado. En un sistema operativo que soporta hilos de núcleo, el sistema planifica estos hilos usando determinado algoritmo de planificación. Por otra parte, en sistemas con una configuración del tipo número de hilos del núcleo que hilos de usuarios, aparte de las dos planificaciones comentadas, ario implementar con la biblioteca de hilos una planificación local para establecer qué hilo de ~"':"' J-U puede usar un hilo del núcleo.
Lecturas recomendadas - - se desea obtener una explicación adicional de los contenidos tratados en este capítulo se pueden .:li'!:z:::ltar, por ejemplo: el capitulo 6 de [Silberschatz et. al, 2002], los capítulos 9 y 10 de [Stallings, o el capítulo 2 de [Tanenbaum, 2009]. Asimismo, en cualquiera de estos libros, se pueden enconerosas referencias adicionales con contenidos más avanzados sobre la planificación de procesos
Autoevaluación Enumerar y describir brevemente los diferentes tipos de colas de procesos que mantiene un sistema operativo. (Respuesta en sección 3.2)
-En qué consiste la actividad del sistema operativo conocida como planificación de procesos?¿Qué - eles de planificación se distinguen? (Respuesta en sección 3.2) -Qué función realiza el planificador a corto plazo? ¿Cuáles son sus componentes? Respuesta en sección 3.2.1) Enumerar algunas circunstancias que requieran la invocación del planificador a corto plazo. Respuesta en sección 3.2.1) - -.Qué tareas realiza el planificador a medio plazo? (Respuesta en sección 3.2.2) -Qué tareas realiza el planificador a largo plazo? (Respuesta en sección 3.2.3) -Qué es un proceso limitado por CPU? ¿Y un proceso limitado por E/S? (Respuesta en sección 3.2.3) -Cuáles son los objetivos principales que debe cumplir la función de planificación de procesos? Respuesta en sección 3.3) Definir los siguientes criterios de planificación del procesador: utilización del procesador o efica-a, productividad, tiempo de entrega o tiempo de estancia, tiempo de espera, tiempo de respuesta _ plazo de finalización. (Respuesta en sección 3.4)
112
Fundamentos básicos de los sistemas operativos
3.10. Señalar los criterios principales considerados en la planificación del procesador dependiendo del tipo de sistema operativo. (Respuesta en sección 3.4) 3.11. Definir planificación expropiativa y no expropiativa. Señalar sus principales diferencias y ventajas. (Respuesta en sección 3.5) 3.12. ¿Qué es un cuanto de ejecución? (Respuesta en sección 3.5)
3.13. ¿Qué tipo de planificación, expropiativa o no expropiativa, es más recomendable para un sistema operativo por lotes? ¿Y para un sistema de tiempo compartido? (Respuesta en sección 3.5) 3.14. Describir el algoritmo de planificación del primero en llegar primero en ser servido. (Respuesta en sección 3.6.1) 3.15. Describir el algoritmo de planificación de primero el proceso más corto. (Respuesta en sección 3.6. 3.16. Describir el algoritmo de planificación del proceso con menor tiempo restante. (Respuesta en sección 3.6.3) 3.17. Describir el algoritmo de planificación de turno rotatorio. (Respuesta en sección 3.6.4) 3.18. Describir el algoritmo de planificación basada en prioridades. (Respuesta en sección 3.6.5) 3.19. Describir el algoritmo de planificación basada en múltiples colas de prioridad. (Respuesta en sección 3.6.6)
3.20. Describir el algoritmo de planificación basada en múltiples colas de prioridad y realimentación. (Respuesta en sección 3.6.7) 3.21. Describir el algoritmo de planificación por tiempo límite. (Respuesta en sección 3.6.8)
3.22. Describir la planificación de hilos en función del tipo de hilo soportado por el sistema operativo. (Respuesta en sección 3.7)
3.11.
Problemas
3.1. Considérense los procesos A, B, C y D cuyo tiempo de llegada, prioridad y tiempo de servicio .,. muestran en la Tabla 3.9. Supuesto que 1 es la prioridad más alta, que el tiempo de colocación la cola de procesos preparados es despreciable y que el tiempo de cambio de contexto es de 1 ut:
a) Representar el diagrama de uso del procesador en el caso de que se utilicen los siguientes algoritmos de planificación: 1) Algoritmo FCFS. Suponer que si varios procesos tienen el mismo tiempo de llegada
colocan en la cola de procesos preparados por orden de prioridad.
Planificación de procesos
113
2) Algoritmo SJF. 3) Algoritmo de tumo rotatorio con un cuanto q = 2 ut. Suponer que si varios procesos tienen el mismo tiempo de llegada se colocan en la cola de procesos preparados por orden de prioridad. 4) Algoritmo basado en prioridades de tipo expropiativo. b) ¿Con qué algoritmo de planificación de los utilizados en los apartados anteriores se genera mayor sobrecarga al sistema?, para dicho algoritmo ¿cómo podría reducirse la sobrecarga? c) Calcular para el caso 1) el tiempo de finalización, el tiempo de retomo y el tiempo de espera del proceso C. Proceso A B
C D
Tiempo de llegada (ut) O O 1 1
Prioridad 1 2 3 4
Tiempo de servicio (ut) 4 2 3 5
Tabla 3.9 - Características de los procesos del Problema 3.1
Considérense cuatro procesos A, B, C YD con el mismo tiempo de llegada TLL = O Ycuyos tiempos de servicio son Ts A , TSB, Tsc Y TSD, respectivamente. Supuesto que TS A < TSB < Tsc < TSD que el tiempo de cambio de contexto es despreciable, demostrar que en el caso del algoritmo de planificación SJF el tiempo de espera promedio TE puede calcularse usando la siguiente expresión: TE
3Ts A + 2TsB + Tsc = -::":":""--4.c:..=...._...c::....::..
En un computador que dispone de dos canales de E/S (CH1 y CH2) se ejecutan los procesos A, B _ C. Sus requerimientos de uso de CPU y de los canales de E/S se muestran en la Tabla 3.10. Los procesos entran en la cola de procesos preparados en el instante t = Out y se colocan en la misma en función de su prioridad, la cual se asigna a través de la siguiente función: . .d d pnon a
> C > B si t E = {A . B > C > A SI tE
A 40 utde CPU 10 ut de CH2 5 utde CPU
[O, 40) ut [40, 100] ut
B
e
10 ut de CPU 25 ut de CH1
35 ut de CPU lOut de CH2
Tabla 3.10 - Requerimientos de uso de recursos de los procesos del Problema 3.3
114
Fundamentos básicos de los sistemas operativos
Dibujar el diagrama de uso de los recursos del computador. Suponer que se utiliza un algoritmo de planificación de turno rotatorio con un cuanto de 20 ut, que un proceso aunque sea el más prioritario si termina un cuanto de ejecución debe ceder el uso de la CPU a otro proceso (al no ser que sea el único proceso que queda por ejecutar), y que la sobrecarga es despreciable. 3.4. El planificador a corto plazo de un sistema operativo sigue un algoritmo de colas multinivel realimentadas. Con las siguientes características: • Tiene tres colas de planificación. La cola 1 sigue un algoritmo de planificación de tumo rotatorio con cuanto de 2 ms. La cola 2 sigue un algoritmo de planificación de turno rotatorio con cuanto de 4 ms. La cola 3 sigue una planificación FIFO. La planificación entre colas e por prioridad siendo la más prioritaria la cola 1 y la menos prioritaria la cola 3. • Los procesos entran en el sistema por la cola 1. • Si un proceso agota su cuanto entonces se le expropia el procesador y se coloca en una cola de menor prioridad. • Si un proceso de la cola de planificación i (i =1, 2, 3) se estaba ejecutando y pasa al estado bloqueado en espera de una operación de E/S entonces se coloca en una cola de proceso bloqueados. Cuando finaliza la operación de E/S vuelve al estado preparado dentro de la misma cola i. • Si un proceso que pasa al estado ejecutándose desde la cola de planificación i se bloquea entonces cuando sale del estado bloqueado vuelve a la cola de planificación i. • No existe expropiación a nivel global. Se tienen cuatro procesos con el siguiente comportamiento: • Proceso A. Llega en el instante O, ejecuta 1 ms de CPU, 5 ms de E/S, 2 ms de CPU y termina.. • Proceso B. Llega en el instante 1, ejecuta 10 ms de CPU y termina. • Proceso C. Llega en el instante 2, ejecuta 2 ms de CPU, 4 ms de E/S, 1 ms de CPU y termina.. • Proceso D. Llega en el instante 3, ejecuta 4 ms de CPU y termina. Se pide: a) Dibujar el diagrama de uso del procesador y de E/S. b) Determinar los instantes de tiempo en que los procesos cambian de cola de planificación.. Suponer que el tiempo de cambio de cola y el tiempo de cambio de contexto es despreciable 3.5. El planificador de un sistema operativo planifica los procesos usando un algoritmo basado e prioridades (la máxima prioridad es 1) de tipo no expropiativo. Se tienen que ejecutar dos proce _ multihilos Ay B. El proceso A de prioridad 1 consta de tres hilos: H Al , H A2 Y H A3. Mientras que el proceso B de prioridad 3 consta de dos hilos: HBl y H B2. La prioridad y requerimientos de est hilos son los siguientes:
Planificación de procesos
115
• H Al (prioridad 1): ráfaga de CPU de 20 ut, E/S de 60 ut y ráfaga de CPU de 20 ut. • HA2
(prioridad 2): ráfaga de CPU de 60 ut.
• H A 3 (prioridad 3): ráfaga de CPU de 20 ut, E/S de 60 ut y ráfaga de CPU de 40 ut. • HBl
(prioridad 4): ráfaga de CPU de 40 ut, E/S de 60 ut y ráfaga de CPU de 20 ut.
• HB2
(prioridad 5): ráfaga de CPU de 40 ut, E/S de 60 ut y ráfaga de CPU de 20 ut.
upuesto que la sobrecarga es despreciable, dibujar el diagrama de uso de recursos, y determinar el número de cambios de procesos, el número de cambios de hilos y el tiempo de finalización de lo procesos en los siguientes casos: a) El sistema operativo soporta exclusivamente hilos a nivel de usuario. La planificación local a nivel de hilo es idéntica en los dos procesos A y B, Y está basada en prioridades de tipo no expropiativo (la máxima prioridad corresponde al valor 1). b) El sistema operativo soporta un hilo del núcleo por cada hilo de usuario. Además el planificador utiliza el mismo algoritmo basado en prioridades de tipo no expropiativo para planificar a los procesos y a sus hilos.
pítulo 4
cronización y comunicación de procesos "etivos docentes Los objetivos docentes de este capítulo son los siguientes: Saber qué es y por qué es necesaria la exclusión mutua entre procesos en el uso de recursos compartidos. • Conocer las principales soluciones software y hardware a la exclusión mutua. ,. Conocer el funcionamiento, la implementación y el uso de los semáforos. • Conocer el planteamiento y al solución de varios problemas clásicos de sincronización de procesos concurrentes. • Saber qué son, cómo se implementan y cómo se utilizan los monitores. • Conocer el funcionamiento, la implementación y el uso del paso de mensajes.
Introducción En un computador con un único procesador, en un determinado instante de tiempo solamente puede - . un proceso en el estado ejecutándose. Si el sistema soporta multiprogramación se va conmutando del procesador entre todos los procesos en el estado preparado para que puedan ir progresando su ejecución. Los procesos se entrelazan en el tiempo para ofrecer la ilusión de que se ejecutan táneamente o concurrentemente en paralelo. En el caso de disponer de una máquina con varios adores, aparte de poder entrelazar la ejecución de varios procesos en cada procesador disponible, ién es posible conseguir un solapamiento o paralelismo real en la ejecución de varios procesos. La ejecución concurrente de procesos presenta varios problemas, todos ellos asociados al hecho de no es posible predecir la velocidad relativa de ejecución de un proceso. Dicha velocidad es función
117
=
118
Fundamentos básicos de los sistemas operativos
de la política de planificación del sistema operativo, de la forma en que se tratan las interrupciones y de la actividad de los otros procesos existentes en el sistema. Uno de los principales problemas de la ejecución concurrente de procesos es que el acceso a recursos globales compartidos (memoria, dispositivos de E/S, etc) debe controlarse de alguna forma si se desea que el resultado de la ejecución de un proceso sea independiente de la velocidad de ejecución del proceso con respecto a los otros procesos concurrentes. Por ejemplo, supóngase dos procesos A y B que se ejecutan concurrentemente, ambos poseen el mismo código consistente en leer un carácter pulsado por el usuario en el teclado, guardarlo en una variable global y mostrarlo en la pantalla. Supóngase que el proceso A lee el carácter s, lo almacena en la variable global te c 1 a y antes de que pueda mostrarlo en pantalla llega una interrupción. El núcleo atiende dicha interrupción y cuando finaliza planifica para ejecución al proceso B, que lee el carácter a, lo almacena en tecla, muestra en pantalla dicho carácter y finaliza. Posteriormente el proceso A vuelve a ser planificado y continúa con su ejecución, mostrando por pantalla el valor de la variable tec l a, es decir, muestra a. Éste no era el carácter que tenía que mostrar sino s que se ha perdido al sobreescribir el proceso B la variable tecla. Obviamente este problema no se hubiera producido si se hubiera controlado de alguna forma el acceso a la posición de memoria asociada a la variable global tec l a. La forma de controlar el acceso de procesos concurrentes a un recurso global compartido consiste en marcar al recurso como un recurso crítico. Para ello hay que especificar que el conjunto de instrucciones del código del programa que utiliza dicho recurso es una sección crítica del programa, y garantizar la exclusión mutua en el uso de la sección crítica asociada a dicho recurso compartido, es decir, garantizar que solo un proceso a la vez pueda estar ejecutando una sección crítica del programa. La exclusión mutua puede conseguirse mediante soluciones software, como el algoritmo de Peterson o el uso de un cerrojo y alternancia estricta, o con soluciones hardware, como el bloqueo de interrupciones o el uso de instrucciones máquina especiales. Otras soluciones a la exclusión mutua ofrecidas por los sistemas operativos son los semáforos y el paso de mensajes, que son mecanismos que también se pueden usar para la sincronización de procesos. Asimismo, algunos compiladores de lenguajes de alto nivel, como Java o Modula-2, soportan el uso de monitores, que son un mecanismo basado en semáforo que garantiza, por su propia construcción, la exclusión mutua. Además, los monitores se pueden usar también para la sincronización de procesos. Los procesos también pueden tener la necesidad de intercambiarse datos entre sí. La mayoría de los sistemas operativos disponen de mecanismos de comunicación entre procesos, como por ejemplo: el paso de mensajes o el uso de memoria compartida. En este capítulo en primer lugar se define la exclusión mutua y se presentan algunas solucione software y hardware que permiten garantizarla. En segundo lugar se describen los semáforos. A continuación, se plantean y se resuelven con el uso de semáforos algunos problemas clásicos de sincronización de procesos concurrentes. Finalmente se estudian los monitores y el paso de mensajes. Conviene señalar que aunque los contenidos de este capítulo se exponen considerando procesos concurrentes también se aplican al caso de hilos concurrentes.
Sincronización y comunicación de procesos
119
Exclusión mutua 1. Interacción entre procesos concurrentes En un sistema con multiprogramación se ejecutan múltiples procesos de manera concurrente. De
general, en función de la forma y grado de interacción entre estos procesos, se pueden distinguir tipos de procesos: • Procesos independientes. Son aquellos que se ejecutan sin tener en cuenta la existencia de otros procesos. En consecuencia, ni intercambian información ni colaboran entre sí para compartir un recurso o realizar alguna tarea. Procesos cooperantes. Son aquellos que intercambian información o colaboran entre sí para compartir un recurso o realizar alguna tarea .
.so el caso de los procesos cooperantes se distinguen dos tipos de cooperación:
directa e indirecta. cooperación directa los procesos conocen la existencia e identidad de los otros procesos con los colaboran, dicha colaboración se realiza principalmente mediante intercambio de información, lo ibilita la comunicación y sincronización de los procesos. En el caso de la cooperación indirecta los procesos no conocen la existencia e identidad de los otros os y en consecuencia no se comunican con ellos. Sin embargo, saben que acceden a recursos coms y por ello los manipulan adecuadamente para garantizar que dichos recursos queden en un estado nte que permita su uso por los restantes procesos. De esta forma, los procesos cooperan indirece entre sí para garantizar la integridad de los recursos compartidos. Ejemplo de esta cooperación ta sería una base de datos donde múltiples procesos acceden concurrentemente para consultar y datos. Cada proceso no se comunica con los restantes, pero accede a datos comunes que deben .pulados adecuadamente para que estén siempre en un estado coherente.
........-aJJLLa1
Condiciones de carrera El uso de recursos compartidos no se produce únicamente en el caso de procesos cooperantes. Tamlo procesos independientes ejecutándose concurrentemente utilizan recursos compartidos, aunque en vez de cooperar, compiten por el uso de dichos recursos. en problema denominado condición de carrera (race condition) que surge cuando múltiples procesos ndientes se ejecutan concurrentemente y acceden para leer o escribir en un recurso compartido, el resultado final de la ejecución depende del orden en que se hayan planificado los procesos, es en que se hayan ejecutado las instrucciones .de lectura y escritura de cada proceso sobre el recurso. La depuración de programas que pueden poseer condiciones de carrera es complicada, ya que la 'a de las veces que se ejecutan parecen funcionar correctamente y las condiciones de carrera solo :::mnifiestan en algunos casos muy concretos.
-120
Fundamentos básicos de los sistemas operativos
• Ejemplo 4.1 En la Figura 4.1 se muestra, en un pseudocódigo basado en el lenguaje de programación e (ver sección 4.8), el código de un programa que lanza dos procesos A y B concurrentes que comparten una variable global entera denominada contador inicializada a O. int contador=O; vo id procesoA ()
/* Región de código lA */ contador=contador+l; i f (contador== l ) /* Región de código 2A * / else /* Finalizar el proceso */ end /* Región de código 3A */
void procesoB ()
/* Región de código lB */ contador=contador+l; if (contador==l ) /* Región de código 2B */ else /* Finalizar el proceso */ end /* Región de código 3B */
void main () ejecución_concurrente (procesoA, procesoB);
Figura 4.1 - Pseudocódigo de un programa que lanza dos procesos A y B concurrentes que comparten una variable global
Supóngase la siguiente secuencia de acciones: 1. El proceso A ejecuta su región de código lA y llega a ejecutar también la sentencia de incremente de contador, que toma el valor 1. 2. El proceso A es expropiado y se planifica el proceso B que ejecuta su región lB y llega a ejecutar la sentencia de incremento de contador, que toma el valor 2. 3. El proceso B evalúa la condición, y como contador es distinto de 1 finaliza.
Sincronización y comunicación de procesos
~.
121
Se planifica el proceso A, evalúa la condición y como contador es distinto de 1 también finaliza. secuencia de acciones de las varios posibles sería la siguiente:
1. El proceso A ejecuta su región lA de código y llega a ejecutar también la sentencia de incremento de contador, que toma el valor l. El proceso A evalúa la condición y como contador es igual a 1, pasaría a ejecutar su región 2A. El proceso A es expropiado. Se planifica al proceso B que ejecuta su región lB y llega a ejecutar la sentencia de incremento de contador, que toma el valor 2. El proceso B evalúa la condición y como contador es distinto de 1 finaliza. - El proceso A continúa ejecutando su región 2A, y luego pasa a ejecutar su región 3A. finitiva este programa posee una condición de carrera, los procesos A y B compiten por ser los ros en escribir y leer el valor de la variable contador. En la primera secuencia de ejemplo, el o A es el primero en escribir pero es el segundo en leer la variable contador. Mientras que en la da secuencia, el proceso A es el primero tanto en leer como en escribir dicha variable. En función ultado de las carreras el resultado del programa es diferente.
•
Secciones críticas e denomina sección crítica o región crítica de un proceso a una instrucción o conjunto de instrucciosecuenciales de su código que requieren manipular un recurso compartido (variable, dato, fichero ,...) otros procesos. Dentro del código de un proceso pueden existir varias secciones críticas. 'emplo 4.2 Figura 4.2 se muestra en un pseudocódigo basado en el lenguaje C el código de un programa que dos procesos A y B concurrentes que necesitan acceder a un recurso compartido R 1. instrucciones de los procesos A y B que requieren el uso del recurso R1 constituyen secciones . Se observa que el proceso A posee dos secciones críticas asociadas al recurso R1 y que el o B posee solamente una. Para implementar la exclusión mutua si el proceso A ejecuta código guna de sus dos secciones críticas, entonces el proceso B tendrá que esperar para poder ejecutar el <:,0 de su sección crítica. Si fuese B el que estuviera ejecutando código de su sección crítica entonces el proceso A el que tendría que esperar. objeto de regular el acceso al recurso compartido R1 cada proceso para acceder a una sección crítica código tiene que invocar a la función a c c e s o _ s e c e ión_ c r í tic a (R 1 ) . Cuando un proceso la sección crítica invoca a la función salida_sección_crí tica (Rl) .
•
122
Fundamentos básicos de los sistemas operativos
#define TRUE 1 void procesoA ( ) while(TRUE)
1*
Bucle infinito
*1
Sección no crítica
*1
{
1*
acceso_sección_crítica (R1); 1* sección crítica 1*1 salida sección crítica (R1);
1*
Sección no crítica
*1
acceso_sección_crítica (R1); 1* sección crítica 2 *1 salida sección crítica (R1);
void procesoB () while(TRUE)
1*
Bucle infinito
*1
Sección no crítica
*1
{
1*
acceso_sección_crítica (R1); 1* sección critica 1 *1 salida sección crítica (R1);
void main() ejecución_concurrente (procesoA, procesoB);
Figura 4.2 - Pseudocódigo de un programa que lanza dos procesos A y B concurrentes que requieren acceder a un mismo recurso Rl
Sincronización y comunicación de procesos
123
'.4. Descripción de la exclusión mutua Las condiciones de carrera se evitarían si se garantizase que cuando un proceso A está ejecutando cciones dentro de una sección crítica SI asociada un recurso RI compartido, entonces ningún otro o puede ejecutar código de una sección crítica asociada a RI hasta que el proceso A no salga de _En definitiva lo que se requiere es exclusión mutua, es decir, que el uso de un recurso por parte de un o excluya su uso para los restantes. jemplo 4.3 .dérese dos procesos A y B que se ejecutan concurrentemente y comparten el uso de un recurso R. Figura 4.3 se muestra un diagrama que especifica para cada proceso a lo largo del tiempo si se traba dentro de una sección de código no crítica o de una sección crítica. Nótese que en el instante -empo TI cuando el proceso B desea entrar en su sección crítica no puede hacerlo porque el proceso - ~ encuentra dentro de la suya. En consecuencia el proceso B se queda bloqueado a la espera de poder r. Cuando en el instante T 2 el proceso A sale de su sección crítica entonces el proceso B puede en la suya. Proceso A
Proceso B
Sección No critica
I
Sección Critica
Sección No crítica
Sección No critica
Sección Critica
Sección No critica
bloqueado
TI
B intenta entrar en su sección critica
T2
Tiempo (ut)
B consigue entrar en su sección critica
Figura 4.3 - Exclusión mutua en el acceso a secciones críticas
•
La exclusión mutua así planteada resuelve las condiciones de carrera. Sin embargo, si no se exigen
s requisitos adicionales puede producir otros problemas de control de procesos, como el interbloy la inanición de procesos. El interbloqueo o bloqueo mutuo de dos o más procesos, se produce por ejemplo cuando dos procesos • B necesitan dos recursos RI y R2 para realizar una cierta función. Si A posee RI y B posee R2 o puede progresar, ambos se quedan esperando por el recurso que necesitan, y no pueden liberar :xurso que poseen hasta obtener el otro recurso y realizar la función correspondiente.
124
Fundamentos básicos de los sistemas operativos
Por su parte la inanición de un proceso se produce cuando un proceso no puede progresar al necesitar un recurso al que nunca llega a acceder porque el sistema operativo siempre le relega dando prioridad a otros procesos. Para evitar estos problemas potenciales, el mecanismo o técnica que se utilice para implementar la exclusión mutua debe cumplir los siguientes requisitos: 1. Garantizar que solo un proceso puede estar a la vez dentro de una sección crítica asociada a un recurso R. Sólo se puede ejecutar a la vez una única sección crítica asociada a un cierto recurso compartido R. 2. No puede realizar suposiciones sobre la velocidad relativa y prioridad de ejecución de los procesos concurrentes. 3. Garantizar que un proceso que no está ejecutando una sección crítica asociada a un recurso R no impide o bloquea el acceso a R a otros procesos. 4. Asegurar que ningún proceso se quede esperando indefinidamente a poder acceder a una sección crítica asociada a un recurso R. Es decir, debe evitar la inanición de procesos. Obviamente esto requiere que un proceso no debe permanecer dentro de su sección crítica por un tiempo ilimitado. 5. Si ningún proceso está dentro de una sección crítica asociada a un recurso R, entonces si un proceso desea entrar en una sección crítica se le debe conceder rápidamente. La exclusión mutua puede conseguirse mediante soluciones software o con soluciones hardware, en las siguientes secciones se describen ambos tipos de soluciones.
4.2.5.
Soluciones software a la exclusión mutua
En esta sección se van describir dos posibles soluciones software a la exclusión mutua: el uso de un cerrojo y alternancia estricta, y el algoritmo de Peterson. Para simplificar su explicación se van a considerar únicamente dos procesos A y B concurrentes. Ambas soluciones se caracterizan porque no presuponen el apoyo de sistema operativo o del hardware del computador para su implementación. El principal inconveniente de ambas soluciones es que cualquier proceso que desea entrar en una sección crítica, si está siendo ejecutada por otro proceso, debe esperar a que éste termine mediante la ejecución de un bucle que comprueba el valor de una condición basada en el valor de una o varias variables. Esta variable hace las veces de cerrojo (lock). Cuando el valor del cerrojo se comprueba dentro de un bucle se habla de cerrojo con vuelta (spinlock). A dicho tipo de espera se le denomina espera activa (busy waiting) o espera cíclica (spin waiting). La espera activa supone un problema si se dilata mucho en el tiempo ya que consume valiosos ciclos de uso del procesador que podrían ser utilizados para ejecutar otros procesos.
Sincronización y comunicación de procesos
125
de un cerrojo y alternancia estricta En la Figura 4.4 se muestra en pseudocódigo basado en el lenguaje C la solución software a la Iu ión mutua mediante el uso de un cerrojo y alternancia estricta para el caso de dos procesos. = ~::in e
TRUE=l u rno =O; / * Variable global que se usa como cerrojo * /
_::.:1 p roce soA ()
while(TRUE) { / * Bucle infinito * / / * sección no crítica * / while(turno!=O ) ; / * Bucle de espera * / / * sección crítica * / turno=l; / * sección no crítica */
};
::.d p roc esoB () while(TRUE) { / * Bucle infinito * / / *sección no crítica*/ whil e(turno!=l ); / * Bucle de espera * / / * sección critica * / turno=O; /* sección no crítica */
};
Figura 4.4 - Obtención de la exclusión mutua para dos procesos usando un cerrojo y alternancia estricta
En esta solución se considera la existencia de una variable global de acceso turno, que se usa como ~ o y que puede tomar como valor el identificador numérico de un proceso. En este caso el proceso A el identificador O y el proceso B el identificador 1. Nótese que el valor al que se inicializa el cerrojo .........o..LLILLl·J.la qué proceso puede entrar en primer lugar en su sección crítica, en este caso es el proceso A. Cuando un proceso (A o B) quiere entrar en su sección crítica comprueba el valor de turno. Si coin- con su identificador numérico entonces puede ejecutar su sección crítica, en caso contrario deberá . La espera que realiza el proceso es una espera activa ya que entra en un bucle para comprobar or de turno, del que no sale hasta que turno toma como valor el identificador numérico del o que está esperando. Una vez que turno toma el valor del identificador numérico del proceso que desea entrar en su ·ón crítica, éste podrá ejecutar dicha sección. Cuando finalice debe configurar el valor de turno el identificador numérico del otro proceso concurrente. En consecuencia, el acceso a la sección -ca se va alternando entre los procesos A y B. Hasta que un proceso no finaliza la ejecución de su .ón crítica, el otro proceso no puede ejecutar la suya.
126
Fundamentos básicos de los sistemas operativos
Supóngase que el proceso A se ha planificado en primer lugar. Cuando comprueba el valor de turno se encuentra que vale O, y en consecuencia puede acceder a su sección crítica. Si ahora se planifica al proceso B, cuando éste comprueba el valor de turno se encuentra que vale O y en consecuencia entra en un bucle (w h i 1 e (t urna! == 1 ) ) del que no podrá salir hasta que t urna tome el valor 1. Cuando el proceso A vuelve a ser planificado termina su sección crítica, configura a 1 la variable turno y comienza a ejecutar código no crítico. Si ahora se planifica el proceso B, éste encuentra que turno vale 1 por lo que sale del bucle y comienza a ejecutar su sección crítica. Supóngase que ahora se planifica el proceso A. Éste termina su sección no crítica, vuelve al comienzo, ejecuta otra sección no crítica e intenta entrar en su sección crítica, pero no puede porque turno vale 1. En consecuencia entrará en un bucle en espera de que el proceso B configure el valor de turno
aO. Esta solución garantiza la propiedad en exclusiva de un recurso, que es el primer requisito para garantizar la exclusión mutua. Sin embargo posee dos inconvenientes. En primer lugar la velocidad de ejecución de los procesos A y B viene limitada por la velocidad de ejecución del proceso más lento. Puesto que la ejecución de los procesos A y B se va alternando estrictamente para garantizar la propiedad en exclusiva del recurso compartido, hasta que un proceso (por ejemplo A) no termina en su sección critica y configura la variable turno con el identificador del otro proceso (B), éste no puede acceder. En consecuencia, aunque la velocidad ejecución de B fuera más rápida que la de A, su velocidad real se ralentiza al tener que esperar por A. El segundo problema que tiene esta solución es que si un proceso falla (por ejemplo A) antes de poder cambiar el valor de turno al identificador del otro proceso (B), entonces éste (B) permanecerá bloqueado indefinidamente.
Algoritmo de Peterson En [Dijkstra, 1965] se describe la solución software desarrollada por T. Dekker para obtener exclusión mutua sin necesidad de asegurar una alternancia estricta de los procesos. Dicha solución, conocida como algoritmo de Dekker, en su forma original solo es aplicable para la ejecución concurrente de do procesos y no es sencillo extenderla para un número superior. En 1981 G.L. Peterson obtuvo una solución simple y elegante para el problema de garantizar completamente la exclusión mutua de un número arbitrario de procesos concurrentes [Peterson, 1981]. Dicha solución, conocida como algoritmo de Peterson se muestra en la Figura 4.5 escrita en pseudocódigo basado en el lenguaje C para el caso de dos procesos concurrentes. Cuando un proceso desea ejecutar una sección crítica debe invocar primero a la función a e e e s o _ s e pasándole como parámetro el identificador numérico pid que tiene asociado dicho proceso. En este caso es Opara el proceso A y 1 para el proceso B. Supóngase que esta función ha sido invocada por el proceso A, en ese caso, pid==O . En primer lugar se calcula el valor de otroyid, es decir, el identificador asociado al otro proceso concurrente que se está ejecutando, en este caso el proceso B. Para ello realiza la operación otro _pid== l-pid, luego en este caso otro _pid== lo A continuación el proceso A expresa su deseo de acceder al recurso compartido poniendo el valor TRUE en el elemento O del vector de dos elementos enteros petición_rec. Luego asigna a la variable
Sincronización y comunicación de procesos
;:ine FALSE o :":;:ine TRUE 1 u rno; - pet ición rec[2]; - ..: ac ceso_sc(int pid) int otroyid; otroy id = 1 - pid; petic ión_rec[pid]=TRUE; turno = otroyid; whi le(turno == otroyid && petición_rec[otroyid]
TRUE) ;
_ s alida_sc( int pid) petic ión_rec[pid]
FALSE;
_::: procesoA ( ) while (TRUE)
{ /* sección no crítica */ acceso_sc(O) ; /* sección critica*/ salida_sc(O) ; /* sección no crítica */
_::: procesoB () while (TRUE)
{ /* sección no crítica */ acceso_sc(l) ; /* sección critica */ salida_sc (1) ; / * sección no crítica */
i n () petición_rec[O ] = FALSE; petición_rec[l] = FALSE; ejecución_concurrente (procesoA,procesoB) ;
Figura 4.5 - Algoritmo de Peterson para dos procesos concurrentes
127
128
Fundamentos básicos de los sistemas operativos
turno un valor igual al identificador numérico del otro proceso, en este caso 1. Finalmente entra en un bucle whi le en espera de poder usar el recurso compartido. Dicho bucle se ejecutará mientas se cumplan las siguientes dos condiciones:
1. turno==otro _pidoLa variable turno coincida con el identificador del otro proceso que se está ejecutando concurrentemente. En este caso el proceso es B luego turno vale 1. 2. petición_rec [otroyid] ==TRUE . El otro proceso (en este caso B) haya solicitado previamente usar el recurso compartido. Cuando un proceso termina de ejecutar su sección crítica debe invocar a la función sal ida _ sc , pasándole como parámetro el identificador numérico pid que tiene asociado dicho proceso. Esta función lo único que hace es desactivar la petición de uso del recurso por parte del proceso invocador; para lograrlo configura con el valor FALSE el elemento asociado al proceso invocador en el vector petición_ rec . Algunos de los escenarios que se se pueden presentar en el uso del código de este algoritmo son lo siguientes: • El proceso A ha invocado a acceso_sc y el proceso B se encuentra ejecutando una sección no crítica. Entonces el proceso A no tiene que esperar en el bucle de acceso_sc , puede acceder a su sección crítica inmediatamente, ya que petición_rec [1] =FALSE . • El proceso A ha invocado a acceso _sc y el proceso B se encuentra ejecutando su sección crítica Entonces el proceso A tiene que esperar en el bucle de acceso_sc ya que petición_rec [1 ] = TRUE. La espera finalizará cuando el proceso B ejecute la función salida_sc y haga que petición_rec [1] =FALSE. • El proceso A y el proceso B invocan prácticamente a la vez la función acceso _ sc. El proceso que conseguirá acceder a la sección crítica será aquel que primero consiga completar la instrucción petición_rec [pid] =TRUE. Nótese que el valor que se quedará en la variable turno será el del último proceso que ejecute la instrucción turno=otro_proceso. El algoritmo de Peterson garantiza la exclusión mutua ya que el proceso que primero ejecuta la instrucción peticion_rec [id_proceso] =TRUE se garantiza el uso del recurso. El otro proce o tendrá que esperar. Por otra parte este algoritmo evita la posibilidad de interbloqueo. Supóngase que el proceso A se bloquea esperando en su bucle while, en consecuencia eso significa que petición_rec [1] =TRLE Y turno = 1. El proceso A podrá entrar en su sección crítica cuando petición_rec [1] =FALS:::: o cuando tumo valga O. Nótese que nunca puede suceder que los dos procesos se queden bloqueados en espera de entrar en su sección crítica, ya que si A está bloqueado a la fuerza turno=l y en consecuencia el proceso B podrá entrar en su sección crítica. Por otra parte un proceso no puede monopolizar el uso de un recurso ejecutando repetidas veces sección crítica ya que siempre concede una oportunidad de entrar al otro proceso al ejecutar la instrucció turno=otro_pid.
Sincronización y comunicación de procesos
129
6. Soluciones a la exclusión mutua con apoyo del hardware e van a describir en esta sección dos soluciones a la exclusión mutua que requieren el apoyo del ware para su implementación: el uso de instrucciones máquina especiales y el bloqueo de interrups.
de instrucciones máquina especiales
La mayoría de los computadores, especialmente aquellos que poseen varios procesadores, disponen repertorio de instrucciones de instrucciones máquina especiales que bloquean el uso del bus. Esto ==-.. . . .cu·~a que si un procesador PI está accediendo a una posición de memoria ningún otro procesador acceder a dicha posición hasta que PI haya terminado de usar dicha posición de memoria. Estas instrucciones máquina especiales realizan acciones tales como leer y comprobar, o leer y escria posición de memoria determinada. Se caracterizan por ser atómicas, es decir, se ejecutan en un ciclo de instrucción que no puede ser interrumpido, por lo que su ejecución siempre se completa. forma se garantiza el acceso exclusivo a la posición de memoria accedida. plo 4.4
las instrucciones máquina especiales soportada en el repertorio de muchos procesadores es comy configurar (test and set). El nombre con que se denota a esta instrucción varía dependiendo de tipo de procesador. Se va a considerar que el nombre de esta instrucción en un lenguaje ensamblador ·0 es ccc (comprobar y configurar cerrojo), la forma de invocarla sería la siguiente: - r 1 , cerrojo;
cción ccc copia el contenido de la posición de memoria compartida cerroj o en el registro cribe un valor distinto de cero (normalmente un 1) en cerroj o . Esta instrucción es atómica, lo 53f311tiza que la instrucción se ejecuta sin interrupción hasta completarse. 'able compartida cerroj o se utiliza para coordinar el acceso a una sección crítica asociada a un lE=::Ilrn"lllado recurso X. eso puede acceder a su sección crítica si ce r ro j o = O, en caso contrario tendrá que esperar. La que realiza es una espera activa, ya que ejecuta un bucle hasta que cerroj 0= 1 . un proceso termina de ejecutar una sección crítica asigna a la variable cerroj o el valor 0, lo ~rmitirá a otro proceso entrar en su sección crítica, aquél que ejecute en primer lugar la instrucción
........____u v
.er proceso para entrar en una región crítica asociada a un recurso X, debe invocar al pro.ento a c c e s o _ s c (X) Y cuando sale de dicha sección crítica debe invocar al procedimiento - - :..da _sc (X) : .=-=so_sc (X) ; - sec ción crítica */ =- =.da _ sc (X) ;
130
Fundamentos básicos de los sistemas operativos
En la Figura 4.6 se muestra el código de acceso_se (X) en un lenguaje ensamblador ficticio. La instrucción [la] copia el contenido de eerroj o en el registro rl y escribe un 1 en eerroj o. La instrucción [lb] compara el valor del registro rl con el valor O. Nótese que en rl se encuentra almacenado el antiguo valor de eerroj o. Si dicho valor estaba a O significa que ningún proceso e encontraba dentro de una región crítica asociada a un recurso X. En caso contrario existe algún proce o dentro de una sección crítica asociada a dicho recurso. / * acceso_sección_critica * / [la) ccc rl, cerroj o [lb) comparar rl, #0 , [Id) [lc) saltar [la) [Id] volver
/* salida_sección_critica */ [2a) [2b)
mover cerrojo, #0 volver
Figura 4.6 - Obtención de la exclusión mutua mediante el uso de la instrucción máquina especial del tipo comprobar y configurar (e e e)
Si el valor del registro rl es igual a O, salta a la instrucción [Id] que sale del procedimiento devolviendo el control del programa a la instrucción situada a continuación de la invocación del procedimiem acceso_se , es decir, al interior de una región crítica. Si el valor del registro rl es igual a 1 se ejecuta la instrucción [l e] que salta a la instrucción [l a] . Este bucle (instrucciones [l a] a [l e] ) de espe activa se ejecutará hasta que un proceso no salga de su sección crítica y escriba un O en eerroj o. En la Figura 4.6 también se muestra el código del procedimiento salida_se. La instrucción [2a = mueve el valor O a la posición de memoria eerroj o . La instrucción [2b] sale del procedimient devolviendo el control del programa a la instrucción situada a continuación de la invocación del procedimiento salida se. El principal inconveniente de usar instrucciones máquina especiales como solución para garantizar la exclusión mutua radica en que la espera que realiza un proceso para entrar en su sección crítica activa. La espera activa supone un problema si se dilata en exceso en el tiempo. Aparte del problema de la espera activa, esta solución también puede producir inanición de proces Puesto que la elección de qué proceso entra en una sección crítica cuando 'otro finaliza es arbitraria. podría suceder que si existen varios procesos esperando para entrar en sus secciones críticas alguno ellos se quedase relegado indefinidamente. Finalmente, otro problema que puede presentar esta solución es la aparición de interbloqueos. P ejemplo, supóngase que un planificador basado en prioridades de tipo expropiativo planifica un proc A que ejecuta la instrucción especial y entra en una sección crítica asociada a un recurso X. Entone llega un proceso B de mayor prioridad que A, con lo éste es interrumpido para planificar al proceso B Supóngase que el proceso B requiere entrar en una sección crítica asociada al recurso X y ejecuta
Sincronización y comunicación de procesos
131
cción especial. Debido a la exclusión mutua B no consigue acceder a X. Permanecerá en espera indefinidamente, ya que el proceso A nunca será escogido para ser planificado y poder liberar el ::c::m;o X al ser de menor prioridad que B.
eo de las interrupciones Otra forma de conseguir la exclusión mutua consiste en permitir que un proceso A, antes de entrar región crítica, ejecute una instrucción especial para bloquear el mecanismo de interrupciones del :oo..;:o,...-na., y cuando salga de la región crítica ejecute otra instrucción especial que lo vuelva a habilitar. ninguna interrupción será atendida, ni siquiera las más prioritarias como las interrupciones del reloj , se utilizan para medir el cuanto de un proceso y poder expropiarle el uso del procesador cuando fa. De esta forma se garantiza, en un sistema con un único procesador, que ningún proceso será - ~ cado hasta que el proceso A salga de su región crítica. - bloqueo de las interrupciones aunque es la solución más simple para garantizar la exclusión mutua JI[:!~rua sin embargo serios inconvenientes. En primer lugar el rendimiento del sistema se puede degradar . [e al no permitirle atender las interrupciones más prioritarias en el momento en que llegan. Además - en manos del proceso la decisión de ceder el procesador y si éste nunca lo devuelve el sistema se - ' colgado. otra parte, esta solución no sirve en el caso de sistemas multiprocesadores, ya que un proceso B, "'" estuviera ejecutando en un procesador P2 distinto al procesador PI en el que ejecuta al proceso 'a acceder a una sección critica aunque estén deshabilitadas las interrupciones, ya que esto solo ~=IZa que el proceso A no puede ser expulsado del procesador PI , pero no que se ejecuten otros ¡¡.'-~lIU~ en otros procesadores.
Semáforos Definición semáforos son un mecanismo de sincronización de procesos concurrentes gestionado por los .s.~iS
operativos que fue presentado por primera vez en [Dijkstra, 1965]. -n emáforo es una variable, por ejemplo supóngase que se llama S, que almacena un valor entero la que es posible realizar tres operaciones básicas: Asignación de un valor inicial entero N no negativo al semáforo. Es decir, S=N. _ ( S) . Esta operación disminuye en una unidad el valor del semáforo. Es decir, S = S -1. Si el valor resultante es un número negativo entonces el proceso que ha invocado esta operación es añadido a la cola de procesos bloqueados asociada al semáforo y se bloquea. ( S) . Esta operación incrementa en una unidad el valor del semáforo, es decir, S = S + 1. Si el
valor resultante es menor o igual a O entonces se elimina de la cola asociada al semáforo uno de los procesos bloqueados, y se le despierta, lo que hace que pase al estado preparado para ejecución.
132
Fundamentos básicos de los sistemas operativos
Las operaciones P y V derivan de las palabras holandesas probaren (prueba) y verhogen (incremento . En la literatura es frecuente encontrar los términos wait y signal para referirse a las operaciones P y V, respectivamente. El motivo de usar estos nombres es el siguiente: cuando un proceso desea utilizar un recurso cuyo acceso está regulado por un semáforo S y éste está ocupado, debe esperar (wa i t ) a que esté libre. Cuando el proceso que estaba usando el recurso finaliza, avisa a los procesos que estaban esperando transmitiendo una señal (signa l ) vía el semáforo S. Puesto que las operaciones wait y signal tienen el mismo nombre que dos llamadas al sistema de los sistemas operativos UNIX y Linux, para evitar confusiones en este texto se van utilizar 10_ nombres wai t _sem y signal_sem para designar a estas operaciones. Luego se tienen las siguientes equivalencias de nombres: P=wait=wait_semy S=signal=signal_sem. Por otra parte con in i t _ s em ( S ,N) se denotará la operación de inicialización del semáforo S c el valor N. Esta operación se suele realizar fuera de la ejecución de los procesos concurrentes que puede solicitar operaciones sobre el semáforo . • Ejemplo 4.5 Supóngase un semáforo llamado acc que es inicializado mediante ini t _ sem (acc ,2) al valor .: y cuatro procesos concurrentes A, B, C y D. A continuación se comenta el resultado de realizar secuencia de operaciones wait_semo signal_semsobre dicho semáforo: • El proceso A invoca una operación wai t _ sem (acc) . Esta operación produce que acc= 1. • El proceso B invoca una operación wa i t _ s em ( a c c ) . Esta operación produce que a c c = O. • El proceso C invoca una operación wai t _ sem (acc) . Esta operación produce que acc= - 1 . que el proceso C sea bloqueado y añadido a la cola de procesos bloqueados asociada al semáfo acc. • El proceso D invoca una operación wai t _ sem (acc) . Esta operación produce que acc= - 2 . que el proceso D sea bloqueado y añadido a la cola de procesos bloqueados asociada al semáfo • El proceso B invoca una operación signal_sem (acc). Como resultado de esta operaci acc=-l . Además, uno de los procesos de la cola del semáforo (C o D) se elimina de la co y pasa al estado preparado para ejecución. Supuesto que dicha cola se gestiona con una politi PIFO entonces el proceso desbloqueado sería el C. • El proceso A invoca una operación signal_sem(acc) . Como resultado de esta operaci acc=O y se desbloquea al proceso D, puesto que era el único proceso de la cola del semáforo. • El proceso A invoca otra operación signal_sem (acc). Como resultado de esta operaci acc=1.
Sincronización y comunicación de procesos
133
El funcionamiento de las operaciones wai t _semy signa1_semque se ha descrito en los párrafos ·ores corresponde a un semáforo general o semáforo con contador. Una versión simplificada de este , oro general corresponde al caso del semáforo binario, también denominado mutex en la literatue únicamente puede tomar los valores O y 1. En el caso de un semáforo binario las operaciones =-=- ~ _ s em y signa 1_s em funcionan de la siguiente manera: wait_sem (8). Esta operación comprueba el valor del semáforo 8. Si 8=0, entonces el proceso es colocado en la cola de procesos bloqueados asociada al semáforo y se bloquea. Si 8 = 1 , entonces pone el semáforo a O y el proceso puede continuar su ejecución. s igna 1_ s em ( 8 ) . Esta operación comprueba si la cola de procesos bloqueados asociada al semáforo 8 está vacía. En caso afirmativo, pone el semáforo a 1, y continúa su ejecución. En caso negativo, es decir, hay procesos bloqueados en el semáforo, entonces el sistema operativo elimina de la cola asociada al semáforo a uno de los procesos bloqueados, y le despierta lo que hace que pase al estado preparado para ejecución. otra parte, un semáforo binario solamente puede ser inicializado a O o 1.
plo 4.6 gase un semáforo binario llamado rem que es inicializado mediante ini t _sem (rem O) al O. Considérese la ejecución concurrente de tres procesos A, B Y C. A continuación se comenta el -.,,,,-.auo de realizar una secuencia de operaciones wai t _sem o signal_sem sobre dicho semáforo: I
El proceso A invoca una operación wai t _ sem (rem) . Como rem= O el proceso A entra en el estado bloqueado y se añade a la cola del semáforo. El proceso B invoca una operación wai t _ sem (rem) . Como rem= O el proceso B entra en el estado bloqueado y se añade a la cola del semáforo. El proceso C invoca una operación signa1_sem (rem) . Puesto que la cola del semáforo no está vacía, en ella están los procesos A y B, entonces se desbloquea a un proceso de la cola. Supóngase que la cola se gestiona con un algoritmo FIFO, luego se desbloquea al proceso A. El valor del semáforo sigue siendo O. El proceso A invoca una operación signa1_sem (rem) . Puesto que la cola del semáforo no está oacía, en ella está el proceso B, entonces se desbloquea a dicho proceso. El valor del semáforo sigue siendo O. El proceso B invoca una operación signa1_sem (rem). Puesto que la cola del semáforo está cía, entonces rem= 1 y el proceso continúa su ejecución El proceso B invoca otra operación signa 1_ s em ( rem) . El valor del semáforo no se modifica, -gue siendo 1 y el proceso B continúa su ejecución.
•
134 Fundamentos básicos de los sistemas operativos 4.3.2.
Implementación
Los semáforos son un mecanismo de sincronización entre procesos que gestiona el sistema operativo. Un proceso simplemente tiene que solicitar el uso de un semáforo o de un conjunto de semáforos al que le asignará el nombre que desee realizando la llamada al sistema correspondiente. Para realizar una operación sobre el semáforo (ini t _ sem, wai t _ sem o s ignal_ sem) un proceso también tiene que realizar una llamada al sistema. El sistema operativo se encarga de asignar las estructuras de dato necesarias para los semáforos y de realizar las operaciones sobre ellos. El núcleo implementa las operaciones wait_sem y signal_sem como primitivas o funcione elementales de su código que se ejecutan de forma atómica, es decir, se ejecutan en un único ciclo de instrucción que no puede ser interrumpido, por lo que su ejecución siempre se completa. El núcleo tiene que garantizar que dos procesos no pueden realizar simultáneamente dos operacione sobre un mismo semáforo. Luego en la implementación de las primitivas del núcleo de las operacione wai t _ sem y signal_sem se ha de resolver un problema de exclusión mutua. En sistemas con un único procesador la exclusión mutua se garantiza bloqueando las interrupcione cuando se está ejecutando una operación sobre el semáforo. Puesto que una operación se realiza relativamente en poco tiempo el bloqueo de las interrupciones no perturba en exceso el funcionamiento del sistema. • Ejemplo 4.7 En la Figura 4.7 se muestra en pseudocódigo basado en el lenguaje e una posible implementación de las primitivas de las operaciones ini t_sem, wai t_sem y signal_sem de un semáforo general que utiliza el bloqueo de interrupciones para garantizar la exclusión mutua en el uso del procesador.
• En sistemas multiprocesador el bloqueo de interrupciones no es una solución válida para el proble.r:IlZ de la exclusión mutua ya que cada procesador tiene su propio mecanismo de interrupciones. En e caso la implementación de las primitivas de las operaciones wai t_sem o signal_sem utiliza algun::. instrucción máquina especial. Recuérdese que estas instrucciones especiales requieren espera activa, pe no suele ser un problema ya que estas operaciones no requieren mucho tiempo de uso del procesador. • Ejemplo 4.8 En la Figura 4.8 se muestra en pseudocódigo basado en el lenguaje e una posible implementación las primitivas de las operaciones ini t _sem, wai t_sem y signal_sem de un semáforo general q utilizan una instrucción máquina especial del tipo comprobar y configurar. Se ha supuesto que die instrucción máquina se invoca a alto nivel mediante la sentencia t e s t _ s e t. Si el procesador no dispone de ninguna instrucción especial entonces se utiliza alguna solución ware, como por ejemplo el algoritmo de Peterson. Por otra parte, el sistema operativo se encarga de implementar y gestionar las colas de procesos b queados asociadas a los semáforos. La implementación de una cola es sencilla, simplemente se utili.z:: punteros en el bloque de control de un proceso bloqueado, para enlazar al proceso anterior y al pr
Sincronización y comunicación de procesos
semáforo{ int contador; 1* Otras variables para implementar el semáforo y su cola (dependen de cada sistema operativo) * 1
:nit sem(semáforo S, int valor) S .contador=valor;
wa it sem(semáforo S)
1*
Bloqueo de las interrupciones
*1
S.contador=S.contador-l; if
(S.contador < O)
{
1* 1* 1*
Añadir el proceso a la cola del semáforo Bloquear el proceso *1 Desbloqueo de las interrupciones *1
*1
el se
1*
~
Desbloqueo de las interrupciones
*1
signa l sem(semáforo S)
1*
Bloqueo de las interrupciones
*1
S .contador=S.contador+l; if
(S.contador <= O)
{
1* 1*
Eliminar un proceso P de la cola del semáforo *1 Añadir el proceso P a la cola de procesos preparados
1*
Desbloqueo de las interrupciones
*1
*1
!!lIra 4.7 - Primitivas de las operaciones init_sem, wait_sem y signal_sem de un semáforo
=
eral que utilizan el bloqueo de interrupciones para garantizar la exclusión mutua
135
136
Fundamentos básicos de los sistemas operativos
struct semáforo{ int contador; int ocupado; /* Otras variables para implementar el semáforo y su cola (dependen de cada sistema operativo) */
void init_sem(semáforo S, int valor) S.contador=valor;
void wait sem(semáforo S) while (!test_set(S.ocupado)); /* Bucle de espera activa * / S.contador=S.contador-l; if (S.contador < O)
{ /* Añadir el proceso a la cola del semáforo */ /* Bloquear el proceso */ S.ocupado=O;
void signal sem(semáforo S) while (!test set(S.ocupado)); /*Bucle de espera activa */ S.contador=S . contador+l; if (S.contador <= O)
{ /* Eliminar un proceso P de la cola del semáforo */ /* Añadir el proceso P a la cola de procesos preparados */
S.ocupado=O;
Figura 4.8 - Primitivas de las operaciones init_sem, wait_sem y signal_sem de un semáforo general que utilizan una instrucción máquina especial para garantizar la exclusión mutua
Sincronización y comunicación de procesos
137
rior de la cola. La cola se puede gestionar con cualquier algoritmo, uno de los más utilizados es un _ 'tmo FIFO, ya que asegura una espera limitada para los procesos de la cola .
.3.
Utilidad de los semáforos ción de exclusión mutua
B problema de la exclusión mutua se soluciona fácilmente utilizando semáforos. Simplemente hay ntilizar tantos semáforos como recursos distintos compartan, a través de regiones críticas, los procencurrentes. -==ine TRUE 1 - '=oro S;
-=:
proc esoA () while (TRUE)
{ / * sección no crítica * / wait sern (S) ; / * sección cr iti ca asociada al recurso R */ signal sern(S); / * sección no crítica */
roc esoB () while (TRUE)
{ / * sección no crítica */ wait sern(S); / * sección critica asociada al recurso R * / signal_sern (S) ; / * sección no crítica * /
} in() in it sern(S,l); e jecución_concurrente (procesoA,procesoB ) ;
a 4.9 - Solución mediante un semáforo a la exclusión mutua para el caso de dos procesos concu~tes
138
Fundamentos básicos de los sistemas operativos
Supóngase, por simplificar, que únicamente hay un recurso cuyo acceso se va a regular con un semáforo 8. El semáforo se inicializa al, in i t _ s em ( 8 1) . Cuando un proceso desea entrar en una región crítica asociada a dicho recurso realiza una operación wai t _ sem (8) . Si el valor de 8 es 1, entonces 8 se hace y el proceso puede acceder inmediatamente a la sección crítica. A partir de momento cualquier proceso que desee entrar en su sección crítica e invoque una operación wai t _ sem (8) producirá que se decremente en una unidad el semáforo y se quede bloqueado en la cola de dicho semáforo. I
°
Cuando el proceso que estaba dentro de su sección finalice entonces ejecutará signa1_sem (8 ) que incrementará en una unidad el valor del semáforo y desbloqueará a uno de los procesos bloqueado en la cola del semáforo. En la Figura 4.9 se muestra en pseudocódigo basado en el lenguaje C la solución a la exclusión mutua mediante el uso de un semáforo para el caso de dos procesos concurrentes. Cuando existen varias instancias de un mismo recurso R (por ejemplo N buffers) entonces se puede permitir que N procesos puedan estar simultáneamente accediendo al recurso, es decir, ejecutando secciones críticas. En dicho caso el semáforo 8 se inicializa al número N de instancias de dicho recurso. En cualquier momento un número entero positivo S indica el número de instancias de dicho recurso disponibles. Si 8 = entonces no existe ninguna instancia disponible. Por otro lado un número entero negativo en 8 indica el número de procesos bloqueados en la cola del semáforo.
°
Sincronización de procesos Los semáforos también se pueden utilizar para sincronizar la ejecución de procesos. Por ejemplo, e el caso de dos procesos A y B basta con usar un semáforo 8 que se inicializa a 0, ini t _ sem (8 10) . el proceso A invoca una operación wai t _ sem (8) , 8 toma el valor -1 (o si era un semáforo binario y se bloquea en la cola del semáforo en espera de que el proceso B complete alguna operación. Cuan el proceso B finaliza dicha operación ejecuta una operación signa 1_ s em ( 8) para notificárselo proceso A. Como resultado de dicha operación el semáforo S toma el valor 0, el proceso A se desbloqu y pasa al estado preparado para ejecución.
°
En la Figura 4.10 se muestra en pseudocódigo basado en el lenguaje C la sincronización de d procesos con el uso de un semáforo. Nótese que a diferencia de 10 que ocurría en la exclusión mutua, para sincronizar procesos solo necesario que en el código de los procesos a sincronizar aparezca una única operación sobre el semáfo wai t _sem en el caso del proceso A que espera que se produzca un evento, y signa1_sem en el c del proceso B que notifica la aparición de dicho evento. Por otra parte, nótese que la sincronización se produce siempre perfectamente, aún cuando el p ceso B ejecutará la operación s igna1_ sem (8) antes de que el proceso A ejecutase la operaci wai t _ sem (8) . En dicho caso s igna1_ sem (8) dejaría el semáforo a 1, de tal modo que cuan el proceso A ejecutase wai t _ sem (8) pondría el semáforo a y podría continuar su ejecución bloquearse. Lo que significa que ya se ha producido el evento y que no hace falta que el proceso _ espere.
°
Sincronización y comunicación de procesos
139
=::':=':ne TRUE 1
=o ro S; _=.:i p ro cesoA ()
while (TRUE)
{ wait sem(S); /* Para bloquearse en espera de evento * /
= proc esoB ( ) while (TRUE)
{ signal_sem(S); /* Notificación del evento * /
::. ;:a i
n () i nit sem(S,O); e jecución_concurrente (procesoA,procesoB) ;
Figura 4.10 - Sincronización de dos procesos concurrentes usando un semáforo
Problemas potenciales asociados a un mal uso de los semáforos o se ha visto en la sección anterior los semáforos son muy útiles. Sin embargo, su utilización _ _. ."'. . sumo cuidado y pericia por parte del programador. La colocación inadecuada de las operaciones sem y s igna1_ sem pueden producir errores de temporización y de funcionamiento (condicio- carrera, inanición o interbloqueo) que pueden ser difíciles de detectar, ya que solo se producen terminadas secuencias de ejecución, las cuales no se dan siempre. En el caso de programas cortos ción adecuada de estas operaciones es fácil. El problema surge cuando el código es extenso ya dicho caso puede ser difícil visualizar de forma global el efecto de las operaciones wai t _ sem y ==.3.1 _ S em sobre los semáforos sobre las que operan.
-=_
plo 4.9 ___"",-,'Tese el semáforo acceso que se utiliza para garantiza la exclusión mutua sobre un recurso .::n~!I1i·,do por varios procesos concurrentes. Como se ha visto en la sección anterior, la forma correcta .....-,:nr<.r a las operaciones wéi. i t _ s em y signa 1_ s em es incluir el siguiente código dentro de cada
u
140
Fundamentos básicos de los sistemas operativos
proceso: wait - sem(acceso); /* sección crítica */ signal_sem(acceso) ;
Supóngase ahora que por un error de programación se ha intercambiado el orden de estas operaciones: signal_sem(acceso) ; /* sección crítica */ wait sem(acceso);
En dicho caso no se estaría cumpliendo la exclusión mutua y varios procesos podrían estar ejecutan simultáneamente código de la sección crítica. Supóngase ahora el error de cambiar la operación signal_sem por wai t _sem: wait - sem(acceso); /* sección crítica */ wait sem(acceso);
En dicho caso se produciría un interbloqueo, ya que el proceso que estaba ejecutando la sección críti al finalizar ejecuta la segunda operación wait_sem(acceso) y se queda bloqueado. Además, cualqui-otro proceso que intente acceder a la sección crítica se bloqueará también. Considérese ahora el error de olvidar incluir la operación signal_sem: wait_sem(acceso) ; /* sección crítica */
En dicho caso se produciría un interbloqueo, ya que el proceso nunca libera el recurso. Finalmente considérese el error de olvidar incluir la operación wai t _ sem: /* sección crítica */ signal sem(acceso);
En dicho caso no se garantiza la exclusión mutua.
141
Sincronización y comunicación de procesos
Problemas clásicos de sincronización de procesos concurrentes En esta sección se van a plantear y resolver mediante el uso de semáforos dos problemas clásicos - cronización de procesos concurrentes: el problema de los productores y los consumidores, y el ema de los lectores y los escritores. Estos problemas han sido objeto de un amplio estudio en la ---........... a ya que tienen un gran interés tanto desde un punto de vista teórico como desde un punto de práctico.
El problema de los productores y los consumidores · opóngase un conjunto de procesos concurrentes cooperativos que comparten un buffer de tamaño o. Unos procesos, los productores, escriben datos en el buffer y otros procesos, los consumidores, D datos del buffer, es decir, primero leen y luego borran el dato. Las velocidades de producción y ión de datos no tienen por qué ser iguales, es decir, se puede producir datos más rápido de lo que men o viceversa. Se desea diseñar un protocolo de sincronización entre los productores y los ':::::.&:ID1'dores de tal forma que los datos sean extraídos en el mismo orden en que son escritos, es decir, ..,te un esquema FIFO. a a considerar, por simplificar la solución, que únicamente existe un proceso productor y un lC~iO consumidor. Además se va a medir el tamaño del buffer en datos que puede almacenar, por o N = 100 datos. Cada dato ocupará un determinado espacio de memoria en bytes, que es función de dato de que se trate. ~ primer lugar conviene darse cuenta que el buffer es un recurso compartido. Obviamente se debe F::!l::tinlf que solo un proceso (el productor o el consumidor) puede acceder simultáneamente al buffer y ·..........iU la operación de escribir o extraer. Se trata de un problema de exclusión mutua que se puede resolejemplo, utilizando un semáforo binario, al que se va a denotar, como acceso. Este semáforo - . a a 1 mediante ini t sem (acceso ,1) . •~ proceso realiza primero una operación wai t _ sem (acceso) cuando va a escribir o extraer un el buffer. Dicha operación comprueba si el valor del semáforo es 1, en caso afirmativo puede bre el buffer. Si el semáforo es O, entonces el proceso se bloquea y pasa a esperar en la cola del ____'...~v . Cuando un proceso termina de utilizar el buffer realiza una operación signal (acceso) que """'~"Jeba si existe algún proceso esperando en la cola del semáforo. En caso afirmativo se desbloquea "'ll caso negativo se pone a 1 el semáforo. otra parte, se debe tener en cuenta que el consumidor solo puede extraer datos si el buffer no está Además, como el tamaño del buffer es limitado el productor únicamente puede escribir si el buffer lleno. implementar estas condiciones se puede utilizar dos semáforos adicionales: ocupado que lleuenta del espacio ocupado en el buffer, y disponible que llevará la cuenta del espacio dis_ _.&:'" en el buffer. Si ocupado vale O significa que el buffer está vacío, asimismo si disponible significa que el buffer está lleno. En consecuencia estos semáforos se deben inicializar con los O y N, respectivamente. Para ello se deben realizar las operaciones ini t _ sem (ocupado O) &I"-'--,.
I
I
~-=_s em(disponible/N) .
142
Fundamentos básicos de los sistemas operativos
#define TRUE 1 #define N 100 semaforo binario acceso ; semaforo ocupado, disponible ; void productor ( ) int dato; while (TRUE)
/ * Bucle infinito * /
{ dato=producir_dato() ; wait_sem (disponible) ; wait_sem(acceso) ; escribir_buffer (dato) ; signal sem (acceso ); signal_sem(ocupado ) ;
/ * Generar dato * / / * Comprobar si está lleno * / / * Entrar en sección crítica * / / * Escribir dato en el buffer * /
/ * Salir de sección crítica * / / * Avisar al c onsumido r */
void consumidor() int dato; while (TRUE)
/ * Bucle Infinito */
{ wait_sem(ocupado ) ; /* wait_sem (acceso ) ; /* leer_buffer (dato ) ; /* signal sem(acceso); /* signal_sem(disponible ) ; / * dato=consumir_dato ( ) ; /*
Comprobar si está vacío * / Entrar en sección crítica */ Escribir dato en el buffer * / Salir de sección c rítica */ Avisar al productor */ Consumir dato * /
void main () init sem(acceso , l ); init_sem(ocupado,O) ; init_sem(disponible,N) ; ejecución_concurrente (producto r, consumidor ) ;
Figura 4.11 - Una posible solución al problema de los productores y los consumidores
Sincronización y comunicación de procesos
143
- proceso consumidor antes de realizar la operación wai t _ sem (acceso) debe realizar una ·ón wai t _ sem (ocupado) para comprobar si el buffer esta vacío. Esta operación decremenuna unidad el valor del semáforo ocupado. Si el valor resultante es menor que cero, es de- buffer está vacío entonces el consumidor se bloquea en la cola del semáforo en espera de que ctor produzca un dato. Así, el consumidor debe ser avisado de este evento por el productor, realizar una operación signal_sem (ocupado) después de haber realizado una operación =:=al sem(acceso). ogamente el proceso productor antes de realizar la operación wai t _ sem (acceso) debe realioperación wai t _sem (disponible) para comprobar si el buffer no está lleno. Esta operación ....-.......,.·n ta en una unidad el valor del semáforo disponible. Si el valor resultante es menor que cero, - el buffer está lleno, entonces el productor se bloquea en la cola en espera de que un proceso a::3l::ill-dor consuma un dato y deje espacio disponible. Así, el productor debe ser avisado de este evento consumidor que debe realizar una operación signal_sem (disponible) después de haber _ L . L . 1 I U una operación signal_sem (acceso). - la Figura 4.11 se muestra en pseudocódigo basado en el lenguaje C la solución propuesta al .-:rt:!.I=na de los productores y los consumidores.
El problema de los lectores y los escritores ' ngase un conjunto de procesos concurrentes que comparten el acceso a una base de datos. Unos los lectores, leen datos, y otros procesos, los escritores, escriben datos. Múltiples lectores tar consultando la base de datos simultáneamente; pero para mantener la consistencia de los do un escritor va a escribir en la base de datos ningún otro proceso (lector o escritor) puede _=i!r a la base de datos. Se desea diseñar un protocolo de sincronización entre los lectores y los _~_.~ que asegure la consistencia de los datos y mantenga un grado elevado de concurrencia. lector accede a la base de datos no puede dejar acceder a un escritor pero sí a otro lector. Por , un escritor no puede dejar acceder ni a un lector ni a un escritor. Luego se necesita en primer emáforo para regular el acceso a la base de datos. Se va a usar, por ejemplo, un semáforo nominado 81 que se debe inicializar a 1. o que múltiples lectores pueden acceder a la base de datos se necesita una variable global para 1IIa;¡¡¡::ex:::rr el número de lectores que están en la base de datos, por ejemplo, contador. Cuando un a a la base de datos debe incrementar en una unidad contador y cuando sale de la base debe elt:'!=::t::ntar contador. Obviamente puesto que contador es una variable compartida por múltiples -==~~ para garantizar la consistencia de su valor y evitar condiciones de carrera, es necesario regular _....a-~=IU con un semáforo. Se va a usar, por ejemplo, un semáforo binario denominado 82. La variable -~ ~o r se inicializa a O y el semáforo 82 a 1. En la Figura 4.12 se muestra en pseudocódigo basado guaje C la solución propuesta al problema de los lectores y los escritores. oceso lector en primer lugar realiza una operación wai t _ sem (82) para poder utilizar la _¡..¡¡...~~ c o ntador. Si 82 estaba a O entonces quedará bloqueado en la cola del semáforo. Si estaba a .II;::=O:~s incrementa en una unidad el valor de contador. - - gundo lugar comprueba si el valor de contador es igual a 1, esto significaría que es el único _E.::i3S.
..
144
Fundamentos básicos de los sistemas operativos
#define TRUE 1 semaforo binario 81, 82; int contador=O; void lector () while (TRUE)
1* Bucle infinito * 1
{ wait sem(82); contador=contador+l; if (contador==I) wait sem(81); signal sem(82); leer_dato() ; wait sem(82); contador=cont ador-l; if (contador==O) signal sem(81); signal sem(82); procesar_dato() ;
void escritor () while (TRUE)
1* Bucle infinito *1
{ producir_adquirir_dato() ; wait_sem(81) ; escribir_dato() ; signal sem(81);
void main () init sem(81,1); init_sem(82 , 1) ; ejecución_concurrente (lector, escritor);
Figura 4.12 - Una posible solución al problema de los lectores y los escritores
Sincronización y comunicación de procesos
145
r en la base de datos. En dicho caso debe realizar wai t _ sem (S 1) para poder usar la base de datos uear el acceso a los escritores. Si estaba a O el lector se bloquea en la cola del semáforo. Si SI a 1 entonces el lector puede acceder a la base de datos. Antes de leer un dato, el lector debe realiza una operación signa 1_ s em ( S 2) para liberar el uso variable contador y que se puedan desbloquear otros procesos lectores. Luego lee el dato de de datos. A continuación, para abandonar la base, debe decrementar contador. Pero primero asegurarse el acceso exclusivo a dicha variable mediante una operación wai t _ sem (S2) . Cuando decrementa contador si el valor resultante es igual a cero, esto significaría que no existen - procesos lectores en la base de datos, entonces puede liberar el acceso a la base da datos para un -mr realizando una operación signa 1_ s em ( SI) . ~ma1mente el lector debe liberar el uso de la variable contador mediante signa1_sem (S2) y el dato que ha leído de la base de datos. Por su parte, el funcionamiento de un proceso escritor es mucho más sencillo. Primero genera o -ere el dato que desea escribir. A continuación debe realizar una operación wait_sem (SI) para acceder a la base de datos con exclusividad. Si estaba a O el escritor se bloquea en la cola del : oro. Si S 1 estaba a 1 entonces el escritor puede acceder y escribir en la base de datos. Cuando '---.LL~ de escribir realiza una operación signa 1_ s em ( SI) para permitir el acceso a la base de datos procesos . ..-2. olución presentada se caracteriza por dar preferencia a los lectores frente a los escritores con de garantizar una elevada concurrencia de procesos. Sin embargo, presenta como principal inconte que los procesos escritores nunca conseguirán entrar si, estando un proceso lector en la base de llegan continuamente más procesos lectores. -na posible solución a este problema consistiría en imponer las siguientes dos condiciones: Un lector nuevo no puede acceder a la base de dato si existe un escritor esperando. Cuando escritor abandona la base de datos, los lectores que esperan a entrar tienen prioridad sobre otro escritor.
Monitores Definición semáforos proporcionan un mecanismo de sincronización de procesos concurrentes muy útil y e. Sin embargo, deben introducirse cuidadosamente en el código de los programas para que el narniento sea el esperado. Para intentar evitar los errores potenciales asociados a una inadecuada ión de los semáforos y, en definitiva, para simplificar la escritura de los programas de procesos entes, C.A.R. Hoare introdujo en 1974 el concepto de monitor. -n monitor es un módulo software, que consta de un conjunto de procedimientos, variables y esr::::::rr.as de datos, definido en algunos lenguajes de alto nivel que posee la propiedad especial de que permite a un único proceso simultáneamente ejecutar alguno de sus procedimientos. Además, las
146
Fundamentos básicos de los sistemas operativos
variables contenidas dentro del monitor solo son accesible por los procedimientos del monitor y no por procedimientos externos. Un proceso puede acceder a un monitor invocando a alguno de sus procedimientos, siempre que no exista otro proceso que se encuentre ejecutando ya algún procedimiento del monitor. En dicho caso, el proceso se bloquea en espera de que el monitor esté disponible. Por lo tanto, un monitor garantiza, por su propia definición, el acceso con exclusión mutua a un recurso o conjunto de recursos compartidos por varios procesos. Un monitor también proporciona herramientas para la sincronización de procesos. Para ello dispone de un tipo especial de dato: las variables de condición. Cada variable de condición tiene asociada una cola de procesos bloqueados en espera de que se cumpla dicha condición. Sobre una variable de condición X es posible realizar dos posibles operaciones, cuyo nombre depende del lenguaje de programación de alto nivel que las soporte, en este texto se van a considerar los siguientes: • wa i t _ mon (X) . El proceso dentro del monitor que realiza esta operación queda suspendido en una cola de procesos asociada al cumplimiento de la condición X. En consecuencia otro proce puede entrar en el monitor. Nótese que a diferencia de la operación wai t _ sem de los semáforo_ la operación wa i t _ mon de los monitores siempre produce el bloqueo del proceso que la invoca • signa 1_mon (X) . Comprueba si la cola de procesos asociada a la condición X contiene algún proceso bloqueado. En caso afirmativo se desbloquea a un proceso. Si la cola estaba vacía e ta operación no tiene ningún efecto. Nótese que a diferencia de la operación signa1_sem de los semáforos, la operación signa1_mon de los monitores no incrementa ningún contador, consecuencia si no existe ningún proceso en la cola de condición la señal de aviso se pierde.
El funcionamiento descrito para la operación signa 1_mon (X) no ha quedado completamente especificado, falta establecer qué sucede con el proceso que invoca esta operación. A continuación :. enumeran algunas de las soluciones propuestas en la literatura: • El proceso invocador A de la operación signa1_mon se bloquea y se permite ejecutar en monitor al proceso B desbloqueado por dicha operación. Cuando B finalice un procedimiento o "" bloquee en una condición entonces el proceso A se desbloqueará. Esta solución fue propuesta [Hoare, 1974]. • El proceso invocador de la operación signa 1_mon sale del monitor inmediatamente. Luego e operación aparecería como la sentencia final del procedimiento de un monitor. Esta solución propuesta por B. Hansen en 1975. • El proceso A invocador de la operación signa1_mon continua su ejecución hasta finalizar ~ procedimiento del monitor o bloquearse en una condición. Luego se retomará la ejecución proceso B desbloqueado por signa1_mon. Esta solución fue propuesta en [Lamport y Rede 1980]. De las tres propuestas la más sencilla de implementar es la de B. Hansen. Ésta es la que se conside de aquí en adelante.
Sincronización y comunicación de procesos
-.2.
147
Estructura y declaración de un monitor
En la Figura 4.13 se muestra la estructura de un monitor. El monitor consta de N procedimientos, .ables de condición, un conjunto de datos y unas rutinas de inicialización del monitor. En el mo010 puede existir a la vez un proceso ejecutando alguno de sus procedimientos. Los procesos que algún procedimiento del monitor deberán bloquearse en una cola de entrada al monitor hasta el proceso que estuviera dentro del monitor salga del mismo, o se bloquee en una cola de condición ___~'~ te la realización de una operación wa i t _ mon (Xi) . Cuando un proceso que finaliza en el moejecuta una operación signa 1_mon (Xi) se desbloquea a un proceso de la cola de condición Xi, continúa ejecutando el procedimiento por el que había solicitado entrar en el monitor. Si la cola está , entonces se introduce un proceso de la cola de entrada. MONITOR
.------------------,--------------------------. Datos
Cola de condición X¡ wait_mon(X¡)
M variables de condición Proceso que Cola de entrada oca un procedimiento del monitor - - - .
Procedimiento 1
Cola de condición XM Procedimiento N
wait_mon(XM )
Inicialización ~------~rr--------L--------------------------I
Salida signal_mon(X¡) Figura 4.13 - Estructura de un monitor según la propuesta de B. Hansen
gunos lenguajes de programación, como por ejemplo, Módula-2, Módula-3, Java o Pascal concudisponen de sentencias explícitas para construir un monitor. Dichas sentencias son interpretadas a especial por sus compiladores, que añaden las instrucciones necesarias para implementar la .ón mutua y el bloqueo de los procesos en la cola de entrada o en las colas de condición de un - r mediante el uso de semáforos binarios soportados por el sistema operativo. Puesto que es el • ador y no el programador el que se encarga de introducir los semáforos para garantizar la exclu-
148
Fundamentos básicos de los sistemas operativos
sión mutua, la probabilidad de error es mucho más pequeña. El programador únicamente se tiene que preocupar de definir bien el monitor y no de usar correctamente los semáforos. Esta es una gran ventaja de los monitores sobre el uso directo de los semáforos. De forma general, independientemente del lenguaje utilizado, un monitor se declara de la siguiente forma (ver Figura 4.14): en primer lugar se suelen declarar las variables locales utilizadas por los procedimientos del monitor. A continuación, se declaran las variables de condición. Luego se declaran lo procedimientos del monitor. Finalmente se incluye el código de inicialización del monitor. monitor [Nombre monitor] 1* Declaración de variables l ocales *1 1* Declaración de las variables de condición 1* Declaración del procedimient o 1 *1 1* Declaración del procedimient o 2 *1
1* 1*
Declaración del pro cedimient o N Inicialización del monitor *1 end mon it or
*1
*1
Figura 4.14 - Declaración de un monitor
4.5.3.
Uso de los monitores
Los monitores, al igual que los semáforos, se pueden utilizar para garantizar la exclusión mutua _ para la sincronización de procesos. Por su propia definición, un monitor garantiza implícitamente la exclusión mutua sobre recursos compartidos por varios procesos concurrentes. Simplemente hay que definir dentro del monitor los rec compartidos. Por otra parte, un monitor puede proporcionar la sincronización de procesos mediante el uso de 1 variables de condición y de las operaciones wait_mon y signa1_mon. Nótese que el protocolo sincronización se implementa dentro del propio monitor, en concreto, dentro de sus procedimien no en los procesos como ocurría cuando se usaban semáforos, lo que facilita la comprobación de sincronización y la depuración de errores. Por lo tanto si un monitor está bien definido, la sincronización de los procesos está garantizada. Mi tras que en el caso de los semáforos la sincronización se garantiza si se han programado adecuadame . las operaciones sobre los semáforos en el código de los procesos. En consecuencia, el programador debe poner cuidado en la definición correcta del monitor, para la sincronización se realice correctamente. Si omite alguna operación signa 1_mon (X) dentro de procedimiento del monitor los procesos que estaban bloqueados en la cola de la variable de condició se quedarán permanentemente bloqueados.
Sincronización y comunicación de procesos
149
'emplo 4.10
Figura 4.15 se muestra en pseudocódigo la solución mediante el uso de un monitor al problema de :nxluctores y los consumidores con buffer limitado. nitor monl tiene definidas dos variables de condición lleno y vacío, una variable entera ::ado r y dos procedimientos escribir y leer. El monitor inicializa la variable contador decir, el buffer está inicialmente vacío. se ejecuta un productor, en primer lugar produce un dato mediante produc i r _ da to y a con-ón invoca al procedimiento escribir del monitor monl para escribir un dato en el buffer. Si no ningún proceso ejecutando algún procedimiento del monitor entonces el productor puede acceder 'tor y ejecutar dicho procedimiento. En caso contrario, tendrá que esperar bloqueado en la cola da del monitor. Cuando termine de ejecutar dicho procedimiento volverá a empezar desde el -:mcedirniento escribir del monitor monl, en primer lugar comprueba si contador es igual decir, si el buffer está lleno. En caso afirmativo ejecuta wait_mon (lleno) para bloquear o en la cola asociada a la variable de condición 11 eno hasta que haya espacio en el buffer. er no estaba lleno entonces inserta el dato en el buffer e incrementa en una unidad el valor t ador. Finalmente comprueba si el contador es igual a 1, es decir, ha dejado de estar vacío. afirmativo, realiza una operación signal_mon (vacío) para desbloquear a algún proceso .m::s::mi-dor que estuviera esperando en la cola asociada a la variable vacío a que hubiese algún dato parte cuando se ejecuta un consumidor en primer lugar invoca al procedimiento leer del monitor - para obtener un dato del buffer. Si no existe ningún proceso ejecutando algún procedimiento 'tor, entonces el productor puede acceder al monitor y ejecutar dicho procedimiento. En caso .-t:::::::i-o tendrá que esperar bloqueado en la cola de entrada del monitor. Cuando regresa de ejecutar :xocedimiento entonces consume un dato (consumir_dato) y vuelve al comienzo. ::::a:edJ'Lmi'ento leer del monitor monl, en primer lugar comprueba si la variable contador es igual ir, si el buffer está vacío. En caso afirmativo ejecuta una operación wait_mon (vacío) para aJl:ü~ al proceso en la cola asociada a la variable de condición vacío hasta que haya algún dato en . Si el buffer no estaba vacío entonces extrae un dato del buffer y decrementa en una unidad el 1 contador. Finalmente comprueba si el contador es igual a N-1, es decir, ha dejado de estar lleno. afirmativo realiza una operación s ignal_mon (lleno) para desbloquear a algún proceso "B::::m',dor que estuviera esperando en la cola asociada a la variable 11 eno a que hubiese espacio en el
•
• 150
Fundamentos básicos de los sistemas operativos
#define TRUE 1 #define N 100 /* Capacidad del buffer */ monitor monl condición lleno, vacio; int contador; char buffer [N] ; void escribir(int dato) /* Procedimiento del monitor */ if (contador==N) wait_mon(lleno); insertar_dato (buffer, dato) ; contador=contador+l; if (contador==l) signal_mon(vacio); void leer ( int dato); /*Procedimiento del monitor */ if (contador==O) wait_mon(vacio); extraer_dato (buffer, dato); contador=contador-l; if (contador==N-l) signal(lleno);
contador=O;
/* Inicialización del monitor */
end monitor void productor ( ) while (TRUE)
{ dato=producir_dato() ; monl. escribir (dato) ;
void consumidor() while (TRUE)
{ monl.leer (dato) ; consumir_dato (dato) ;
void main( ) ej ecución_concurrente (productor, consumidor)
Figura 4.15 - Solución con un monitor al problema de los productores y los consumidores
Sincronización y comunicación de procesos
151
Paso de mensajes Definición Los semáforos y los monitores son mecanismos de sincronización de procesos concurrentes que ren para su implementación el uso de un espacio de memoria compartida por dichos procesos. Estos __..A.a.L,." mos resultan muy útiles en sistemas monoprocesador o multiprocesador, los cuales disponen de muca memoria principal. Sin embargo, su utilización en sistemas distribuidos formados por múltimáquinas, cada una con su procesador o procesadores y su memoria principal, conectadas por una área local resulta ineficaz y lenta. Por otra parte, los semáforos y los monitores no son mecanismos _ realizar la comunicación entre procesos, en el sentido de que no posibilitan el intercambio explícito ormación entre ellos. "3 paso de mensajes es un mecanismo de sincronización y comunicación entre procesos soportado istemas operativos tanto de sistemas centralizados como distribuidos. Un mensaje es un conjunto -ormación que puede ser intercambiada entre un proceso emisor y un proceso receptor. Básicamente operaciones básicas que se pueden realizar sobre un mensaje son: send(destino, mensaje) receive(fuente, mensaje)
El proceso emisor envía (send) un mensaje a un determinado proceso (destino), y el proceso or recibe (recei ve) el mensaje procedente del emisor (fuente). Estas operaciones son invopor los procesos mediante el uso de las llamadas al sistema apropiadas. Nótese que el argumento -- ~aj e es la dirección de memoria de la estructura de datos que contiene el mensaje a enviar a - :o::i n o, o de la estructura de datos donde se almacenará el mensaje a recibir de fuente. Conviene que el nombre que reciben estas operaciones depende de cada sistema operativo . .....0 aspectos básicos a considerar en el diseño del mecanismo de paso de mensajes de un sistema -....,..,.,m·",'o son: la especificación de la fuente y el destino del mensaje, el esquema de sincronización o, el formato del mensaje y el medio de almacenamiento de los mensajes. En las siguientes - nes se abordan estos aspectos de diseño. Finalmente la última sección se dedica a ilustrar el uso ecanismo de mensajes mediante varios ejemplos.
Especificación de la 'fuente y el destino del mensaje operaciones send y recei ve deben incluir información sobre el destino y la fuente del menpara poder establecer una correcta comunicación entre procesos. En función de dicha información en distinguir dos tipos de comunicación: comunicación directa y comunicación indirecta.
-AS
cación directa
:.10,................"
En la comunicación directa el proceso emisor del mensaje especifica explícitamente en la operación - - - el proceso al que va dirigido el mensaje:
152
Fundamentos básicos de los sistemas operativos
send(P_receptor, mensaje) Donde P_receptor es el identificador del proceso receptor del mensaje. Por su parte, el proceso receptor del mensaje especifica explícitamente en la operación recei ve el proceso emisor del mensaje:
receive(P_emisor, mensaje) Donde P_ emi sor es el identificador del proceso emisor del mensaje. Otra posibilidad, es que el proceso receptor del mensaje especifique implícitamente en la operación recei ve el proceso emisor del mensaje:
receive(ident, mensaje) Donde ident toma el valor del identificador del proceso con el que se ha realizado la comunicación. el cual no se sabe a priori, sino una vez que se completa la operación recei ve. La comunicación directa con especificación explícita de los identificadores de los procesos receptor y emisor es útil para procesos concurrentes cooperantes. Mientras que la comunicación directa co especificación explícita del identificador del receptor pero implícita del emisor resulta útil cuando un proceso realiza una operación en función del mensaje enviado por un proceso emisor que no se pued conocer a priori, sino una vez que se ha establecido la comunicación. Por ejemplo, un proceso servid de impresión debe aceptar un mensaje de solicitud de impresión de cualquier otro proceso, desconoci a priori. La comunicación directa posee como principal ventaja que permite establecer un enlace seguro entre el proceso emisor y receptor para el intercambio de mensajes. Sin embargo, el tener que conocer c antelación la identidad de los procesos emisores y receptores, no resulta útil para proporcionar servici del sistema operativo ya que no se conoce con antelación quién los va a solicitar. Comunicación indirecta En la comunicación indirecta el proceso emisor envía el mensaje a una estructura de datos compartí denominada buzón que se implementa como una cola de mensajes. Por su parte, el proceso recep solicita recibir el mensaje de dicho buzón. Además previamente a las operaciones de emisión o recepci un proceso (emisor o receptor) tiene que solicitar mediante una llamada al sistema la creación del buz ' En la comunicación indirecta las operaciones send y recei ve toman la siguiente forma:
send(buzón, mensaje) receive(buzón, mensaje) La comunicación indirecta es más flexible que la comunicación directa ya que permite difere esquemas de difusión de mensajes: • Un emisor - un receptor. Un proceso emisor envía un mensaje a un buzón para que lo recoj a determinado proceso receptor. Este esquema es útil cuando se desea una comunicación pri\ entre procesos.
~
Sincronización y comunicación de procesos
153
• Un emisor - varios receptores. Un emisor envía un mensaje a un buzón para que lo puedan leer varios receptores. Este esquema es útil cuando se requiere difundir una determinada información entre varios procesos. • Varios emisores - un receptor. Varios procesos emisores envían mensajes a un buzón, que en este caso se suele denominar puerto, para que los lea un único proceso receptor. Este esquema es útil para implementar aplicaciones del tipo cliente/servidor, donde diferentes procesos clientes realizan peticiones para ser atendidas por un determinado proceso servidor. • Varios emisores - varios receptores. Varios procesos emisores envían mensajes a un buzón para que sean leídos por varios procesos receptores. Este esquema permite a varios procesos servidores atender concurrentemente a varios procesos clientes.
n buzón o cola de mensajes puede ser propiedad de un proceso o del sistema operativo. Si el buzón piedad de un proceso, entonces se implementa en el espacio de direcciones de dicho proceso. este caso solo el proceso propietario puede recibir mensajes de dicho buzón. Cuando el proceso ietario finaliza entonces el buzón desaparece. Si algún proceso posteriormente envía mensajes a este , debe ser notificado de la no existencia del mismo. Por otra parte, si el buzón es propiedad del sistema operativo, entonces se implementa en el espacio . ecciones del núcleo, por lo que es independiente de cualquier proceso. En este caso el sistema .va debe proporcionar llamadas al sistema para crear y borrar el buzón. El proceso que crea un , es considerado su propietario. Inicialmente solo el propietario puede leer mensajes del buzón pero privilegio se puede compartir con otros procesos mediante las llamadas al sistema adecuadas. En - uencia puede existir varios receptores.
Esquemas de sincronización En función de si el proceso emisor o el proceso receptor pueden pasar al estado bloqueado al realizar operación send o recei ve se pueden distinguir los siguientes casos:
• Operación send con bloqueo. El proceso emisor pasa al estado bloqueado hasta que el mensaje ea recibido por el proceso receptor o por el buzón. • Operación send sin bloqueo. El proceso emisor envía el mensaje a un proceso receptor o a un buzón y continúa su ejecución. Un problema asociado a esta implementación es que un proceso, por error o intencionadamente, puede estar enviando continuamente mensajes, lo que repercute en el rendimiento del sistema ya que se están consumiendo tiempo de procesador y espacio de almacenamiento. Otro inconveniente es que el programador debe implementar mecanismos para determinar si un mensaje ha sido recibido, normalmente mediante el uso de mensajes de respuesta. • Operación recei ve con bloqueo. El proceso receptor pasa al estado bloqueado en espera de recibir un mensaje de un proceso emisor o de que exista algún mensaje en el buzón. Presenta como inconveniente que el receptor puede quedarse indefinidamente bloqueado si el proceso emisor fi naliza antes de enviar el mensaje o si el mensaje se pierde en el caso de un sistema distribuido.
,. 154
Fundamentos básicos de los sistemas operativos
• Operación recei ve sin bloqueo. El proceso receptor obtiene de un proceso emisor o de un buzón un mensaje válido o uno nulo y continua su ejecución. Su principal desventaja es que si se ejecuta antes que llegue el mensaje, éste puede perderse. La combinación de estos cuatro casos posibilita cuatro posibles esquemas de sincronización: • Envío y recepción sin bloqueo. • Envío sin bloqueo y recepción con bloqueo. Es uno de los esquemas de sincronización más utilizado. • Envío con bloqueo y recepción sin bloqueo. • Envío y recepción con bloqueo. A este esquema de sincronización se le conoce como cita (rendezvous) entre el emisor y el receptor.
4.6.4.
Formato y almacenamiento de los mensajes
De forma general un mensaje consta de dos partes: la cabecera del mensaje y el cuerpo del mensaje. La cabecera del mensaje contiene información de control del mensaje como por ejemplo: el tipo y la prioridad del mensaje, identificadores del destino y origen del mensaje, la longitud o tamaño del mensaje. punteros a otros mensajes de la cola de mensajes, etc. El cuerpo del mensaje contiene el contenido propiamente dicho del mensaje. La longitud de un mensaje puede ser fija o variable, es el sistema operativo el que dicta la longitud de mensajes que soporta. Los mensajes de longitud fija son más fáciles de implementar para un sistema operativo, ya que se almacenan en bufferes de tamaño fijo, lo que hace más sencilla y eficaz su asignación. Su principal desventaja es que complican a los programadores la creación de los procesos emisore . ya que los mensajes largos deben ser divididos y enviados en varios mensajes del tamaño de mensaje soportado, lo que puede producir problemas de secuenciamiento con los procesos receptores. Por el contrario, los mensajes de longitud variable facilitan al programador la programación de lo procesos emisores. Sin embargo, su implementación a nivel del sistema operativo es más compleja, ya que ahora tiene que asignar trozos de memoria de tamaño variable, según el tamaño de cada mensaje, lo cual aumenta la sobrecarga y puede producir problemas de fragmentación de memoria. Los mensajes, independientemente de si la comunicación es directa o indirecta con el uso de buzone . se estructuran en colas de mensajes que consumen espacio de memoria. Dependiendo de la capacidad de las colas de mensajes se distinguen dos tipos de mecanismos de mensajes: • Mecanismo de mensajes sin buffer. Las colas de mensajes son de capacidad nula, por lo que lo mensajes nunca pueden esperar. El proceso emisor se bloquea hasta que el receptor recibe el mensaje. • Mecanismo de mensajes con buffer. Las colas de mensajes permiten almacenar temporalmente un número finito de mensajes. Cada vez que llega un mensaje se añade a la cola y cada vez que un proceso lee un mensaje se borra (salvo que se especifique lo contrario). Si la cola está llena, el proceso emisor se bloquea hasta que exista espacio disponible en la cola.
Sincronización y comunicación de procesos
155
La forma más simple de gestionar una cola de mensajes es utilizando un algoritmo de tipo FIFO,
os mensajes se entregan a los procesos receptores por orden de llegada. También el emisor puede send la prioridad del mensaje enviado, por lo que el sistema operativo entrega ero a los receptores los mensajes de mayor prioridad. Otra alternativa es que el proceso receptor ·_-....-;·ifi que al invocar la operación recei ve el tipo de mensaje que desea recibir, entonces el sistema ega el mensaje de la cola que se ajuste al tipo especificado.
....ooor.......'·cllcar en la operación
Uso del paso de mensajes E paso de mensajes se utiliza para implementar la comunicación directa o indirecta entre procesos, posibilitan el intercambio explícito de información. Además, el paso de mensajes se puede utilizar garantizar la exclusión mutua y como un mecanismo de sincronización, al igual que los semáforos monitores. plo 4.11 , gase N procesos que se ejecutan concurrentemente y que acceden a un recurso compartido. Se puetizar el acceso con exclusión mutua al recurso utilizando mensajes. Se va a suponer que se dise la operación send sin bloqueo y de la operación recei ve con bloqueo y que la comunicación cta a través de un buzón buzónl que se debe crear con la llamada al sistema crear_ buzon.
TRUE 1
N 5
/* Número de procesos */
- ?roceso(int i) mensaje testigo; wh ile (TRUE)
{
/ * sección no critica */ receive(buzon1,testigo) ; / * sección cr itica */ send(buzon1, testigo) ; / * sección no critica */
i n() mensaje nulo; crea r_buzón(buzon1 ); send (buzon1,nulo) ; ejecución_concurrente (proceso (1) , . . . ,proceso(N));
Figura 4.16 - Exclusión mutua mediante paso de mensajes
= 156
Fundamentos básicos de los sistemas operativos
La cola de mensajes se inicializa fuera del código de los procesos con un mensaje que no requiere tener ningún contenido y que se denotará como nulo. En la Figura 4.16 se muestra en pseudocódigo basado en el lenguaje C un programa para garantizar la exclusión mutua mediante paso de mensajes. Un proceso que desea ejecutar su sección crítica primero debe ejecutar una operación recei ve para recibir un mensaje. Si el buzón está vacío entonces se bloquea hasta que llegue un mensaje a la cola. Cuando dicho evento ocurra entonces el proceso obtiene el mensaje (que se supone que se borra de cola) y puede sea entrar en su sección crítica. Cuando sale ejecuta una operación send para enviar el mensaje de nuevo a la cola, y permitir que otro proceso que estuviera bloqueado en la cola de mensajes pueda desbloquearse y acceder a su región crítica. En conclusión, en la cola solo puede haber un mensaje simultáneamente y dicho mensaje actúa como testigo que es pasado entre los procesos para irse cediendo el uso del recurso y garantizar así la exclusión mutua. Obviamente si hubiesen H recursos disponibles la cola se debe inicializar con H mensajes nulos, la exclusión mutua se garantizaría permitiendo un máximo de H mensajes simultáneamente en la cola .
• • Ejemplo 4.12 Supóngase que se desea sincronizar la ejecución de un proceso A con la de otro proceso B. En concreto e proceso A requiere para poder continuar su ejecución que el proceso B realice alguna acción. Supóngase además que se dispone de la operación send sin bloqueo y la operación recei ve con bloqueo y que la comunicación es indirecta a través de un buzón buzónl que se debe crear con la llamada al sistema crear_buzan. El mensaje que se va enviar no requiere tener ningún contenido. En la Figura 4.17 se muestra en pseudocódigo basado en el lenguaje C un programa que implementa la sincronización entre los procesos A y B mediante paso de mensajes. Para conseguir la sincronización el proceso A debe ejecutar una operación recei ve cuando debe esperar por una acción que debe realizar el proceso B. Por su parte, el proceso B debe ejecutar una operaci ' send cuando termine de ejecutar dicha acción. Si se ejecuta antes la operación recei ve del proceso A que la operación send del proceso B, entone el proceso A se quedará bloqueado a la espera de la recepción del mensaje. En caso contrario el proce A continuará su ejecución, eso significa que el proceso B ya ha realizado la acción por la que iba esperar el proceso A, y en consecuencia no tiene necesidad de esperar.
• Ejemplo 4.13 En la Figura 4.18 se muestra en pseudocódigo basado en el lenguaje C la solución mediante el uso mensajes al problema de los productores y los consumidores con buffer limitado. En esta solución se supone que se dispone de las operaciones send sin bloqueo y recei ve con bl queo. Se utilizan dos buzones buzónyroduzca y buzón_consuma. Los productores a medida producen datos los envían a buzón_consuma, que hace las veces del buffer de almacenamiento c .
Sincronización y' comunicación de procesos
157
""""-4n-", está determinado por la constante N. Si dicho buzón no contiene mensajes el consumidor se
bloqueado. o contrario, el consumidor lo extrae de la cola y envía un mensaje a buzón_produzca, que la actividad del productor. Este buzón se inicializa antes de invocar a los productores y consumicon N mensajes nulos. Además su capacidad disminuye cada vez que se produce un dato y aumenta "eZ que se consume uno.
•
-::.:...:J.e TRUE 1; : ?roc esoA ()
=-saj e X; wh ile (TRUE )
{ / * Código previo */ receive(buzon1 , X); /* Esperar a que el proceso B realice una acción */ / * Código posterior */
?rocesoB()
:e:::saj e Y; while (TRUE) { / * Realizar acción para el proceso A */ send(buzon1, Y); /* Avisar al proceso A */ / * Código posterior */
.; =ain ( )
crear_buzón (buzon1) ; ejecución_concurrente (procesoA, procesoB);
Figura 4.17 - Sincronización de dos procesos mediante paso de mensajes
158
Fundamentos básicos de los sistemas operativos
#define TRUE 1 #define N 100 /* Tamaño del buffer */ void productor () mensaje X; while (TRUE) { receive (buzón-produzca, X) ; producir_dato (X) ; send(buzón_consuma,X ) ;
void consumidor() mensaje Y; while (TRUE) { receive(buzón_consuma,Y ) ; consumir_dat o (y) ; send(buzón-produzca,Y) ;
void main () int h; mensaje nulo; crear buzón (buzón_consuma ) ; crear_buzón (buzón-produzca) ; for(h=l; h<=N,h++) { send (buzon-produzca, nulo) ;
ejecución_concurrente (productor, consumidor);
Figura 4.18 - Solución mediante paso de mensajes al problema de los productores y los consumidores
Sincronización y comunicación de procesos
159
Resumen La ejecución concurrente de procesos presenta problemas relacionados con la falta de predicción
velocidad relativa de ejecución de un proceso, que depende de la política de planificación, del .ento de interrupciones y de la actividad de otros procesos.
En función de la forma y grado de interacción entre múltiples procesos que se ejecutan de forma rnrrente, se pueden distinguir dos tipos de procesos: procesos independientes, que no tienen en cuenta - encia de otros programas; y procesos cooperantes, que intercambian información entre sí para --.,--...,.rti·r un recurso o realizar alguna tarea. procesos independientes también utilizan recursos compartidos, pero en lugar de cooperar, compor el uso de dichos recursos. La condición de carrera es un problema derivado de estas situaciones, el resultado final de la ejecución de un proceso depende del orden de la planificación de los pro-3
forma de controlar el acceso de procesos concurrentes a un recurso global compartido consiste en al recurso como un recurso crítico. Para ello hay que especificar que el conjunto de instrucciones _' 'go del programa que utiliza dicho recurso es una sección crítica del programa, y garantizar la on mutua en el uso de la sección crítica asociada a dicho recurso compartido, es decir, garantizar lo un proceso a la vez pueda estar ejecutando una sección crítica del programa. exclusión mutua puede conseguirse mediante soluciones software, como por ejemplo: el uso de ~jo y alternancia estricta, y el algoritmo de Peterson. Estas soluciones software no presuponen _o del sistema operativo ni del hardware. Su principal inconveniente es que cualquier proceso que entrar en una sección crítica, si está siendo ejecutada por otro proceso, debe esperar a que éste r::;::e mediante la ejecución de un bucle que comprueba el valor de una condición basada en el valor o varias variables globales. Esta variable hace las veces de cerrojo. Cuando el valor del cerrojo eba dentro de un bucle se habla de cerrojo con vuelta. A dicho tipo de espera se le denomina activa, y supone un problema si se dilata mucho en el tiempo ya que consume valiosos ciclos de , procesador que podrían ser utilizados para ejecutar otros procesos. exclusión mutua también puede obtenerse mediante soluciones hardware, como por ejemplo: de instrucciones máquina especiales y el bloqueo de interrupciones. Las instrucciones máquina c:z~-;a¡es bloquean el uso del bus, garantizando así que ningún procesador pueda acceder a una posición "-"-""''T'Ioria accedida previamente por otro procesador hasta que haya finalizado su uso. instrucciones máquina especiales son atómicas, es decir, se ejecutan en un único ciclo de ins_o:.::::1·n que no puede ser interrumpido, por lo que su ejecución siempre se completa. Su principal in·-""""""-ente es la espera activa. Otra solución hardware es el bloqueo de las interrupciones, donde un III=~O ejecuta una instrucción especial para bloquear el mecanismo de interrupciones antes de entrar región crítica. Su principal inconveniente es que puede afectar al rendimiento sistema. Además en los sistemas multiprocesador. olución a la exclusión mutua ofrecida por los sistemas operativos son los semáforos, los cuales e pueden usar para la sincronización de procesos. Se define un semáforo S como una variable cena un valor entero, y sobre la que se pueden realizar tres operaciones básicas:
s 160
Fundamentos básicos de los sistemas operativos
• ini t _ sem (8, N) . Asignación de un valor inicial entero no negativo, es decir, 8=N. • wa i t s em (8) . Disminución en una unidad del valor del semáforo, es decir, 8 = 8 -1. Si el valor resultante es negativo el proceso se añade a la cola de procesos bloqueados asociada al semáforo. • signa1_sem (8). incremento en una unidad el valor del semáforo, es decir, 8=8+1. Si el valor resultante es menor o igual a O se elimina de la cola del semáforo a uno de los procesos bloqueado y se le pasa al estado preparado.
Para realizar una operación sobre el semáforo, un proceso tiene que realizar una llamada al sistema operativo, que se encarga de asignar estructuras de datos para los semáforos y realizar la operación correspondiente. El sistema operativo implementa las operaciones wait_sem y signa1_sem como primitivas o funciones elementales de su código que se ejecutan de forma atómica. Algunos compiladores de lenguajes de alto nivel, como Java o Modula-2, soportan el uso de monitores, que son un mecanismo basado en semáforos que garantiza por su propia construcción la exc1usió mutua. Un monitor es un módulo que consta de un conjunto de procedimientos, variables y estructuras de datos, con la propiedad especial de que solo permite a un proceso a la vez la ejecución de alguno d sus procedimientos. Además, las variables del monitor solo son accesibles por los procedimientos de monitor. Para sincronizar procesos, un monitor dispone de las variables de condición, que tiene asociad una cola de procesos bloqueados en espera de que se cumpla dicha condición. Sobre una variable de condición X se pueden realizar dos posibles operaciones: • wa i t _ mon (X) . El proceso dentro del monitor que realiza esta operación queda suspendido una cola de procesos asociada al cumplimiento de la condición X. En consecuencia otro proce puede entrar en el monitor. • signa 1_mon (X) . Comprueba si la cola de procesos asociada a la condición X contiene al proceso bloqueado. En caso afirmativo se desbloquea a un proceso. Si la cola estaba vacía e operación no tiene ningún efecto
En relación a qué sucede con el proceso que invoca la operación signa1_mon (X) existen vari posibilidades: que se bloquee e ingrese en una cola de condición, que salga del monitor, o que contin su ejecución hasta finalizar el procedimiento del monitor o bloquearse en una variable' de condición. Los procesos, en ocasiones también tienen la necesidad de intercambiarse datos entre sí. La may de los sistemas operativos disponen de mecanismos de comunicación entre procesos, como por ejemp el paso de mensajes. Un mensaje se define como un conjunto de información que puede ser intercambi entre un proceso emisor y un proceso receptor. Las dos operaciones básicas que se pueden realizar so un mensaje son send (enviar) y recei ve (recibir). En la especificación de la fuente y el destino del mensaje, se pueden distinguir dos tipos de co nicación: comunicación directa y comunicación indirecta. En la comunicación directa el proceso emis del mensaje especifica explícitamente en la operación send el proceso al que va dirigido el men _ y el proceso receptor especifica en la operación recei ve el proceso emisor del mensaje. Tiene co ventaja el establecimiento de un enlace seguro entre el proceso emisor y receptor, pero presenta c
Sincronización y comunicación de procesos
161
nveniente que no es útil para proporcionar servicios del sistema operativo, dado que no se conoce antelación quién los va a solicitar. En la comunicación indirecta el proceso emisor envía el mensaje a una estructura de datos denominabuzón que se implementa como una cola de mensajes, y el proceso receptor solicita recibir el mensaje ·cho buzón. Es más flexible que la comunicación directa ya que permite diferentes esquemas de ·ón de mensajes: un emisor-un receptor, un emisor-varios receptores, varios emisores-un receptor y emisores-varios receptores. En función de si el proceso emisor o receptor pueden pasar al estado bloqueado al realizar una ción send o recei ve se pueden distinguir cuatro casos: operación send con bloqueo, operación z=-d sin bloqueo, operación recei ve con bloqueo, y operación recei ve sin bloqueo, que dan lugar o posibles esquemas de sincronización posibles: envío y recepción sin bloque, envío sin bloqueo pción con bloqueo (que es el más utilizado), envío con bloqueo y recepción sin bloqueo, y envío y ión con bloqueo. _-\.demás de para la comunicación de procesos, el paso de mensajes puede utilizarse, al igual que los , oros y los monitores, para resolver el problema de la exclusión mutua y para la sincronización de os.
Lecturas recomendadas i e desea obtener una explicación adicional de los contenidos tratados en este capítulo se pueden tar, por ejemplo: el capítulo 5 de [Sta1lings, 2005], el capítulo 2 de [Tanenbaum, 2009] y el capitulo [Silberschatz et. al, 2002]. Asimismo, en cualquiera de estos libros, se pueden encontrar numero=ferencias adicionales con contenidos más avanzados sobre la sincronización y comunicación de -,-·~....,ovs.
vr otra parte, si no se está familiarizado con el lenguaje de programación e en el que se basa eodocódigo de los programas que se incluyen en este capítulo, se pueden consultar, por ejemplo, .ed, 2005] y [Kernighan y Ritchie, 1991].
Autoevaluación Explicar cuándo se produce y en qué consiste el problema de la condición de carrera. espuesta en sección 4.2.2)
¿Qué es una sección cTÍtica? (Respuesta en sección 4.2.3) ¿En que consiste la exclusión mutua? ¿Qué problema permite resolver? (Respuesta en sección 4.2.4) Explicar brevemente los problemas que puede producir el uso de la exclusión mutua si no se implementa correctamente. (Respuesta en sección 4.2.4) - ¿Qué requisitos debe cumplir el mecanismo o técnica que se utilice para implementar la exclusión mutua? (Respuesta en sección 4.2.4)
s:g:::
162
Fundamentos básicos de los sistemas operativos
4.6. ¿Por qué se caracterizan las dos soluciones software a la exclusión mutua descritas en el texto? ¿Cuál es su principal inconveniente? (Respuesta en sección 4.2.5) 4.7. ¿Cómo se puede lograr la exclusión mutua usando un cerrojo y alternancia estricta? ¿Qué problemas presenta esta solución software? (Respuesta en sección 4.2.5) 4.8. ¿Qué acciones se realizan en la función a e e e s o _ s e del algoritmo de Peterson? ¿Yen la función sal ida_se ? (Respuesta en sección 4.2.5) 4.9. ¿Por qué el algoritmo de Peterson evita la posibilidad de interbloqueo de procesos? (Respuesta en sección 4.2.5) 4.10. Cuando se utiliza el algoritmo de Peterson ¿puede un proceso monopolizar el uso de un recurso? (Respuesta en sección 4.2.5) 4.11. ¿Cómo se garantiza la exclusión mutua mediante el uso de instrucciones máquina especiale '? ¿Cuáles son sus principales inconvenientes? (Respuesta en sección 4.2.6)
4.12. ¿Cómo se garantiza la exclusión mutua mediante el uso del bloqueo de las interrupciones? ¿Cuáles son sus principales inconvenientes? (Respuesta en sección 4.2.6) 4.13. ¿Qué son los semáforos? (Respuesta en sección 4.3.1) 4.14. Describir el funcionamiento de las operaciones ini t _sem, wai t _sem, signal_ sem cuand se aplican sobre un semáforo general y cuando se aplican sobre un semáforo binario. (Respuesta en sección 4.3 .1) 4.15. ¿Cómo implementa el sistema operativo las operaciones sobre un semáforo? (Respuesta en sección 4.3.2) 4.16. Describir cómo se usan los semáforos para obtener el acceso con exclusión mutua a un recurso. (Respuesta en sección 4.3.3) 4.17. Describir cómo se usan los semáforos para sincronizar procesos. (Respuesta en sección 4.3.3) 4.18. ¿Qué problemas potenciales se pueden producir debido a un mal uso de los semáforos? (Respuesta en sección 4.3.4) 4.19. ¿Qué es un monitor? (Respuesta en sección 4.5.1) 4.20. ¿ Qué utilidad tienen las variables de condición de un monitor? ¿Tienen asociada algún tipo " cola? (Respuesta en sección 4.5.1) 4.21. Describir el funcionamiento de las operaciones wai t _ mon y signal_mon de un monitor. (Respuesta en sección 4.5.1)
Sincronización y comunicación de procesos
163
Explicar qué sucede con un proceso que invoca una operación signa 1_mon según la solución de: a) Hoare. b) Hansen. c) Lampson y Redell. (Respuesta en sección 4.5.1) Describir cómo se obtiene en un monitor el acceso con exclusión mutua a un recurso. (Respuesta en sección 4.5.3) I
Describir cómo se obtiene en un monitor la sincronización de procesos. (Respuesta en sección 4.5.3)
- ¿Qué es el paso de
mens~es?
(Respuesta en sección 4.6.1)
¿Qué es un mensaje? ¿Cuáles son las dos operaciones básicas que se pueden realizar sobre un mensaje? (Respuesta en sección 4.6.1) • ¿Cuáles son los aspectos básicos en el diseño del mecanismo de paso de mensajes? (Respuesta en sección 4.6.1) Explicar cómo se realiza la comunicación directa mediante paso de mensajes. espuesta en sección 4.6.2) • Explicar cómo se realiza la comunicación indirecta mediante paso de mensajes. ¿Qué esquemas de difusión de mensajes posibilita? (Respuesta en sección 4.6.2) Describir el funcionamiento de un buzón que sea propiedad de: a) Un proceso. b) El sistema operativo. (Respuesta en sección 4.6.2) Enumerar los cuatro esquemas de sincronización posibles en el mecanismo de paso de mensajes. espuesta en sección 4.6.3) Describir las partes de un mensaje. (Respuesta en sección 4.6.4) Describir las principales ventajas e inconvenientes relativas a que la longitud de un mensaje sea fij a o variable. (Respuesta en sección 4.6.4) Describir los mecanismos de mensajes posibles en función de la capacidad de las colas de mensajes. (Respuesta en sección 4.6.4) upuesto que se dispone de la operación send sin bloqueo, de la operación recei ve con bloqueo _ que la comunicación es indirecta a través de un buzón. Describir cómo se puede obtener mediante o de mensajes: a) La sincronización de procesos. b) El acceso con exclusión mutua a un recurso. 'Respuesta en sección 4.6.5)
s 164
Fundamentos básicos de los sistemas operativos
4.10. Problemas 4.1. En una oficina municipal de atención al ciudadano existen 5 ventanillas. Cuando un ciudadano entra en la oficina para realizar alguna gestión debe guardar una única cola hasta que alguna ventanilla queda libre. Escribir el pseudocódigo de un programa que coordine la actividad de lo ciudadanos en la oficina usando: a) Semáforos binarios. b) Semáforos generales. c) Un monitor de nombre o f i e ina, considerar la solución de Hansen en el comportamiento de la operación signal_ffion. d) Paso de mensajes, suponer que la comunicación es indirecta a través de buzones y que se dispone de la operación send sin bloqueo y de la operación recei ve con bloqueo. 4.2. Dos procesos A y B se ejecutan concurrentemente en un determinado sistema. El proceso A ejecuta unas tareas (tareas 1 ( ) ) y alcanza un punto de encuentro. Posteriormente realiza otras tareas (tareas _ 2 ( ) ) y finaliza. Por su parte el proceso B ejecuta unas tareas (tareas _ 3 ( ) ) y llega al punto de encuentro. Posteriormente realiza otras tareas (tareas _ 4 ( ) ) y finaliza. El prime proceso que llega al punto de encuentro no puede continuar su ejecución hasta que no llegue e otro proceso. No se sabe qué proceso comienza a ejecutarse primero o cuál es el primero que termina. Escribir el pseudocódigo de un programa que coordine la actividad de los procesos A . B usando: a) Semáforos. b) Paso de mensajes, suponer que la comunicación es indirecta a tra és de buzones y que se dispone de la operación send sin bloqueo y de la operación recei ve ca bloqueo.
4.3. El baño de caballeros de un centro comercial posee una capacidad para seis caballeros. Cuando e servicio está completo los caballeros que desean pasar deben esperar fuera haciendo cola al lade de la puerta. Además si el operario de limpieza está limpiando el baño no puede pasar nin ' caballero. Por otra parte, el operario solo pasa a limpiar el baño si éste está vacío. Escribir el p e docódigo de un programa que usando semáforos binarios coordine la actividad de los caballero . del operario de limpieza. 4.4. Una peluquería tiene una capacidad para N clientes (N - 1 sillas para esperar y un sillón p cortar el pelo). Si no hay clientes a quienes atender el peluquero se pone a dormir en el sill ' El primer cliente que entra en la peluquería despierta al peluquero y se queda de pie esperando que el peluquero se prepare y le indique que se puede sentar en el sillón. Si un cliente entra a peluquería y ve que la peluquería está completa entonces se marcha. En caso contrario se sie en una silla y espera hasta que le llegue su tumo de cortarse el pelo para levantarse. El peluqu avisa al cliente que le toca para que se siente en el sillón. Además le indica cuando ha terminado cortarle el pelo. Escribir el pseudocódigo de un programa que usando semáforos binarios coor la actividad del peluquero y de sus clientes. 4.5. En un restaurante autoservicio inicialmente vacío existen M puestos para comer. Cuando un clie ~ llega al restaurante lo primero que hace es buscar un puesto libre, si no encuentra ninguno _ marcha. Si encuentra algún puesto libre lo reserva dejando allí sus cosas. A continuación coge. necesidad de esperar ninguna cola, lo que desea comer de unos mostradores. Luego se pone en
Sincronización y comunicación de procesos
165
cola para que le cobre un dependiente. Finalmente vuelve a su puesto para comer. El dependiente solo atiende a los clientes de uno en uno y debe ser avisado por el cliente para que le cobre. Cuando no está cobrando a los clientes el dependiente se dedica a reponer los mostradores. Escribir el pseudocódigo de un programa que usando semáforos binarios coordine la actividad de los clientes y del dependiente. Cinco filósofos están sentados en una mesa circular con cinco platos de espaguetis y cinco tenedores. Cada tenedor está situado en la mesa entre dos platos. Un filósofo cuando se cansa de pensar y le entra hambre tiene que coger dos tenedores para comer su plato de espaguetis. No puede coger los dos tenedores simultáneamente, es decir, primero coge uno (el de su derecha o el de su izquierda) y después el otro. Cuando sacia su apetito deja los dos tenedores sobre la mesa y continúa pensando. Escribir el pseudocódigo de un programa que usando semáforos coordine la actividad de los cinco filósofos evitando posibles interbloqueos.
pítulo 5
terbloqueo . etivos docentes .....o objetivos docentes de este capítulo son los siguientes:
Saber en qué consiste el problema del interbloqueo y cuáles son las condiciones que se tienen que dar para que se produzca. aber interpretar y realizar grafos de asignación de recursos. Conocer la filosofía y las características de las principales estrategias que un sistema operativo puede adoptar para tratar los interbloqueos: prevención, evitación, y detección y recuperación.
Introducción recursos disponibles en un sistema informático se pueden clasificar en dos grandes categorías: ~;-csi-[tj·[yIOS hardware y elementos software. Ejemplos de recursos hardware son: el procesador, la meprincipal y los dispositivos de EIS (discos duros, impresoras, etc). Ejemplos de elementos software - estructuras de datos: archivos, mensajes, semáforos, etc. De forma general un recurso hardware ",---.....,..T,e se pueden clasificar en alguno de los siguientes tipos: Recurso reutilizable. Es aquél que no se destruye después de ser utilizado. Ejemplos de recursos reutilizables son los recursos hardware y algunos recursos software, como los archivos y los semáforos. Dado un cierto sistema informático el número de recursos reutilizables suele ser fijo. Se be tener en cuenta que pueden existir varias instancias de un mismo recurso. Por ejemplo, si en hay conectadas tres impresoras de las. . ..mismas características, de tal forma que da lo sistema .. __ .. .... ••• •• - - ._• • _ •••• - '"1-- - - . -
~
~~ ~ . _ ~
~
~~~.1
--~.
.~~~~
_~
t"~-~-~~~
~-
~~~
~
~ ~
--~_._
~_._~~,
. mo imprimir en una que en otra, entonces a efectos de asignación de recursos cada instancia - contabiliza como un recurso asignable y reutilizable. Una instancia de un recurso reutilizable lo se puede asignar simultáneamente a un proceso como máximo. Cuando un proceso termina utilizar una instancia de un recurso reutilizable entonces puede ser utilizada por otro proceso. 167
ss 168
Fundamentos básicos de los sistemas operativos
• Recurso consumible. Es aquél que puede producirse (crearse) y consumirse (destruirse). Ejemplo de recursos consumibles son la información en los buffers de E/S y los mensajes. En consecuencia en un sistema el número de recursos consumibles varía con el tiempo. Un recurso consumible e producido por un proceso (productor). Cuando dicho recurso se asigna a otro proceso (consumidor), éste lo consume. En consecuencia el recurso deja de existir y de estar disponible para otro procesos. La ejecución concurrente de un conjunto de procesos que compiten por un grupo de recursos puede provocar un interbloqueo o bloqueo mutuo (deadlock). Por ejemplo, considérense dos procesos A y B que se ejecutan concurrentemente. El proceso A durante su ejecución requiere acceder al disco duro de la máquina y posteriormente a la impresora. Por su parte, el proceso B necesita acceder en primer lugar a la impresora y posteriormente al disco duro. Supóngase que primero se planifica el proceso A y se le concede el acceso al disco duro. En ese momento se planifica el proceso B que accede a la impresora. Si ahora se planifica el proceso A, éste no puede continuar su ejecución porque el proceso B retiene la impresora. Por su parte, el proceso B tampoco puede continuar su ejecución porque el proceso A retiene el disco duro. Se ha producido por tanto un interbloqueo. En el ejemplo anterior los recursos por los que compiten los procesos A y B son recursos reutilizable Pero un interbloqueo también se puede producir por la asignación recursos consumibles. En dicho c un proceso espera por un recurso consumible que nunca se va a producir. Por ejemplo, supóngase uc proceso A que en su código primero invoca una operación recei ve con bloqueo para recibir un mensaje procedente de un proceso B y luego una operación send para enviar un mensaje al proceso B. Por parte el proceso B en su código primero invoca una operación recei ve con bloqueo para recibir mensaje procedente del proceso A y luego una operación send para enviar un mensaje al proceso A. Ambos procesos se van a quedar indefinidamente bloqueados, ya que el proceso A se queda en espera de un mensaje de B que nunca enviará, ya que éste está esperando a que le envíe un mensaje A. Este capítulo está dedicado al estudio del interbloqueo de procesos. En primer lugar se realiza llI12. definición de interbloqueo y se describen las condiciones que se tienen que dar para que se produzc A continuación se definen los grafos de asignación de recursos que permiten ilustrar de forma gráfi la presencia de interbloqueos. Posteriormente, se describen las principales estrategias que un siste operativo puede adoptar para tratar los interbloqueos: prevención, evitación, y detección y recuperació Finalmente se comentan otras posibles estrategias de tratamiento de interbloqueos.
5.2.
Definición y condiciones del interbloqueo
De forma general se puede definir interbloqueo como aquella situación en la cual un conjunto procesos está bloqueado en espera de la liberación de uno o varios recursos que se encuentran asignad a otro proceso del mismo conjunto. Como todos los procesos del conjunto están bloqueados, nin de ellos liberará los recursos que posee y que otro proceso necesita, y en consecuencia ninguno pu continuar su ejecución. Así, un conjunto de procesos se dice que está interbloqueado si cada proceso de dicho conjunto bloqueado en espera de la aparición de un evento que solo puede generar otro proceso bloqueado
Interbloqueo
169
too Para que se produzca un interbloqueo se deben cumplir necesariamente las siguientes cuatro condi[Coffman et al.,1971]:
L Exclusión mutua. Cada instancia de un recurso solo puede ser asignada a un proceso como máximo. _ Retención y espera. Cada proceso retiene los recursos que le han sido asignado mientras espera por la adquisición de los otros recursos que necesita. o existencia de expropiación. Si un proceso posee un recurso, éste no se le puede expropiar. - . Espera circular. Existe una cadena circular de dos o más procesos, de tal forma que cada proceso de la cadena se encuentra esperando por un recurso retenido por el siguiente proceso de la cadena.
-na vez definido lo qué es un interbloqueo y cómo se produce, es el momento de examinar las . ales estrategias que un sistema operativo puede implementar para tratar los interbloqueos: Prevención de interbloqueos. Consiste en impedir que se produzca alguna de las cuatro condiciones necesarias para que se produzca el interbloqueo. Evitación de interbloqueos. Consiste en examinar las posibles consecuencias de asignar los reursas solicitados y evitar el interbloqueo mediante la no asignación de recursos en situaciones potencialmente peligrosas. Detección y recuperación de interbloqueos. Consiste en comprobar cada cierto tiempo el estado del sistema para detectar la existencia de interbloqueos y en el caso de que existan tomar las medidas oportunas para eliminarlos.
tes de analizar en las próximas secciones cada una de estas estrategias más detalladamente se va ·bir en la siguiente sección los grafos de asignación de recursos que permiten ilustrar de forma la aparición de interbloqueos.
Grafos de asignación de recursos [Holt, 1972] se presentaron por primera los grafos de asignación de recursos que permiten ilustrar _ ción de los recursos de un sistema a los procesos que se ejecutan en el mismo en un determinado ,_ ....:..."" de tiempo. '=-
el grafo de asignación de recursos se representa a cada procesos con un círculo y a cada recurso
uadrado. Cada instancia de un mismo recurso, se representa como un punto dentro del cuadrado al recurso. Si un proceso ha solicitado una instancia de recurso y se encuentra bloqueado en de que le sea asignada, entonces se representa una flecha que sale del proceso hacia el recurso. parte, si un proceso tiene asignado una instancia de un recurso, entonces se representa una flecha desde la instancia del recurso hacia el proceso.
_~!do
170
Fundamentos básicos de los sistemas operativos
El grafo de asignación de recursos puede utilizarse para detectar la presencia de interbloqueos, para ello debe suponerse que ya se cumplen las condiciones de exclusión mutua y no existencia de expropiación, las cuales quedan fijadas por el sistema operativo. En el grafo de asignación de recursos pueden detectarse visualmente, o usando algún algoritmo de análisis de grafos, la condición de espera circular _la condición de retención y espera. Se puede demostrar que si el grafo no contiene ningún camino que sea un ciclo entonces no exi te interbloqueo. Por otra parte la existencia de un ciclo no es condición suficiente para que exista interbloqueo, dependerá también del número de instancias de cada recurso implicado en el ciclo y del tipo de caminos de los que formen parte dichas instancias. Si los recursos que forman parte de un ciclo únicamente tienen una instancia entonces existe interbloqueo. Por otra parte, si en el ciclo existen recur que tienen más de una instancia, entonces para que exista interbloqueo todos las instancias de dicho.:. recursos deben forman parte de caminos que sean ciclos .
• Ejemplo 5.1 Considérese un computador con una unidad de DVD (recurso R I ), una impresora (recurso R2) y un di duro (recurso R3). Supóngase que se están ejecutando tres procesos A, B YC. En la Figura 5.1 se mue el grafo de asignación de recursos en un determinado de tiempo TI. El proceso A tiene asignado R I. proceso B tiene asignado R2 y se encuentra bloqueado en espera de que le asignen R3, que está asigna al proceso C. Se observa que en el grafo no existe ningún ciclo, luego no existe interbloqueo.
Figura 5.1 - Ejemplo de grafo de asignación de recursos con una sola instancia de cada recurso y sin interbloqueo En la Figura 5.2 se muestra el grafo de asignación de recursos en un instante de tiempo posterior T2. observa que existe un ciclo ya que el proceso B tiene asignado R2 y se encuentra bloqueado en es de que le asignen R3. Por su parte el proceso C tiene asignado R3 y está bloqueado en espera de • le asignen R2. El ciclo puede escribirse de forma resumida de la siguiente forma: R2 ~ B ~ R3 -. ~ R 2 . Como cada recurso formando parte del ciclo únicamente posee una instancia entonces existe interbloqueo entre los procesos B y C. Supóngase ahora que se instala otra unidad de DVD, de tal forma que ahora existen en el computador instancias del recurso RI. En la Figura 5.3 se muestra el grafo de asignación de recursos en un ins
Interbloqueo
5.2 - Ejemplo de grafo de asignación de recursos con una sola instancia de cada recurso e rbloqueo
tgura
Figura 5.3 - Ejemplo de grafo de asignación de recursos con un ciclo pero sin interbloqueo
Figura 5.4 - Ejemplo de grafo de asignación de recursos con interbloqueo
171
172
Fundamentos básicos de los sistemas operativos
de tiempo posterior T3 . Se observa que existe el ciclo Rl ~ B ~ R3 ~ C ~ R 1, es decir, el proceso tiene asignada una instancia de Rl y se encuentra bloqueado en espera de que le asignen R3. Por su parte el proceso C tiene asignado R3 y está bloqueado en espera de que le asignen una instancia de Rl. S embargo, no existe interbloqueo ya que el otro camino que sale del nodo asociado al recurso Rl, es de ~ Rl ~ A, no forma un ciclo. Nótese que cuando el proceso A termine de usar la instancia del rec _ Rl que posee se le podrá asignar al proceso C. A su vez el proceso C, una vez consiga una instancia ." recurso R l puede liberar al recurso R3 permitiendo así al proceso B acceder al mismo. En la Figura 5.4 se muestra el grafo de asignación de recursos en otro instante posterior T4 . Se obse que existe interbloqueo ya que el recurso Rl tiene sus dos instancias asignadas y de él parten dos camine (R 1 ~ B ~ R3 ~ C ~ Rl Y Rl ~ A ~ R2 ~ B ~ R3 ~ C ~ Rl) que son ciclos. El proceso C bloqueado en espera de una de las dos instancia del recurso R 1, las cuales están asignadas a los proc A y B, respectivamente. A su vez el proceso A espera por el recurso R2 que está asignado al proce o el cual espera por el recurso R3 que está asignado al proceso C.
5.4.
Prevención de interbloqueos
La estrategia de prevención de interbloqueos consiste en eliminar la aparición de alguna de las c condiciones necesarias y suficientes para que se produzca un interbloqueo: exclusión mutua, retenci ' espera, no existencia de expropiación y espera circular. Se analizan en las siguientes subsecciones e ' es posible eliminar cada una de estas condiciones y los inconvenientes que produce dicha eliminaci '
5.4.1.
Eliminación de la condición de exclusión mutua
La condición de exclusión mutua es una condición que no puede eliminarse en recursos comparri si se quiere garantizar la integridad y la no corrupción de los mismos. Por ejemplo, supóngase do cesos A y B, si se permite que los dos puedan escribir simultáneamente en una impresora, el que se imprima sería un caos ya que recogería fragmentos escritos por el proceso A y fragmentos es por el proceso B.
5.4.2.
Eliminación de la condición de retención y espera
La condición de retención y espera se puede eliminar forzando a que un proceso solicite a la todos los recursos que va a necesitar en su ejecución. Hasta que no pueda obtener todos los permanecerá bloqueado. Uno de los principales inconvenientes que tiene la eliminación de esta condi es que requiere conocer por anticipado todos los recursos que va a necesitar un proceso duran '" ejecución, lo cual en muchas ocasiones (salvo quizás en trabajos por lotes) es difícil de saber. Otro inconveniente es que produce problemas de rendimiento del sistema. Un proceso puede manecer bloqueado un tiempo excesivo o incluso permanentemente (inanición) hasta poder obtener vez todos los recursos que necesita, cuando podría haber progresado en su ejecución si se le hubie
Interbloqueo
173
iendo alguno de los recursos que necesitaba. Otro problema es que un recurso de los asignados proceso puede permanecer bastante tiempo sin ser utilizado, ya que un proceso solo puede estar _..ILoCw.,do un recurso cada vez. Obviamente dicho recurso podría ser asignado mientras tanto.
Eliminación de la condición de no existencia de expropiación ~
eliminación de la condición de no existencia de expropiación, se consigue permitiendo que el operativo pueda expropiar a un proceso los recursos que retiene. La expropiación solo es posible sos para los cuales el sistema operativo puede salvar el estado en que se encontraban, para reso cuando el proceso expropiado consiga otra vez su uso. Este es el caso del procesador (cambio de ~~uO, de un proceso) y la memoria principal (intercambio en memoria secundaria). En consecuencia s:,.,.o¡.'jE; valorar si la desaparición de los interbloqueos mediante la eliminación de la existencia de expro,......~'~ compensa la disminución del rendimiento del sistema debido a la sobrecarga por las tareas de ~~lf y restaurar el estado de los recursos. .-.,o-=-r,,,
Eliminación de la condición de espera circular de el punto de vista del grafo de asignación de recursos, la eliminación de la condición de espera implica que nunca podrán aparecer ciclos en el grafo, y en consecuencia nunca se producirá el .......... ~"":Iueo . condición de espera circular se puede eliminar asignando a cada recurso del sistema un número do a que un proceso solo pueda solicitar los recursos en orden ascendente. Por lo tanto, si un ~ce.so posee un recurso R¡ solo puede solicitar el recurso Rj si j > i. Procediendo de esta forma se evita .ción de la espera circular ya que un proceso que posee un recurso R¡ nunca puede esperar por un ':::::Il3iO Rh si h ~ i retenido por otro proceso. La principal desventaja de este método es que los recursos ser solicitados en el orden establecido, en lugar de pedirlos cuando se necesitan realmente. De esta un proceso retiene un recurso que no va a utilizar hasta haber utilizado otros. Impidiendo así que r asignado a otro proceso. -.....~_LU
plo 5.2 _~........'rese
un computador con un disco duro (recurso R 1), una impresora (recurso R2), una unidad de urso R3) y una unidad de CD-ROM (recurso R4). El subíndice i de R¡ establece el número de los recursos a la hora de su posible petición. Supóngase que un proceso solicita en primer lugar o R2, entonces solo puede pedir a continuación recursos con número de orden superior a 2, es o ~. Además si necesita estos dos recursos primero debe pedir R3 ya continuación ~.
comprobar que esta estrategia de ordenación de las peticiones de recursos permite evitar el _ _ """'iueo. Supóngase que un proceso C tiene asignado el recurso R2 y se encuentra bloqueado en de que le asignen el recurso R3, el cual está asignado a un proceso D. El proceso D nunca puede _ _........ el progreso del proceso C ya solo puede bloquearse en espera de recursos con número de _r.e:::xi·ón mayor, en este caso el recurso R4.
•
174
Fundamentos básicos de los sistemas operativos
5.5.
Evitación de interbloqueos
La estrategia de tratamiento de interbloqueos conocida como evitación o predicción de interbloque consiste en conceder a un proceso solamente aquellas peticiones de recursos que tengan garantizado q no conducirán a un estado de interbloqueo. En esta estrategia un proceso tiene que especificar por adelantado todos los recursos que va a necesi para su ejecución. Obviamente si los recursos solicitados por un proceso superan el número máximo recursos (asignados o no) del sistema, entonces dicho proceso no es admitido para ser ejecutado. Cuan un proceso comienza su ejecución va solicitando los recursos conforme los va necesitando. Si e disponibles y su concesión no conduce a un estado de interbloqueo entonces se le concede su uso. caso contrario, el proceso tiene que esperar y se bloquea. El sistema operativo debe contabilizar el número de recursos disponibles, el número de rec asignados a cada proceso y el número de recursos que restan por asignar a cada proceso. Además. _encarga de comprobar si una asignación es segura o, por el contrario, puede conducir a un estado interbloqueo.
5.5.1.
Estado de la asignación de recursos: estados seguros y estados inseguros
Una posible forma de llevar la contabilidad de los recursos solicitados por los procesos y de recursos asignados a los mismos es mediante el uso del siguiente conjunto de vectores y matrices: • El vector RE de recursos existentes:
El sistema posee q tipos de recursos distintos. REj es el número de instancias existentes del rec j. • El vector Ro de recursos disponibles: Ro
= (RDl,RD2, ... ,RDj, ...,RDq)
RDj es el número de instancias disponibles del recurso j.
• La matriz N de recursos máximos necesitados por cada proceso: N11 N12
N=
Ni1 N i2
Esta matriz tiene p filas , una asociada a cada proceso existente en el sistema. Además po columnas, una por cada tipo de recurso existente. Por lo tanto el elemento Nij es el número u .. u .......1IIIII de instancias del recurso j necesitadas por el proceso i.
Interbloqueo
175
• La matriz A de recursos asignados a cada proceso:
All A=
A l2
Alj
A lq
Ail Aa
Ai}
Aiq
Apl A p 2
Apj
Apq
(5.4)
Esta matriz tiene p filas, una asociada a cada proceso existente en el sistema. Además posee q columnas, una por cada tipo de recurso asignado. Por lo tanto el elemento Aij es el número de instancias del recurso j asignadas al proceso i. Nótese que si suman los elementos de una misma columna, se obtienen el número total de instancias asignadas entre todos los procesos del recurso j: P
RAj
= ¿Akj
(5.5)
k=l
Esto permite definir el vector RA de instancias de recursos asignadas en total:
(5 .6) e que se cumplen las siguientes relaciones entre los vectores y matrices que se han definido: El número total de instancias existentes de un recurso j se puede determinar como la suma del número de instancias disponibles más la suma del número de instancias asignadas:
(5.7) Un proceso i no puede solicitar un número de instancias de un recurso j mayor que el número de tancias existentes de dicho recurso, es decir: Ni} ~ REj
T
(5.8)
n proceso i no puede tener asignadas un número de instancias de un recurso j mayor que el , ero máximo de instancias inicialmente solicitadas de dicho recurso, es decir: Aij ~ N ij
-
i = 1, ..., p j = 1, .. . , q
~stado
i
= 1, ..., p
j
= 1, ... , q
(5.9)
del sistema con respecto a la asignación de sus recursos en un determinado instante de queda determinado por los vectores RE, Ro y las matrices N y A. estado se dice que es seguro si posibilita al menos una secuencia de asignación de recursos a los ~c=sos que garantiza que éstos se pueden ejecutar hasta su finalización sin que se produzca interbloluso aunque los procesos soliciten simultáneamente todos los recursos que van a necesitar. Un eguro es aquél que no garantiza que no se pueda producir un interbloqueo.
176
Fundamentos básicos de los sistemas operativos
En la práctica, la forma de detectar si un estado es seguro consiste en comprobar si con los recurso disponibles al menos uno de los procesos existentes se puede ejecutar por completo, aunque solicite a la vez todos los recursos que va a necesitar. En términos de los vectores y matrices definidas habría que calcular N - A Y comprobar si alguna de sus filas cumple la condición: (Ni -A i)
~
RD
(5.10
Ni Y Ai son vectores que representan a la fila i de las matrices N y A, respectivamente. Esta relación de comparación entre vectores se satisface si cada elemento del vector (Ni - A i) es menor o igual que el elemento correspondiente del vector RD , es decir: Ni} - Ai}
~
RDj
j
= 1, ... , q
(5.11
• Ejemplo 5.3 Supónganse tres tipos de recursos: unidades de disco duro (j = 1), impresoras (j = 2) Y unidades de CD-ROM (j = 3). Existen 4 unidades de discos duros, 3 impresoras y 2 unidades de CD-ROM. El vect de recursos existentes es el siguiente: RE
= (4
3 2)
Considérese que se están ejecutando tres procesos Pl , P2 Y P3. En un determinado instante de tiempo. e estado del sistema en cuanto a la asignación de recursos es:
N=(~1 1~ 2~l A=(~1 0~ 1~l Es decir, el proceso PI necesita como máximo 2 discos duros, 2 impresoras y una unidad de CD-RO. Actualmente tiene asignados un disco duro, una impresora y un CD-ROM. El proceso P2 necesita como máximo 3 discos duros, 2 impresoras y 2 CD-ROMs. Actualmente ti asignados un disco duro, ninguna impresora y ningún CD-ROM. El proceso P 3 necesita como máximo un disco duro, una impresora y 2 CD-ROMs. Actualmente ti asignados un disco duro, ninguna impresora y un CD-ROM. Sumando los elementos de una misma columna de la matriz A se obtiene el vector RA que indica número de instancias de cada tipo de recurso asignadas: RA
= (3
1 2)
El vector de recursos disponibles se obtiene restando el vector de recursos existentes menos el vector recursos asignados:
Interbloqueo
Rn = RE - R A 13
= (4
3 2) - (3
1 2)
= (1
177
2 O)
a denotar a este estado como SI:
e estado el número de instancias de cada recurso que todavía necesita cada proceso se obtiene do la matriz N y la matriz A.
N-A=U ~ ~l-[~ ~ ~l=[~ ~ ~l 12
101
011
ber si este estado S I es seguro o no, simplemente hay que comprobar si existe alguna fila i de es decir, algún proceso Pi que cumpla la condición (Ni -A i ) ~ Rn
i
= 1,2,3
era fila asociada al proceso PI si que cumple que cada uno de sus elementos es menor o igual elementos de Rn: (1
1
0)~(1
2 O)
da fila asociada al proceso P 2 no cumple la condición:
(2 2
2)~(1
2 O)
ra fila asociada al proceso P3 tampoco cumple la condición:
(O
1
1)~(1
2 O)
al proceso PI se le pueden conceder todos los recursos que necesita para completarse aunque los todos a la vez. Supóngase que el proceso PI se ha completado, el estado del sistema pasa a ser
_ro:~
que puesto que el proceso PI se ha completado, la fila 1 de las matrices N y A son nulas. Dicha _ no se considera en los siguientes análisis.
178
Fundamentos básicos de los sistemas operativos
El número de instancias de cada recurso que todavía necesita cada proceso se obtiene restando la matriz N y la matriz A.
N-A=
000] [000] [000] [ 31 12 22 - 11 0°1° = 02 12 12
Se observa que la tercera fila de N - A asociada al proceso P3 si cumple que cada uno de sus elemento es menor o igual que los elementos de Ro. Luego se pueden asignar al proceso P3 todos los recursos que necesita para completarse. Supóngase que el proceso P3 se ha completado, el estado del sistema pasa a ser S3:
El número de instancias de cada recurso que todavía necesita cada proceso se obtiene restando la matriz N y la matriz A.
N-A=
000] [000] [000] 3 2 2 - 1 O O = 2 2 2
[O O O
O O
°
O O O
Se observa que la segunda fila de N - A asociada al proceso P2 sí cumple que cada uno de sus element es menor o igual que los elementos de Ro. Luego se pueden asignar al proceso P2 todos los recursos necesita para completarse. En definitiva se ha demostrado que el estado S I es un estado seguro, ya que a partir de él es posi _ completar la ejecución de todos los procesos .
• Ejemplo 5.4 Supónganse tres tipos de recursos: unidades de disco duro (j = 1), impresoras (j = 2) y unidades de ROM (j = 3). Existen 4 unidades de discos duros, 3 impresoras y 2 unidades de CD-ROM. Considé que se están ejecutando tres procesos PI, P2 Y P3. En un determinado instante de tiempo, el estado sistema en cuanto a la asignación de recursos es:
Se desea saber si el estado de asignación de recursos S es seguro. Para ello en primer lugar hay calcular N - A:
Interbloqueo
N-A=
(
179
2 1 O] 1 2 2 · 011
uación simplemente hay que comprobar si existe alguna fila i de N - A, es decir, algún proceso cumpla la condición: (Ni - A¡) :-::; Rn
i
= 1,2,3 .
- era fila asociada al proceso PI no cumple la condición: (210):-::;(120)
da fila asociada al proceso P2 no cumple la condición: (122):-::;(120)
a fila asociada al proceso P3 tampoco cumple la condición: (O
11):-::;(12 O)
ninguna de las filas cumple la condición el estado S es un estado inseguro. Nótese que un estado __ ......rrn no tiene por qué conducir a un estado de interbloqueo. Por ejemplo si el proceso P2 liberase duro y se le asignase a PI entonces se retomaría al estado S 1 del ejemplo anterior, que ya se ____.... vbó que era un estado seguro.
• Denegación de asignación de recursos: el algoritmo del banquero técnica más usada de evitación de interbloqueos es la denegación de asignación de recursos nsiste en no conceder a un proceso una petición adicional de un recurso si dicha petición puede .;o::a::~. a un estado inseguro. implementación más conocida y usada de está técnica es el algoritmo del banquero [Dijkstra, __ ya que simula el comportamiento de un banquero que realiza préstamos y recibe pagos sin caer en la posibilidad de no poder satisfacer todas las necesidades de sus clientes. La analogía es la te: el banquero representa al sistema operativo, los clientes son los procesos y el dinero prestado recursos. '= e algoritmo asegura que el número de recursos asignados a todos los procesos nunca puede exdel número de recursos del sistema. Además, nunca se puede hacer una asignación peligrosa, es asignar recursos de modo que no queden suficientes para satisfacer las necesidades de todos los s. pasos de que consta este algoritmo son los siguientes:
180
Fundamentos básicos de los sistemas operativos
1. Se parte de un estado inicial de asignación seguro Sk con k
= O. (5.1 2
2. Cuando un proceso realiza una petición de asignación de recursos, se simula que se concede la petición y se actualiza el estado del sistema. A este estado ficticio se le denota como S' : S'
= {N',A',RE,R'D}
(5. 1
3. Se comprueba si S' es seguro. • En caso afirmativo se concede la petición al proceso y se actualiza el estado del sistema: (5.1 • En caso negativo la petición se deniega y el proceso se bloquea hasta que se le puedan conceder los recursos que solicita. 4. Volver al paso 2. En teoría el algoritmo del banquero es una técnica excelente para evitar los interbloqueos. Sin embargo, en la práctica realmente no se utiliza, ya que es difícil conocer por adelantado los recursos q ~ van a necesitar los procesos durante su ejecución. Además dicho algoritmo parte de la suposición de q el número de procesos y de recursos existentes es fijo, lo cual no tiene por qué ser cierto. En general. población de procesos varía dinámicamente en el tiempo. Por otra parte, los recursos que inicialme están disponibles pueden que con el tiempo no lo estén debido a posibles fallos, por ejemplo, que :quede atascado papel en una impresora o que se dañe una unidad de cinta.
5.5.3.
Denegación de la iniciación de un proceso
Otra posible técnica para evitar los interbloqueos es la denegación de la iniciación de un proceso consiste en no iniciar un proceso si el número máximo de recursos que va a necesitar durante su ejecuci pueden conducir a un interbloqueo. En términos de los vectores y matrices definidos en la sección S': la condición que se debe cumplir para que un proceso pueda iniciar su ejecución es la siguiente: P
R Ej ?
N(p+l )j
+
I..
Nkj
j = 1, ... , q
(S. :
k=l
Es decir, el proceso p + 1 puede iniciar su ejecución si el número máximo de instancias de recurso j que necesita sumadas al número máximo de instancias de dichos recursos necesitadas por . procesos ya existentes no supera el número de instancias existentes. En consecuencia, el proceso p iniciar su ejecución si el sistema está en un estado seguro. La denegación de la iniciación de un proceso como técnica de evitación de interbloqueos no es ya que supone que todos los procesos van a solicitar simultáneamente todos las instancias de que van a necesitar, es decir, trabaja con el peor de los casos posibles.
Interbloqueo
181
Detección y recuperación de interbloqueos La estrategia de tratamiento de los interbloqueos conocida como detección y recuperación de inter-
eos consiste en no limitar las asignaciones de recursos a los procesos y comprobar periódicamente, __-'"'"·.........te la utilización de algún algoritmo, si se ha producido algún interbloqueo. En caso afirmativo se ~-=-"""" alguna técnica para intentar recuperar al sistema del interbloqueo.
Algoritmos de detección de interbloqueos Gna posible forma de detectar la existencia de interbloqueos en un sistema sería construir el grafo de -'=-"""""""i.ón de recursos y comprobar visualmente la existencia de ciclos. Obviamente para implementar lécnica en un sistema operativo habría que formalizarla y automatizarla, es decir, establecer una de describir el grafo de forma no gráfica y usar un algoritmo de inspección de ciclos en grafos. Otra alternativa, mucho más utilizada, es usar algún algoritmo que trabaje con una descripción matrilos recursos existentes, de los recursos disponibles, y de las peticiones y asignaciones de recursos. ible algoritmo de detección de interbloqueos es el propuesto en [Coffman et al., 1971]. De aquí lante a este algoritmo se le denominará algoritmo de Coffman. ~ e algoritmo utiliza los siguientes vectores y matrices: RE vector de recursos existentes, Rn vector os disponibles, A matriz de recursos asignados a cada proceso y M matriz de recursos necesitacada proceso adicionalmente de los que ya posee. RE, Rn Y A ya fueron definidos en la sección - . Por su parte la matriz M se define de la siguiente forma:
Mll M12
M=
Mil Mi2
Mi}
(5.16)
Esta matriz tiene p filas, una asociada a cada proceso existente en el sistema. Además posee q co-
, una por cada tipo de recurso existente. Por lo tanto el elemento Mi} es el número de instancias recurso j necesitadas por el proceso i adicionalmente de las que ya posee. El algoritmo de Coffman considera inicialmente que todos los procesos están sin marcar, y va mara aquellos procesos que pueden ser completados. Los procesos marcados no pueden provocar una 'ón de interbloqueo. Este algoritmo consta de los siguientes pasos: L Se marca cada proceso que tenga una fila i (i = 1,2, ... , p) de la matriz de asignación A igual a cero ya que dicho proceso no retiene ningún recurso y en consecuencia no puede producir interbloqueo. Se realiza la asignación X
= Rn donde X es un vector auxiliar.
Para cada i no marcado se comprueba la condición M i ~ X donde Mi es la fila i de la matriz M .
182
Fundamentos básicos de los sistemas operativos
4. Si no existe ningún i que cumpla la condición, entonces el algoritmo finaliza. Si existe algún i que cumpla la condición, entonces se marca el proceso, se realiza la suma vectorial X = X + A¡ Y se vuel ve al paso 3. Básicamente este algoritmo lo que hace es comprobar para cada proceso si los recursos adicionale que necesita se le pueden conceder con los recursos disponibles. En caso afirmativo, asume que se le conceden esos recursos al proceso, se ejecuta el proceso hasta finalizar y luego se liberan esos recursos. Entonces marca el proceso como completado y procede a comprobar si se pueden atender las peticiones de otro proceso. Cuando el algoritmo finaliza todos los procesos que no estén marcados estarán en situación de interbloqueo. En conclusión existe interbloqueo si existe más de un proceso sin marcar. Recuérdese que para que se produzca interbloqueo se requieren al menos dos procesos . • Ejemplo 5.5 Su pónganse tres tipos de recursos: unidades de disco duro (j = 1), impresoras (j = 2) Y unidades de CDROM (j = 3). Existen 4 unidades de discos duros, 3 impresoras y 2 unidades de CD-ROM. Considérese que se están ejecutando tres procesos PI, P2 Y P3. En un determinado instante de tiempo ti, el vector de recursos existentes RE y la matriz A de recursos asignados a cada proceso son:
RE
= (4
3 2) A
=
[~1 0~ 1~ 1
Se observa que el proceso PI tiene asignado una impresora y una unidad de CD-ROM, el proceso P_ tiene asignado un disco y una impresora, y el proceso P3 tiene asignado un disco y un CD-ROM. De la matriz A se puede deducir el vector de recursos asignados RA , sumando los elementos de una misma columna:
RA
= (2
2 2)
El vector de recursos disponibles se obtiene de la siguiente forma:
RD
= RE -
RA
= (4
3 2) - (2 2 2)
= (2
1 O)
Por otra parte, supóngase que en dicho instante la matriz de recursos necesitados por cada proceso adicionalmente de los que ya posee es:
M=
00 1 1 O 2 O [ 1 1 O
Se va aplicar el algoritmo de Coffman para la detección de interbloqueos:
_1
Interbloqueo
183
l. Se examina la matriz A y se comprueba si alguna de sus filas es igual a (O O O). Como no existe ninguna, no se marca ningún proceso. Se realiza la asignación
x = RD = (2
1 O)
3. Para cada proceso Pi no marcado, en este caso los tres procesos, se comprueba la condición M¡::;X 3.1) Para la primera fila de M la condición no se cumple ya que el proceso PI necesita una unidad de CD-ROM y no existe ninguna disponible: (O
01)::;(210)
Luego el proceso PI no se marca. 3.2) Para la segunda fila de M la condición no se cumple ya que el proceso P 2 necesita dos impresoras y solo existe una disponible: (O
2 0)::;(210)
Luego el proceso P2 no se marca. 3.3) Para la tercera fila de M la condición se cumple ya que el proceso P3 necesita un disco duro y una impresora, y existen disponibles dos discos duros y una impresora: (110)::;(210) ~.
Se marca el proceso P3, se supone que se ejecuta hasta su finalización y que luego se liberan sus recursos. Hay que realizar la siguiente actualización:
x = X + A3 = (2
1 O) + (1
O 1)
= (3
1 1)
5. Para cada proceso Pi no marcado, en este caso PI y P2, se comprueba la condición
Mi::;X 5.1) Para la primera fila de M la condición se cumple ya que el proceso PI necesita una unidad de CD-ROM y existe una disponible: (O 01)::;(311)
184
Fundamentos básicos de los sistemas operativos
5.2) Para la segunda fila de M la condición no se cumple ya que el proceso P2 necesita dos impresoras y solo existe una disponible: (O
0)~(3
2
11)
6. Se marca el proceso PI, se supone que se ejecuta hasta su finalización y que luego se liberan sus recursos. Hay que realizar la siguiente actualización:
x = X + A3 = (3
1
1) + (O
1
1)
= (3
2
2)
7. Para cada proceso Pi no marcado, en este caso P2, se comprueba la condición
7.1) Para la segunda fila de M la condición se cumple ya que el proceso P2 necesita dos impresoras y existen dos disponibles: (O
2
0)~(3
22)
8. El proceso P2 es marcado. Además se supone que se ejecuta hasta su finalización y que luego se liberan sus recursos. Hay que realizar la siguiente actualización: X
= X + A3 = (3
2
2) + (1
1 O)
= (4
3
2)
9. Para cada proceso Pi no marcado, se comprueba la condición Mi~X
Como todos los procesos están marcados el algoritmo finaliza. Al terminar el algoritmo todos los procesos están marcados lo que significa que no existe interbloqueo .
• 5.6.2.
Frecuencia de invocación del algoritmo de detección de interbloqueos
Una cuestión que debe fijarse en la estrategia de detección de interbloqueos es cuándo se invoca al algoritmo de detección. Una opción es invocarlo cada vez que un proceso realice una petición de un recurso. Obviamente con esta opción la frecuencia de invocación del algoritmo será bastante alta . el interbloqueo se detectaría muy pronto. Sin embargo, se estaría aumentando la sobrecarga, ya que e algoritmo consume tiempo de procesador.
Interbloqueo
185
Otra posible opción consiste en invocar el algoritmo cada T minutos, o cuando el grado de utilización procesador caiga por debajo de un determinado umbral. Debe tenerse en cuenta que si el procesador _ uentra inactivo o con un grado de utilización pequeño quizás sea debido a que existen interbloqueos impiden que los procesos puedan progresar en su ejecución.
Técnicas de recuperación del interbloqueo ena vez ejecutado el algoritmo de detección de interbloqueos, si se detecta la existencia de procesos loqueados, el siguiente paso es intentar recuperar el sistema del interbloqueo mediante la aplicación guna técnica de recuperación. A continuación se comentan brevemente algunas de las técnicas más
• Recuperación mediante expropiación de recursos. Consiste en ir expropiando recursos a algunos procesos y concedérselos a otros hasta conseguir salir del interbloqueo. Esta técnica requiere establecer algún criterio para seleccionar los procesos a los que se les va a expropiar los recursos, omo por ejemplo: el tiempo de uso del procesador, la prioridad, el tiempo de ejecución restante e timado, etc. En ocasiones la expropiación se debe hacer de manera manual por el administrador del sistema, como por ejemplo en el caso de sistemas por lotes. Recuperación mediante el retroceso de los procesos interbloqueados a algún punto de control previo. Consiste en ir realizando puntos de control (chekpoint) periodicamente durante el tiempo e vida de un proceso. En cada punto de control se guarda el contexto del proceso en un fichero . tinto. Cuando se detecta que el proceso está interbloqueado se retrocede su ejecución a un punto e control anterior con la esperanza de que se evite el interbloqueo Recuperación mediante el aborto selectivo de procesos. Consiste en ir abortando selectivamente · algún proceso para que libere los recursos que posee y puedan ser asignados a algún proceso interbloqueado de forma que pueda salir de dicho estado y continuar su ejecución. Esta técnica requiere establecer algún criterio de selección de los procesos que van a ser abortados, ya sea alguno de los interbloqueados o cualquier otro proceso. Recuperación mediante el aborto de todos los procesos interbloqueados. Se trata de la solución más drástica y curiosamente la más utilizada.
Ventajas e inconvenientes .:.-a detección y recuperación de interbloqueos es una estrategia de tratamiento de interbloqueos munos conservativa que la prevención y la evitación de interbloqueos, ya que al no limitar el número gnaciones permite un mayor grado de concurrencia de procesos. detección de interbloqueos introduce un grado de sobrecarga al sistema que puede ser tolerable te el uso de algoritmos de detección eficientes y mediante el ajuste de la frecuencia de invocación -ho algoritmo.
186
Fundamentos básicos de los sistemas operativos
Por su parte, la recuperación de interbloqueos sí que puede producir una sobrecarga elevada de sistema. Además puede producir un desaprovechamiento de los recursos para aquellos procesos que so reiniciados o retornados a un punto de control anterior. En general puede afirmarse que la recuperación de interbloqueos es bastante útil en sistemas con bajs probabilidad de interbloqueos.
5.7.
Otras estrategias de tratamiento de interbloqueos
5.7.1.
Estrategia mixta de tratamiento de interbloqueos
Las estrategias de tratamiento de interbloqueos descritas pueden utilizarse conjuntamente con obje de aprovechar su ventajas y reducir sus inconvenientes. La forma de proceder es la siguiente: 1. Agrupar los recursos existentes del sistema en diferentes clases. 2. Ordenar las clases para evitar la espera circular (ver sección 5.4.4). 3. Utilizar para cada clase la estrategia de tratamiento de los interbloqueos que se considere más oportuna . • Ejemplo 5.6 Supóngase un sistema cuyos recursos se agrupan en las siguientes clases: 1. Espacio de intercambio. Área en memoria secundaria para almacenar copias de seguridad de bloques de memoria principal.
2. Recursos de trabajo. Tales como dispositivos hardware (impresoras, discos, etc) o recursos so -ware (archivos). 3. Memoria principal. Se pueden asignar a los procesos bloques de memoria principal (páginas segmentos). 4. Recursos internos del sistema. Como canales de E/S o buffers. Para evitar la espera circular, las clases de recursos se asignan en el orden en que han sido enumeradas primero espacio de intercambio, luego recursos de trabajo, a continuación memoria principal y finalmente recursos internos. Dentro de cada clase se pueden utilizar las siguientes estrategias:
• Espacio de intercambio. Se puede usar la prevención de interbloqueos. Mediante la adquisición por adelantado de todo el espacio necesario se elimina la condición de retención y espera. También _ puede utilizar la evitación de interbloqueos.
Interbloqueo
187
• Recursos de trabajo. Se puede usar la evitación de interbloqueos ya que es factible conocer por adelantado los recursos de trabajo de los procesos. También se puede usar la prevención de interbloqueos mediante la ordenación lineal de recursos que elimina la condición de espera circular. • Memoria principal. La estrategia mejor es la prevención del interbloqueo permitendo la expropiación. Cuando se expropia a un proceso de la memoria simplemente se intercambia a memoria secundaria. • Recursos internos del sistema. Se recomienda usar la prevención del interbloqueo evitando la espera circular mediante la ordenación de los recursos.
• Ignorar los interbloqueos Como se ha visto en las secciones anteriores tratar los interbloqueos supone algún coste al sistema, sea en términos de sobrecarga, de reducción en la concurrencia de procesos, de conservadurismo en asignación de recursos o de un uso menos eficiente de los recursos. Por este motivo muchos sisteoperativos, como por ejemplo UNIX o Windows, no utilizan ninguna estrategia de tratamiento de rerbloqueos. Estos sistemas consideran que los usuarios prefieren sufrir algún interbloqueo de vez en do que disponer de un sistema que les limite el uso de recursos o con alta sobrecarga. Se basan en -uposición de que la probabilidad de que se produzca un interbloqueo es pequeña y confían en el azar a que no se produzca. En el caso de que se produzca será el administrador del sistema el que tenga e encargar de detectar el interbloqueo y recuperarlo.
Resumen Se define interbloqueo como aquella situación en la que un conjunto de procesos está bloqueado en ra de la liberación de uno o varios recursos que se encuentran asignados a otro proceso del mismo nj unto. Un conjunto de procesos está interbloqueado si cada proceso de dicho conjunto está bloqueado espera de la aparición de un evento que solo puede generar otro proceso bloqueado del conjunto. Para que se produzca un interbloqueo, se deben cumplir necesariamente las siguientes cuatro condi-
• Exclusión mutua. Cada recurso solo puede ser asignado a un proceso como máximo simultáneamente. • Retención y espera. Cada proceso retiene los recursos mientras espera por la adquisición de los que necesita. • No existencia de expropiación. Si un proceso posee un recurso, éste no puede ser expropiado.
188
Fundamentos básicos de los sistemas operativos
• Espera circular. Existe una cadena circular de dos o más procesos, donde cada proceso se encuentra en espera de un recurso retenido por el siguiente proceso de la cadena.
Las principales estrategias que puede implementar un sistema operativo para el tratamiento de lo interbloqueos son: prevención de interbloqueos, evitación de interbloques, y detección y recuperación de interbloqueos. La estrategia de prevención de interbloqueos consiste en eliminar la aparición de alguna de las cuatro condiciones necesarias y suficientes para que se produzca un interbloqueo. La estrategia de evitación o predicción de interbloqueos consiste en conceder a un proceso solamente aquellas peticiones de recursos que tengan garantizado que no conducirán un estado de interbloqueo. El proceso debe especificar por adelantado todos los recursos que va a necesitar. En la ejecución de proceso, si el recurso está disponible y su concesión no conduce a interbloqueo se le concede su uso. En caso contrario el proceso tiene que esperar y se bloquea. El sistema operativo debe contabilizar el número de recursos disponibles, los asignados y los restantes, y comprueba si la asignación es segura. Una fonna posible de llevar la contabilidad de los recursos solicitados y los recursos asignados es mediante el u o de vectores y matrices. La técnica más usada de evitación de interbloqueos es la denegación de asignación de recursos, _ consiste en no conceder a un proceso una petición adicional de un recurso susceptible de llevar a un estado inseguro. Se dice que un estado es seguro cuando posibilita al menos una secuencia de asignación de recursos a los procesos que garantice que éstos se pueden ejecutar hasta su finalización sin interbloquee incluso cuando solicitan simultáneamente todos los recursos. Un estado es inseguro cuando no garan . que no se pueda producir un interbloqueo. La estrategia de detección y recuperación de interbloqueos consiste en no limitar las asignacione-5 de recursos a los procesos y comprobar periódicamente la existencia de interbloqueos. Para detec interbloqueos se suele usar algún algoritmo, como por ejemplo el algoritmo de Coffman. Si se detecta algún interbloqueo se emplea alguna técnica para recuperar al sistema del mismo, co por ejemplo: la expropiación de recursos, el retroceso de los procesos interbloqueados a algún punto control previo y el aborto selectivo de procesos.
a
5.9. Lecturas recomendadas Si se desea obtener una explicación adicional de los contenidos tratados en este capítulo se pu consultar, por ejemplo: el capítulo 6 de [Stallings, 2005], el capítulo 6 de [Tanenbaum, 2009] y el capi 8 de [Silberschatz et. al, 2002]. Asimismo, en cualquiera de estos libros, se pueden encontrar nume referencias adicionales.
Interbloqueo
189
:.10. Autoevaluación ':.1. ¿Qué es un interbloqueo? (Respuesta en sección 5.2)
Enumerar y explicar las cuatro condiciones necesarias y suficientes para la existencia del interbloqueo. (Respuesta en sección 5.2) Enumerar las principales estrategias que puede implementar un sistema operativo para el tratamiento de los interbloqueos. (Respuesta en sección 5.2) ¿Cómo se construye un grafo de asignación de recursos? (Respuesta en sección 5.3) ¿Cómo se pueden detectar los interbloqueos en un grafo de asignación de recursos? (Respuesta en sección 5.3) ¿En qué consiste la estrategia de prevención de interbloqueos? (Respuesta en sección 5.4) ¿Es aconsejable eliminar la condición de exclusión mutua para prevenir el interbloqueo? (Respuesta en sección 5.4.1) Señalar los inconvenientes de la eliminación de la condición de retención y espera para prevenir el interbloqueo. (Respuesta en sección 5.4.2) . Explicar como se consigue la eliminación de la condición de no existencia de expropiación en la estrategia de prevención de interbloqueo. (Respuesta en sección 5.4.3) Explicar una posible forma de eliminar la condición de espera con objeto de prevenir el interbloqueo. (Respuesta en sección 5.4.4) Explicar en qué consiste la estrategia de evitación de interbloqueos. (Respuesta en sección 5.5) ¿Qué es un estado seguro? ¿Y un estado inseguro? (Respuesta en sección 5.5.1) Describir la técnica de denegación de asignación de recursos. (Respuesta en sección 5.5.2) ¿Para que se utiliza el algoritmo del banquero? ¿Cuáles son sus pasos? ¿Qué inconvenientes preenta su uso? (Respuesta en sección 5.5.2) - Describir la técnica de denegación de la iniciación de un proceso. (Respuesta en sección 5.5.3) ¿En qué consiste la estrategia de detección y recuperación de interbloqueos? Respuesta en sección 5.6) . Enumerar los pasos del algoritmo de Coffman para la detección de interbloqueos. (Respuesta en sección 5.6.1 ) Describir algunas técnicas de recuperación del interbloqueo. (Respuesta en sección 5.6.3)
190
Fundamentos básicos de los sistemas operativos
5.19. Señalar las ventajas y los inconvenientes de las técnicas de detección y recuperación de interbloqueos. (Respuesta en sección 5.6.4) 5.20. Explicar en que consiste una estrategia mixta de tratamiento de interbloqueos. (Respuesta en sección 5.7.1) 5.21. ¿En qué hipótesis se basa la estrategia de ignorar los interbloqueos? (Respuesta en sección 5.7.2)
5.11.
Problemas
5.1. Considérese un computador con un procesador, un disco duro y dos unidades de DVD iguales En un cierto instante de tiempo T existen cuatro procesos A, B, C y D de usuarios en el siste El proceso A tiene asignado el procesador. El proceso B tiene asignado una unidad de DVD y : encuentra bloqueado en espera de que le asignen el disco duro. El proceso C tiene asignado disco duro y se encuentra bloqueado en espera de que le asignen el procesador. El proceso D ti asignada una unidad de DVD y se encuentra bloqueado en espera de que le asignen el procesa Dibujar el grafo de asignación de recursos y analizar la posible existencia de interbloqueo. 5.2. Considérese la intersección de carreteras que se muestra en la Figura 5.5. En un cierto instante tiempo un coche A que viaja hacia el Sur se encuentra en la intersección C1 bloqueado a la es de poder acceder a la intersección C3. Otro coche B que viaja hacia el Oeste se encuentra en intersección C2 bloqueado a la espera de poder acceder a la intersección C 1. Otro coche C viaja hacia el Norte se encuentra en la intersección C4 bloqueado a la espera de poder acceder la intersección C2. Un último coche D que viaja hacia el Este se encuentra en la intersección bloqueado a la espera de poder acceder a la intersección C4. Dibujar el grafo de asignación recursos y analizar la posible existencia de interbloqueo. 5.3. En un computador con 3 instancias de un recurso R1, 2 instancias de un recurso R2 y 2 u·",,,,.u-._ de un recurso R3 se están ejecutando los procesos PI, P2 Y P3. En un cierto instante de tiempo estado del sistema es:
En cada matriz se ha asociado la fila i al proceso Pi y la columna j al recurso Rj (i, j
= 1,2 Y::
a) Determinar si el estado SI es seguro. b) Encontrándose el sistema en el estado S I se crea otro proceso P4 que requiere como para completarse dos instancias de RI y una instancia de R2 . Además pide inicialme .. asignación de una instancia de RI. Analizar usando el algoritmo del banquero si la del proceso P4 puede ser concedida o debe ser denegada.
Interbloqueo
191
Figura 5.5 - Intersección de carreteras del Problema 5.2. En un computador con 2 instancias de un recurso R 1 , 3 instancias de un recurso R2 y 4 instancias de un recurso R3 se están ejecutando los procesos PI , P2 Y P3. En un cierto instante de la matriz M de recursos necesitados adicionalmente y la matriz A de recursos asignados son:
M=[~O ~1 ~l1 A=[~1 O1 O~l En cada matriz se ha asociado la fila i al proceso Pi y la columna j al recurso Rj (i, j Detectar la posible existencia de interbloqueos usando el algoritmo de eoffman.
= 1, 2 Y 3).
apítulo 6
dministración de memoria ~etivos
docentes
Los objetivos docentes de este capítulo son los siguientes: • Conocer y entender los conceptos de espacio del núcleo, espacio de usuario y área de intercambio. • Saber cómo se asigna la memoria principal en sistemas operativos monoprogramados. • Conocer y comprender el funcionamie~to y las características de las principales técnicas que puede implementar un sistema operativo multiprogramado para la asignación contigua de memoria principal: el particionamiento fijo y el particionamiento dinámico. Conocer y comprender el funcionamiento y las características de las principales técnicas que puede implementar un sistema operativo multiprogramado para la asignación no contigua de memoria principal en sistemas que no soportan memoria virtual: la paginación simple y la segmentación simple.
Introducción .....él capacidad
de la memoria principal de los computadores actuales (unos 4 GiB en los computadores es) es varios órdenes de magnitud superior a la de los primeros microcomputadores de los años -in embargo los requisitos de memoria de los programas, sistema operativo incluido, que se ejecucrualmente también han aumentado espectacularmente. En conclusión, la memoria principal de un _ rador sigue siendo un recurso limitado que se debe administrar adecuadamente para conseguir el rendimiento del sistema. que un programa pueda ser ejecutado por el procesador primero debe ser cargado en la memoria -c:r:pal. En un sistema con multiprogramación, varios procesos estarán cargados (total o parcialmente) memoria principal. Si la memoria está llena y se desea ejecutar un proceso A que no está en
193
194
Fundamentos básicos de los sistemas operativos
memoria, hay que intercambiar algún proceso a la memoria secundaria para habilitar espacio libre en la memoria principal y poder cargar al proceso A. El subsistema de administración de la memoria principal es el componente del sistema operativo encargado de administrar, en colaboración con el hardware, la memoria principal entre todos los procesos que se ejecutan en el computador. Para realizar esta tarea debe usar una determinada técnica de administración de memoria. Las técnicas de administración de memoria principal que puede utilizar un sistema operativo multiprogramado se pueden clasificar en dos grandes grupos en función de cómo se asigne espacio en memoria principal a los procesos: • Técnicas de asignación contigua. Se caracterizan porque todo el espacio de direcciones lógicas de un proceso se carga de forma contigua en memoria principal, es decir, tiene asignado un rango contiguo de direcciones físicas. Ejemplos de este tipo de técnicas son el particionamiento fijo y el particionamiento dinámico . • Técnicas de asignación no contigua. Se caracteriza porque el espacio de direcciones lógicas de un proceso se divide en bloques de igual o distinto tamaño. Los bloques de un mismo proceso no tienen que estar cargados de forma contigua en memoria principal. Ejemplos de este tipo de técnicas son la paginación simple y la segmentación simple. En la paginación simple los bloques son del mismo tamaño y ~n la segmentación simple los bloques son de distinto tamaño. Tanto e la paginación simple como en la segmentación simple es necesario que todos los bloques en que se descompone el espacio lógico de un proceso se encuentren cargados en memoria principal para que el proceso pueda ser ejecutado. Esta restricción no existe en las técnicas de gestión de memoria de paginación por demanda y segmentación por demanda, que también son técnicas de asignació no contigua y que son utilizadas en sistemas que soportan memoria virtual. Estas técnicas serán explicadas en el siguiente capítulo.
Tanto en las técnicas de asignación contigua como en las técnicas de asignación no contigua, una parte de la memoria principal se reserva para almacenar al sistema operativo y sus estructuras de dato El resto se encuentra disponible para cargar procesos. Este capítulo está dedicado a estudiar las técnicas de administración de memoria principal que consideran la existencia de memoria virtual. En primer lugar se incluyen las definiciones de espacio núcleo, espacio de usuario y área de intercambio, conceptos que son necesarios conocer para entend las explicaciones de las restantes secciones. En segundo lugar se describe la asignación de memoria sistemas monoprogramados. A continuación se explican las técnicas de asignación contigua de memori . el particionamiento fijo y el particionamiento dinámico. Finalmente se describen y analizan las técnic de asignación no contigua: la paginación simple y la segmentación simple.
Administración de memoria
195
.2. Definiciones previas .1.
Espacio del núcleo y espacio de usuario
El sistema operativo, como cualquier otro programa, para poder ser ejecutado debe estar cargado en moria principal. El sistema operativo se carga cuando se arranca el computador mediante el uso de programa cargador. Al espacio ocupado por el código, las estructuras de datos y la pila (o pilas) del . leo del sistema operativo se le denomina espacio del núcleo. El acceso al espacio del núcleo solo se e realizar en modo núcleo. Aparte del sistema operativo, en la memoria principal pueden estar cargados (total o parcialmente) o varios procesos. Al espacio de memoria principal ocupado por la imagen de un proceso, es decir, u espacio de direcciones de memoria lógica, se le denomina espacio de usuario. El acceso al espacio uario se puede realizar en modo usuario o en modo núcleo. En conclusión en la memoria principal de un sistema multiprogramado se puede distinguir: el espacio núcleo, uno o varios espacios de usuario y espacio libre.
Área de intercambio en memoria secundaria Un programa es un archivo ejecutable que reside en memoria secundaria dentro de algún directorio . tema de archivos. Cuando se desea ejecutar un programa el sistema operativo tiene que crear un o asociado a dicho programa y cargarlo en memoria. Para ello debe buscar el archivo ejecutable en - ema de archivos, crear una copia de la imagen del proceso en memoria secundaria y cargar dicha ~en en memoria principal. Algunos sistemas operativos directamente crean y cargan la imagen del o en memoria principal sin crear una copia en la memoria secundaria. El sistema operativo reserva espacio en memoria secundaria, típicamente en un disco duro, para alnar las copias de las imágenes de los procesos. A dicho espacio se le denomina área de intercambio. - mmaño de esta zona suele estar predefinido, aunque algunos sistemas permiten que su tamaño máximo configurado por el administrador. e denomina intercambio (swapping) a la operación de cargar la imagen de un proceso desde el de intercambio a memoria principal o viceversa. Se habla de intercambio fuera de memoria prin(swapping out) al paso de la imagen desde memoria principal al área de intercambio en memoria daria, y de intercambio dentro de memoria principal (swapping in) al caso contrario. La operación de intercambio fuera de memoria principal se suele realizar en los siguientes casos: • Cuando se requiere espacio en memoria principal para cargar otros procesos. • Cuando un proceso necesita más espacio en memoria principal debido al crecimiento de su región de datos o de su región de pila. • Cuando es necesario regular el grado de multiprogramación del sistema, es decir, el número de procesos cargados en memoria principal. Por su parte la operación de intercambio dentro de memoria principal se suele realizar en los siguien-
196
Fundamentos básicos de los sistemas operativos
• Se desea aumentar el grado de multiprogramación del sistema para mejorar su rendimiento. • Existe espacio en memoria principal para cargar más procesos. • Existe un proceso de mayor prioridad en el área de intercambio. Dependiendo de si el sistema soporta memoria virtual o no, la imagen del proceso se intercambia por completo o solo algunas partes de la misma. En un sistema con memoria virtual, la imagen de un proceso no necesita residir por completo en memoria principal para que el proceso pueda ser ejecutado, por ello solo se intercambian algunas partes. Si el sistema no soporta memoria virtual la imagen se intercambia por completo. Por otra parte, para ahorrar espacio la copia de la imagen de un proceso en el área de intercambio no contiene aquellas direcciones lógicas asociadas al espacio del proceso que no se encuentran asignadas. Normalmente la operación de intercambio es realizado por un proceso del sistema denominado intercambiador. Este proceso se encarga entre otras tareas de: • Gestionar y asignar el espacio de intercambio. Para ello el sistema operativo mantiene una estru tura de datos con información sobre el espacio libre en el área de intercambio. Por ejemplo, u lista de bloques libres donde cada entrada contiene la dirección de comienzo de un bloque libre e el área de intercambio y su tamaño. • Seleccionar procesos para ser intercambiados fuera de memoria principal. El intercambiador escoge en primer lugar para ser intercambiados aquellos procesos que se encuentran en el esta bloqueado de acuerdo a los siguientes criterios: menor prioridad del proceso y mayor tiempo de residencia en memoria. En segundo lugar escoge a procesos en el estado preparado, con los mism criterios que el caso anterior. • Seleccionar procesos para ser intercambiados dentro de memoria principal. Se suelen escoó aquellos procesos preparados para ejecución que llevan más tiempo en el área de intercambio o de mayor prioridad.
Puede considerarse que el intercambiador realiza las funciones del planificador a medio plazo, recuérdese decide qué procesos pasan de las colas en memoria principal a memoria secundaria o vi versa. El proceso intercambiador estará suspendido en memoria principal mientras no haya que realizarninguna tarea de intercambio y el sistema operativo lo despertará cuando haya que realizar alguna. Cuando un proceso es intercambiado fuera de memoria el sistema operativo almacena en el bloque control del proceso el número de bloque del área de intercambio donde comienza la imagen del pr y el tamaño en bloques que ocupa. Cuando el proceso es intercambiado dentro lee en el bloque de con: del proceso dicha información para recuperar la imagen del proceso y cargarla en memoria. Podría pensarse en trabajar directamente con el archivo ejecutable asociado al proceso ubicado algún directorio del sistema de archivos y así no mantener el área de intercambio. A continuación detallan las razones que justifican la existencia del área de intercambio:
Administración de memoria
197
• Una operación de lectura y escritura en el área de intercambio es más rápida que en el sistema de archivos ya que no hay que traducir una ruta de acceso al archivo ni comprobar permisos de accesos. • La imagen de un proceso es una entidad dinámica .cuyo contenido suele diferir del contenido del archivo ejecutable conforme se va ejecutando el proceso. La imagen del proceso debe ser guardada para poder continuar con la ejecución del proceso sin tener que reiniciarla desde el principio.
Asignación de memoria en sistemas monoprogramados En sistemas monoprogramados la memoria principal se divide en dos particiones. Una partición está ada para contener permanentemente a aquellas partes del sistema operativo que deben estar siemen memoria principal. Al conjunto de todas las partes del sistema operativo residentes en memoria ·pal se las denominada monitor del sistema operativo. La memoria principal no ocupada por el sistema operativo conforma otra partición que está dispopara almacenar de forma temporal a un proceso de usuario o a un proceso del sistema asociado !!1ll1a parte no residente del sistema operativo. Puesto que solo puede estar cargado un proceso en oria principal, los procesos se ejecutan una a continuación de otro. Cuando un proceso finaliza, el a operativo puede cargar otro proceso en la única partición disponible para tal efecto. En función de si la partición de memoria asociada al sistema operativo se encuentra en la parte -or (direcciones bajas) o en la parte superior (direcciones altas) de memoria principal es posible
o
O
r
Monitor del SO
Monitor del SO RAM
.:M
Proceso de usuario
~
RAM ~
<
Proceso de usuario
Proceso de usuario
>-
ROM \
max Configuración 1
o
r
~
Monitor del SO ROM
~
Controladores de dispositivos
max Configuración 2
max Configuración 3
Figura 6.1 - Configuraciones de memoria principal más habituales en sistemas monoprogramados
198
Fundamentos básicos de los sistemas operativos
distinguir las siguientes configuraciones (ver Figura 6.1): • Configuración 1. La memoria principal se implementa exclusivamente con una RAM. La partición del sistema operativo ocupa la parte inferior de memoria principal, desde la dirección física Ohasta la dirección DirF1 . La parte superior de memoria, desde la dirección física DirF1 + 1 hasta DirFmax. está disponible para almacenar el proceso que se desea ejecutar. Esta configuración, actualmente casi no se usa, pero fue utilizada en los primeros macrocomputadores y minicomputadores. • Configuración 2. La memoria principal se implementa con una RAM y una ROM. El sistema operativo ocupa la ROM en la parte superior de memoria principal, desde la dirección física DirF1 + 1 hasta DirFmax . El programa que se va a ejecutar ocupa la RAM en la parte inferior de memoria principal, desde la dirección O hasta la dirección DirF1 . Nótese que se trata de una configuración muy poco flexible ya que el código del sistema operativo al residir en una ROM no puede er modificado y actualizado. Esta configuración es utilizada actualmente en algunos computadores de mano y sistemas integrados. • Configuración 3. La memoria principal se implementa con una RAM y una ROM. La partici' del sistema operativo ocupa la parte inferior de la RAM, desde la dirección física O hasta la dirección DirF1 . En esta partición se suelen almacenar las siguientes partes del sistema operati O' el cargador de programas y el intérprete de comandos. La parte superior de la memoria RMl desde la dirección física DirFl + 1 hasta Dirp2, está disponible para almacenar el proceso que desea ejecutar. La memoria ROM, contiene la tabla de vectores de interrupciones del hardware (ver sección 8.3.3) y las rutinas de servicio de las interrupciones. A esta memoria también se la c~ noce como sistema básico de entrada-salida (Basic Input-Output System, BIOS). A ella se accede con las direcciones-físicas DirF2 + 1 hasta DirFmax . Esta configuración fue utilizada en los prime microcomputadores. El sistema operativo MS-DOS usa esta configuración. Esta forma de gestionar la memoria principal es sencilla y conlleva muy poco trabajo al siste operativo. Éste únicamente necesita conocer la dirección física de inicio, también denominada direcci ' base, y el tamaño de la única partición disponible para la ejecución de procesos. Cuando va a cargar nuevo proceso comprueba si el tamaño del espacio lógico de dicho proceso es menor o igual al tam de la partición disponible para la ejecución de procesos. En caso afirmativo carga el espacio lógico proceso de forma contigua comenzando en la dirección base. En caso contrario genera un mensaje error para el usuario. Una vez cargado en memoria el proceso que se desea ejecutar, el sistema operativo transfiere control del procesador a dicho proceso para que se inicie su ejecución. Cuando finalice su ejecución proceso transfiere el control al sistema operativo invocando de forma explícita o implícita una llamada sistema del tipo terminar. Ahora el sistema operativo puede cargar en memoria otro proceso. Para garantizar la protección del sistema operativo, es decir, evitar que los procesos de usuario hag referencias a direcciones de memoria físicas ocupadas por el sistema operativo, se utiliza uno o registros para almacenar la dirección base de inicio de la partición para procesos o/y el tamaño de di partición. Cada referencia a memoria es comparada con dichos registros.
Administración de memoria
199
Ejemplo 6.1 Supóngase que el sistema operativo reside en las partes bajas de memoria, y que ocupa las direcciones .cas O hasta DirPI . Es necesario guardar en un registro, que se denomina registro base, la dirección - FI + 1. Dada una dirección lógica DirL, la dirección física se forma sumando DirL a la dirección con.da en el registro base. De esta forma nunca es posible acceder a direcciones inferiores a la dirección , ngase ahora que la partición para procesos ocupa la parte baja de memoria principal, desde la ión física Ohasta la dirección DirPI . Por su parte el sistema operativo ocupa la parte alta de memoria - e la dirección DirPI + 1 hasta Dirpmax. Nótese que en este caso no es necesario traducir las direcciones .:-cas, ya que una dirección lógica equivale a una dirección física. garantizar la protección del sistema operativo se necesita un registro, denominado registro límite, en e hay que almacenar DirpI + 1. Cuando se genera una dirección lógica el hardware comprueba que menor que el valor del registro límite. En caso afirmativo la referencia a memoria es válida, si no se ce una excepción que al ser tratada por el sistema operativo provocará el aborto del proceso.
•
Particionamiento fijo Características istemas multiprogramados se cargan múltiples procesos en el estado preparado para ejecución en .......,.-...cuoria principal. En un sistema con un único procesador, solo uno de los procesos podrá encontrarse tado ejecutándose. Si el proceso en ejecución se bloquea en espera de la aparición de un evento, por ejemplo, la finalización de una operación de E/S, otro proceso en el estado preparado para .ón puede ser planificado para ser ejecutado. La multiprogramación permite mejorar el rendimiento -stema, evitando que sus recursos se encuentren inactivos. -.3 forma más sencilla de gestionar la memoria en sistemas multiprogramados consiste en dividir la '::I:l:JOn'a principal en un número fijo N de particiones que pueden ser de igual o de diferente tamaño. Esta -' n puede realizarse, por ejemplo, manualmente en tiempo de arranque del sistema. A esta técnica oonoce como particionamiento fijo. -na partición se reserva para contener el sistema operativo. Normalmente está partición se encuentra extremo de la memoria, o en la parte baja o en la parte alta. Como los vectores de interrupción ión 8.3.3) se suelen colocar en la parte baja de memoria, el sistema operativo se suele colocar ~""' -'Oll allí. restantes N -1 particiones están disponibles para cargar procesos. En cada partición solo se puede _ un proceso. En consecuencia el número de particiones en que se divida la memoria principal, fijará de multiprogramación del sistema, es decir, el número máximo de procesos que pueden estar ~'!3lOs simultáneamente en memoria principal. - si tema operativo mantiene una estructura de datos, denominada tabla de descripción de parti. que contiene la siguiente información por cada partición: dirección física de comienzo (también
200
Fundamentos básicos de los sistemas operativos
denominada dirección base), tamaño y estado (si está libre o ocupada). El sistema operativo se encarga de gestionar el estado de cada partición, ya que la dirección base y el tamaño son fijados en tiempo de arranque. Cuando se asigna una partición a un proceso, el sistema operativo guarda el número de partición asignada en el bloque de control del proceso. Además marca como ocupada la entrada de la tabla de descripción de particiones asociada a dicha partición. Cuando un proceso finaliza su ejecución o es intercambiado al área de intercambio en memoria secundaria su partición de memoria queda libre para ubicar a otro nuevo proceso o a un proceso intercambia procedente del área de intercambio. Cuando hay que asignar una partición a un proceso se busca una partición libre en la tabla de d cripción de particiones .
• Ejemplo 6.2
,
Considérese una memoria principal de 8 MiB estructurada en 4 Mipalabras por 2 bytes/palabra. Si unidad direccionable es una palabra, entonces cada palabra tiene asociada una dirección de memoria espacio de direcciones físicas consta por lo tanto de 4 Midirecciones. De aquí en adelante por simplificar, salvo que se indique lo contrario, se omitirá en los tamaños el té palabras, por ejemplo, en vez de escribir Mipalabras se escribirá simplemente Mi. Supóngase que se utiliza la técnica de particionamiento fijo. En la Figura 6.2a se representa la memo principal considerando que se ha sido dividida en cuatro particiones de 1 Mi cada una.
• Partición O. Ocupa el rango de direcciones físicas [O, 1024 Ki-l]. Está asignada al sistema ope tivo. • Partición l. Ocupa el rango de direcciones físicas [1024 Ki, 2048 Ki -1] . Está asignada actualm te al proceso B de tamaño 900 Ki. El espacio no utilizado de esta partición es de 1024 - 900 = L Ki, o equivalentemente de 248 KiB. • Partición 2. Ocupa el rango de direcciones físicas [2048 Ki, 3072 Ki-l]. Está asignada actualm te al proceso C de tamaño 500 Ki. El espacio no utilizado de esta partición es de 1024 - 500 = -_ Ki, o equivalentemente de 1048 KiB. • Partición 3. Ocupa el rango de direcciones físicas [3072 Ki, 4096 Ki -1]. Está asignada actualm te al proceso A de tamaño 200 Ki. El espacio no utilizado de esta partición es de 1024 - 200 = Ki, o equivalentemente de 1648 KiB. En la Figura 6.2b se representa la memoria principal considerando que ha sido dividida en cuatro p ciones de distinto tamaño:
• Partición O. Tiene un tamaño de 1 Mi Y ocupa el rango de direcciones físicas [O, 1024 Ki-l]. asignada al sistema operativo.
Administración de memoria
DirFo
DirFo
OKi
OKi
1\
Sistema Operativo
1024 Ki
I~
Partición 1 > (1024 Ki)
Proceso B (900 Ki)
Ki
Libre Proceso
1300 Ki
Libre
~
Partición O (1024 Ki) Partición 1 (276 Ki)
Partición 2 (1700 Ki)
Partición 2
3000Ki
. I~
Proceso A (200 Kl)
Libre
I~
Proceso G (500 Ki) Partición 3
> (1024 Ki)
IJ
Ki
~
> (1024 Ki)
Libre
Libre
\
Proceso E (1500 Ki)
I~
e (500 Ki)
_ 2 Ki
Sistema Operativo
Partición O
> (1024 Ki)
201
(a)
~
Libre 4096 Ki
)
Partición 3 (1096 Ki)
(b)
IgUra 6.2 - Memoria principal con particionamiento fijo. (a) Particiones de igual tamaño. (b )Particiones
distinto tamaño
Partición l. Tiene un tamaño de 276 Ki, ocupa el rango de direcciones físicas [1024 Ki, 1300 Ki -l]. Esta partición está libre. Partición 2. Tiene un tamaño de 1700 Ki Y ocupa el rango de direcciones físicas [1300 Ki, 3000 Ki-l]. Está asignada actualmente al proceso E de tamaño 1500 Ki. El espacio no utilizado de esta
partición es de 1700 - 1500
= 200 Ki, o equivalentemente de 400 KiB.
Partición 3. Tiene un tamaño de 1096 Ki Y ocupa el rango de direcciones físicas [3000 Ki, 4096 Ki- 1]. Está asignada actualmente al proceso G de tamaño 500 KiB. El espacio no utilizado de esta partición es de 1096 - 500 = 596 Ki, o equivalentemente de 1192 Kbytes.
• lécnica de particionamiento fijo fue utilizada por los sistemas operativos de algunos de los primeocomputadores. Por ejemplo, el sistema operativo OS;360, también conocido como OS/MFT, utilizado en algunos macrocomputadores de IBM.
202
Fundamentos básicos de los sistemas operativos
6.4.2.
Particiones de igual tamaño
La asignación de memoria con particionarniento fijo y particiones del mismo tamaño es bastante simple, ya que no importa qué partición libre se asigne a un proceso al ser todas iguales. Presenta, sin embargo, dos problemas:
• Limitación del tamaño máximo de los procesos qu_e se pueden cargar en memoria principal. Un proceso cuyo espacio de direcciones lógicas sea de mayor tamaño que el tamaño fijado para las particiones no podrá ser cargado en memoria y en consecuencia no podrá ser ejecutado. La única excepción a esta limitación se produce si el programa ha sido diseñado con superposiciones. Una superposición (overlay) es un conjunto de instrucciones y datos que se pueden ejecutar y acceder de forma autónoma. Un programa se compone de varias superposiciones que se almacenan en memoria secundaria. En un determinado instante de tiempo solo es necesario, para que pueda progresar en su ejecución, que esté cargada en memoria principal una única superposició del proceso. Cuando una superposición de un programa termina de ejecutarse invoca a otra superposición que es cargada desde memoria secundaria en el espacio de memoria principal que ocupaba la anterior. Esta técnica permite ahorrar espacio de memoria. Sin embargo, el diseño y la programación de un programa con superposiciones es bastante tediosa, sobre todo en el caso programas largos.
• Fragmentación interna. Si el tamaño del espacio de direcciones lógicas de un proceso es inferioc al tamaño de la partición que se la ha asignado entonces existe un espacio no utilizado dentro de dicha partición. Nótese que este espacio no puede ser utilizado por ningún otro proceso, es decir. es un espacio desperdiciado. Al desaprovechamiento de la memoria dentro de una partición se denomina fragmentación interna.
6.4.3.
Particiones de distinto tamaño
Se va considerar ahora el caso en que las N particiones pueden ser de distinto tamaño. Para asignar 1 particiones a los procesos, el sistema operativo puede mantener una cola de procesos por cada partici' Cuando un proceso debe ser cargado en memoria ingresa en aquella cola asociada a la partición de me tamaño que puede contener al proceso. La planificación de cada cola se realiza de forma independien por lo que no existe competencia entre los procesos de diferentes colas. La ventaja que presenta esta forma de asignación de las particiones a los procesos es que intenta . mizar la fragmentación interna dentro de cada partición. Sin embargo, puede provocar que las particio de mayor tamaño se queden vacías mientras que las colas asociadas a particiones de menor tamaño e llenas de procesos esperando. Es decir, se está infrautilizando la memoria. Para resolver este problema, una posible solución consiste en mantener una única cola de proc para todas las particiones. Cuando un proceso debe ser cargado en memoria, es colocado en dicha co En el momento que alguna partición se queda libre se busca un proceso en la cola para ser carg Algunos de los criterios de búsqueda más utilizados son:
Administración de memoria
203
• Criterio del primer ajuste. Consiste en buscar el proceso más cercano a la cabecera de la cola cuyo tamaño sea igual o menor al de la partición libre. Este criterio de búsqueda produce búsquedas rápidas, sin embargo no minimiza la fragmentación interna. • Criterio del mejor ajuste. Busca en toda la cola al proceso de mayor tamaño que entre dentro de la partición. Este criterio de búsqueda minimiza la fragmentación interna; pero produce búsquedas más lentas al tener que buscar en toda la cola. Además discrimina a los procesos de pequeño tamaño, como suelen ser los asociados a tareas interactivas. Obviamente estos procesos deben ejecutarse rápidamente y no ser relegados continuamente por otros procesos de mayor tamaño. Una posible solución sería imponer un valor máximo de veces que un proceso puede ser discriminado.
'emplo 6.3 - la Figura 6.3a se representa una memoria principal de 4 Mi a la que se aplica la técnica de particio-
'ento fijo con cuatro particiones de distinto tamaño. Cada partición destinada a procesos posee su .a cola de procesos que esperan para poder ser cargados en dicha partición.
Colas de entrada
~1 ':Ki
B 150 Ki
----+
Memoria Principal
Memoria Principal
Sistema Operativo
Sistema Operativo
Partición 1 (276 Ki)
Partición 1 (276 Ki) Cola de entrada
11:
D
1:000 Ki
H 300Ki
H 300 Ki
D 1000 Ki
B 150 Ki
----+
Partición 2 (1700 Ki)
Partición 2 (1700 Ki)
r-----
Partición 3 (1096 Ki)
Partición 3 (1096 Ki)
(a)
(b)
IFIgUra 6.3 - Memoria principal con particionamiento fijo y particiones de distinto tamaño con una cola entrada por partición (a) o una única cola de entrada para todas las particiones (b)
204
Fundamentos básicos de los sistemas operativos
En la cola de la partición 1 solo se pueden colocar procesos cuyo tamaño sea inferior o igual a 276 Ki. Esta cola posee dos procesos en espera el proceso B de 150 Ki Y el proceso E de 100 Ki. Por su parte en la cola de la partición 2 solo se pueden colocar procesos cuyo tamaño sea superior a 1096 Ki e inferior o igual a 1700 Ki. Actualmente esta cola esta vacía Finalmente en la cola de la partición 3 solo se pueden colocar procesos cuyo tamaño sea superior a 276 Ki e inferior o igual a 1096 Ki. Actualmente esta cola tiene dos procesos en espera: el proceso H de 300 Ki Y el proceso D de 1000 Ki. En la Figura 6.3b se representa la misma memoria principal pero considerando una única cola de entrada. que actualmente contiene tres procesos: el proceso B de 150 Ki, el proceso D de 1000 Ki Y el proceso H de 300 Ki. Supóngase que la partición 2 se encuentra libre ya que ha finalizado el proceso que estaba cargado ella. En consecuencia se puede cargar un proceso de la cola en dicha partición. Para seleccionar el proceso de la cola que será cargado se puede utilizar por ejemplo el criterio de primer ajuste, es decir, buscar al primer proceso de la cola cuyo tamaño sea menor o igual al tam de la partición. En este casó, de acuerdo con este criterio se cargaría en la partición 2 al proceso B. tiempo de búsqueda en la cola es muy pequeño ya que el proceso B es el primero de la cola: Por o lado la fragmentación interna es de 1700 - 150 = 1550 Ki, es decir, el 91.2 % del espacio de la partici ' 2 se desperdicia al cargar en ella al proceso B. Si se utilizara el criterio del mejor ajuste se buscaría en toda la cola al proceso de mayor tamaño que en dentro de la partición. En este caso el proceso seleccionado sería el proceso D. El tiempo de búsqu sería mayor que en el caso anterior, pero la fragmentación interna es más pequeña: 1700 - 1000 = Ki, es decir, el 41.2 % del espacio de la partición 2 se desperdicia al cargar en ella al proceso D.
La técnica de particionamiento fijo con particiones de distinto tamaño presenta los mismos prob mas que presentaba el uso de particiones de igual tamaño: la existencia de fragmentación interna . limitación del tamaño máximo del espacio de direcciones lógicas del proceso que puede ser carg en memoria. Sin embargo ambos problemas en el caso de particiones de tamaño variable son de magnitud menor que en el caso de particiones de tamaño fijo. Usando particiones de tamaño vari la fragmentación interna es más pequeña. Además es posible cargar procesos de mayor tamaño configura una partición lo suficientemente grande para contenerlos.
6.4.4.
Traducción de direcciones y protección
La traducción de direcciones lógicas a direcciones físicas en la técnica de gestión de memoria diante particionamiento fijo requiere del uso de dos registros denominados registro base y registro lí (ver Figura 6.4). Cuando un proceso es planificado para ser ejecutado, el sistema operativo carga en el registro la dirección física base de la partición de memoria principal donde se encuentra cargado el proc Además carga el registro límite con la dirección lógica más alta del espacio de direcciones lógicas
Administración de memoria
205
eso, es decir, con el tamaño de su espacio lógico. El sistema operativo obtiene la información que ""a en estos registros del bloque de control del proceso. Cuando el procesador hace una referencia a una dirección lógica (Dird se compara con el valor de _. tro límite. Si la dirección es mayor que dicho valor, entonces el hardware genera una excepción error de direccionamiento que al ser tratada por el sistema operativo típicamente suele producir la . ación del proceso y la notificación de dicha circunstancia al usuario propietario del proceso. Si la ción lógica es menor que el valor del registro límite entonces se le suma el contenido del registro para generar la dirección física (DirF ) correspondiente. _'ótese que el registro base impide el acceso de un proceso a direcciones físicas inferiores a las asiga su espacio lógico. Por otra parte el registro límite impide el acceso a direcciones físicas superiores asignadas a su espacio lógico. De esta forma se protege el espacio de direcciones lógicas del sisoperativo o el espacio de otro proceso contra el acceso involuntario o intencionado del proceso en ión.
Registro Base Registro Límite
--- ---
-----
Proceso
ador
Error de direccionamiento Memoria Principal
Figura 6.4 - Traducción de direcciones y protección de memoria con particionarniento fijo
206
Fundamentos básicos de los sistemas operativos
• Ejemplo 6.4 Considérese un proceso E cuyo espacio de direcciones lógicas en decimal va desde la dirección O has la dirección 49999, es decir ocupa un total de 50000 direcciones. Dicho proceso ha sido cargado en partición de memoria principal cuya dirección física base es 125000. Cuando el proceso E sea planificado para ejecución en el registro base se almacenará el número decimal 125000 y en el registro límite el número decimal 50000. De acuerdo con estos dos valores el rango direcciones físicas asociadas al proceso E iría desde la dirección 125000 hasta la dirección 174999. Cuando el procesador busca una instrucción de este proceso comprueba si la dirección lógica conteni en el contador del programa es menor que el contenido del registro límite. En caso afirmativo se sum el valor del contador del programa y del registro base para generar la dirección física de memoria don se debe ir a buscar dicha instrucción. En caso negativo se produciría una excepción por error de dir cionamiento que debe ser atendida por el sistema operativo. El mismo procedimiento se aplica cuando proceso desea acceder a una cierta dirección lógica asociada a un dato. Por ejemplo, si en el contador de programa se encuentra la dirección lógica DirL = 1O, como es me que el contenido (50000) del registro límite no se produciría un error de direccionamiento. La direcci ' física donde el procesador debe buscar la instrucción a ejecutar es DirF=12501O, que se obtiené de s la dirección virtual al contenido del registro base 125000. Por el contrario, si el programa desea escribir en la dirección lógica DirL=50100, como es mayor que contenido (50000) del registro límite se produciría un error de direccionamiento. Gracias a este mecanismo de traducción de direcciones el espacio de direcciones lógicas de un p ceso puede estar cargado en cualquier partición de la memoria principal. O lo que es equivalente se di que el sistema soporta reubicación dinámica en tiempo de ejecución.
6.4.5.
Ventajas e inconvenientes
La técnica de gestión de memoria mediante particionamiento fijo presenta como principal ven que es sencilla de implementar para el sistema operativo, únicamente requiere una tabla de descripci ' de particiones y de una o varias colas para contener a los procesos que deben ser cargados en mem La gestión de estas estructuras produce muy poca sobrecarga. Los principales inconvenientes de esta técnica son que provoca fragmentación interna y que el tam máximo de proceso que puede ser cargado en memoria viene limitado por la partición de mayor tam que se defina. Además el número máximo de procesos cargados en memoria principal o grado de multiprogr ción está limitado por el número de particiones que se definan en el momento de arrancar el sistema. repercute en una disminución del rendimiento máximo del sistema, es decir, del grado de utilización procesador y de los canales de E/S.
Administración de memoria
207
Particionamiento dinámico -.1. Características La técnica de gestión de memoria denominada particionamiento dinámico se caracteriza porque el
o de particiones no es fijo sino que varía a lo largo del tiempo. Así, en la memoria principal se . guen dos tipos de elementos: particiones y huecos. Una partición es una zona contigua de memoria .:.c::;pciIí1a, mientras que un hueco es una zona contigua de memoria libre. Inicialmente al arrancar el sistema, únicamente existe una partición y un gran hueco. En dicha pare aloja el sistema operativo. Conforme transcurre el tiempo se van creando más particiones para esos que deben ser cargados en memoria principal y el hueco va disminuyendo de tamaño. Asi.-......,,,, si algún proceso es intercambiado fuera de memoria, se creará un nuevo hueco adicional. Por lo . el número de particiones y el número de huecos, va variando a lo largo del tiempo. Esta técnica de gestión de memoria fue utilizada por el sistema operativo OSjMVT, instalado en a:;:::ac:>s de las primeros macrocomputadores de IBM. Actualmente está técnica ya no se utiliza. Cllalldo un proceso tiene que ser éargado en memoria principal el sistema operativo busca un hueco o mayor tamaño que pueda contener al proceso. El espacio ,de dicho hueco asignado al proceso una partición. El espacio del hueco no asignado al proceso pasa a definir un nuevo hueco, que ente será más pequeño que el original. Con el paso del tiempo, al crearse nuevos procesos e intercambiarse otros, la memoria se va frag~-....cu,do entremezclando particiones asignadas con huecos. En la memoria principal irán apareciendo cada vez más pequeños, algunos de los cuales no pueden ser utilizados por sí solos para crear particiones debido a su pequeño tamaño. A este desaprovechamiento de memoria entre particioido a la dispersión del espacio libre en una serie de huecos de pequeño tamaño se le denomina n/ación externa. fragmentación externa supone un problema cuando no se puede crear una partición de tamaño S _~~_ la suma del espacio de todos los huecos sí que es mayor o igual a S, es decir, existe suficiente '0 libre en memoria pero no es contiguo. na forma de solucionar el problema de la fragmentación externa es usar la técnica conocida como .:::J!r:;;lru:t,ación de memoria, que consiste en agrupar todos los huecos pequeños en un único hueco. Una e implementación de esta técnica consiste en mover todas las particiones hacia un extremo de la '::E::::::mn'a de forma que estén contiguas. Así se consigue que los huecos se desplacen hacia el otro extremo pen para formar un único hueco. El principal inconveniente de la compactación de memoria es ume bastante tiempo de uso del procesador, lo que produce una alta sobrecarga. _.~-.....p , lo
6.S
- gase una memoria principal de 4 Mi donde el sistema operativo ocupa una partición de 1 Mi. m:::!biDente existe un hueco de 3 Mi disponibles para cargar procesos (ver Figura 6.5a). se crea un proceso A de 200 Ki. Una vez que se le asigna espacio al proceso A queda un hueco de _ . (ver Figura 6.5b). -: se crea un proceso B de 1700 Ki. Se puede cargar en memoria ya que existe un hueco de 2872
208
Fundamentos básicos de los sistemas operativos
Ki. Una vez que se le asigna una partición de 1700 Ki al proceso B queda hueco de 1172 Ki (ver Figura 6.5c). En t3 se crea un proceso C de 500 Ki. Se puede cargar en memoria ya que existe un hueco de 1172 Ki. Una vez que se le asigna espacio al proceso C queda hueco de 672 Ki (ver Figura 6.5d). En t4 se crea un proceso D de 700 Ki. No se puede cargar en memoria porque el único hueco existente es de 672 Ki. Supóngase que el proceso B entra en el estado bloqueado en espera de que se produzca un determinado evento que puede que tarde en producirse. El intercambiador decide intercambiar el proceso B al área de intercambio en memoria secundaria. Se genera en ts un hueco de 1700 Ki (ver Figura 6.5e). por lo que se puede cargar el proceso D. Una vez que se le asigna una partición al proceso D (ver Figura 6.50 queda un hueco de 1000 Ki. En t6 el proceso A finaliza su ejecución por lo que el espacio que ocupaba en memoria queda disponible para albergar a otros procesos, es decir, se forma un hueco de 200 Ki (ver Figura 6.5g). En este instante existirían tres huecos en la memoria principal de 200 Ki, 1000 Ki y 672 Ki, respectivamente. Se obsem l como la memoria se va fragmentando entremezclando particiones asignadas con huecos Por otra parte el hueco de mayor tamaño limita el tamaño máximo de los procesos que se deseen cargar en memoria principal. En este caso; para este instante de tiempo el tamaño máximo sería de 1000 Ki Nótese que existe lS72 Ki de espacio libre, el problema es que dicho espacio no es contiguo, por lo que no puede cargarse un proceso de tamaño comprendido entre 1000 Ki y lS72 Ki.
• Comúnmente tanto el tamaño de la partición que se crea para un proceso como el espacio que sobra. forma otro hueco, son múltiplos de una determinada unidad de asignación o bloque de memoria mínimo El tamaño de la unidad de asignación es constante y nunca inferior al tamaño de una palabra. Puede desde unos pocos bits (S, 16, 32, 64, ... ) hasta varios KiB (1,4, S, ... ). De esta forma una partición (o hueco) constará de un determinado número de bloques de memoria o unidades de asignación. El asignar la memoria de esta forma intenta evitar el problema de tener huecos de memoria de tam muy pequeño, cuyo registro en las estructuras de datos del sistema operativo requieran más espaci del que ocupa el propio hueco, lo cual supone un desperdicio de memoria. Por su parte esta forma de asignar la memoria introduce fragmentación interna en las particiones. Aunque dicha fragmentación despreciable en comparación con la técnica de memoria con particionamiento fijo, ya que como má la fragmentación interna en una partición será de casi una unidad de asignación . • Ejemplo 6.6 Supóngase que un sistema operativo realiza la gestión de la memoria principal usando la técnica particionamiento dinámico. La unidad de asignación o bloque de memoria que utiliza es de 64 bit bytes). Para cargar en memoria un proceso de 26625 bytes se le debe asignar una partición con un total de: . (26625) ceIl -S-
= 3329 bloques
Administración de memoria
Sistema Operativo (1024 Ki)
Sistema Operativo (1024 Ki)
Sistema Operativo (1024 Ki)
Sistema Operativo (1024 Ki)
Proceso A (200 Ki)
Proceso A (200 Ki)
Proceso A (200 Ki)
Proceso B (1700 Ki)
Proceso B (1700 Ki)
Libre (2872 Ki)
Libre (3072 Ki)
Proceso Libre (1172 Ki)
(a)
(b)
Libre (672 Ki) (d)
(c)
Sistema Operativo (1024 Ki)
Sistema Operativo (1024 Ki)
Sistema Operativo (1024 Ki)
Proceso A (200 Ki)
Proceso A (200 Ki)
Libre (200 Ki)
Proceso D (700 Ki)
Proceso D (700 Ki)
Libre (1000 Ki)
Libre (1000 Ki)
Libre (1700 Ki)
Proceso
e (500 Ki)
Proceso
e (500 Ki)
e (500 Ki)
Proceso
e (500 Ki)
Libre (672 Ki)
Libre (672 Ki)
Libre (672 Ki)
(e)
(f)
(g)
Figura 6.5 - Ejemplo de gestión de memoria con..particionamiento dinámico
209
210
Fundamentos básicos de los sistemas operativos
El espacio asignado al proceso es de 3329·8 = 26632 bytes. En consecuencia la fragmentación interna de la partición asignada al proceso es de 26632 - 26625 = 7 bytes, es decir de casi una unidad de asignación .
•
Para poder implementar la técnica de gestión de memoria mediante particionamiento dinámico el sistema operativo debe mantener una o varias estructuras de datos que contengan la información sobre las particiones y los huecos existentes en memoria principal. Una posibilidad es mantener una única estructura de datos que mantenga simultáneamente las particiones y los huecos existentes en memoria principal. Dicha estructura se puede implementar con un mapa de bits o con una lista enlazada (simple o doble). En el caso de usar una lista ésta puede ser organizada por direcciones físicas o por tamaños. Otra posibilidad consiste en mantener dos listas independientes: una de particiones y otras de huecos. Así se consigue acelerar el proceso de búsqueda de huecos, sobre todo si dicha lista está organizada por tamaños. Sin embargo la operación de desasignación de memoria se relantiza ya que cuando un proceso finaliza, o es intercambiado al área de intercambio, el sistema operativo tiene que que actualizar do estructuras de datos. Primero tiene que eliminar la entrada que ocupa el proceso en la lista de particiones y a continuación tiene que añadir, en el lugar correcto, una entrada en la lista de huecos.
Bloque n° 100 ---+ ............ Partición 4 .......... .
1+-------+...,
···········-(Proceso F) .......... .
~----------~-+~
Libre ....................................................... Libre ............ Partición 5 ........... 16 bloques de 1+-------+-+-+-11-+-++-1 memoria principal ·····,,··-(Proceso C) ...... ,.... 7 O
I
1 1 lOO l 1 1 Mapa de bits asociado 1 100 1 1 1 O
~=**=l=Fl=*=l
Libre Libre ............ Partición 6 ......... .. .......... {Proceso V) .... ··· ....
Bloque nO 115 ---+ .......... ......... !:A?.r.~ . . . ...... ..... . I + - - - - - - - - - - - - - - - '
Figura 6.6 - Mapa de bits para establecer el estado libre u ocupado de los bloques de la memoria principal
Administración de memoria
211
Obviamente estas estructuras ocupan espacio de memoria. Cada entrada de una lista o un mapa de ·ts puede ocupar varias palabras de memoria. Por ello, no parece razonable el que existan huecos de memoria de tamaño muy pequeño (unas pocas palabras). Ejemplo 6.7 Considérese una memoria principal con una tamaño de palabra de 8 bits. En la parte izquierda de la 19ura 6.6 se representan dos palabras de memoria de direcciones físicas DirF y DirF+ 1 que forman del mapa de bits que puede utilizar un sistema operativo para saber que espacio de la memoria "Xincipa1, descompuesto en unidades de asignación o bloques de un determinado tamaño, se encuentra formando parte de un hueco o asignado a un proceso. -=- la parte derecha de la Figura 6.6 se representan 16 bloques de una memoria principal, en concreto
bloque número 100 al 115. Recuérdese que un bloque o unidad de asignación estará formado por un rminado número de palabras, es decir, abarcará un determinado rango de direcciones físicas. bloques 100 a 102 están ocupados por el proceso F, por eso los tres bits más significativos (bit 7 a
Figura 6.7 - Parte de la lista doblemente enlazada que registra la utilización de la memoria principal de la Figura 6.6
212
Fundamentos básicos de los sistemas operativos
bit 5) de la palabra DirF del mapa de bits se encuentran a 1. A continuación existe un hueco formado por los bloques 103 a 104, por ello los bits 4 y 3 de la palabra DirF del mapa de bits se encuentran a O. Los bloques 105 a 109 están ocupados por el proceso C, por eso los tres bits menos significativos (bit _ a bit O) de la palabra DirF del mapa de bits se encuentran a 1. Además los dos bits más significativos de la palabra DirF+ 1 del mapa de bits se encuentran también a 1. Los bloques 110 a 111 forman un hueco por ello los bits 5 y 4 de la palabra DirF+ 1 del mapa de bi están a O. Los bloques 112 a 114 están ocupados por el proceso V por ello los bits 3 a 1 de la palabra DirF+ 1 del mapa de bits están a 1. Finalmente el bloque 115 forma un hueco por ello el bit menos significativo de la palabra QirF+ 1 del mapa de bits está a O. En vez de un mapa de bits el sistema operativo podría utilizar una lista (simple o doblemente) enlazada para registrar las particiones asignadas a procesos y los huecos de la memoria principal. En la Figura 6.7 se representa parte de una lista doblemente enlazada cuyas entradas están asociadas a los 16 bloques de memoria principal de la Figura 6.6. Cada entrada de la lista contiene la siguiente información sobre una determinada zona de la memoria principal: estado (partición asignada a proceso o hueco), direcci ' física base del primer bloque de la partición o del hueco y el número de bloques de que consta la partici ' o el hueco. Nótese que cada entrada i de la lista contiene un puntero (dirección física) a la entrada i de la lista y otro puntero a la entrada i + 1 de la lista. Otra posibilidad sería utilizar dos listas independientes una de particiones y otra de huecos, tal y co se ilustra en la Figura 6.8.
Lista de particiones
Lista de huecos
Figura 6.8 - Parte de la lista de particiones y la lista de huecos asociadas a la memoria principal de la Figura 6.6
Administración de memoria
- .2.
213
Asignación de espacio de memoria principal
Cuando el sistema operativo tiene que cargar en la memoria principal un proceso con un espacio de ciones lógicas de tamaño S busca en las estructuras de datos asociada a la gestión de memoria un eco disponible de tamaño igualo mayor a S para crear una partición para el proceso. Algunos de los coritmos de búsqueda más utilizados sori: • Algoritmo del primer ajuste (first fit). Se comienza a buscar desde el principio de la estructura de datos y se asigna el primer hueco con un tamaño igualo mayor a S. Este algoritmo es sencillo de implementar. Además es rápido ya que minimiza el tiempo de búsqueda. Con el paso del tiempo este algoritmo produce pequeños huecos al comienzo de la estructura de datos. • Algoritmo del siguiente ajuste (next fit). La búsqueda en la estructura de datos de un hueco de tamaño igualo mayor a S se inicia desde donde finalizó la búsqueda anterior. Aunque este algoritmo se ideó con la intención de mejorar el aprovechamiento de memoria que producía el algoritmo del primer ajuste, diversas simulaciones han demostrado que con el paso del tiempo produce resultados ligeramente peores, tanto en tiempo de búsqueda como en aprovechamiento de memoria. • Algoritmo del mejor ajuste (best fit) . Se busca en toda la estructura de datos un hueco cuyo tamaño sea igual o exceda lo mínimo posible del valor S. Este algoritmo, al buscar en toda la estructura de datos, es más lento que el algoritmo del primer ajuste o del siguiente ajuste. Además produce huecos de memoria muy pequeños que no suelen ser utilizables para posteriores asignaciones, lo que obliga a realizar compactación de memoria más frecuentemente. • Algoritmo del peor ajuste (worst fit) . Se busca en toda la estructura de datos un hueco cuyo tamaño sea igualo exceda lo máximo posible del valor S, es decir, se busca el hueco más grande posible. Con ello se pretende que los huecos que se generen sean aprovechables para posteriores asignaciones y en consecuencia haya que realizar compactación menos frecuentemente. Diferentes simulaciones han demostrado que con el paso del tiempo este algoritmo no es muy efectivo reduciendo la fragmentación externa y la frecuencia de realización de compactación.
De estos cuatro algoritmos, el más rápido es el algoritmo del primer ajuste, lo cual es lógico ya en principio, no necesita buscar en toda la estructura de datos. Por otra parte en relación con el echamiento de la memoria diversos estudios han concluido que no se puede afirmar que el algoritmo jor ajuste sea superior al algoritmo del primer ajuste, pero sí que el algoritmo del peor ajuste es el produce un aprovechamiento menor de la memoria. plo 6.8 ema operativo utiliza una lista de particiones y una lista de huecos para administrar el espala memoria principal. En un determinado instante de tiempo la lista de huecos tiene 8 entradas = 0, 1, 2, ... ,7). El tamaño de los huecos a los que hacen referencia estas entradas es el siguiente (co""'_'T.'I ndo por i = O): 1200 Ki, 550 Ki, 730 Ki, 2200 Ki, 400 Ki, 1000 Ki, 100 Ki y 680 Ki. Supóngase ea asignar una partición a un proceso A de 850 Ki.
214
Fundamentos básicos de los sistemas operativos
Si se utiliza el algoritmo del primer ajuste se comenzaría a buscar desde el principio de la lista, es decir, desde la entrada O, un hueco de tamaño igualo mayor a 850. En este caso la búsqueda finaliza rápidamente ya que se le asignaría el hueco de 1200 Ki al que referencia la entrada O. Se generaría un nuevo hueco de 350 Ki. Si se utiliza el algoritmo del mejor ajuste se buscaría en toda la lista un hueco de tamaño igualo que exceda lo mínimo posible de 850. En este caso se le asignaría el hueco de 1000 Ki al que referencia la entrada 5. La búsqueda tarda 8 veces más que en el caso anterior ya que hay que inspeccionar las ocho entradas de la lista de huecos. Sin embargo el nuevo hueco que se genera es de 150 Ki, más pequeño que en el caso anterior. Finalmente supóngase que se utiliza el algoritmo del peor ajuste, se buscaría en toda la lista un hueco de tamaño igualo que exceda lo máximo posible de 850. En este caso se le asignaría el hueco de 2 Ki al que referencia la entrada 3. El tiempo de búsqueda es el mismo que en el caso anterior, ya que inspecciona toda la lista. Sin embargo el nuevo hueco que se genera es de 1350 Ki, mucho más grande que en el caso anterior.
•
6.5.3.
Traducción de direcciones y protección
En la técnica de gestión de memoria mediante particionamiento dinámico la traducción de direcci~ nes y la protección se implementa de la misma manera que en la técnica del particionamiento fijo, decir, se utilizan dos registros dedicados denominados registro base y registro límite. El sistema operativo, cuando se va a ejecutar un proceso, carga en el registro base la dirección física de inicio de partición de memoria física asociada al proceso, y carga en el registro límite el tamaño de la partición.. Cuando el procesador al ejecutar el proceso hace una referencia a una dirección lógica para b por ejemplo una instrucción o un operando, ésta es comparada con el valor de registro límite. Si dirección es mayor que dicho valor, entonces se generara una excepción que al ser tratado por el siste operativo típicamente suele producir la terminación del proceso y la notificación de dicha circunstan al usuario propietario del proceso. Si la dirección lógica es menor que el valor del registro límite enton la dirección lógica se suma al contenido del registro base para generar la dirección física correspondiente En definitiva, el registro base y el registro límite impiden el acceso de un proceso a direcciones físi inferiores o superiores, respectivamente, a las asignadas a su espacio lógico. De esta forma se protege el espacio de direcciones lógicas del sistema operativo o el espacio de otro proceso contra el ac involuntario o intencionado del proceso en ejecución.
6.5.4.
Ventajas e inconvenientes
La técnica de particionamiento dinámico presenta las siguientes ventajas con respecto a la técnica de particionamiento fijo: • Minimiza la fragmentación interna. Como se ha comentado la fragmentación interna de una partición es prácticamente despreciable, ya que como máximo será cercana a una unidad de asignaci -
Administración de memoria
215
• Permite ejecutar procesos de mayor tamaño. En un determinado instante de tiempo el tamaño máximo del proceso que puede cargarse en memoria viene limitado por la existencia de una hueco de tamaño igual o mayor que lo pueda contener. Inicialmente en la memoria solo está cargado el sistema operativo, por lo que el resto de la memoria formaría un hueco de tamaño S que podría albergar un proceso de tamaño máximo menor o igual a S. • Permite asignar fácilmente más espacio a procesos cuya región de datos o pila aumenta por encima del tamaño inicialmente asignado. Para ello el sistema operativo puede proceder de dos formas. Una opción es crear una partición de mayor tamaño y reubicar al proceso en dicha partición. Otra posibilidad es añadir a la partición del proceso el espacio de un hueco adyacente a la partición. Por otra parte la técnica del particionamiento dinámico presenta las siguientes desventajas con resa la técnica de particionamiento fijo:
• Las estructuras de datos que requiere para su implementación y los algoritmos para su gestión son más complejos. En consecuencia se produce una mayor sobrecarga al sistema. • Produce fragmentación externa. Lo que reduce el aprovechamiento de la memoria.
Paginación simple Descripción .....a técnica de gestión de memoria conocida como paginación consiste en dividir la memoria prinen bloques del mismo tamaño Sp denominados marcos de página o páginas físicas . El espacio de ·ones de un proceso también se divide en bloques del mismo tamaño Sp denominados páginas o lógicas. Una página de un proceso se carga en un marco de página libre de memoria principal. - .......J..lU'''' las páginas de un mismo proceso no tienen porque ocupar marcos contiguos. Sea CMP la capacidad de la memoria principal, el número NMP de marcos de página de tamaño Sp en divide la memoria principal se obtiene de la siguiente forma: CMP) NMP= fioor ( Sr
(6.1)
marco de página tiene asignado un identificador numérico entero positivo j que lo identifica unívoca. Al número j se le denomina número del marco de página. Así se habla del marco de j o marco j de memoria principal.
plo 6.9 Figura 6.9 se representa la memoria principal de 1 Gi de un determinado computador cuyo sistema . ·0 gestiona la memoria usando paginación con un tamaño de marco de 1 Ki. El número de marcos e descompone la memoria principal se obtiene aplicando (6.1):
216
Fundamentos básicos de los sistemas operativos
30
s;-
1Gi . NMP= fi oor (CMP) = 1 Ki = 2 2 10 = 220 = 1 meblmarcos = 1024kib·lmarcos Luego el número de marco de página j puede tomar los valores j = 0,1, ... , 220 - 1. Para acceder a una palabra perteneciente a un determinado marco, simplemente hay que indicar la dirección física correspondiente. Así, con las direcciones físicas expresadas en decimal DirF = 0, 1, 2, .. . , 1023 se acceden a las palabras que forman parte del marco j = 0, con las direcciones físicas DirF = 1024, 1025, ... ,204 se acceden a las palabras pertenecientes al marco j = 1, etc.
o ....r--M-a-rc-O-j-.=-O---,} 1024
S _ 1 Ki
,-
Marco )= l
2048
-+1-------1
Marco ) =2 2°_1
Memoria principal
Figura 6.9 - Estructura de la memoria principal de 1 Oi con marcos de página de 1 Ki del Ejemplo 6.9
Por otra parte, si Cx es el tamaño del espacio de direcciones lógicas de un proceso, el número Np páginas de tamaño Sp en que se descompone el espacio del proceso se obtiene de la siguiente forma: (6
Administración de memoria
217
Cada página del proceso tiene asignado un identificador numérico entero positivo i. Al número i se e denomina número de página. Así se habla de la página i del proceso X: Como se verá en la sección 7.8.1 el tamaño de página Sp es un factor de diseño importante de técnica paginación. Simplemente comentar ahora que el tamaño de página Sp está limitado por el dware del computador y que normalmente suele ser una potencia de dos: 29 bytes, 2 10 bytes, etc. Ejemplo 6.10
Ki
Considérese un cierto proceso A con un espacio de direcciones lógicas de tamaño 100 (ver Figura _lOa). En la Figura 6.lOb se representa dicho espacio de direcciones lógicas descompuesto en páginas 1
Ki.
Página i=O Página i=l
}
Sp= 1 Ki
Código (32 Ki)
32Ki
32 Ki
Página i=31 Página i=32
80 Ki
Página i=79 Página i=80
Datos (48 Ki)
80Ki Pila (20 Ki) (a)
Página i=99 (b)
Figura 6.10 - Espacio de direcciones lógicas de un cierto proceso A de 100 Ki: (a) Regiones del proceso. ) Páginas del proceso
, ero de páginas en que se descompone el proceso se obtiene aplicando (6.2): Np= ceil =0
(~:) = ceil C~~Ki) = 100 paginas
el número página i puede tomar los valores i = 0, 1, . . . , 99.
218
Fundamentos básicos de los sistemas operativos
Se observa que la región de código del proceso tiene un tamaño de 32 Ki Y ocupa las direcciones lógicas O a 32 Ki - 1. Esta región se encuentra contenida dentro de las páginas i = O a i = 31. Por su parte la región de datos con un tamaño de 48 Ki ocupa las direcciones lógicas 32 Ki a 80 Ki - 1 ' está contenida dentro de las páginas i = 32 a i = 79. Finalmente la región de pila que tiene un tamaño de 20 Ki ocupa las direcciones lógicas 80 Ki a 100 Ki - 1 Y está contenida en las páginas i = 80 a i = 99. Nótese que en este ejemplo una página i únicamente contiene direcciones lógicas de una única región (código, datos o pila). Esto no siempre es así, con otros tamaños página puede suceder que una página contenga direcciones lógicas de más de una región. Por ejemplo, si el tamaño de página fuera de 100 Ki todo el espacio de direcciones lógicas del proceso A estaría contenido en una única página.
•
En un determinado instante de tiempo un marco de página j puede estar libre o ocupado por un página i de un proceso X. Un marco se dice que está libre si se puede utilizar para cargar una página de un proceso . • Ejemplo 6.11 En la Figura 6.11 se muestra el contenido de cuatro marcos consecutivos de una memoria principal en determinado instante de tiempo. El marco j = 10003 contiene una copia de la página i = 3 de un proce A. El marco j = 10004 contiene una copia de la página i = 25 de un proceso G. El marco j = 1()()(}5 se encuentra libre, es decir, está disponible para albergar una página de algún proceso cuando el siste operativo lo considere necesario. Finalmente el marco j = 10006 contiene una copia de la página i = : de un proceso H. Debe tenerse en cuenta que si la memoria principal se descompone en NMP marcos un conjunto ellos, por ejemplo V, estarán reservados para el espacio del núcleo. El resto de marcos NMP - V est ' disponibles para cargar en ellos páginas de procesos de usuario. En teoría, el proceso de mayor tam que se puede cargar podría tener NMP - V páginas, pero entonces no se tendría multiprogramación. que solo podría cargar un proceso en memoria principal. • Ejemplo 6.12 Supóngase que V = 2 10 marcos de la memoria principal descrita en el Ejemplo 6.9 están reserva para el espacio del núcleo, entonces el número de marcos disponibles para alojar páginas de proceso usuarios es:
Así, los números de marco de página j = 0,1 ,2, .. . , 1023 hacen referencia a marcos de página reserva para el sistema operativo y los números de marco j = 1024, 1025, ... , 220 - 1 hacen referencia a mar de página disponibles para albergar páginas de procesos.
Administración de memoria
Página i=3 Proceso A
j
=
10003
Página i=25 Proceso G
j
=
10004
Libre
j
=
10005
Página i=3 Proceso H ,
219
j= 10006
Memoria principal Figura 6.11 - Ejemplo del contenido en un determinado instante de tiempo de cuatro marcos de una memoria principal en un sistema con paginación con páginas de 1 Ki
n bits
~
Dirección Física
~
N° de marco ~
f
Desplazamiento ~~
dbits
bits
~
m bits
Dirección Lógica
N° de página
Desplazamiento
P bits
dbits
Figura 6.12 - Formato de las direcciones físicas y de las direcciones lógicas en la técnica de paginación simple (mS;n)
lJ
220
Fundamentos básicos de los sistemas operativos
En la técnica de paginación una dirección física consta de dos campos (ver Figura 6.12): el número de marco de página de f bits y el desplazamiento dentro del marco de d bits. El tamaño f del campo número de marco de página se obtiene a partir del número NMP de marcos de página existentes, resolviendo la siguiente desigualdad:
mín {NMP ~ 2f }
(6.
f
Mientras que el tamaño d del campo desplazamiento se obtiene a partir del tamaño Sp de una página o de un marco de página expresado en unidades direccionables (usualmente palabras) resolviendo siguiente desigualdad:
mln{Sp ~ 2
d
}
(6.
Conocidos el tamaño de cada uno de estos campos, el tamaño n de una dirección física se calcula de la siguiente forma: n=f+d
(6. -
También se puede obtener del dato de la capacidad CMP de memoria principal expresada en unidades direccionables a través de la resolución de la siguiente desigualdad:
Por su parte, una dirección lógica consta de los siguientes dos campos (ver Figura 6.12): el núm de página de p bits y el desplazamiento dentro de la página de d bits. El tamaño p del campo núm de página se obtiene a partir del número total de páginas Np de que consta un proceso X resolviendo siguiente desigualdad:
mín{Np
~
2P }
P
Por su parte, el tamaño del campo desplazamiento es igual que el de una dirección física. Conocidos el tamaño de cada uno de estos campos, el tamaño m de una dirección lógica se calc de la siguiente forma: m=p+d
También se puede obtener del dato de la capacidad Cx del espacio de dIrecciones lógicas del pro _ X expresada en unidades direccionables mediante la resolución de la siguiente desigualdad:
En un esquema con pag~nación simple el tamaño m de una dirección lógica es menor o igual tamaño n de una dirección física, es decir, se verifica la relación m ~ n.
Administración de memoria
221
Ejemplo 6.13 upóngase la memoria principal del Ejemplo 6.9, el tamaño n en bits de una dirección física de memoria se obtiene resolviendo la desigualdad:
Como CMP = 1 Gi = 230 palabras entonces n= 30 bits. El rango de direcciones físicas posibles se .ende desde O hasta 230 - 1. -na dirección física de memoria se puede descomponer en dos campos: número de marco y desplaza-ento. El tamaño ¡ del campo número de marco se obtiene resolviendo la desigualdad:
o NMP
= 220 marcos entonces ¡ = 20 bits.
otra parte el tamaño d del campo desplazamiento se obtiene resolviendo la desigualdad:
mJn{Sp ~ 2
d
}
Sp = 1 Ki = 2 10 palabras entonces d = 10 bits. que se cumple la relación n = ¡ + d. Luego si se conocen dos de las tres cantidades {n, ¡, d} se obtener la restante a través de la expresión anterior. En la Figura 6.13 se representa el formato de dirección física para esta memoria. ejemplo, la dirección física expresada en decimal DirF
DirF
= 10243584 10 , equivale en binario a la direc-
= 0000001001110001001110000000002
hace referencia al marco j = 0000001001110001001 h = 1000310 de memoria principal y a un dentro del contenido del marco de 10000000002 = 51210 palabras.
lII:S~zanu·ento
.. Dirección Física
n=30 bits
~
N° de marco
.
Desplazamiento ~
f=20 bits
.
~
d=lO bits
Ftgura 6.13 - Formato de una dirección física para una memoria de 1 Gi con marcos de página de 1 Ki
222
Fundamentos básicos de los sistemas operativos
Marco j = 10003 10243072 - .......-------'---- , Página i=3 10243584 ---. ............. p~~~~~~. 'A . ............
t Desplazamiento
Página i=25 Proceso G
j = 10004
Libre
j = 10005
Página i=3 Proceso H
j = 10006
=
512
Memoria principal
Figura 6.14 - Contenido en un determinado instante de tiempo de cuatro marcos de una memoria principal en un sistema con paginación con páginas de 1 Ki. Ubicación de la dirección física 1024358410
En la Figura 6.14 se ilustra la ubicación en memoria principal de dicha dirección física. Se observa que el marco j = 10003 contiene en el instante de tiempo en el que se ha representado la memoria principal la página i = 3 del proceso A de 100 páginas descrito en el Ejemplo 6.10. El tamaño m en bits de una dirección lógica del proceso A se obtiene resolviendo la desigualdad:
17 bits. Con este tamaño de Como Cx = 100 Ki = 100.2 10 ~ 128.2 10 = 27 .2 10 = 2 17 entonces m dirección lógica el rango de direcciones lógicas posibles es O a 2 17 - 1 = 131071. Sin embargo puesto que el proceso A tiene un tamaño de 100 Ki el rango de direcciones válidas es O a 100 Ki - 1 = 102399. Una dirección lógica se descompone en dos campos: número de página y desplazamiento. El tamaño del campo desplazamiento de una dirección lógica es idéntico al del campo homónimo de una dirección física ya que el tamaño de una página coincide con el de un marco de página. m=17 bits
. Dirección Lógica
N° de pagina
...
p=7 bits
. .
•
Desplazamiento
d=10 bits
•
Figura 6.15 - Formato de una dirección lógica de proceso de 100 Ki con un tamaño de página de 1 Ki
Administración de memoria
223
Por otra parte el tamaño del campo número de página se obtiene resolviendo la siguiente desigualdad:
Como N p = 100 páginas y 100:::; 128 = 27 entonces p una dirección lógica del proceso A.
= 7 bits. En la Figura 6.15 se representa el formato
ejemplo, la dirección lógica expresada en decimal DirL = 358410, equivale en binario a la dirección: DirL = 000001110000000002 cual hace referencia al número de página i a de 10000000002 = 51210.
= 000001 h = 310
Y a un desplazamiento dentro de la
'~.
~
la Figura 6.16 se ilustra la ubicaCión de la dirección DirL , ~ . cas del proceso A.
o
= 358410 dentro del espacio de direcciones
, Página i=O
024 Página i=1 2048 Página i=2 3072 3584
--+ ........... Página i=3
...........
t Desplazamiento = 512
,
Memoria principal Figura 6.16 - Ubicación de la dirección lógica DirL = 3584 10 dentro del espacio de direcciones lógicas del proceso A
•
n sistema operativo para implementar la paginación generalmente utiliza las siguientes estructuras tos:
• Tablas de páginas. Cada proceso tiene asignada una tabla de páginas. Cada entrada i de la tabla de páginas de un proceso X contiene, entre otras informaciones, el marco j donde se encuentra almacena la página i del proceso X y los permisos de acceso a la página. Además puede contener información sobre la ubicación de la copia de la página en memoria secundaria, . aunque a veces esta información se implementa en una tabla diferente.
224
Fundamentos básicos de los sistemas operativos
• Tabla de marcos de página. Esta tabla tiene tantas entradas como marcos de página tiene la memoria principal. Cada entrada j de la tabla de marcos de página contiene, entre otras, las siguiente informaciones relativas al marco: su estado, es decir, si está libre o ocupado, punteros para crear una lista de marcos libres, y la ubicación en memoria secundaria de la copia de la página i contenida en el marco . • Lista de marcos libres. Es consultada cuando hay que asignar espacio a los procesos que deben er cargados t?n memoria principal. Cuando hay que asignar un marco se selecciona al primero de la lista. Si un marco queda libre es colocado al final de la lista.
La técnica de paginación de memoria puede implementarse de diferentes formas. En su implementación más sencilla, denominada paginación simple, para que un proceso X pueda ser ejecutado es necesario que todas sus páginas se encuentren cargadas en memoria principal, aunque no es necesario que estén cargadas en marcos contiguos. En la paginación simple cuando un proceso X de tamaño Np páginas tiene que ser cargado en memoria principal, el sistema operativo comprueba la existencia de Np marcos libres en la lista de marc libres. Si no hay marcos suficientes la carga del proceso tendrá que ser pospuesta hasta existan Np m cos libres. Si hay marcos libres suficientes, entonces se les asigna al proceso, los elimina de la lista marcos libres, los marca como ocupados en la tabla de marcos de página y carga en ellos las páginas del proceso. A continuación, se crea o se actualiza (si había sido intercambiado) la tabla de páginas proceso indicando el número de marco donde está cargada cada página. Además, si la tabla de pá . no estaba ya creada, almacena en el bloque de control del proceso un puntero a la dirección física comienzo de la tabla de páginas. Es importante darse cuenta que conforme evoluciona la ejecución de un proceso el contenido de tablas de página cambia. Por ejemplo, si un proceso fuese intercambiado fuera de memoria, todas páginas desaparecerían de memoria, cuando volviese a ser cargado en memoria sus páginas se carg en otros marcos, aquellos que hubiese libres en el momento de intercambiar dentro al proceso. Ob\ ' mente la tabla de páginas del proceso, tendrá que reflejar la nueva ubicación en memoria principal de páginas del proceso. También se irá modificando dinámicamente, conforme se cargan en memoria principal nuevos cesos o se intercambian dentro o fuera de ella procesos, el contenido de la tabla de marcos de página _ la lista de marcos libres . • Ejemplo 6.14
Supóngase dos procesos X e Y cuya imagen o espacio de direcciones lógicas construida en el área intercambio en disco (ver Figura 6.17) consta de cuatro y tres páginas, respectivamente. En la Figura 6. se muestran, en un determinado instante de tiempo t, las estructuras de datos que el sistema ope mantiene para implementar la técnica de paginación simple: las tablas de página de ambos proceso tabla de marcos de página y de la lista de marcos libres. Estas estructuras se encuentran almacenadas memoria principal dentro del espacio del núcleo. Asimismo en la Figura 6.19 se muestra el contenido los marcos j = 30 a j = 40 de la memoria principal en el mismo instante t.
Administración de memoria
DirLo DirLo O -+1;--____-:--:--___:_--, I--_P_a....: ' g:;...in_a_i=_O_----I } Sp O Página i=l Página i=2 Página i=3
225
I-_P_á...::g;...in_a_l_·=_O_-t} Sp Página i=l Página i=2
Espacio lógico Proceso Y
Espacio lógico Proceso X
Figura 6.17 - Espacio lógico de los procesos X e Y del Ejemplo 6.14 en el área de intercambio
j=O Otros campos
Marcoj
i=O
39
i=l
33 32 40
i=2
-
"' FJ
Tabla de páginas Proceso X Otros campos
i=O ~l
Estado Otros campos Asignado
Marco} 36 30
35 Tabla de páginas Proceso Y
j=30 j=3l j=32 j=33 j=34 j=35 j=36 }=37
}=38 }=39 }=40
Asignado Libre Asignado Asignado Libre Asignado Asignado Libre Libre Asignado Asignado Tabla de marcos de página
Lista de marcos libres
19Ura 6.18 - Contenido en el instante t de las estructuras de datos en el espacio del núcleo de un rminado sistema operativo para la implementación de la técnica de paginación simple en el Ejemplo 14
. las de páginas permiten conocer la localización en memoria principal de las páginas de los pro~'a que contienen, entre otras informaciones, el marco j donde se encuentra cargada cada página. plo la página i = del proceso X se encuentra cargada en el marco j = 39.
°
la de marcos de página contiene, entre otras informaciones, el estado (libre o asignado) de cada _Se observa en la Figura 6.18 que los marcos j = 0,1, ... ,30,32,33,35,36,39 Y40 se encuentran ....,,,...-;..0 , mientras que los marcos j = 31, 34, 37 Y 38 están libres. Luego estos marcos formarán parte :!sta de marcos libres. En la Figura 6.18 se observa que el primer marco libre de la lista es el marco
226
Fundamentos básicos de los sistemas operativos
Página i= 1 (Y) Libre Página i=2 (X) Página i= 1 (X) Libre Página i=2 (Y) Página i=O (Y) Libre Libre Página i=O (X) Página i=3 (X) ,
j=30 j=31 j=32 j=33 j=34 j=35 j=36 j=37 j=38 j=39 j=40
Memoria principal
Figura 6.19 - Contenido en el instante t de los marcos j = 30 a j = 40 de la memoria principal del Ejemplo 6.14 Estado Otros campos j=O Asignado
j=30 j=31 j=32 j=33 j=34 j=35 j=36 j=37 j=38 j=39 j=40
Asignado Asignado Asignado Asignado Asignado Asignado Asignado Asignado Libre Asignado Asignado Tabla de marcos de página
Otros campos
i=O i=l i=2
Marcoj 34 37 31
Tabla de páginas Proceso Z
Lista de marcos libres
j=30 j=31 j=32 j=33 j=34 j=35 j=36 j=37 j=38 j=39 j=40
Página i= 1 (Y) Página i=2 (Z) Página i=2 (X) Página i= 1 (X) Página i=O (Z) Página i=2 (Y) Página i=O (Y) Página i= 1 (Z) Libre Página i=O (X) Página i=3 (X)
Memoria principal
Figura 6.20 - Contenido de las estructuras de datos del sistema operativo y de la memoria principal después de crear al proceso Z del Ejemplo 6.14
Administración de memoria
227
- = 34, éste será el primero en ser asignado cuando sea necesario. Por su parte si algún marco queda
se añadirá al final de la lista, a continuación del marco j
= 38.
-=
la técnica de paginación simple todas las páginas de un proceso, para que éste pueda ser ejecutado, n estar cargadas en memoria principal. En la Figura 6.19 se observa que las cuatro páginas del so X y las tres páginas del proceso Y están cargadas en marcos de memoria principal, por lo que procesos pueden ser ejecutados, cuando el planificador así lo decida. Supóngase ahora que se tiene asignar espacio para un nuevo proceso Z que consta de tres páginas. El sistema operativo le asignaría tres primeros marcos de la lista de marcos libres, es decir, los marcos j = 34, 37 Y 31, actualizaría las estructuras y construiría la tabla de páginas del proceso. En la Figura 6.20 se muestra cómo ,..,.,....,~",n'a configuradas las estructuras de datos del sistema operativo y la memoria principal.
•
Traducción de direcciones En la técnica de gestión de memoria mediante paginación, la traducci~n de direcciones lógicas a .ones físicas requiere que el sistema operativo cargue en el hardware cierta información sobre la páginas del proceso actualmente en ejecución. información que carga depende de los componentes hardware disponibles para realizar la traducdirecciones: Registro base. Se utiliza para almacenar la dirección física de comienzo de la tabla de páginas. Banco de registros. Se utiliza para almacenar una copia completa de la tabla de páginas. Buffe r de traducción de vista lateral (Translation Lookaside Buffer, TLB). Se utiliza para almaceaar algunas entradas de la tabla de páginas. :=
las siguientes secciones se describen los mecanismos más habituales de traducción de direcciones componentes.
-=:..mm',ón de direcciones con un registro base uema más sencillo de traducción de direcciones se basa en el uso de un registro base (ver 621). Cuando un proceso es planificado para ser ejecutado, el sistema operativo carga en dicho -"""'..,.la dirección física (DirFo) de comienzo de la tabla de páginas del proceso. do durante un ciclo de instrucción se referencia a una dirección lógica DirL, se suma el campo -.,--.... de página i de la dirección lógica a DirFO para obtener la dirección física DirF1 de la entrada i de páginas. A continuación se realiza una operación de lectura a memoria principal para acceder obtener el marco de página j donde se encuentra almacenada la página i. vez obtenido el número de marco j donde se aloja la página i ya se tiene toda la información :';:¡:::::xJ.Saruir la dirección física DirF a la que equivale la dirección lógica DirL, ya que el campo despla.-ne:=n es común en ambas direcciones.
228
Fundamentos básicos de los sistemas operativos
El mecanismo descrito de traducción de direcciones tiene como principal ventaja que únicamente requiere que el sistema operativo cargue el registro base en cada cambio de proceso, lo cual repercute e unos tiempos de cambio de proceso más pequeños. Su principal inconveniente es que la traducción de una dirección lógica requiere de un acceso memoria principal para.localizar en la tabla de páginas el marco j que contiene la página i. Este acc introduce un retardo en la ejecución de la instrucción en curso. Por este motivo este mecanismo de traducción de direcciones se utiliza en raras ocasiones. Sí se suelen utilizar variaciones del mismo, co se verá en las siguientes secciones.
Procesador
1. Dirección Lógica
I
N° de página
I
DirL
Desplazamiento
I
DirFo Tabla de páginas
Registro Base
I
DirFo
Dirección Física
DirF1
+
I
N° de marco
I ,....
Desplazamiento
Otros
I
,Marco)
Entrada i
iI
I
,./
......
DirF Desplazamiento
¡
Página i del proceso X cargada en el marco)
Memoria Principal Figura 6.21- Traducción de direcciones en paginación con un registro base
Marco)
Administración de memoria
229
ducción de direcciones con un banco de registros En el caso de disponer de un banco de registros (ve\ Figura 6.22), el sistema operativo puede cargar él, cuando se produce un cambio de proceso, una copia de la tabla de páginas del proceso que se va a utar.
Procesador
1
DirL
:>ireCCl'ón
Lógic
a--1
N° de página
I
Desplazamiento
I
Banco de registros O
1
--+i
Otros
Marco)
~
Np-l
Cl'ón
física
~
I
.........
N° de marco
I Desplazamiento I ./
T
Desplazamiento
1
Página i del proceso X cargada en el marco j
Marco)
DirF
Memoria Principal
Figura 6.22 - Traducción de direcciones en paginación simple con un banco de registros De esta forma cuando se referencia a una dirección lógica DirL, se utiliza el campo número de página DirL para acceder a la entrada i de la copia de la tabla de páginas del proceso almacenada en el banco ~ tros y obtener el marco de página j donde se encuentra almacenada la página i. Goa vez obtenido el número de marco j donde se aloja la página i ya se puede construir la dirección DirF a la que equivale la dirección lógica, ya que el campo desplazamiento es común en ambas iones.
230
Fundamentos básicos de los sistemas operativos
El mecanismo descrito tiene como principal ventaja que la traducción de una dirección lógica n requiere de ningún acceso a memoria principal. Su principal inconveniente, sin embargo, es que solo puede utilizar si se asegura que el tamaño de las tablas de páginas de los procesos nunca será mayor qu el tamaño del banco de registros. Oebe tenerse en cuenta un banco de registros suele tener entre 64 y 2 registros. Otro inconveniente de este mecanismo de traducción es que el sistema operativo, cuando se produ un cambio de proceso, tiene que copiar en el banco de registros la tabla de páginas del nuevo proc planificado lo que aumenta el tiempo de cambio de proceso y por tanto la sobrecarga.
Traducción de direcciones con un TLB Un TLB es una memoria caché especial de alta velocidad. Su funcionamiento es similar al de memoria caché del procesador. Cada entrada del TLB contiene una copia de una entrada de la tab de páginas del proceso actualmente en ejecución. Conviene matizar que no es necesario copiar en entrada del TLB todos los campos de una entrada de la tabla de páginas del proceso en ejecución . únicamente aquellos que son necesarios para poder realizar la traducción de direcciones (número página i y número de marco j), la protección, o determinar si la página ha sido modificada. Un puede tener entre 8 y 4096 entradas. Cuando el procesador hace una referencia a una dirección lógica OirL, el TLB examina en parale el campo número de página i de cada una de sus entradas para ver si alguno coincide con el nú de página i al que hace referencia OirL. Si el campo número de página i de alguna entrada del por ejemplo la entrada h, coincide con el número de página i de la dirección lógica, se dice que e producido un acierto en el TLB. Si ninguna coincide se dice que se ha producido un fallo en el TLB. Si se produce un acierto en el TLB entonces se lee el campo número de marco j de dicha entra para formar la dirección física OirF junto con el campo desplazamiento de OirL. Si se produce un fallo en el TLB, la gestión del mismo requiere básicamente de las siguientes él! nes: • Una operación de lectura a memoria principal para acceder a la entrada i de la tabla de pá . del proceso y obtener el marco de página j donde se encuentra almacenada la página i. Con información ya se puede formar OirF. • Copiar en una entrada vacía del TLB , el contenido de dicha entrada i. Si todas las entradas TLB están ocupadas entonces alguna debe ser elegida para ser reemplazada de acuerdo con algoritmo de reemplazamiento (ver sección 7.4). Por lo tanto, si en un futuro próximo se vuel referenciar a una dirección lógica asociada a la página i del proceso en ejecución se producirá acierto en el TLB ya que su entrada asociada en la tabla de páginas estará cargada en una enlDIIIIIII del TLB. La gestión de un fallo en el TLB la puede realizar el hardware, el sistema operativo o ambos colaboración. Si la gestión del fallo la realiza el hardware únicamente o en colaboración con el .
Administración de memoria
231
.vo, entonces también se dispone de un registro base donde se almacena la dirección física DirFo .enzo de la tabla de página del proceso en ejecución. Cuando se produce un cambio de proceso, el sistema operativo tiene que cargar el registro base. ás tiene que borrar todas las entradas del TLB, ya que la información que contiene no sirve para el o proceso que se va ejecutar. Por lo tanto en los primeros instantes de la ejecución de un proceso ucen fallos en el TLB.
plo 6.15 Figura 6.23 se muestra, a modo de ejemplo, el contenido de un TLB en un cierto instante de . Se observa que posee ocho entradas, en cada entrada se almacena, entre otras informaciones, el de una página i del proceso en ejecución y el marco j de memoria principal donde se encuentra nada.
Desplazamiento
N° de página
Otros campos
Página i
Marco)
32
215
33
320
2
50
125
3
55
375
4
34
123
5
26
330
6
70
235
o
7
TLB N° de marco
Desplazamiento
Figura 6.23 - Contenido del TLB del Ejemplo 6.15 en un cierto instante de tiempo
232
Fundamentos básicos de los sistemas operativos
Supóngase que el procesador hace referencia a una dirección lógica contenida en la página i = 55. El TLB examina en paralelo el campo número de página i de cada una de sus ocho entradas para ver si alguno coincide con el número de página i al que hace referencia la dirección lógica. En este caso se produce un acierto, ya que el campo número de página de la entrada 3 del TLB contiene el valor 55 que coincide con el número de página de la dirección lógica. Entonces se lee el campo marco j de dicha entrada, que contiene el valor j = 375, para poder construir la dirección física a la que hace referencia la dirección lógica referenciada. Supóngase ahora que el procesador hace referencia a una dirección lógica contenida en la página i = 30. Al examinar en paralelo el campo número de página i de sus ocho entradas ninguna contiene el valor i = -30, por lo que se produciría un fallo en el TLB . En este caso se debe leer en memoria principal la entrada i = 30 de la tabla de páginas del proceso en ejecución y copiar los campos necesarios en una entrada del TLB . De acuerdo con la Figura 6.23 la entrada 7 del TLB se encuentra libre por lo que se elige ésta. Si no hubiese ninguna entrada libre habría que elegir una para ser reemplazada utilizando algún algoritmo de reemplazamiento.
• El uso de un TLB es una solución para la traducción de direcciones a medio camino entre el uso de un registro base y el uso de un banco de registros, ya que permite ejecutar procesos de espacios lógico grandes y solo realiza un acceso a memoria principal en la traducción de una dirección si se produce un fallo en el TLB. Recuérdese que con un banco de registros no se requería de ningún acceso a memoria principal para traducir una dirección lógica a dirección física. Sin embargo el tamaño del espacio lógico de los proceso que se podían ejecutar estaba limitado por el número de registros del banco. Por otra parte, si se usaba un registro base no existía restricción de tamaño, salvo la dada por el número de marcos de la propi memoria principal cuando se utiliza paginación simple. Sin embargo, era necesario un acceso a memori principal en la traducción de una dirección lógica a dirección física.
6.6.3.
Tablas de páginas paginadas
El espacio lógico de un proceso puede ser bastante grande, sobre todo en sistemas que soportan memoria virtual (ver capitulo 7). La tabla de páginas de un proceso se ubica en memoria princip ocupando un rango de direcciones físicas contiguas, para facilitar su localización y acceso. Si el proce posee un espacio de direcciones lógicas grande, entonces su tabla de páginas ocupará una cantidad despreciable de memoria física contigua . • Ejemplo 6.16
Considérese un cierto proceso A con un espacio de direcciones lógicas de tamaño CA = 4 GiB y tamaño de página de Sp = 4 KiB. El número de páginas de que consta el proceso se obtiene de siguiente forma:
Administración de memoria
233
observa que la tabla de páginas de este proceso tendrá más de un millón de entradas, una por cada _. a. Supóngase que cada entrada ocupa SE = 4 bytes, entonces el tamaño de la tabla de páginas tendrá mmaño de:
memoria principal tiene un tamaño de CMP el 6,25 % de la memoria.
= 64 MiB , entonces la tabla de páginas del proceso A
•
-na forma de tratar a las tablas de páginas grandes es descomponerla también en páginas, se tiene to una tabla de páginas paginada. De esta forma la tabla de páginas se fragmenta y puede ubicarse !:II ¡~llloria principal de forma no contigua. Así se pueden distinguir dos tipos de páginas:
Dirección lógica página
I ITS I Desplazamiento
~
•
I Marco} I Desplazamiento I
I
'-
3+i
r
I
Dirección Física
DirFo Registro Base
DirfO
Tabla de páginas pnmana
.....
Marco k
:>irfl
f~+ TP
~ IrF2
Marco k Tabla de páginas secundaria
l
ITS
Marco} r---
Marco}
DirF)
Memoria Principal
Memoria Principal
!
Desp.
~
Página i
Memoria Principal
Figura 6.24 - Traducción de direcciones lógicas usando una tabla de páginas paginada
234
Fundamentos básicos de los sistemas operativos
• Páginas ordinarias. Contienen instrucciones y datos del espacio lógico de un proceso. • Páginas de tablas de páginas. Contienen entradas de una tabla de páginas. Para localizar en memoria principal a las páginas de una tabla de páginas (ver Figura 6.24) se utiliza otra tabla de páginas denomina tabla de páginas de primer nivelo tabla de páginas primaria. A las entradas de la tabla de páginas original contenidas en una página se les denomina tabla de páginas de segundo nivel' o tabla de páginas secundaria. Por lo tanto para cada proceso existe una única tabla de primer nivel y varias tablas de segundo nivel, tantas como páginas ocupe la tabla de páginas original del proceso. Existen por tanto dos niveles de paginación, el primer nivel lo implementa la tabla de páginas primaria que permite localizar el marco de página donde se ubican las páginas de la tabla de páginas original. Una vez localiza una página de tabla de páginas se accede al segundo nivel de paginación implementado por la tabla de páginas secundaria que permiten localizar el marco de página donde se ubica la página ordinaria número i a la que hace referencia la dirección lógica DirL referenciada. m bits
111
(a)
Dirección Lógica
D0'Plazmnionto
~
P bits
..
I
~
dbits
m bits
111
Dirección Lógica
I
N° de página
. (b)
~
~
Índice Índice Desplazamiento Tabla Primaria Tabla Secundaria r bits
s bits
d bits
Figura 6.25 - Formato de una dirección lógica: a) Un único nivel de paginación (tabla de páginas sin paginar). b) Dos niveles de paginación (tabla de páginas paginada) U sando una tabla de páginas paginada, es decir, dos niveles de paginación, el campo número de página de una dirección lógica se descompone en los siguientes dos subcampos (ver Figura 6.25):
• Índice tabla primaria (lTP). Contiene el número de la entrada de la tabla de páginas de primer nivel donde hay que buscar el marco de memoria que contiene a la página que ubica a la tabla de páginas de segundo nivel Si la tabla de páginas de primer nivel de un proceso tiene un número de entradas NTPl entonces el tamaño r de este campo se obtiene resolviendo la siguiente desigualda
Administración de memoria
235
• Índice tabla secundaria (ITS). Contiene el número de la entrada de la tabla de páginas de segundo nivel donde hay que buscar el marco de memoria que contiene a la página ordinaria referenciada. Si las tablas de páginas secundarias del proceso tienen un número de entradas NTP2 entonces el tamaño s de este campo se obtiene resolviendo la siguiente desigualdad:
(6.11) • Ejemplo 6.17 Considérese el proceso A del Ejemplo 6.16 con un espacio de direcciones lógicas de tamaño CA = 4 GiB . Las direcciones lógicas asociadas a este proceso tienen un tamaño de m = 32 bits. Como se calculó en el ejemplo anterior, supuesto un tamaño de página de Sp = 4 KiB , la tabla de páginas de dicho proceso tiene NTP = 220 entradas. Además si el tamaño de una entrada de la tabla de páginas es de SE = 4 bytes, entonces el tamaño de la tabla de páginas es de CTP = 4 MiB. upóngase que se dispone de un registro base y que el sistema operativo utiliza la técnica de gestión de memoria mediante paginación simple considerando dos niveles de paginación. El número de entradas de tabla de páginas de primer nivel es igual al número de páginas que se necesitan para contener la tabla páginas original, que se calcula de la siguiente forma: TP NTP1= ceil (C ) =ceil( 12 4MiB,. ) =2 IO páginas=2 IO entradas Sp 2 (bytes/pagma)
e: olviendo (6.10) se obtiene que el tamaño del campo ITP es r = 10 bits. or otra parte, el número de entradas de una tabla de páginas de segundo nivel es igual al número de tradas de la tabla de páginas original contenidas en una página, que se calcula de la siguiente forma: . (212(bytes/Página)) ID ' . . (Sp) NTP2= ceIl = ceIl 2 = 2 (entradas/pagma) SE 2 (bytes/entrada) olviendo (6.11) se obtiene que el tamaño del campo ITS es s = 10 bits. Por lo tanto el formato de dirección lógica será el que se muestra en la Figura 6.26.
. Dirección Lógica
32 bits ITP
..
ITS ~
r =10 bits
~
..
lo"Plozruniento ~
s =10 bits
. d =12 bits
I
~
Figura 6.26 - Formato de una dirección lógica para los datos del Ejemplo 6.17 do el procesador referencia a una dirección lógica la traducción de dicha dirección a una dirección ·ca se realiza siguiendo los siguientes pasos (ver Figura 6.24)
236
Fundamentos básicos de los sistemas operativos
1. Se suma ITP al contenido del registro base (DirFO ) para construir la dirección física DirF1 de la entrada de la tabla de páginas de primer nivel donde hay que buscar el marco k de memoria que contiene a la página que ubica a la tabla de segundo nivel. 2. Se accede a DirFl para leer dicho número de marco k y se le suma a ITS, para construir la dirección física DirF2 de la entrada de la tabla de páginas de segundo nivel donde hay que buscar el marco j de memoria que contiene a la página i referenciada en la dirección lógica DirL . 3. Se accede a la memoria principal para leer el número de marco j y poder construir la dirección física DirF3 a la que equivale la dirección lógica DirL referenciada por el procesador. Luego la traducción de una dirección lógica a una dirección física, usando dos niveles de paginación y un registro base, requiere de dos accesos a memoria principal.
• Si la tabla de páginas de primer nivel resulta demasiado grande entonces podría plantearse descomponerla también en páginas. En ese caso se estaría añadiendo un nuevo nivel de paginación y se tendrí un sistema de paginación de tres niveles. En teoría pueden implementarse todos los niveles que se deseen. Por ejemplo, la arquitectura SPARC soporta tres niveles de paginación y la arquitectura Motorola 680 soporta cuatro. Cada nivel de paginación implica un acceso a memoria principal en el proceso de tradu ción. Así, dos niveles de paginación requieren dos accesos, tres niveles tres accesos, etc. En consecuen . el retardo en la traducción de una dirección y por tanto en la ejecución de una instrucción puede ser importante. Por ello es raro utilizar más de tres niveles de paginación. Por último cabe señalar que si se dispone de un TLB entonces el rendimiento del sistema con vari niveles de paginación mejora notablemente, ya que solo hay que buscar en los sucesivos niveles cuan se produce un fallo en el TLB.
6.6.4.
Tablas de páginas invertidas
Como se ha comentado en la sección anterior, las tablas de páginas pueden llegar a ser bastan grandes. Aparte del uso de tablas de páginas paginadas, otra posible solución consiste en utilizar única tabla de páginas invertida, en vez de una tabla de páginas por proceso. Dicha solución fue utiliz por los sistemas operativos de algunas estaciones de trabajo IBM y Hewlett-Packard. Una tabla de páginas invertida tiene asociada una entrada por cada marco j de memoria principal, vez de una entrada por cada página i de un proceso. De ahí el nombre de tabla invertida. En consecuen " el número de entradas de la tabla de páginas invertida es fijo y es igual al número de marcos. No depen por tanto, del número de procesos que haya en el sistema o del número de páginas en que se divida espacio virtual de estos procesos. Cada entrada j de la tabla de páginas invertida contiene típicamente los siguientes campos: núm de página i alojada en el marco j, identificador numérico del proceso al que pertenece dicha página y b" de control (protección, referenciada, etc). Para traducir una dirección lógica en una dirección física se comparan el campo número de pá " de la dirección y el identificador numérico del proceso en ejecución con los campos homónimos de c
Administración de memoria
237
::a::3i1a de la tabla de páginas invertida. Cuando se produce una coincidencia en la entrada j, dicho valor el marco que contiene la página i referenciada que se requiere para construir la dirección física. "emplo 6.18 Figura 6.27 se muestra una posible implementación de una tabla de páginas invertida. Supóngael proceso actualmente en ejecución tiene como identificador numérico el valor pid = 1456 Y hay que obtener la dirección física asociada a la dirección lógica con número de página 213217 y JeS~lzamiento 124. Dirección Lógica 11;:id=1456
IN° de página=213217
I
Desplazamiento= 124
....
Otros campos
Dirección Física
II
N° de marco
pid
N° de página
1456
213217
i
I
Desplazamiento
I
j=O j=1
e
e busca la entrada cuyos campos coincidan con estos dos
j=2CI Tabla de páginas invertida en memoria principal
Figura 6.27 - Tabla de páginas invertida del Ejemplo 6.18 conocer el número de marco donde se ubica esta página hay que examinar una a una las entradas de tabla de páginas invertida hasta encontrar una cuyo campo pid almacene el valor 1456 y cuyo campo , ero de página almacene el valor 213217. Supóngase que la entrada que contiene estos valores es la = 323 . Entonces éste es el número de marco de la dirección física correspondiente.
•
El problema de traducir las direcciones lógicas a direcciones físicas de esta forma es que el tiempo una traducción no es constante sino que depende del número de entradas de la tabla de páginas
238 . Fundamentos básicos de los sistemas operativos
invertida que haya que comprobar. Luego si hay que comprobar muchas entradas hasta encontrar correspondencia el tiempo de traducción puede ser excesivo, lo que repercute en el rendimiento sistema. Una forma típica de resolver este problema y limitar la búsqueda a una o dos entradas como m ' . es implementar la tabla de páginas invertida como una tabla hash (ver Apéndice B), usando como lla e e número de página. La traducción de una dirección lógica a una dirección física con una tabla de pá . invertida, cuando se implementa con una tabla hash, requiere de uno o dos accesos a memoria prin . para leer la entrada o las entradas de la tabla hash y así obtener el campo marco j para construir dirección física. Una forma de mejorar el rendimiento es usar un TLB, así únicamente se consulta tabla de páginas invertida cuando se produce un fallo en el TLB.
6.6.5.
Protección
En la técnica de gestión de memoria mediante paginación la protección del espacio de direcciones un proceso se implementa a nivel de página. En cada entrada i de la tabla de páginas de un proceso e . un campo protección con un tamaño de uno o varios bits que en función de su valor permiten establ el tipo de acceso que se permiten sobre dicha página i: solo lectura, lectura y escritura, ejecución, ... Cada vez que el procesador referencia a una dirección lógica se comprueba, antes de traducir la rección, que el tipo de acceso que se pretende realizar sobre la página i no viola los permisos estableci en el campo protección. Si se detecta un intento de acceso incorrecto entonces el hardware genera excepción denominada fallo de protección. El tratamiento de dicho fallo por parte del sistema operati suele ocasionar la finalización del proceso y el envío de un mensaje de aviso al usuario del proceso. Adicionalmente a este mecanismo de protección a nivel de página, suele existir también un re . límite donde el sistema operativo almacena en cada cambio de proceso el número de páginas de consta el proceso que va a ser ejecutado. Cuando se produce una referencia a una dirección lógica, de examinar el campo protección, se compara el campo número de página de la dirección lógica con valor almacenado en el registro límite. Si el número de página es mayor que dicho valor, entonces hardware provoca una excepción que debe ser atendida por el sistema operativo. El tratamiento de excepción suele producir las mismas acciones comentadas para el caso de un fallo de protección.
6.6.6.
Compartición de páginas
Cada vez que se ejecuta un programa el sistema operativo crea un proceso asociado a su ejecución. espacio lógico de dicho proceso se divide típicamente en tres regiones: código, datos y pila. Para ser ejecutado en un esquema de paginación simple todas las páginas en que se descompone el esp lógico del proceso deben estar cargadas en memoria. En entornos de tiempo compartido varios usuarios pueden estar ejecutando simultáneamente el mo programa, por ejemplo, un editor de textos, el gestor de ventanas, un compilador, etc. Supón~ que se ejecutan concurrentemente tres instancias del mismo programa, cada instancia tendrá asoci un proceso. Esto significa que existirán en memoria tres copias idénticas de las páginas del código programa.
Administración de memoria
239
Si el programa posee código reentrante, es decir, que no se puede modificar, se ahorraría espacio en aria si solo se mantuviese cargada en memoria principal una única copia de las páginas de código de o programa. Dichas páginas de código son compartidas en modo solo lectura por todos los procesos iados a un mismo programa. Es el sistema operativo el que detecta si el código de un programa es reentrante. En caso afirmativo carga en la memoria principal una copia de las páginas del código de un programa, independientete del número de instancias de dicho programa que se estén ejecutando. En cada entrada de la tabla de marcos existe un contador de referencias que indica el número de !::IDl(!aS en las tablas de páginas que están referenciando a una página física compartida. De esta forma péÍ¡"oina solo puede ser eliminada de la memoria si el contador de referencias es cero.
Ventajas e inconvenientes La paginación simple es una técnica de gestión de memoria que presenta varias ventajas:
• No produce fragmentación externa. La memoria principal está dividida en marcos y cualquier marco de página libre está disponible para alojar la página de un proceso. • Produce una sobrecarga pequeña. La gestión de las estructuras de datos asociadas a la paginación no requiere mucho tiempo de uso del procesador por parte del sistema operativo. •
o necesita intervención humana. La paginación es una técnica implementada y gestionada por completo por el sistema operativo. No requiere, por lo tanto, la intervención humana en ningún momento, a diferencia por ejemplo, del particionamiento fijo donde el administrador debe definir el número de particiones de la memoria principal.
• Permite compartir entre varios procesos un código común. Tal y como se ha descrito en la sección anterior si el código de un programa es reentratante puede ser compartido por varios procesos, de tal forma que solo es necesario tener cargadas en memoria principal una copia de las páginas del código del programa independientemente del número de instancias de dicho programa que se ejecuten, cada instancia tendrá un proceso asociado. Por tanto permite ahorrar memoria. La principal desventaja del uso de la paginación es que produce fragmentación interna. El espacio de direcciones de un proceso se descompone en páginas de un determinado tamaño, normalmente resultado de dividir el tamaño del espacio lógico entre el tamaño de páginas no da como resultado un o entero, sino uno decimal. Esto significa que la parte final del espacio de direcciones del proceso '¡cará en una página que no ocupará por completo. Es decir, suele suceder que se desaprovecha parte pacio de la última página asignada al proceso. Por lo tanto, en el peor de los casos la fragmentación a será de casi una página. Puede demostrarse que en promedio la fragmentación interna es del de media página por proceso. Una característica de la paginación, que en algunas ocasiones puede considerarse como una ventaja otras como un inconveniente, es que la paginación es invisible al programador. Un programador
240
Fundamentos básicos de los sistemas operativos
desconoce y tampoco necesita conocer a la hora de programar en cuáles y cuántas páginas se va a descomponer una determinada parte de su programa. A diferencia. por ejemplo, de lo que sucede en segmentación.
6.7.
Segmentación simple
6.7.1.
Descripción
En el código de un programa es posible distinguir los siguientes elementos: una rutina o mód principal, un conjunto de subrutinas o módulos auxiliares y un conjunto de estructuras de datos (variabl arrays, tablas, etc). Cada uno de estos elementos tiene asignado un nombre por el que es referenci dentro del programa. La segmentación simple es una técnica de gestión de la memoria que soporta los elementos en que se descompone el código de un programa. Básicamente el programa es dividido por el comp" dor en segmentos. Cada segmento es una entidad lógica conocida por el programador asociada a determinada estructura de datos o a un módulo, pero nunca a una mezcla de ambos. Cada segmento tiene asignado un nombre (código principal, subrutinas, datos, pila, etc) y una 1 gitud. El compilador compila cada segmento comenzando por la dirección lógica O. De esta forma segmento tiene su propio espacio de direcciones lógicas. Por otra parte, cuando el sistema operativo crea un proceso asociado a un determinado pro asigna a cada segmento un identificador numérico entero positivo h. Al número h se le denomina n ' del segmento. Así se habla del segmento h del proceso X. m bits
Dirección Lógica
N° de segmento
Desplazamiento
s bits
dbits
Figura 6.28 - Formato de una dirección lógica en un esquema de gestión de memoria mediante segmentación simple
Una dirección lógica consta de dos campos (ver Figura 6.28): el número de segmento de s bel desplazamiento dentro del segmento de d bits. El tamaño s del campo número de segmento e tiene a partir del número total de segmentos Ns de que consta un proceso X, resolviendo la sigui desigualdad:
Por su parte el tamaño mínimo d del campo desplazamiento dentro de un segmento se obtiene a
Administración de memoria
241
tamaño Ss del segmento expresado en unidades direccionables (usualmente palabras), resolviendo la -goiente desigualdad: mJn {Ss :S 2
d
(6.13)
}
Para un proceso que conste de Ns segmentos, el campo número de segmento será del mismo tamaño todas las direcciones lógicas. Sin embargo, el tamaño mínimo del campo desplazamiento dependerá longitud de segmento al que esté asociado dicha dirección lógica. Por otra parte, en la segmentación le una dirección lógica nunca puede ser de mayor tamaño que una dirección física. j emplo 6.19 . tema operativo utiliza un esquema de gestión de memoria mediante segmentación simple. Supónque un cierto proceso A consta de los cuatro segmentos de memoria que se muestran en la Figura
o
Segmento O
Segmento 1 O
Código Principal 15 Ki
I Subru~s I
0[:] Segmento 2
O
Segmento 3
Datos
12 Ki 18 Ki
20 Ki
Figura 6.29 - Segmentos de memoria de un cierto proceso s = 4, de acuerdo con (6.12), el tamaño del campo número de segmento de una dirección lógica quiera de estos cuatro segmentos tendrá un tamaño de s = 2 bits. su parte el tamaño mínimo del campo desplazamiento de un segmento depende del tamaño de cada _ ento. Por ejemplo, el segmento O está asociado al código principal y tiene un tamaño Ss = 20 Ki. año mínimo d del campo desplazamiento de una dirección lógica de este segmento se obtiene viendo (6.13). Como Ss = 20Ki = 20 .2 10 :S 32.2 10 = 2 15 se obtiene que d = 15 bits. Luego una .ón lógica asociada a este segmento requiere al menos de m = 2 + 15 = 17 bits. - rma análoga puede comprobarse que el segmento 3 asociado a datos también requiere direcciones de al menos 17 bits. Mientras que los segmentos 1 y 2 asociados a subrutinas y pila, respectivarequieren direcciones lógicas de al menos 16 bits. ' n gas e la siguiente dirección lógica expresada en binario: 00001110101111010 do bits más significativos corresponden al campo número de segmento y los quince bits restantes el desplazamiento. Pasando a decimal el valor de ambos campos se obtiene la dirección
242
Fundamentos básicos de los sistemas operativos
(O, 7546) Esta dirección hace referencia a la palabra 7546 dentro del segmento O. Como el desplazamiento no supera el tamaño del segmento que es de 20 Ki = 20 ·1024 = 20480 palabras, se trata de una dirección lógica válida. Ejemplos de dirección lógicas no válidas serían por ejemplo (O, 23400) Y (4, 232). La primera no es válida por tener un desplazamiento superior al tamaño del segmento O. Mientras que la segunda no e válida por hacer referencia a un segmento que no existe, recuérdese que el proceso A solo tiene definido cuatro segmentos (segmento O a segmento 3).
• En la segmentación simple un proceso no puede ser ejecutado si todos sus segmentos no se encuentran cargados en memoria principal. Cuando se va a cargar un proceso en memoria principal el sistema operativo debe buscar, en la estructura de datos que mantenga para registrar el espacio ocupado y libre de la memoria principal, un hueco para cada segmento. Dentro de un hueco, a cada segmento se le asigna justo el espacio (en unidades de asignación) que necesita, el espacio sobrante pasa a formar un nuevo hueco. Con este esquema de asignación los segmentos de un proceso no tienen por qué estar ubicados en particiones contiguas. Memoria principal O Libre 2800 Segmento 3 (18 Ki) Tabla de segmentos del proceso A
21232 Libre
Base
Longitud
43760
20480
28400
15360
2
72432
12288
3
2800
18432
28400 Segmento 1 (15 Ki)
O
43760 Segmento O (20 Ki)
Otros Campos
64240 Libre 72432 Segmento 2 (12 Ki)
Figura 6.30 - Ubicación en memoria principal de los segmentos del proceso A del Ejemplo 6.20
Administración de memoria
243
Dirección lógica N° de segmento Desplazamiento h
Violación del tamaño del segmento 'stro Base
DirFo 1 - - - - ' - - - - - 1 Tabla de
DirFl
I-"""T""---'L.,----I
Segmento h
Memoria Principal
Memoria Principal
Figura 6.31 - Traducción de direcciones en un esquema de segmentación simple con un registro base
Además, cuando el sistema operativo tiene que cargar un proceso en la memoria principal crea una la de segmentos asociados al proceso. Esta tabla está indexada por el número de segmento, es decir, - e una entrada por cada segmento del proceso. Cada entrada contiene la dirección física base de cada ~ ento y la longitud del segmento (en unidades de asignación). También contiene información relativa permisos de acceso al segmento (lectura, escritura, ejecución). Además puede contener información re ubicación de la copia del segmento en memoria secundaria. Aunque a veces esta información se plementa en una tabla diferente.
Ejemplo 6.20 En la Figura 6.30 se representa la ubicación en memoria principal de los cuatro segmentos del proceso _ del Ejemplo 6.19. El sistema operativo mantiene en otra parte de la memoria principal la tabla de segmentos del proceso A. La tabla tiene una entrada por cada segmento del proceso que, entre otras - ormaciones, contiene la dirección física base y la longitud de cada segmento. El segmento O comienza en la dirección física 43760 y tiene una longitud de 20480 palabras (20 Ki). El segmento 1 comienza en la dirección física 28400 y tiene una longitud de 15360 palabras (15 Ki). El segmento 2 comienza en la dirección física 72432 y tiene una longitud de 12288 palabras (12 Ki). Finalmente el segmento 3 mienza en la dirección física 2800 y tiene una longitud de 18432 palabras (18 Ki). Se observa que los
244
Fundamentos básicos de los sistemas operativos
segmentos del proceso no tienen por qué estar cargados en memoria de forma consecutiva ni contigua.
6.7.2.
Traducción de direcciones
En la técnica de gestión de memoria mediante segmentación, la traducción de direcciones lógi a direcciones físicas requiere que el sistema operativo cargue en el hardware cierta información la tabla de segmentos del proceso actualmente en ejecución. La información que carga depende de componentes hardware disponibles para realizar la traducción de direcciones. Si se dispone de un registro base, entonces el sistema operativo, en cada cambio de proceso, carga este registro la dirección física DirFO de comienzo de la tabla de segmentos. El sistema operativo obti esta dirección del bloque de control del proceso. Cuando se hace una referencia a una dirección lógica DirL se realizan los siguientes pasos p traducirla a una dirección física (ver Figura 6.31): 1. Se suman el campo número de segmento h de la dirección lógica y DirFo para obtener la direcci . física DirFl de la entrada h de la tabla de segmentos. 2. Se accede a DirFl para leer la dirección física base y la longitud del segmento h. 3. Se compara el valor del campo desplazamiento de la dirección lógica con la longitud del segmen h . Si el desplazamiento es mayor entonces el hardware genera una excepción por violación tamaño del segmento. 4. Si el desplazamiento es menor que la longitud del segmento h se suma a la dirección física b del segmento h el desplazamiento (Desp.) indicado en la dirección lógica para obtener la direcci física DirF2 a la que equivale DirL. • Ejemplo 6.21
Considérese la tabla de segmentos del proceso A del Ejemplo 6.20. Supóngase que se desea obten la dirección física asociada a la dirección lógica DirL = 0,425) que está expresada en decimal. dirección lógica hace referencia al segmento 1 ya un desplazamiento 425. La entrada asociada al segmento 1 en la tabla de segmentos del proceso A específica que su direccifísica base es 28400 y que tiene una longitud de 15360 palabras (15 Ki). Puesto que el desplazamien es menor que la longitud no se produce una violación de segmento. Sumando la dirección física base _ el desplazamiento se obtiene que DirF = 28825 es la dirección física asociada a DirL.
• El mecanismo descrito de traducción de direcciones tiene como principal ventaja que únicamente
requiere que el sistema operativo cargue en cada cambio de contexto un solo registro, lo cual disminu e el tiempo de cambio de proceso. Su principal inconveniente es que requiere un acceso a memoria principal para leer en la tabla de segmentos la dirección física base y la longitud del segmento. Este acce introduce un retardo en la ejecución de la instrucción en curso.
Administración de memoria
245
Para acelerar la traducción de direcciones, al igual que sucedía con la técnica de paginación, se puede un banco de registros o un TLB .
1.3.
Protección
En la técnica de gestión de memoria mediante segmentación la protección del espacio de direcciones un proceso, se implementa a nivel de segmento. En cada entrada h de la tabla de segmentos de un so existe un campo protección con un tamaño de uno o varios bits que en función de su valor :JeIJIÚten establecer el tipo de acceso que se permiten sobre dicha segmento (solo lectura, lectura y 'tura, ejecución, etc). Cada vez que el procesador referencia a una dirección lógica comprueba, antes de traducir la direc-- que el tipo de acceso que se pretende realizar sobre el segmento h no viola los permisos establecidos . el campo protección. Si se detecta un intento de acceso incorrecto entonces el hardware genera una cepción por fallo de protección que debe ser atendida por el sistema operativo. El tratamiento de dicha epción suele producir la finalización del proceso y el envío de un mensaje de aviso al usuario que ó el proceso. Adicionalmente a este mecanismo de protección a nivel de segmento, suele haber también un registro , 'te donde el sistema operativo almacena en cada cambio de proceso el número de segmentos de que ta el proceso que va a ser ejecutado. Cuando se produce una referencia a una dirección lógica, antes examinar el campo protección, se compara el campo número de segmento de la dirección lógica con valor almacenado en el registro límite. Si el número de segmento es mayor que dicho valor, entonces hardware provoca una excepción que debe ser atendida por el sistema operativo. El tratamiento de esta cepción suele producir las mismas acciones comentadas para el caso de un fallo de protección .
.4.
Compartición de segmentos
La técnica de gestión de memoria mediante segmentación simple permite que un segmento de código datos sea compartido por varios procesos. Para ello el sistema operativo mantiene una tabla con los ~ entos cargados en memoria principal. Cada entrada de esta tabla contiene, entre otras informaciones elativas a un segmento cargado en memoria, un contador de referencias que mantiene el número de esos que referencian a dicho segmento a través de alguna entrada de sus tablas de segmentos, y en ecuencia lo comparten. Dicho segmento no podrá ser eliminado de memoria principal hasta que el tador de referencias valga O.
1.5.
Ventajas e inconvenientes
La segmentación simple es una técnica de gestión de memoria que presenta las siguientes ventajas: • Produce una fragmentación interna despreciable. Cuando se asigna espacio dentro de un hueco de memoria para un segmento de un proceso, dicho espacio se asigna como un múltiplo de una determinada unidad de asignación. Por ello la fragmentación interna por segmento será como máximo del orden de una unidad de asignación.
246
Fundamentos básicos de los sistemas operativos
• Soporta la visión modular que el programador posee de su programa. Como ya se ha comentado, es posible asignar un segmento independiente para cada parte del programa: código principal, subrutinas, estructuras de datos, etc. • Permite manejar confacilidad estructuras de datos que crecen. Dichas estructuras tienen asignado un determinado segmento. Si dicho segmento requiere más espacio simplemente hay que anexionarle el espacio de algún hueco contiguo al segmento o buscar un hueco de mayor tamaño para alojar el segmento. • Facilita la protección y compartición de las diferentes partes de un programa. Como cada parte del programa tiene asignado un segmento independiente, la protección y la compartición se realiza a nivel de segmento. Esta es una ventaja importante con respecto a la paginación, donde no es posible asegurar si en una misma página no estarán contenidas diferentes partes (código y datos) del programa. Entre los inconvenientes de la segmentación destacan los siguientes: • Produce fragmentación externa. Lo que reduce el aprovechamiento de la memoria y requiere el uso de compactación. Señalar que la fragmentación externa que produce la segmentación es mucho menor que la que producía la técnica del particionamiento dinámico, ya que el espacio en memoria no se asigna para el proceso completo sino por segmentos. • Aumenta la sobrecarga del sistema. Las estructuras de datos que requiere para su implementación y los algoritmos para su gestión son comparativamente más complejos que en el caso del particionamiento dinámico, ello produce un aumento de la sobrecarga del sistema.
6.8.
Segmentación con paginación simple
La segmentación y la paginación se pueden combinar para aprovecharse de las ventajas de cada técnica y reducir sus inconvenientes. La combinación de ambas técnicas constituye la técnica de gestión de memoria conocida como segmentación con paginación. Básicamente esta técnica consiste en dividir cada segmento de un proceso en un determinado número de páginas. m bits
.. Dirección Lógica
N° de segmento
..
N° de página ~
s bits
.
Desplazamiento ~
P
bits
..
k bits
Figura 6.32 - Estructura de una dirección lógica en la técnica de segmentación con paginación
Administración de memoria
247
Una dirección lógica (ver Figura 6.32) se descompone en tres campos: número de segmento de s bits, , ero de página de p bits y desplazamiento dentro de la página de k bits. Nótese que la suma de la gitud del campo número de página y desplazamiento dentro de una página, es igual a la longitud del desplazamiento dentro de un segmento de una dirección lógica en segmentación. Cuando se carga un proceso en memoria principal el sistema operativo crea la tabla de segmentos del eso y varias tablas de páginas (una por cada segmento). Ahora cada entrada de la tabla de segmentos contiene la dirección física base del segmento sino la dirección física base de la tabla de páginas iada al segmento. Además el campo longitud del segmento viene expresado en número de páginas. Si se dispone de un registro base, entonces el sistema operativo, en cada cambio de proceso, carga en o registro base la dirección física DirFO de comienzo de la tabla de segmentos. Cuando el procesador una referencia a una dirección lógica DirL , se realizan los siguientes pasos para traducirla a una ción física (ver Figura 6.33):
Dirección lógica
11_,., de segmento h
N° de página i
IDesplazamiento J
.
I Marco) J Desplazamiento I
)
DirFo
.....
I
./
Dirección Física
Registro Base
DirFO Tabla de segmentos
-::-:-+ Dlr F1
Base
ILongitud
I
lh
<[ DirF2
Tabla de páginas del segmento h
l'
Marco) r---
Marco)
DirF
Memoria Principal
Memoria Principal
¡
Desp.
l--+
Página i
Memoria Principal
(*) Por simplificar en este esquema se ha omitido el paso de comprobar si el desplazamiento es menor que la longitud.
Figura 6.33 - Esquema de traducción de direcciones en un sistema de segmentación con paginación
248
Fundamentos básicos de los sistemas operativos
1. Se suma el campo número de segmento h de la dirección lógica y DirFo para obtener la dirección física DirF1 de la entrada h de la tabla de segmentos. 2. Se accede a DirFl para leer la dirección física base de comienzo de la tabla de páginas (Base) y la longitud del segmento h (Longitud).
3. Se compara el valor del campo desplazamiento de DirL con la longitud del segmento h. Si el desplazamiento es mayor entonces el hardware genera una excepción por violación del tamaño del segmento. 4. Si el desplazamiento es menor que la longitud del segmento h, entonces se suma el campo número de página de DirL y la dirección física base de la tabla de páginas del segmento para generar la dirección física DirF2 de la entrada i de la tabla de páginas. 5. Se accede a DirF2 para leer el número de marco j que contiene la página i referenciada. 6. Se construye la dirección física DirF con el número de marco j leído y con el campo desplazamiento de DirL. El mecanismo descrito de traducción de direcciones realiza dos accesos a memoria principal: el primero para leer en la entrada h de la tabla de segmentos la dirección física base de la tabla de páginas y la longitud del segmento, el segundo para leer en la entrada i de la tabla de páginas el marco de página j donde se aloja la página i. Para acelerar la traducción de direcciones se puede utilizar un banco de registros o un TLB.
6.9.
Resumen
La memoria principal de un computador es un recurso limitado que se debe administrar adecuadamente para conseguir el mejor rendimiento del sistema. Para que el procesador pueda ejecutar un programa, éste debe estar cargado en la memoria principal. En un sistema con multiprogramación, vario_ procesos estarán cargados (total o parcialmente) en la memoria principal. Si la memoria principal está llena, el sistema operativo intercambia (total o parcialmente) uno o varios procesos al área de intercambio, que es una zona reservada en memoria secundaria para almacenar las copias del espacio lógico o imágenes de los procesos. El intercambio es la operación de cargar la image de un proceso desde el área de intercambio a memoria principal o viceversa. Normalmente la operació de intercambio es realizado por un proceso del sistema denominado intercambiador, que se encarga de gestionar y asignar el espacio de intercambio, seleccionar procesos para ser intercambiados fuera . dentro de memoria principal. El subsistema de administración de la memoria principal es el componente del sistema operativo encargado de administrar o gestionar, en colaboración con el hardware, la memoria principal entre todos los procesos que se ejecutan en el computador. Para realizar esta tarea debe usar una determinada técni de administración de memoria.
Administración de memoria
249
Las técnicas de gestión de memoria principal de un sistema operativo multiprogramado se pueden . car en dos grandes grupos dependiendo de la asignación de espacio en memoria: técnicas de asig"n contigua y técnicas de asignación no contigua. Las técnicas de asignación contigua se caracterizan porque todo el espacio de direcciones lógicas de
proceso se carga de forma contigua en memoria principal. Ejemplos de este tipo de técnicas son el . ionamiento fijo y el particionamiento dinámico. Las técnicas de asignación no contigua se caracterizan porque el espacio de direcciones lógicas de
oceso se divide en bloques de igual o distinto tamaño. Estos bloques no tienen porque estar cargados forma contigua en memoria principal. Ejemplos de este tipo de técnicas son la paginación simple y la ~ entación simple. La técnica de gestión de memoria de particionamiento fijo consiste en dividir la memoria principal en po de arranque en un número fijo de particiones de igualo diferente tamaño. Una partición se reserva . cargar el sistema operativo y el resto para cargar procesos. Cada proceso se carga en una partición. implementar esta técnica el sistema operativo mantiene una tabla de descripción de particiones contiene la información sobre la dirección base, tamaño y estado de cada partición. La principal taja de esta técnica es su sencillez de implementación. Su principal inconveniente es que produce entación interna, es decir, existe espacio desaprovechado dentro de cada partición si el tamaño del o es menor que el tamaño de la partición asignada. Dicho espacio no puede ser asignado a otros sos. Otra desventaja de esta técnica es que el número máximo de procesos en memoria principal , limitado por el número de particiones que se definan en el momento de arranque, suponiendo una . ución del rendimiento máximo del sistema. La técnica de gestión de memoria de particionamiento dinámico se caracteriza porque el número particiones varía a lo largo del tiempo. En la memoria principal se distinguen las particiones, que es zona contigua de memoria ocupada, y los huecos, que es una zona contigua de memoria libre. Al car el sistema inicialmente, existe una partición con el sistema operativo y un gran hueco, que irá minuyendo conforme se van cargando los procesos. Cada vez irán apareciendo huecos más pequeños, que da lugar a la fragmentación externa, es decir, desaprovechamiento de memoria entre particiones bido a la dispersión del espacio libre en una serie de huecos de pequeño tamaño. Una forma de solu'onar este problema es con la compactación de memoria, la cual produce a su vez una alta sobrecarga ;!Il el sistema. Para poder implementar el particionamiento dinámico, el sistema operativo debe mantener o varias estructuras de datos que contengan información sobre las particiones y los huecos existentes en memoria principal. La técnica de gestión de memoria conocida como paginación consiste en dividir la memoria principalen bloques del mismo tamaño Sp 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. Además las páginas de un mismo proceso no tienen porque ocupar marcos contiguos. Cuando se usa paginación una dirección física se descompone de dos campos: el número de marco de página y el desplazamiento dentro del marco. Además una dirección lógica se descompone en los campos número de página y el desplazamiento dentro de la página.
250
Fundamentos básicos de los sistemas operativos
La técnica de paginación puede implementarse de diferentes formas. En su implementación más sencilla, denominada paginación simple, para que un proceso pueda ser ejecutado todas sus páginas deben estar cargadas en memoria principal. Para implementar la paginación el sistema operativo crea y gestiona las siguientes estructuras de datos en la memoria principal: tablas de páginas, tabla de marcos de página y lista de marcos libres. Una tabla de páginas tiene una entrada por cada página en que se descompone el espacio de direccione_ lógicas de un proceso. Cada entrada i, entre otras informaciones, contiene el marco j donde se aloja la página i del proceso. La tabla de marcos de página tiene tantas entradas como marcos de página posee la memoria principal. Cada entrada j contiene entre otras informaciones, el estado del marco (libre u ocupado), punteros para crear la lista de marcos libres y la ubicación en memoria secundaria de la copia de la página i que aloja. La lista de marcos libres es consultada cuando hay que asignar espacio a los procesos que van a ser cargados en memoria principal. Las principales ventajas de la paginación simple son las siguientes: no produce fragmentación externa, produce una sobrecarga pequeña, no necesita intervención humana, y permite compartir entre vari _ procesos un código común. Su principal inconveniente es que produce fragmentación interna. La segmentación es una técnica de gestión de memoria donde un programa es dividido por el compilador en segmentos. Cada segmento es una entidad lógica asociada a una determinada estructura de datos o a un módulo, y tiene asignado un nombre (código principal, subrutinas, datos, pila, etc) y una longitud. Cada segmento tiene su propio espacio de direcciones lógicas. En esta técnica una direcci lógica consta de dos campos el número de segmento y el desplazamiento dentro del segmento. La técnica de segmentación puede implementarse de diferentes formas. En su implementación más sencilla, denominada segmentación simple, para que un proceso pueda ser ejecutado todos sus segment deben estar cargados en memoria principal. Para implementar la segmentación el sistema operativo crea y gestiona una tabla de segmentos por cada proceso. Cada entrada de una tabla de segmentos contiene, entre otras informaciones, la dirección física base y longitud de un segmento de un proceso. Esta información se utiliza en el proceso de traducción de una dirección lógica en una dirección física. Las principales ventajas de la segmentación simple son las siguientes: produce una fragmentación interna despreciable, soporta la visión modular que el programador posee de su programa, permite manejar con facilidad estructuras de datos que crecen, y facilita la protección y compartición de las diferentes partes de un programa. Su principal desventaja es que produce fragmentación externa. Por último, la técnica de segmentación con paginación es una combinación de las técnicas de segmentación y paginación, y consiste en dividir cada segmento de un proceso en un determinado número de páginas. En esta técnica una dirección lógica se descompone en tres campos: número de segmento. número de página, y desplazamiento. J
Administración de memoria
10.
251
Lecturas recomendadas
Si se desea obtener una explicación adicional de los contenidos tratados en este capítulo se pueden ultar, por ejemplo: el capitulo 9 de [Silberschatz et. al, 2002], los capítulos 5 y 6 de [Milenkovic, ], el capítulo 3 de [Tanenbaum, 2009] y el capítulo 7 de [Stallings, 2005] .
•11. Autoevaluación Definir los siguientes conceptos: a) Espacio del núcleo. b) Espacio de usuario. (Respuesta en sección 6.2.1) ¿Qué es el área de intercambio en memoria secundaria? (Respuesta en sección 6.2.2) ¿En qué consiste la operación de intercambio de procesos? (Respuesta en sección 6.2.2)
.t. ¿En qué casos se suele realizar la operación de intercambio fuera de memoria principal? ¿Y la operación de intercambio dentro de memoria principal? (Respuesta en sección 6.2.2) ¿Cuáles son las principales tareas del intercambiador? (Respuesta en sección 6.2.2) 6. ¿Qué dos razones justifican la existencia del área de intercambio? (Respuesta en sección 6.2.2) 7. Describir cómo se realiza la asignación de memoria en sistemas monoprogramados. (Respuesta en sección 6.3)
¿En qué consiste la técnica de particionarniento fijo? (Respuesta en sección 6.4.1) ¿Qué información contiene la tabla de descripción de particiones? (Respuesta en sección 6.4.1)
O. ¿Qué desventajas presenta,el particionamiento fijo con particiones de igual tamaño? (Respuesta en sección 6.4.2) 1. ¿Qué ventajas e inconvenientes presenta el uso de una cola por partición? (Respuesta en sección 6.4.3) 12. ¿Qué criterios de búsqueda se emplean con las particiones de distinto tamaño y una única cola de procesos? (Respuesta en sección 6.4.3) , 3. ¿Qué desventajas presenta el particionarniento fijo con particiones de distinto tamaño? (Respuesta en sección 6.4.3) 14. ¿Cómo se realiza la traducción de direcciones lógicas a físicas y la protección en la técnica de gestión de memoria mediante particionarniento fijo? (Respuesta en sección 6.4.4)
15. ¿Cuáles son las principales ventajas e inconvenientes de la técnica de gestión de memoria mediante particionarniento fijo? (Respuesta en se~ción 6.4.5)
252
Fundamentos básicos de los sistemas operativos
6.16. ¿En qué consiste la técnica de gestión de memoria denominada particionamiento dinámico? (Respuesta en sección 6.5.1) 6.17. ¿Qué es la fragmentación externa? ¿Cómo se puede solucionar? (Respuesta en seccÍón 6.5 .1) 6.18. ¿Qué estructuras de datos debe mantener el sistema operativo para implementar el particionamiento dinámico? (Respuesta en sección 6.5 .1) 6.19. Enumerar y describir brevemente algunos de los algoritmos de búsqueda más empleados en la asignación de memoria en el particionarniento dinámico. (Respuesta en sección 6.5.2) 6.20. ¿Cómo se realiza la traducción de direcciones lógicas a físicas y la protección en la técnica de gestión de memoria mediante particionamiento dinámico? (Respuesta en sección 6.5.3) 6.21. Señala las principale,s ventajas e inconvenientes de la técnica de particionamiento dinámico frente a la técnica de particionarniento fijo. (Respuesta en sección 6.5.4) 6.22. ¿En qué consiste la paginación? (Respuesta en sección 6.6.1) 6.23. Cuando se usa paginación ¿en que campos se descompone una dirección física y una dirección lógica? ¿Cómo se puede determinar el tamaño de dichos campos? (Respuesta en sección 6.6.1) 6.24. Enumerar y describir brevemente las estructuras de datos que utiliza el sistema operativo para implementar la paginación. (Respuesta en sección 6.6.1) 6.25. ¿Qué es la paginación simple? (Respuesta en sección 6.6.1) 6.26. Describir la traducción de direcciones en paginación con un registro base. (Respuesta en sección 6.6.2) 6.27. Describir la traducción de direcciones en paginación con un banco de registros. (Respuesta en sección 6.6.2) 6.28. Describir la traducción de direcciones en paginación con un TLB. (Respuesta en sección 6.6.2) 6.29. ¿Qué es una tabla de páginas paginada? ¿Cuántos accesos a memoria requiere? (Respuesta en sección 6.6.3) 6.30. ¿Qué es una tabla de páginas invertida? (Respuesta en sección 6.6.4) 6.31. ¿Cómo se realiza la protección en la técnica de paginación? (Respuesta en sección 6.6.5) 6.32. ¿Cómo se implementa la compartición de páginas? (Respuesta en sección 6.6.6) 6.33. Enumerar las ventajas y los inconvenientes de la paginación simple. (Respuesta en sección 6.6.7) 6.34. ¿En que consiste la segmentación? (Respuesta en sección 6.7.1)
Administración de memoria
253
5. ¿Cuáles son los campos de que consta la dirección lógica de un segmento? ¿Cómo se puede determinar su tamaño? (Respuesta en sección 6.7.1) 6. ¿Qué es la segmentación simple? (Respuesta en sección 6.7.1)
7. ¿Qué información contiene una tabla de segmentos? (Respuesta en sección 6.7.1) 8. Describir la traducción de direcciones en segmentación con un registro base. (Respuesta en sección 6.7.2) 9. ¿Cómo se implementa la protección en la técnica de segmentación? (Respuesta en sección 6.7.3) ¿Cómo se implementa la compartición de segmentos en la técnica de segmentación? (Respuesta en sección 6.7.4)
.'1. Enumerar las ventajas y los inconvenientes de la segmentación simple. (Respuesta en sección 6.7.5)
42. ¿En qué consiste la técnica de segmentación con paginación? (Respuesta en sección 6.8)
,.12.
Problemas
.1. Un computador tiene una memoria principal de 512 MiB con un tamaño de palabra de 2 bytes. El sistema operativo gestiona la memoria principal mediante particionamiento dinámico con una unidad de asignación de 8 palabras. Para contabilizar el uso de la memoria utiliza un mapa de bits. Determinar el porcentaje de memoria que ocupa el mapa de bits.
'6.2. Un sistema operativo utiliza particionarniento dinámico para gestionar la memoria principal. Para implementar esta técnica, entre otras estructuras, mantiene una lista de particiones libres doblemente enlazada. Cada entrada de esta lista, entre otras informaciones, contiene (en hexadecimal) la primera dirección (DIRo) Y la última dirección (DIRp ) que ocupa la partición. Cuando se busca una partición libre para asignar, la búsqueda comienza desde la cabecera de la lista. La entrada que es asignada se elimina de la lista. Además cuando se crea una partición libre se crea una nueva entrada que se añade al final de la lista. En un determinado instante de tiempo T el estado de la lista de particiones libres es el que se muestra en la Figura 6.34.
Cabecera de la lista de particiones libres
Partición #0
Partición #1
Partición #2
Partición #3
DIRo=343 16 DIRF =3CF 16
DIRo=E24 16 DIRF =ED8 16
DIRo=OF8 16 DIRF =IA7 16
DIRo=537 16 DIRF=96F 16
Figura 6.34 - Estado de la lista de particiones libres de memoria del Problema 6.1 en el instante T
254
Fundamentos básicos de los sistemas operativos
Supuesto que la unidad direccionable es la palabra y que la memoria principal tiene una capacidad de 4096 palabras y una longitud de palabra de 8 bits, responder razonadamente a las siguientes apartados: a) Calcular el tamaño en bits del espacio libre total existente en la memoria principal en el instante T. b) El sistema operativo utiliza el algoritmo de .asignación del primer ajuste. Si en el instante T el sistema operativo tiene que asignar una partición de memoria para un proceso de 175 byte determinar que partición de memoria le asignará. c) Representar el estado de la lista de particiones libres de memoria principal en el instante TI después de asignar espacio para el proceso del apartado anterior. 6.3. El sistema operativo gestiona la memoria principal usando la técnica de paginación simple con un tamaño de página de 4 KiB . La memoria principal del computador tiene una capacidad de 256 MiB con un tamaño de palabra de 16 bits. La unidad direccionable es la palabra. En la Tabla 6.1 se muestra parte del contenido (expresado en decimal) de la tabla de páginas asociada a un proceso A cargado en memoria principal cuyo espacio de direcciones lógicas ocupa 310 KiB . a) Determinar el tamaño en bits de cada uno de los campos en que se descompone una dirección física y una dirección lógica. b) Determinar la dirección física expresada en decimal que le corresponde a cada una de las siguientes direcciones lógicas expresadas en binario: 1) 0110100000000011012. 2) 1010000000000000012.
Página i 50 51 52 53 54 55
Otros campos
Marco j 40000 10256 2596 8793 5621 1526
Tabla 6.1- Parte de la tabla de páginas del proceso A del Problema 6.3
6.4. El sistema operativo de un computador gestiona la memoria principal usando la técnica de paginación simple. Supuesto que el tiempo de acceso medio a memoria principal es tap , determinar el tiempo medio de traducción de una dirección lógica a una dirección física en los siguientes casos: a) La traducción de direcciones se realiza con un registro base.
Administración de memoria
255
b) La traducción de direceiones se realiza usando un TLB con una tasa de aciertos del 90 %. Suponer que el tiempo medio de gestión de un acierto en el TLB es 0,3·tap y que el tiempo medio de gestión de un fallo es 1,3·tap . c) La traducción de direcciones se realiza con un banco de registros de capacidad suficiente para albergar la tabla de página de un proceso. Suponer que el tiempo medio de acceso al banco de registros es 0,3·tap . 6.5. Un cierto sistema operativo utiliza la técnica de segmentación simple para gestionar la memoria principal de un computador que tiene una capacidad de 128 MiB, una longitud de palabra de 16 bits y que toma como unidad direccionable una palabra. En la Tabla 6.2 se muestra el contenido de la tabla de segmentos de un proceso A en un determinado instante de tiempo. a) Para cada uno de los segmentos del proceso determinar el tamaño en bits de una dirección lógica especificando el tamaño de cada campo. b) Determinar a que dirección física expresada en decimal hace referencia la siguiente dirección lógica expresada en binario 011100000000h . N° de segmento O 1 2 3
Dirección Base 2711 16 18BCC 16 B1386 16 E09C016
Longitud (bytes) 1024 3072 4096 512
Tabla 6.2 - Tabla de segmentos del proceso A del Problema 6.5
apítulo 7
emoria virtual bjetivos docentes Los objetivos docentes de este capítulo son los siguientes: • Saber qué es la memoria virtual y cuales son su principales características. • Conocer el funcionamiento y las principales características de la implementación de la memoria virtual mediante paginación por demanda. • Conocer el concepto de conjunto de trabajo de un proceso. • Saber el funcionamiento y las características de los principales algoritmos de reemplazamiento de páginas. • Conocer cómo el sistema operativo realiza las siguientes funciones asociadas a la implementación de la técnica de paginación por demanda: asignación de memoria, control de carga, copia en memoria secundaría de páginas modificadas, paginación por adelantado y reserva de marcos libres.
7.1.
Introducción
Las técnicas de gestión de memoria para sistemas multiprogramados estudiadas en el capítulo anterior (particionarniento fijo, particionarniento dinámico, paginación simple y segmentación simple) presentan como principal limitación que para poder ejecutar un proceso su espacio de direcciones lógicas debe estar cargado por completo en la memoria principal. Este requisito limita el grado de multiprogramación del sistema, es decir, el número de procesos que simultáneamente pueden estar cargados en memoria principal, lo que repercute en el rendimiento del sistema (número de trabajos terminados en istemas por lotes, número de interacciones atendidas en sistemas de tiempo compartido o número de 257
258
Fundamentos básicos de los sistemas operativos
plazos cumplidos en sistemas de tiempo real). En general, cuanto mayor sea el grado de multiprogramación, hasta un cierto límite máximo, mayor será la utilización de los recursos del sistema en provecho de la ejecución de procesos de usuarios. Otra limitación de las técnicas de gestión de memoria estudiadas en el capítulo anterior es que el tamaño del espacio lógico de un proceso nunca puede superar el tamaño de la memoria física disponible para la ejecución de procesos, salvo que haya sido programado con superposiciones. Este requisito limita el tamaño máximo que puede tener un proceso. Con objeto de superar estas limitaciones en la década de los setenta se introdujo la técnica de gestión de memoria conocida como memoria virtual, que consiste en tener cargadas en memoria principal solo aquellas partes (páginas o segmentos) del espacio de direcciones lógicas, que ahora también se denominan direcciones virtuales, de un proceso que se van necesitando durante su ejecución. Si al ejecutar una instrucción de un proceso se requiere acceder a una dirección virtual que no está cargada en memoria principal entonces se produce una excepción que es atendida por el sistema operativo. Éste trae desde memoria secundaria a memoria principal la parte del proceso a la que hace referencia dicha dirección virtual. Posteriormente la instrucción del proceso que produjo la excepción debe ser reiniciada. En consecuencia, la memoria virtual permite aumentar el grado de multiprogramación del sistema. ya que en memoria principal caben más procesos si solo hay algunas partes de cada proceso que si sus espacios de direcciones virtuales estuviesen cargados por completo. Además permite ejecutar proceso con un espacio de direcciones virtuales de tamaño superior al tamaño de la memoria física disponible para procesos. Otra ventaja de la memoria virtual es que reduce el número de operaciones de E/S que son necesarias para intercambiar un proceso bloqueado desde memoria principal a memoria secundaria o viceversa, a que solo hay que intercambiar las partes del espacio de direcciones virtuales del proceso que estaban en memoria principal y no todo el proceso. La memoria virtual se debe diseñar con cuidado ya que de lo contrario el rendimiento del sistema se puede ver seriamente afectado. Si un proceso está causando continuamente excepciones porque requiere cargar en memoria partes del proceso que no están cargadas, su ejecución se relantiza enormemente . además estará provocando una fuerte sobrecarga al sistema que tendrá que estar atendiendo las continuas excepciones. La implementación de la memoria virtual requiere que el hardware del computador soporte el reinicio de las instrucciones de su repertorio. Además cuando se implementa la memoria virtual también se suele utilizar un componente hardware denominado unidad de gestión de memoria (Memory Managemeru Unit, MMU) que se encarga de realizar la traducción de una dirección virtual en una dirección física. Una MMU puede implementarse en un circuito integrado independiente o dentro del circuito integrado de procesador. Consta de registros, sumadores y comparadores. También puede tener un banco de registros o un TLB. Por otra parte, la implementación de la memoria virtual requiere que el sistema operativo realice arias tareas, como por ejemplo: el tratamiento de las excepciones provocadas por el acceso a una direcció del espacio de direcciones virtuales del proceso que no está cargada en memoria principal, la selecció de la parte del proceso o de otro proceso que va a ser reemplazada por la parte que contiene la direcció
Memoria virtual
259
e provocó la excepción, o la copia en memoria secundaria de las partes modificadas. La memoria virtual se puede implementar usando paginación por demanda (UNIX, Linux y Wins), segmentación por demanda (OS/2) o segmentación con paginación por demanda (Multics). De tres opciones la técnica más utilizada es la paginación por demanda, seguida de la segmentación paginación por demanda. La segmentación por demanda no es muy popular ya que los algoritmos reemplazamiento de segmentos son complejos. Este capítulo está dedicado al estudio de la implementación de la memoria virtual mediante pagi.ón por demanda. En primer lugar se describe el funcionamiento básico de esta técnica. Después se duce el concepto de conjunto de trabajo de un proceso que resulta muy útil para optimizar algunas - las tareas que debe realizar el sistema operativo para implementar la paginación por demanda. En r lugar se describen los principales algoritmos utilizados para el reemplazamiento de páginas. A tinuación se describen las tareas de asignación de memoria, control de carga y copia en la memoria undaria de página modificadas. Finalmente se incluyen una serie de consideraciones adicionales sola implementación de la paginación por demanda, tales como la selección del tamaño de página, la ~. ación por adelantado y la reserva de marcos libres.
-.2. Paginación por demanda .1. Descripción La técnica de paginación por demanda, también conocida como técnica de demanda de página, al que la técnica de paginación simple divide el espacio de la memoria principal en bloques de igual año denominados marcos de página. Además divide el espacio de un proceso en bloques del mismo -o denominados páginas. En un determinado instante de tiempo un marco de página j puede estar o ocupado por una página i de un proceso X. En la paginación por demanda, a diferencia de la paginación simple, para que un proceso se pueda - . utar no es necesario que todas las páginas del mismo estén cargadas en memoria principal, únicamense cargan las páginas que se van referenciando durante la ejecución del proceso. Cuando se referencia una página que no está cargada en la memoria principal el hardware produce una excepción denomifallo de página. El sistema operativo se encarga de atender los fallos de página, como se estudiará detalle en la sección 7.2.5. Básicamente el tratamiento de un fallo de página requiere que se busque marco libre o se elija uno ocupado para ser reemplazado, y se copie en el mismo desde memoria daria la página que produjo el fallo de página. Aparte del tratamiento de los fallos de página, la implementación de la paginación por demanda 'ere que el sistema operativo realice también las siguientes tareas:
-
• Reemplazamiento de páginas. En el caso de que se produzca un fallo de página i y no exista ningún marco libre, el sistema operativo debe seleccionar mediante la utilización de algún algoritmo de reemplazamiento el marco j de página donde se va cargar la página i que traiga desde memoria secundaria. Además debe guardar, si fue modificada, la página k que estaba en el marco j antes de borrarla cargando la página i.
260
Fundamentos básicos de los sistemas operativos
• Asignación de marcos de memoria principal. En un sistema multiprogramado se suelen cargar simultáneamente en memoria dos o más procesos. El sistema operativo tiene que decidir cuánto marcos asigna inicialmente para cada uno. • Control de carga. El sistema operativo debe controlar el grado de multiprogramación del sistema • Copia en la memoria secundaria de páginas modificadas. El sistema operativo debe decidir en qué momento y de qué forma copiará las páginas que han sido modificadas de la memoria principal a la memoria secundaria.
El sistema operativo mantiene las siguientes estructuras de datos para poder implementar la técnica de paginación por demanda: la tabla de marcos de página, la lista de marcos libres y las tablas de páginas. Las dos primeras estructuras son similares a las utilizadas en la paginación simple. Sin embargo las tablas de páginas usadas en paginación por demanda contienen más información que las utilizadas en paginación simple. Como mínimo, una entrada de una tabla de páginas asociada a la página i de un proceso, aparte del marco de página j donde se aloja la página, debe contener un bit denomina presente/ausente o validez/invalidez para indicar si la página está cargada en la memoria principal. Cuando se crea un proceso y éste entra en el estado preparado para ejecución, el sistema operatiyo crea una tabla de páginas para dicho proceso que también reside en memoria principal. El tamaño de la tabla de páginas coincide con el tamaño del espacio virtual de un proceso. La entrada i de la tabla descompone en un número fijo de campos que contienen información sobre la página i del espacio de direcciones virtuales del proceso. El número, la longitud y el nombre de estos campos depende de cada sistema operativo, pero generalmente se suelen encontrar al menos los siguientes campos: • Número de marco de página. Contiene el número de marco j de memoria principal donde encuentra almacenada la página i. El tamaño de este campo depende del número de marcos en que se descomponga la memoria principal. • Validez o presencia. Este campo consta de un único bit v que se activa (v = 1) si la página i está cargada en el marco j, es decir, la entrada de la tabla se considera que es válida y puede utilizada. Si la página no pertenece actualmente al espacio de direcciones virtuales del proceso o la página no está cargada en memoria principal este bit está desactivado (v = O). En cada referenci a memoria hay que comprobar este bit. Si está desactivado entonces el hardware provoca un fallo de página. • Protección. Este campo en su forma más simple consta de un único bit que en función de su valor indica si la página es de solo-lectura o de lectura-escritura. Usualmente este campo suele constar de tres bits (P2PIPO) como máximo que permiten establecer los permisos de acceso lectura (p_ . escritura (PI) y ejecución (Po) de una página. • Referenciada. Este campo consta de un único bit r que se activa cuando la página i es referenciada por una dirección virtual.
Memoria virtual
261
• Modificada. Este campo consta de un único bit m, que se activa cuando la página es modificada en una operación de escritura. Su activación indica al sistema operativo que debe copiar la página en memoria secundaria con objeto de garantizar que la copia de la página que se mantiene en la memoria secundaria está actualizada. Los campos número de marco de página, validez y protección son configurados por el sistema operay son consultados por la MMU cada vez que hay que traducir una dirección virtual en una dirección a. Por su parte, los campos referenciada y modificada son activados por el hardware. Inicialmente cuanuna página i de un proceso es cargada en memoria estos campos de la entrada i de la tabla de páginas proceso son configurados a Opor el sistema operativo. Además cada cierto tiempo durante la ejecu• de un proceso el sistema operativo pone a Oel campo referenciada de todas las páginas del proceso ,",adas en memoria. El algoritmo de reemplazamiento de página que 'utilice el sistema operativo puede consultar los bits _ m para decidir que página k contenida en un marco h será elegida para ser reemplazada por la página ferenciada por la dirección virtual que produjo un fallo de página. 'l)
'emplo 7.1 idérense dos procesos A y B cuyos espacios de direcciones virtuales constan de cuatro y seis pá, respectivamente. Supóngase que el sistema operativo gestiona la memoria principal usando la 'ca de paginación por demanda. En la Figura 7.1 se muestran para un determinado instante de tiemlas tablas de páginas de ambos procesos y los marcos de memoria principal j = 30 a j = 40 donde se uentran alojadas páginas de estos procesos. observa en la tabla de páginas del proceso A que el bit de validez v solo está activado en las entradas 'adas a las páginas i = O e i = 3. Esto indica que éstas son las únicas páginas del proceso A que se entran actualmente cargadas en memoria principal. El campo marco j contiene el marco de memoria de se encuentra cargada la página. Así la página i = O está cargada en el marco j = 30 Y la página = 3 en el marco j = 36. Nótese que en las páginas cuyo bit de validez está desactivado, el campo o j se ha representado vacío ya que dicho campo en este caso no se consulta. En realidad dicho o contendrá un determinado valor, o el valor inicial dado por el sistema operativo al crear la tabla páginas, por ejemplo el valor O, o el marco j donde se encontraba la página antes de ser reemplazada. forma análoga de la tabla de páginas del proceso B se deduce que únicamente sus páginas i = 3, 5 están cargadas en memoria principal. En concreto en los marcos j = 40, j = 33 Y j = 34, tivamente.
=4 e i =
opóngase que el tamaño de una página es de 1 Ki Y que durante la ejecución del proceso A se hace erencia a la dirección virtual Dirv = 1200 expresada en decimal. Se desea saber si dicha referencia vacará un fallo de página. Para determinarlo en primer lugar hay que calcular en que página del acio de direcciones virtuales del proceso se encuentra dicha dirección:
--s;-
. = fioor (DIRv ) = fioor (1200) lKi = fioor (1200) 1024 = fioor (1,17) = 1
1
1
262
Fundamentos básicos de los sistemas operativos
Memoria principal Páginas Otros
r
i=O
m
P2PIPO
O
101
v
Marcoj
30
i=l
O
O
110
O
i=2
O O
110
O
i=3
O
101
36
Tabla de páginas proceso A Páginas Otros
r
m
P2PIPO
v
Marcoj
i=O
O
O
100
O
i=l
O
O
100
O
i=2
O
O
101
O
i=3
1 O
101
1
40
i=4
1
1
110
1
33
i=5
1
O
100
1
34
Marcos j=30
Página i=O (A)
j=31
Página i=45 (F)
j=32
Libre
j=33
Página i=4 (B)
j=34
Página i=5 (B)
j=35
Página i=67 (F)
j=36
Página i=3 (A)
j =37
Libre
j=38
Libre
j=39
Página i=2 1 (G)
j=40
Página i=3 (B)
Tabla de páginas proceso B _____________________________________________________ 1
Figura 7.1- Ejemplo de tablas de páginas utilizadas en paginación por demanda
Luego la dirección virtual 1200 hace referencia a una posición ubicada en la página i = 1 del proce A. Examinando el campo validez de su entrada asociada en la tabla de páginas del proceso A se obsen que el bit está desactivado, lo que indica que la página i = 1 del proceso A no está cargada en memori En consecuencia la referencia a la dirección virtual Dirv = 1200 producirá un fallo de página.
7.2.2.
Reinicio de instrucciones
Un fallo de página puede producirse al realizar una referencia a memoria virtual en cualquier f (búsqueda o ejecución) dentro de un ciclo de instrucción. En la fase de búsqueda el fallo de página puede producir al traducir la dirección virtual de la próxima instrucción a ejecutar (que se encuen contenida en el registro contador de programa). Por su parte, en la fase de ejecución se puede produ un fallo de página cuando hay que traducir la dirección virtual de algún operando o la dirección v' donde se va a almacenar el resultado.
~-
Memoria virtual
263
Para poder implementar la memoria virtual por demanda de página es necesario que la arquitectura 1 computador permita reiniciar cualquier instrucción después de un fallo de página. Nótese que indetx!ndientemente de la fase del ciclo de instrucción en que se produzca el fallo, la instrucción debe ser :einiciada desde el principio, es decir, desde la fase de búsqueda. Para poder reiniciar la instrucción es necesario conocer la dirección virtual de dicha instrucción. arquitecturas que soportan memoria virtual por demanda de página disponen de un registro especial nde copian el valor del registro contador del programa antes de iniciar la fase de búsqueda de una cción. Ejemplo 7.2 Supóngase que en un determinado instante de tiempo el contador de programa de un procesador contiene dirección virtual Diryo asociada con la siguiente instrucción expresada en un lenguaje ensamblador clO:
Mult A, B
:=sta instrucción multiplica el contenido de la posición de memoria A con el contenido de la posición de oria B y almacena el resultado en la posición de memoria A, es decir: M[Al
f-
M [Al x M[Bl
- ciclo de ejecución de esta instrucción requiere: l . Leer la instrucción en memoria. Decodificar el código de operación de la instrucción. 3. Leer el operando A en memoria principal. Se va a suponer que se encuentra almacenado en la dirección virtual DirYl. 4. Leer el operando B en memoria principal. Se va a suponer que se encuentra almacenado en la dirección virtual DirY2. - Realizar la operación de multiplicación. 6. Almacenar el resultado en Diry1 . - puede producir un fallo de página en los pasos 1,3 Y 4. En 6 no se produciría porque dicha posición e ha comprobado que estaba en el paso 3. Antes de realizar el paso 1 se carga en un registro especial dirección Diryo por si es necesario reiniciar la instrucción.
•
Por otra parte, algunos procesadores soportan un modo de direccionamiento indexado para acceder tos que están almacenados en arrays, pilas o colas. La ejecución de instrucciones que soportan este
264
Fundamentos básicos de los sistemas operativos
modo de direccionamiento producen el autodecremento o el autoincremento de uno o varios registros del procesador. Para poder reiniciar este tipo de instrucciones la arquitectura del computador suele disponer de otro registro especial donde almacenar el nombre del registro o registros que se han autoincrementado o autodecrementado y el valor del incremento o decremento. El sistema operativo tiene que deshacer los cambios en dichos registros antes de reiniciar la ejecución de la instrucción que produjo el fallo de página.
7.2.3.
Localización de las páginas en memoria secundaria
En la técnica de gestión de memoria mediante demanda de página existen diferentes eventos que provocan que el sistema operativo tenga que acceder a la memoria secundaria para leer o escribir páginas de procesos. Por ejemplo, cuando la referencia a una página i produce un fallo de página, el sistema operativo debe leer dicha página en memoria secundaria y copiarla en la memoria principal. También. cuando se produce un fallo de página y no existen marcos libres en memoria principal el sistema operativo debe seleccionar una página para ser reemplazada. Si la página ha sido modificada o no existe una copia de la misma en el área de intercambio dicha página debe ser escrita allí. El sistema operativo puede buscar una página en dos posibles localizaciones de memoria secundaria:
• Bloque de disco de un archivo ejecutable. Parte de las páginas en que se divide el espacio de direcciones virtuales de un proceso, en concreto las asociadas a las regiones de código y datos, so creadas por el sistema operativo a partir del archivo ejecutable del programa del cual es instancia dicho proceso. Dicho archivo reside lógicamente en algún directorio del sistema de archivos ~ ocupa físicamente un determinado número de bloques de disco. Conviene aclarar que los bloqu _ de disco que ocupa el archivo no contienen a las páginas ya formadas propiamente dichas sino que poseen el contenido (código y datos del programa) que permite su creación . • Bloque de disco del área de intercambio. El área de intercambio se utiliza para el almacenamien de las páginas de un proceso presentes en memoria principal cuando éste es intercambiado fue para hacer sitio a otros procesos. También se utiliza para el almacenamiento de las páginas que h sido seleccionadas para ser reemplazadas en memoria principal por otras durante el tratamiento los fallos de página. Cada bloque del área de intercambio o del sistema de archivos queda identificado por un número bloque, también denominado dirección de disco. Para localizar una página en memoria secundaria el sistema operativo debe mantener cierta inform.ación en una o varias estructuras de datos. La información que se mantiene y en qué estructuras se gu depende de cada sistema operativo. Las estructuras de datos que permiten localizar los bloques de . de archivos, a partir de los cuales se pueden crear páginas, serán estudiadas en el capítulo 9. Se descri a continuación la localización de páginas en el área de intercambio. Algunos sistemas operativos, cuando crean un proceso, copian por adelantado en el área de interc bio todas las páginas del espacio de direcciones virtuales del proceso. Las operaciones de E/S al área intercambio, sobre todo si ésta se implementa en una partición diferente de la del sistema de archiv
Memoria virtual
265
son generalmente más rápidas que las operaciones de E/S al sistema de archivos, ya que los bloques de 'gnación del área de intercambio suelen ser de mayor tamaño y además no se requieren métodos de , queda de archivos en directorios. El objetivo de esta estrategia es evitar tener que acceder al sistema archivos cuando se produzcan fallos de página y acelerar así su tratamiento. Si la copia de la imagen del proceso ocupa un rango de direcciones contiguas del disco y además da bloque del área de intercambio contiene una página, entonces el sistema operativo únicamente sita conocer la dirección de disco donde comienza la copia de la imagen del proceso en el área de tercambio. Dicha dirección se almacena en el bloque de control del proceso. Con esta estrategia, cuando se produce un fallo de página, el sistema operativo busca la página i e produjo el fallo en el área de intercambio. Para determinar la ubicación de la página i en el área de rercambio accede al bloque de control del proceso y lee la dirección de disco donde está almacenada primera página (i = O) del proceso. A continuación le suma el número de página de la dirección que ujo el fallo. Una vez localizada la página i esta es cargada en un marco j de memoria principal. Si ho marco j contenía una página k que había sido modificada, la página k es copiada en el área de rcambio antes de ser reemplazada por la página i. , Ejemplo 7.3
opóngase que un sistema operativo cuando crea un proceso copia por adelantado en el área de interbio todas las páginas del espacio de direcciones virtuales del proceso. Supóngase también que dicha ia ocupa un rango de direcciones contiguas y que cada bloque del área de intercambio contiene una - .ca página. En la Figura 7.2 se muestra el espacio de direcciones virtuales de un proceso B en el área intercambio. El proceso B consta de seis páginas (i = O a i = 5) de las cuales solo residen actualmente memoria las páginas i = 3, i = 4 e i = 5. Si ahora se ejecutase el proceso B y se hiciese una referencia una dirección de memoria virtual contenida en la página i = 1 se produciría un fallo de página. -
istema operativo durante el tratamiento de este fallo de página, entre otras acciones, necesita determila localización de la página i = 1 del proceso B en el área de intercambio. Para ello accede al bloque control del proceso B y lee la dirección de disco donde comienza la copia de la imagen del proceso, es ir, donde está almacenada su página i = O. Supóngase que es la dirección de disco 12896, expresada decimal. Entonces la página i = 1 del proceso está ubicada en la dirección de disco 12896+i = 12897 .
•
La estrategia comentada es simple; pero tiene un problema, el espacio de direcciones virtuales de un eso puede aumentar su tamaño debido al crecimiento de la región de pila o de la región de datos. Si o sucede hay que buscar un hueco lo suficientemente grande en el área de intercambio y copiar allí nuevo todo el espacio del proceso, lo cual es una tarea que requiere un tiempo no despreciable. Una ible solución es reservar huecos independientes en el área de intercambio para la región de código, región de datos y la región de pila de un proceso. De esta forma si una región crece por encima del año reservado, el tamaño del hueco a buscar y la información a copiar son de menor tamaño, por lo e se reduce el tiempo de la operación. En este caso el sistema operativo deberá almacenar en el bloque control del proceso la dirección de disco donde comienza la copia en el área de intercambio de cada a de las regiones.
266
Fundamentos básicos de los sistemas operativos
Memoria principal
Área de intercambio en disco
1'--
----
1 1- 12896
I
Marcos
j=30
Bloque de control del proceso B
j=31 j=32
Marcoj
Páginas
Página i=4 (B)
j=33
Página i=5 (B)
j=34
12896
Pagina i=O
Otros v
12897
Página i=l
O
i=O
12898
O
i=l
j=35
Página i=2
12899
Página i=3
O
i=2
j=36
12900
Página i=4
1
40
i=3
j=37
12901
Página i=5
1
33
i=4
j=38
1
34
i=5
j=39
Espacio virtual proceso B
Tabla de páginas proceso B
Página i=3 (B)
j=40
:
Figura 7.2 - Localización de las páginas de un proceso en el área de intercambio mediante una dirección de disco base ubicada en el bloque de control del proceso
Otro problema que presenta la estrategia comentada es que consume bastante espacio del área de intercambio, ya que todas las páginas de un proceso son copiadas por adelantado en dicha área, independientemente de que se vayan a utilizar o no. Debe tenerse en cuenta que en un sistema con multiprogramación, en el área de intercambio estarían todas las páginas de todos los procesos. Para evitar estos problemas, otros sistemas operativos no copian por adelantado las páginas de un proceso en el área de intercambio. Una página solo es copiada en el área de intercambio cuando és es reemplazada de memoria principal durante un fallo de página o cuando se intercambia un proceso. El sistema operativo debe mantener para cada página intercambiada la dirección de disco del área de intercambio donde puede ser localizada en caso de que sea necesaria cargarla de nuevo en memoria.. Esta información se almacena en una tabla, a veces denominada mapa de disco , que tiene tantas entradas como páginas tenga un proceso .
• Ejemplo 7.4 En la Figura 7.3 se muestran, entre otras estructuras de datos, el mapa de disco que utiliza el siste operativo para localizar en el área de intercambio a las páginas del proceso B. Las entradas del mapa de disco indica que las páginas i = 0, i = 1 e i = 2 se encuentran en los bloques de disco 12356, 18014 _
Memoria virtual
267
Memoria principal Marcos Área de intercambio en disco
I
j=30
--.......
j=31
-----
j=32
Página i=O
~"i.
I
--
Página i=2
Página i=1 Espacio virtual proceso B
Otros v
Marcoj
12356
O
i=O
1)1
18014
-O
i=l
15879
O
i=2
ti
28741
1
40
i=3
I
26102
1
33
i=4
22485
1
34
i=5
I I
I
Bloque de disco
Mapa de disco
Tabla de páginas proceso B
Página i=4 (B)
j=33
Página i=5 (B)
j=34 j=35 j=36 j=37 j=38 j=39
Página i=3 (B)
j=40
Figura 7.3 - Localización de las páginas de un proceso en al área de intercambio mediante el uso de un mapa de disco - 79. Las entradas del mapa de disco asociadas a las páginas i = 3, i = 4 e i = 5 contienen direcciones disco que no son válidas ya dichas páginas se encuentran cargadas en memoria principal. Cuando guna de estas páginas sea intercambiada fuera de memoria principal su entrada en el mapa de disco rá ser actualizada con la dirección de disco del área de intercambio donde se aloje.
•
- .4. Bloqueo de marcos de página En la técnica de gestión de memoria mediante paginación, la memoria principal se descompone en marcos de igual tamaño. Se dice que un marco de memoria está bloqueado o pinchado (pinning), u contenido no puede ser reemplazado. El sistema operativo bloquea un marco de página activando bit de bloqueo en la entrada asociada a dicho marco en la tabla de marcos de páginas. El bloqueo marcos resulta muy útil para prevenir que un marco, que contiene información que conviene que no borrada, sea seleccionado para alojar la página de otro proceso. Por ejemplo, de los NMP marcos en e se divide la memoria principal un conjunto de V marcos están reservados para alojar el espacio del úcleo. También se reservan marcos para alojar buffers de E/S. Los marcos reservados están bloqueados.
_ - fP
268
7.2.5.
Fundamentos básicos de los sistemas operativos
Tratamiento de un fallo de página
Si durante el ciclo de ejecución de una instrucción de un proceso A, bien en la fase de búsqueda o bien en la fase ejecución, se hace una referencia de lectura o escritura a una determinada posición de memoria, la dirección de memoria virtual referenciada es pasada a la MMU para traducirla a una dirección física. La MMU comprueba que el campo número de página de la dirección virtual no sobrepasa el número de páginas de que consta el espacio del proceso que ha sido almacenado por el sistema operativo en el registro límite de la MMU al planificar el proceso para ejecución. Si lo sobrepasara, se produciría una excepción que al ser atendida por el sistema operativo provocaría la terminación del proceso. Supuesto que la dirección virtual no sobrepasa el espacio del direcciones virtuales del proceso, la MMU utiliza el campo número de página de la dirección como índice para acceder a la entrada correspondiente de la tabla de páginas (puede estar cargada en un TLB, en un banco registros especiales o en memoria principal) y comprueba el valor del bit del campo validez o presencia. Si dicho bit está activado entonces significa que la página está cargada en memoria principal y la MMU lee el campo número de marco de página para construir la dirección física junto con el campo desplazamiento de la dirección virtual. Si el bit de validez está desactivado entonces el hardware produce una excepción denominada fa llo de página y guarda en la pila del núcleo el valor del contador de programa y de los registros especiales. A continuación se cede el control al sistema operativo para que atienda el fallo de página. Cómo se realiza el tratamiento de un fallo de página depende de cada sistema operativo. Pero de forma general se puede decir que en primer lugar el sistema operativo guarda el contexto del proceso A cuya ejecución produjo la excepción. En segundo lugar comprueba la causa de la excepción, ya que existen diferentes motivo_ que pueden causar una excepción, y la identifica como fallo de página. A continuación intenta averiguar cuál fue la dirección virtual que produjo el fallo de página, consultando típicamente los registros ocultos del procesador. Si el procesador no dispone de dichos registros el sistema operativo tendrá que simular la ejecución de la instrucción que produjo el fallo hasta descubrirla. Después de determinar la dirección virtual que produjo el fallo de página, el sistema operativo comprueba que se trata de una dirección legal, es decir, que pertenece al espacio de direcciones virtuales de] proceso y que el tipo de acceso que se pretende no viola el tipo de acceso permitido según el campo de protección de su entrada asociada en la tabla de páginas. Si no es una dirección legal entonces enviará al proceso una señal de aviso o finalizará el proceso. Si la dirección es legal, el sistema operativo consulta la lista de marcos de página libres. Si no ha. ningún marco libre debe invocar al algoritmo de reemplazamiento de página para seleccionar un mar de página j, que no este bloqueado, donde cargar la página i que produjo el fallo. Si la página k que estaba contenida en el marco j tenía su bit de modificada activado, entonces página k es planificada para ser copiada al disco duro. El sistema operativo pasa al proceso A CU} ejecución produjo el fallo de página al estado bloqueado mientras se completa la copia de la página al disco duro. También bloquea el marco j en la tabla de marcos de página para impedir que pueda utilizado para almacenar una página distinta de la página i. Además, se realiza un cambio de proce _ para permitir que otro proceso B se pueda ejecutar mientras tanto.
Memoria virtual
269
Una vez que el marco j está limpio, es decir, la página k se ha copiado en el disco, el sistema operativo aliza la ubicación de la página i en memoria secundaria y planifica su copia a memoria principal. Cuando la página i ha sido copiada en la memoria principal se produce una interrupción de disco avisar de tal evento al sistema operativo. Éste actualiza las tablas de páginas y desbloquea el marco .- en la tabla de marcos de página. A continuación el sistema operativo modifica el contador de programa _ otros registros guardados en el contexto de proceso A para que cuando sea planificado de nuevo pueda :=iniciarse justo desde el comienzo de la instrucción que produjo el fallo de página. El sistema operativo despierta al proceso A, que pasa al estado preparado para ejecución. Cuando proceso A sea planificado para ejecución se cargará su contexto y se reiniciará su ejecución desde el - cipio de la instrucción que produjo el fallo de página. En el caso de que el sistema operativo hubiese encontrado un marco libre en la lista de marcos libres, onces en la gestión del fallo se habrían ahorrado los pasos de invocar al algoritmo de reemplazamiento página y la operación de E/S para copiar la página k desde memoria principal al disco.
Conjunto de trabajo de un proceso Los programas que se ejecutan en un computador cumplen el principio de localidad de referencias, bién denominado principio de proximidad, que afirma que durante un determinado intervalo de tiemde ejecución de un proceso éste referencia a direcciones virtuales próximas entre sí, es decir, a páginas as. Por tanto una vez que dichas páginas se han traído a memoria, el proceso se ejecutará durante o intervalo de tiempo sin necesidad de provocar fallos de página. Dicho conjunto de páginas forma zona de localidad del proceso. Transcurrido dicho intervalo el proceso pasará a referenciar durante intervalo de tiempo a otro conjunto de páginas cercanas, es decir, a otra zona de localidad, y así ivamente. En definitiva este principio afirma que las referencias a memoria dentro de la ejecución un proceso tienden a agruparse en zonas de localidad.
Ejemplo 7.5 ilustrar el principio de localidad de referencia, en la Figura 7.4 se han representado, a modo de lo, el número de página referenciado durante el tiempo de ejecución de un cierto proceso. En dicha , ca se observan tres zonas de localidad. La primera zona de localidad queda definida por la secuencia dena de referencias a páginas 24, 23, 21, 25, 23, 24, 25, 24, 22, 23, 22 que se genera en el rango ral [0.5,5.5] (ut) . Luego esta zona de localidad está formada por el conjunto de páginas 21 , 22, 23,
_-.25. segunda zona de localidad queda definida por la secuencia de referencias a páginas 30,31,32,29,30, _ .32, 32, 34 que se genera en el rango temporal [6, 10] (ut). Luego esta zona de localidad está formada el conjunto de páginas 29, 30, 31, 32, 34. Finalmente, la tercera zona de localidad queda definida la secuencia de referencias a páginas 10, 10, 12, 11 , 13, 14, 10, 11, 11 , 12, 13, 14 que se genera en rango temporal [10.5, 16] (ut). Luego esta tercera zona de localidad está formada por el conjunto de as 10,11, 12, 13, 14.
•
270
Fundamentos básicos de los sistemas operativos
40 r----.----.----.-----.----,----.----,-----r-~
~
~
35
'@30 ~ ~
25
~
.S 20 bl) -~
o. v
15
ev
10
"d
El Z
-;::l
5 O O
2
4
6
8
10
12
14
16
Tiempo virtual (ut) Figura 7.4 - Números de páginas referenciados durante la ejecución del proceso del Ejemplo 7.5
En general, cuando se ejecuta un proceso no se conocen las próximas páginas a las que hará referencia. Dicha información sería de gran utilidad al sistema operativo para poder realizar de forma óptima las tareas de asignación de memoria y reemplazamiento de páginas, lo que permitiría diminuir al máximo posible el número de fallos de página. Si el proceso se está ejecutando dentro de una zona de localidad, por el principio de proximidad, las referencias futuras serán parecidas a las referencias pasadas. Esta idea es la que subyace en el concepto de conjunto de trabajo de un proceso ([Denning, 1968] y [Denning, 1980]), que se puede definir para el instante ti de tiempo virtual como el conjunto de páginas distintas que el proceso en ejecución ha referenciado en sus últimas 6 referencias a memoria principal. Se denomina tiempo virtual al tiempo que un proceso está siendo ejecutado en el procesador. Por ejemplo supóngase que en el intervalo de tiempo [O, 100] expresado en unidades de tiempo (ut) un proceso X ha sido ejecutado en los intervalos [5, 25] Y [75, 90]. El intervalo de tiempo [5, 25] equivale al intervalo de tiempo virtual [O, 20] . Mientras que [75, 90] equivale al intervalo de tiempo virtual [20. 35]. Luego el proceso X se ha ejecutado en el rango de tiempo virtual [O, 35]. El conjunto de trabajo se puede denotar como W(ti , 6), donde ti es un instante de tiempo virtual determinado y 6 es el número de últimas referencias consideradas o ventana del conjunto de trabajo. tiempo ti puede tomar cualquier valor dentro del intervalo de tiempo virtual (O, tf], donde tf denota extremo final del intervalo de tiempo virtual. Por su parte, el parámetro 6 puede tomar valores enter positivos comprendiQos en el rango [1, L]. Siendo L el número de referencias realizadas hasta el instan de tiempo virtual ti . El conjunto de trabajo se puede expresar de la siguiente forma: (7.1
Memoria virtual
271
En la expresión anterior ij representa a un número de página. Nótese que el conjunto de trabajo de un proceso no puede contener números de página repetidos. La correcta elección del valor de ¿j es fundamental para modelar adecuadamente la zona de localidad actual de un proceso y no asignar al proceso más marcos de página de los estrictamente necesarios. El problema radica en que el valor óptimo ¿j es desconocido, ya que solo se podría conocer una vez que se tuvieran todas las referencias de que nsta una zona de localidad, es decir, se tuviera información en el instante ti de las referencias futuras. i e elige un valor de ¿j muy pequeño el conjunto de trabajo no cubrirá toda la zona de localidad actual ;:n la que se encuentra el proceso. Por el contrario, si ¿j es grande, el conjunto de trabajo cubrirá más de a zona de localidad. Cuando ti = t f si ¿j = L entonces el conjunto de trabajo cubrirá todas las zonas de alidad, es decir, todas las páginas diferentes que han sido referenciadas durante el tiempo de vida del eso. Otro inconveniente es que para mantener correctamente el conjunto de trabajo de un proceso, istema operativo tendría que ser ejecutado en cada referencia a memoria realizada por el proceso, lo cual aumentaría la sobrecarga y el tiempo de ejecución del proceso. En la práctica, para reducir la sobrecarga, el sistema operativo construye el conjunto de trabajo de proceso periódicamente cada cierto tiempo virtual f).. Para ello revisa el campo referenciada (bit r) de da entrada de la tabla de páginas del proceso, el conjunto de trabajo está formado por todas aquellas ' cinas que tengan su bit r activado (r = 1). Una vez construido el conjunto de trabajo el sistema rativo pone a Olos bits de referencia que estaban activados.
312
6 7 9 5 2 3 2 9 3 3 6 2
i
i
t2 W(t[ , ll)={l , 2, 6} W(t 2, L1¡)= {2, 3} t[
(a) ll[
... ...
W(t¡ , ll[)={l , 2, 3, 5,6, 7, 9}
ll2 ...
W(t¡, ll2)= {2, 3, 5, 9}
ll3 •
W(t¡, ll3)={2 , 3}
3 1 2 1 6 7 9 5 2 3 2 9 3 362
t t¡ \
(b)
Figura 7.5 - Conjunto de trabajo de un proceso con distintos instantes de tiempo virtual (a) y distintas ventanas de tiempo virtual (b)
272
Fundamentos básicos de los sistemas operativos
De acuerdo con esta forma práctica de construir el conjunto de trabajo, éste se puede definir alternativamente como el conjunto de páginas distintas que el proceso en ejecución ha referenciado en el intervalo de tiempo virtual comprendido entre ti - ~ y ti. Donde ~ es la ventana de tiempo virtual, que puede tomar valores en el rango (0, ti] . Luego ahora el conjunto de trabajo se expresa como (7.2)
Como sucedía con 6, el valor óptimo de ~ también es desconocido a priori. Si ~ es muy pequeño el conjunto de trabajo no cubrirá toda la zona de localidad actual en la que se encuentra el proceso. Por el contrario si ~ es grande, el conjunto de trabajo cubrirá más de una zona de localidad . • Ejemplo 7.6
Supóngase que la ejecución de un determinado proceso ha generado la siguiente secuencia de referencias a página: 3, 1,2, 1,6, 7, 9, 5, 2, 3, 2, 9, 3, 3, 6 y 2. En la Figura 7.5a se muestra el conjunto de trabajo del proceso en dos instantes distintos y la misma ventana. En la Figura 7.5b se muestra el conjunto de trabajo del proceso para un determinado instante ti y tres ventanas distintas de tiempo virtual.
• Del estudio del conjunto de trabajo de un proceso se deducen las siguientes conclusiones: • Una página que es miembro del conjunto de trabajo de un proceso no debe ser selecciona como página víctima para ser reemplazada, ya que ello provocaría rápidamente un nuevo fallo de página • Un proceso debe tener asignados el suficiente número de marcos para poder tener cargado en memoria su conjunto de trabajo. En caso contrario estará constantemente provocando fallos de página, es decir, se produce el fenómeno conocido como sobrepaginación o trasiego (thrashing). De acuerdo con las conclusiones anteriores, el sistema operativo debería mantener el conjunto de trabajo de un proceso para intentar realizar de manera óptima las tareas de reemplazamiento de páginas y asignación de memoria.
7.4.
Reemplazamiento de páginas
Como se comentó al describir el tratamiento de un fallo de página, una de las tareas principales que debe realizar el sistema operativo para implementar la memoria virtual mediante demanda de página e el reemplazamiento de páginas. Esta tarea consiste en seleccionar una página k cargada en un marco j de memoria pril)cipal para ser reemplazada por la página i a la que hacía referencia la dirección virtual que produjo el fallo de página. Básicamente para llevar a cabo esta tarea el sistema operativo debe fijar un conjunto de páginas candidatas a ser reemplazadas y un algoritmo de reemplazamiento de página. De entre el conjunto de páginas candidatas, el algoritmo de reemplazamiento debe elegir una para ser reemplazada. A la página elegida se le denomina página víctima.
Memoria virtual
273
En relación con el conjunto de páginas candidatas a ser reemplazadas, se define el término conjunto de marcos candidatos, que hace referencia a los marcos de memoria principal donde se encuentran acenadas las páginas candidatas. El conjunto de páginas candidatas a ser reemplazadas puede estar formado únicamente por las págicargadas en memoria principal en marcos no bloqueados pertenecientes al proceso que ha producido fallo de página. En dicho caso se dice que el sistema operativo utiliza una estrategia de reemplazaiento de páginas local. Otra posibilidad es que el conjunto de páginas candidatas a ser reemplazadas esté formado por todas páginas cargadas en memoria principal ubicadas en marcos no bloqueados. En este caso se dice que 31 istema operativo utiliza una estrategia de reemplazamiento de páginas global. En general puede afirmarse que la estrategia de reemplazo local es más fácil de analizar que la global, sin embargo su implementación es más complicada y produce mayor sobrecarga. La estrategia de reemplazo utilizada, local o global, queda definida por la política de asignación de emoria que utilice el sistema operativo, tal y como se describirá en la sección 7.5. Una vez fijado el conjunto de páginas candidatas a ser reemplazado, se debe seleccionar un algoritmo reemplazamiento que elija una de las páginas del conjunto. Existen diferentes algoritmos de reemplazamiento de página: algoritmo óptimo, algoritmo FIFO, algoritmo LRU, algoritmo del reloj, etc. Cada o de ellos, como se describirá en las próximas secciones, tiene sus ventajas y sus inconvenientes. La bondad de un algoritmo de reemplazamiento se analiza en función de su rendimiento, entendiencomo tal al número de fallos de página que permite evitar y al tiempo de procesador que requiere ejecución, es decir, la sobrecarga que introduce al sistema. Lo deseable es que el algoritmo de reemplazamiento que utilice el sistema operativo minimice el número de fallos de página y produzca una brecarga mínima. El problema es que estos dos requisitos son opuestos, por lo que hay que tratar de gar a un compromiso entre ambos. También es deseable que el algoritmo de reemplazamiento de páginas que se utilice disminuya el núero de fallos de página a medida que aumenta el número de marcos de página de la memoria principal. decir, cumpla el principio de que a más recursos mejor comportamiento. Debe tenerse presente que es posible conseguir que el número de fallos de página sea cero, ya que como mínimo se producirán tos fallos de página como páginas distintas sean referenciadas en una secuencia. Aquellos algoritmos de reemplazamiento que pueden aumentar el número de fallos de página si enta el número de marcos de la memoria principal se dice que sufren de la anomalía de Belady, que ~ e quién descubrió por primera vez [Belady et al., 1969] este extraño comportamiento en un algoritmo reemplazamiento, en concreto en el algoritmo FIFO.
'. Ejemplo 7.7 En la Figura 7.6 se ha representado, para una secuencia de referencias de páginas y un algoritmo de reemplazamiento dados, el número de fallos de página en función del número de marcos de página . ponibles. Se observa que el algoritmo de reemplazamiento utilizado sufre de la anomalía de Belady _'a que para 4 marcos de página se producen 17 fallos de página mientras que para 5 marcos se producen 1 fallos. Es decir, ha aumentando el número de fallos al aumentar el número de marcos.
•
274
Fundamentos básicos de los sistemas operativos
21.----,-----,-----,-----,-----,----,-----,
20
17
16L---~----~----~----~----~----~--~
o
2
3
4
5
6
7
Marcos de página
Figura 7.6 - Ilustración de la anomalía de Belady
En general los algoritmos de pila, como el algoritmo óptimo o el algoritmo LRU, no presentan la anomalía de Belady. Los algoritmos de pila se caracterizan porque aseguran que el conjunto de páginas en memoria principal para un total de m marcos, es siempre un subconjunto del conjunto de página que estarían en memoria si hubiese m + 1 marcos. En las siguientes secciones se describen los algoritmos de reemplazamiento más conocidos.
7.4.1. Algoritmo de reemplazamiento óptimo El algoritmo de reemplazamiento óptimo selecciona para ser reemplazada aquella página del conjunto de páginas candidatas a ser reemplazadas que tardará más en volver a ser referenciada por una dirección virtual. En consecuencia con este algoritmo, para un determinado número de marcos, se obtiene el menor número de fallos de página posibles. Es decir, minimiza el número de fallos de página, de ahí el calificativo de algoritmo óptimo. El problema que presenta este algoritmo es que no se puede implementar en la práctica ya que requiere conocer la cadena de direcciones virtuales futuras a las que hará referencia el procesador. Pese a este inconveniente el algoritmo de reemplazamiento óptimo sí que se utiliza como modelo con el que comparar al resto de algoritmos de reemplazamiento .
• Ejemplo 7.8 Supóngase que la ejecución de un determinado proceso ha generado la siguiente secuencia de referencias a página: 3, 1,2, 1, 6,7, 9,5, 2,3,2, 9,3,3,6 y 2. Se desea determinar el número de fallos de página que se producirán durante la ejecución del proceso supuesto que el sistema asigna los marcos de página j , k Y 1 (inicialmente vacíos) para este proceso y utiliza el algoritmo de reemplazamiento de página óptimo. Las tres primeras referencias (3, 1,2) producen tres fallos de página ya que en los marcos j , k Y1estaban
Memoria virtual
275
vacíos. La página i = 3 se carga en el marco j , la página i = 1 se carga en el marco k y la página i = 2 se ga en el marco l. La siguiente referencia (i = 1) produce un acierto ya que la página i = 1 está cargada en el marco k. La referencia a la página i
= 6 produce una fallo
ya que dicha página del proceso no está cargada en memoria. Para seleccionar qué página del proceso será reemplazada se utiliza el algoritmo de reemplazamiento óptimo, por lo que hay que inspeccionar la cadena completa de referencias y determinar cuál las tres páginas que se encuentran cargadas en memoria (3, 1, 2) tardará más en ser referenciada. Realizando este análisis se observa que la página i = 1 ya no volverá a ser referenciada, por lo que es elegida para ser reemplazada. Así, la página i = 6 que produjo el fallo se carga en el marco k. La siguiente referencia (i
= 7) también produce un fallo de página. Inspeccionando la cadena de referen-
'as se observa que de las tres páginas cargadas en memoria (3,6,2) la página i = 6 cargada en el marco es la que tardará más en volver a ser referenciada. Así la página i = 7 que produjo el fallo se carga en el marco k. Analizando el resto de referencias se obtiene que la secuencia indicada cuando se dispone de tres marcos de página y se utiliza el algoritmo de reemplazamiento óptimo produce 9 fallos de página. En la Figura - .7 se muestra el contenido de los marcos j, k y 1 antes y después de cada referencia de la secuencia. Se - dica también si dicha referencia provoca un fallo o un acierto. 3
2
6
7
9
5
2
3
2
9
3
3
6
2
Marco ) Marco k Marco 1 F
F
F
A
F
F
F
F
A
A
A
F
A
A
F
A
F=Fallo A=Acierto
Figura 7.7 - Ejemplo de aplicación del algoritmo de reemplazamiento de página óptimo
_-ótese que en el caso de que tras inspeccionar la cadena de referencias existan dos o más páginas que darán lo mismo en ser referenciadas y pueden ser candidatas a ser reemplazadas, la elección de la página a sustituir se realiza aleatoriamente.
•
.4.2. Algoritmo de reemplazamiento LRU El algoritmo de reemplazamiento de la página usada menos recientemente o algoritmo de reempla:tJmiento LRU (Least Recently Used) selecciona para ser reemplazada aquella página del conjunto de páginas candidatas a ser reemplazadas que lleva más tiempo sin ser referenciada, es decir, sin ser utilizada. La idea que subyace detrás de este algoritmo es la de intentar predecir el futuro próximo teniendo en enta el pasado reciente.
276
Fundamentos básicos de los sistemas operativos
El algoritmo LRU es bastante bueno y produce un número de fallos de página bastante cercano al algoritmo de reemplazamiento óptimo. Sin embargo, su principal inconveniente es que su implementación es compleja y produce bastante sobrecarga al sistema. Una posible implementación del algoritmo LRU es mediante el uso de una lista enlazada. Cada entrada de la lista contiene el número de página de una página del conjunto de páginas candidatas a ser reemplazadas. Cada vez que una página es referenciada su número es colocado al principio de la lista. Es decir, la lista funciona como una pila. Así al principio de la lista se coloca el número de página referenciado más recientemente. Mientras que al final de la lista se coloca el número de página referenciado menos recientemente, es decir, la candidata para ser sustituida. Cada vez que el procesador referencia a una dirección virtual, la lista debe ser reordenada, lo cual consume un tiempo importante. Otras implementaciones del algoritmo LRU requieren el apoyo del hardware. Por ejemplo, el algoritmo LRU se puede implementar utilizando un contador hardware que es incrementado cada vez que se referencia a una dirección virtual. Además en cada entrada de una tabla de páginas hay que añadir un campo adicional para copiar el valor del contador, cada vez que una página es referenciada. Cuando se produce un fallo de página el sistema operativo examina el campo contador de cada entrada de la tabla de páginas y selecciona para ser reemplazada la página cuyo campo contador contiene el menor valor, ya que será la página que lleve más tiempo sin ser referenciada. La implementación del algoritmo LRU con un contador hardware es una solución que introduce bastante sobrecarga, ya que en cada referencia a una dirección virtual hay que realizar un acceso a memoria principal para copiar el valor del contador en el campo de la entrada correspondiente de la tabla de páginas. Además hay que realizar una búsqueda en todas las entradas de la tabla de páginas del campo contador de menor valor. Cuanto mayor sea el número de entradas más tiempo empleará la búsqueda. En resumen, aunque el algoritmo LRU produce muy buenos resultados, en cuanto a la disminución del número de fallos de página, no se suele utilizar porque su implementación introduce una gran sobrecarga . • Ejemplo 7.9
,
Se va a determinar el número de fallos de página que produce la secuencia de referencias del Ejemplo 7.8 cuando se dispone de tres marcos de página y se utiliza el algoritmo de reemplazamiento LRU. Se supone que para implementar el algoritmo LRU se utiliza una lista enlazada que se gestiona como una pila. La primera referencia (i = 3) produce un fallo ya que los marcos están inicialmente vaCÍos. El número de página se coloca en la pila y la página se carga en el marco j . La segunda referencia (i = 1) también produce un fallo de página. El número de la página se coloca en la cima de la pila y la página se carga en el marco k. La tercera referencia (i = 2) produce otro fallo de página. El número de página se coloca en la cim de la pila y la página se carga en el marco l. La cuarta referencia (i = 1) produce un acierto. La pila se reordena para colocar a i = 1 en la cima de la pila. La quinta referencia (i = 6) produce un fallo de página. La página que se sustituye es aquella cu o número aparece en la base de la pila, en este caso i = 3, ya que es la que hace más tiempo que fue
Memoria virtual
277
referenciada. El número de página i = 6 se coloca en la cima de la pila y el número i = 3 desaparece de la pila. La página i = 6 es cargada en el marco que contenía la página i = 3, es decir, en el marco j. 2
3
6
7
9
5
2
3
2
9
3
3
6
2
w~~~~rn~~~~~~~~~~ ~ ~~~~~~~~~~~~~~~~ F
F
F
A
F
F
F
F
F
F
A
F
A
A
F
Pila
F
Marco} Marco k Marco 1
Figura 7.8 - Ejemplo de aplicación del algoritmo de reemplazamiento LRU
Procediendo de forma análoga se obtiene que la secuencia de referencias indicada cuando se dispone de !reS marcos de página y se utiliza el algoritmo de reemplazamiento LRU produce 12 fallos de página, !reS fallos más que el algoritmo óptimo (ver Ejemplo 7.8). En la Figura 7.8 se muestra el contenido de la . ta gestionada como una pila utilizada para implementar el algoritmo LRU y el contenido de los marcos j, k Y l antes y después de cada referencia de la secuencia. Se indica también si dicha referencia provoca un fallo o un acierto.
• 7.4.3.
Algoritmo de reemplazamiento mediante envejecimiento
El algoritmo de reemplazamiento mediante envejecimiento (aging) es una aproximación al algoritmo LRU que introduce una sobrecarga mucho más pequeña ya que se puede implementar de forma bastante eficiente. Básicamente se asigna un registro de desplazamiento software de n bits a cada página cargada en memoria principal. El registro se inicializa a O cuando la página es cargada en memoria. Cada cierto tiempo T preestablecido, el sistema operativo desplaza un bit a la derecha el contenido del registro asignado a cada página cargando el bit referenciada en el bit más significativo de cada registro. Además pone a O el bit referenciada de cada página. La página que se selecciona para ser reemplazada es aquella cuyo registro de desplazamiento contiene el número binario más pequeño, ya que será la página menos usada recientemente. Si existen varias páginas que contienen el mismo valor en su registro, entonces la página que se elecciona para ser reemplazada se selecciona aleatoriamente entre dicho conjunto de páginas.
278
Fundamentos básicos de los sistemas operativos
Nótese que el tamaño n del registro de desplazamiento de una página limita el número de referencias que se pueden registrar. Por ejemplo, si el registro asociado a la pagina i contiene el valor 00000000 no se puede saber si dicha página acaba de ser cargada en memoria, o es que hace un tiempo igualo superior a 8·T ut que fue referenciada .
• Ejemplo 7.10 Supóngase que un sistema operativo utiliza para la sustitución de páginas el algoritmo de reemplazamiento mediante envejecimiento. En la Figura 7.9 se ha representado para distintos instantes de tiempo el estado de los registros de desplazamiento software asignados a las páginas i = O, i = 3, i = 4 e i = 6 de un cierto proceso que se encuentran cargadas en memoria principal. Además se muestra el estado del bit referenciada r de la tabla de páginas del proceso para cada página. r
i=O G
r 1
01100000
r
i=3 G
1
00010000
i=6G
01100000
1 00010000
i=3 0
1
01000000
i=4 G
i=6 G
1
10110000
i=3G
1
10001000
r
I
01000000
r
1- 00010000
i=OG r
r
r
(
i=0 0 1 r
r
i=4 G
r
i=4G I
00100000
r 1
00010000
i=6G I
00001000 ~
to+ T
to+ T + 8 (8
to+ 2T
Tiempo
Figura 7.9 - Ejemplo de aplicación del algoritmo de envejecimiento
Cada cierto tiempo T preestablecido, el sistema operativo desplaza un bit a la derecha el contenido del registro asignado a cada página cargando el bit referenciada en el bit más significativo de cada registro. Además pone a O el bit referenciada de cada página. Supóngase que en algunos instantes durante el intervalo de tiempo [to + T, to + 2T] las páginas i = O e i = 3 han sido referenciadas. Además también se ha referenciado a la página i = 7 lo que ha producido un fallo de página. Como no existen marco libres hay que seleccionar una página para ser reemplazada. La página que se selecciona es aquella cuyo registro de desplazamiento contiene el número binario más pequeño, ya que será la página usada menos recientemente. De acuerdo con el contenido de los registros en el instante to + 2T, la página que será seleccionada para ser reemplazada será la i = 6 cuyo registro asociado contiene el número binario 00001000. Los cuatro ceros a la izquierda indican que la página hace 4T ut que no es referenciada.
•
Memoria virtual
.4.
279
Algoritmo de reemplazamiento FIFO
El algoritmo de reemplazamiento de primero en entrar - primero en salir o algoritmo de reemplazato FIFO (First-In, First-Out), selecciona para ser reemplazada aquella página del conjunto de página didatas a ser reemplazas que lleva más tiempo cargada en memoria principal. Para implementar este algoritmo el sistema operativo debe mantener una lista enlazada o cola FIFO. entrada de la lista contiene el número de página de una página del conjunto de páginas candidatas ser reemplazadas Cuando una página se carga en memoria su número de página se coloca al final de lista. Así, el número de página que se encuentra al principio de la lista indica la página que lleva más po cargada en memoria y será la elegida para ser reemplazada. Cuando una página k que ocupaba marco j es reemplazada por una página i entonces su número se elimina del principio de la lista y se loca al final el número de la página que ha sido cargada en el marco j reemplazando a la página k. Nótese que solo es necesario actualizar esta estructura de datos cuando se carga una página en un co de memoria, por lo que su gestión requiere muy poco tiempo. El algoritmo FIFO es el algoritmo de reeemplazarniento más sencillo de programar y de implementar, lo que produce poca sobrecarga. Sin embargo, su rendimiento (en cuanto al número de fallos de I~. as que produce su utilización) no suele ser muy bueno en general. Además adolece de la anomalía Belady. Básicamente el algoritmo FIFO se basa en la suposición de que una página que lleva mucho tiempo ::argada en memoria puede que ya no sea utilizada por lo que es buena candidata para ser reemplazada. in embargo, esta suposición no siempre es cierta, por ejemplo, en procesos que están ejecutando de dJffila continua un bucle, la página con el código de dicho bucle están siendo continuamente referenciada. bviamente el reemplazar una página que está siendo continuamente usada, producirá un aumento del ero de fallos de página. I
Ejemplo 7.11 Se va a determinar el número de fallos de página que produce la secuencia de referencias del Ejemplo - . cuando se dispone de tres marcos de página y se utiliza el algoritmo de reemplazamiento FIFO. Se pone que para implementar este algoritmo se utiliza una cola FIFO.
= 3) produce un fallo ya que los marcos están inicialmente vacíós. El número página se coloca en la cola FIFO y la página se carga en el marco j. La segunda referencia (i = 1) l31llbién produce un fallo de página. El número de la página se coloca en la cola FIFO y la página se ga en el marco k.
La primera referencia (i
La tercera referencia (i = 2) produce otro fallo de página. El número de página se coloca en la cola FIFO . la página se carga en el marco l. La cuarta referencia (i = 1) produce un acierto, luego la cola no se modifica. La quinta referencia (i = 6) produce un fallo de página. La página que se sustituye es aquella cuyo número aparece al principio de la cola, en este caso i = 3, ya que es la que lleva más tiempo cargada en memoria. El número de página i = 6 se coloca al final de la cola y el número i = 3 se elimina de la cola. La página i = 6 es cargada en el marco que contenía la página i = 3, es decir, en el marco j.
Procediendo de forma análoga, se obtiene que la secuencia de referencias indicada cuando se dispone de
280
Fundamentos básicos de los sistemas operativos
tres marcos de página y se utiliza el algoritmo de reemplazamiento PIFO produce 12 fallos de página. En la Figura 7.10 se muestra el contenido de la cola FIFO, y el contenido de los marcos j, k Y 1 antes ) después de cada referencia de la secuencia. Se indica también si dicha referencia provoca un fallo o un acierto. 2
3
2
3 F
F
2
3
3 F
7
6
3 A
2
5
9
2
3
3
9
3
2
6
6
7
9
5
2
3
3
9
9
9
6
2
2
6
7
9
5
2
2
3
3
3
9
6
2
6
7
9
5
5
2
2
2
3
9
F
F
A
F
A
A
F
Cola FIFO
F
Marco} Marco k Marco 1 Figura 7.10 - Ejemplo de aplicación del algoritmo de reemplazamiento FIFO
Generalmente con el algo~itmo FIFO se suelen producir más fallos de página que con el algoritmo LRl.:. aunque casualmente en este ejemplo concreto con el algoritmo PIFO se producen el mismo número de fallos de páginlque con el algoritmo LRU (ver Ejemplo 7.8).
7.4.5.
Algoritmo de reemplazamiento de la segunda oportunidad (algoritmo del reloj)
Cuando se produce un cambio de proceso, el sistema operativo pone a O el bit referenciada de todas las entradas de la tabla de páginas del proceso que se va a ejecutar. Cada vez que el procesador referen .~ a una dirección virtual contenida en una página i, el bit referenciada de la entrada i de la tabla de págin del proceso en ejecución es activado (r = 1). El algoritmo de reemplazamiento de la segunda oportunidad es una variante del algoritmo FIFO que busca la página que lleva más tiempo cargada en memoria y no ha sido referenciada recientemente. Básicamente este algoritmo consulta el bit referenciada (r) de la página que se encuentra al princi . de la cola FIFO. Si r = O; entonces la página es seleccionada para ser reemplazada y el algoritmo finaliza. Por el contrario, si r = 1 entonces el algoritmo pone el bit a Oy coloca el número de la página al de la cola, es decir, se le da una segunda oportunidad. A continuación pasa a consultar el bit referenci de la página cuyo número ocupa ahora el principio de la cola. En el caso de que todas las páginas de la cola tengan su bit referenciada al, entonces el algoritmo la segunda oportunidad se comportaría como un algoritmo de reemplazamiento de página FIFO, ya uno a uno todos los números de páginas contenidos en la cola serían llevadas al final de la cola y su
Memoria virtual
281
referenciada puesto a O. En consecuencia volvería al principio de la cola el número de la primera página uyo bit referenciada puso a 0, que sería justamente la que hubiese elegido el algoritmo FIFO. El algoritmo de la segunda oportunidad tiene un mejor rendimiento, en cuanto a la disminución del número de fallos de página, que el algoritmo FIFO. Sin embargo, produce una mayor sobrecarga debido a que hay que estar moviendo páginas en la cola .
• Ejemplo 7.12 Supóngase que un determinado sistema operativo asigna cinco marcos de página para la ejecución de un determinado proceso. Además utiliza el algoritmo de reemplazamiento de la segunda oportunidad y para implementarlo utiliza una cola FIFO. En la Figura 7.11 se muestra el estado de la cola para diferentes instantes de tiempo. Además se muestra el estado del bit referenciada r de la tabla de páginas del proceso para cada página de la cola. En un cierto instante de tiempo fa la cola contiene las páginas i = 3 (r = 1), i = 1 (r = 1), i = 2 (r = O), i = 5 (r = O) e i = 6 (r = 1). r = bit refe renciada
Cola de páginas candidatas a ser reemplazadas
6 r=1
3 r=0
r=0
7 r=1
5 r=0
6 r=1
3 r=0
r=0
2 r=0
5 r=0
6 r=1
3 r=0
r=1
2 r=0
5 r=0
6 r=1
r=1
r=1
2 r=0
5 r=0
t3
t4
to
tI
t2
t
•
Tiempo
Fallo de la página i=7 Figura 7.11- Ejemplo de aplicación del algoritmo de la segunda oportunidad
En el instante de tiempo fl una referencia a la página i = 7 produce un fallo de página y hay que eleccionar una página para ser reemplazada. Se examina el bit r de la primera página de la cola. Como la página i = 3 tiene r = 1, significa que hace poco que fue referenciada, por ello no se elige como víctima para ser reemplazada sino que se le da una segunda oportunidad colocándola al final de la cola. u bit r se pone a O. La cola queda entonces en el estado que se muestra en el instante t2 . e repite el procedimiento y se examina el bit r de la primera página de la cola. Como la página i = 1 tiene r = 1, se coloca al final de la cola y su bit r se pone a O. La cola queda entonces en el estado que se muestra en el instante t3. e examina de nuevo el bit r de la primera página de la cola. Como la página i = 2 tiene r = 0, se elige para ser reemplazada. Dicha página desaparece de la cola y el número de página i = 7 se coloca al final
1-
282
Fundamentos básicos de los sistemas operativos
de la misma. El bit referenciada de i = 7 se pone al, ya que acaba de ser referenciada. La cola queda finalmente en el estado que se muestra en el instante t4.
• Una forma de disminuir la sobrecarga es utilizar una lista o cola circular para el conjunto de páginas candidatas a ser reemplazadas. Un puntero apunta al número de la página que lleva más tiempo cargada en memoria principal. Esa es la página cuyo bit referenciada se consultará. Si r = Ola página es seleccionada para ser reemplazada. Por el contrario, si r = 1, entonces se pone su bit referenciada a O y el puntero pasa a apuntar al siguiente número de página de la lista. Cuando el algoritmo de la segunda oportunidad se implementa con una cola circular y un puntero se suele denominar algoritmo del reloj, ya que los números de páginas contenidos en la cola circular se pueden visualizar situadas sobre un círculo como si fueran las horas de un reloj y el puntero se asemejaría a una manecilla. • Ejemplo 7.13 Supóngase que un determinado sistema operativo asigna cinco marcos de página para la ejecución de un determinado proceso. Además utiliza el algoritmo de reemplazamiento del reloj y para implementarlo utiliza una lista enlazada o cola circular de cinco entradas. Cada entrada contiene el número de una página del proceso~argada en memoria. En la Figura 7.12 se muestra el estado de la cola circular para diferentes instantes de tiempo y un puntero a una página de la cola. Además se muestra el estado del bit referenciada r de la tabla de páginas del proceso para cada página de la cola. Supóngase que en el instante de tiempo to una referencia a la página i = 7 produce un fallo de página y hay que seleccionar una página para ser reemplazada. Como la página i = 3 tiene r = 1, significa que hace poco que fue referenciada, su bit r se pone a O y el puntero pasa a apuntar a la siguiente página. La cola circular queda entonces en el estado que se muestra en el instante ti·
Se repite el procedimiento y se examina el bit r de la página ahora apuntada. Como la página i = 1 tiene r = 1, su bit r se pone a O y el puntero pasa a apuntar a la siguiente página. La cola circular queda entonces en el estado que se muestra en el instante t2. A continuación se examina el bit r de la página apuntada. Como la página i = 2 tiene r = O, se elige para ser reemplazada. En la posición de la cola ocupada por i = 2 se coloca i = 7 con su bit r = 1, ya que acaba de ser referenciada. El puntero pasa a apuntar al siguiente número de página de la cola circular. La cola circular queda finalmente en el estado que se muestra en el instante t3.
• El rendimiento del algoritmo del reloj puede mejorarse si además del bit referenciada (bit r) se considera también el bit modificada (bit m). En función del valor de estos dos bits se distinguen cuatro posibles tipos de páginas: • Páginas con r = O Y m = O. No han sido referenciadas recientemente ni modificadas. Son las candidatas ideales para ser reemplazadas.
Memoria virtual
r=1
r=1
0
0 r=1
r=0
r=0
0 p-- 0
0
0
r=0
r=0
r=1
r=0
0
0
0
\ r=1 0
to
ti
r=1
r=1
0
0
r=0
r=0
r=0
r=0
0
0
0~
0
/
r=O
r=O
Q
[] t2
283
r=1
r=0
[2]
0 t3
Figura 7.12 - Ejemplo de aplicación del algoritmo del reloj
• Páginas con r = O Y m = 1. No han sido referenciadas recientemente pero fueron modificadas en el pasado. Si se elige una página de este tipo para ser reemplazada, será necesario realizar una operación de escritura en memoria secundaria para actualizar la copia de la página en el área de intercambio. • Páginas con r = 1 Y m = O. Han sido referenciadas recientemente pero no han sido modificadas. No son buenas candidatas para ser reemplazadas ya que puede que vuelvan a ser referenciadas próximamente. • Páginas con r = 1 y m = 1. Han sido referenciadas recientemente y han sido modificadas. No son buenas candidatas para ser reemplazadas ya que puede que vuelvan a ser referenciadas próximamente y además deben ser salvadas en el área de intercambio.
284
Fundamentos básicos de los sistemas operativos
Buscar en la lista circular una página con r=0 y m=O comenzando desde la posición actual del untero Buscar en la lista circular una página con r=0 y m= 1. Para cada página analizada si r= 1 se configura a r=0
No
Si
Si
Buscar en la lista circular una página con r=0 y m=O
Si
La página encontrada se selecciona para ser reemplazada
Buscar en la lista circular una página con r=0 y m= 1
Figura 7.13 - Algoritmo del reloj mejorado
Memoria virtual
285
El algoritmo del reloj mejorado tiene en cuenta los posibles tipos de página que pueden existir. En primer lugar busca en la lista circular, comenzando por la posición actual del puntero, una página con r = O Y m = O. Si encuentra alguna entonces la página es seleccionada para ser reemplazada y el algoritmo finaliza. Si no encuentra ninguna página con r = O Y m = O, entonces en segundo lugar busca una página on r = O Y m = l. Si encuentra alguna entonces la página es seleccionada para ser reemplazada y el algoritmo finaliza. En esta segunda ronda cada vez que analiza una página, si r = 1 entonces lo pone a O. En el caso de no encontrar ninguna página con r = O Y m = 1, entonces realiza una tercera ronda en busca de una página con r = O Y m = O. Nótese que ahora todas las páginas de la lista tendrán su bit r = O. Si se encuentra alguna entonces la página es seleccionada para ser reemplazada y el algoritmo finaliza. Finalmente si no encuentra ninguna página con r = O Y m = O, entonces realiza una cuarta y última ronda en busca de una página con r = O Y m = 1. Ahora si que encontrará una página con estas características. En la Figura 7.13 se muestra un diagrama que resume el funcionamiento del algoritmo del reloj mejorado . • Ejemplo 7.14 upóngase que un determinado sistema asigna cinco marcos de página para la ejecución de un determinado proceso. Además utiliza el algoritmo de reemplazamiento del reloj mejorado. En la Figura 7.14 se muestra el estado de la cola circular para diferentes instantes de tiempo y un puntero a una página de la cola. También se muestra el estado del bit referenciada r y del bit modificada m de la tabla de páginas del oceso para cada página de la cola. Supóngase que en el instante de tiempo to una referencia a la página ; = 7 produce un fallo de página y hay que seleccionar una página para ser reemplazada. En primer lugar se busca una página con r = O Y m = O. Esta primera ronda de búsqueda finaliza sin éxito en tI . En segundo lugar se procede a buscar una página con r = O Ym = 1, cada vez que se analiza una página su bit r se pone a O. Esta segunda ronda de búsqueda finaliza sin éxito en t2. En tercer lugar se pasa a buscar de nuevo una página con r = O Ym = O. Ahora sí se encuentra una página estas características, la página i = 5. Dicha página es seleccionada en t3 para ser reemplazada por la página i = 7. En la posición de la cola ocupada por i = 2 se coloca i = 7. Además se pone su bit r = 1. El estado del bit m dependerá de si la referencia a la página fue de lectura o de escritura, por ejemplo se \ 1l suponer que fue de lectura luego m = O. En t4 el puntero pasa a apuntar al siguiente número de página la cola circular.
• .4.6.
Algoritmo de reemplazamiento del reloj considerando el conjunto de trabajo
El algoritmo del reloj puede ser mejorado si se considera el conjunto de trabajo de un proceso, al algoritmo de reemplazamiento de página resultante se le conoce comúnmente como algoritmo WSClock [Carr y Hennessey, 1981].
286
Fundamentos básicos de los sistemas operativos
pI m=O
[]
pI m=1
pI m=1
0
0 pI m=l
P-[]
pI m=1
pI m=O
~[]
[]
pI m= l
pI m=l
pI m=l
pI m=l
[3]
0
[3]
0
to
ti
pO m=l
pO m= 1
pO m=1
0
0
0
pO m=O
pO m=1
~[]
[]
pOm=O
pO m=1
0~
PO m=1
pO m=1
pO m=1
[3]
[~l
[3]
[] pO m=1
o
pOm=O
1
0 pO m=1
[3]
pO m=1
[3J
pO m=1
o
Figura 7.14 - Ejemplo de aplicación del algoritmo del reloj mejorado
Para implementar el algoritmo WSClock es necesario que en cada entrada i de la tabla de página de un proceso se mantenga un campo denominado tiempo de último uso que contiene el tiempo virtual de último uso de la página i. Cuando se produce un fallo de página se examina el bi r para saber si la página i fue referenciada en el último intervalo ~ . Si r = 1 entonces se escribe en el campo tiempo de último uso el tiempo virtual del proceso. Nótese que la diferencia entre el tiempo virtual actual y el tiempo de último uso, establece la edad de la página, es decir, el tiempo que hace que la página no fue referenciada Si la edad de la página es menor o igual que ~ entonces la página pertenece al conjunto de trabajo del proceso. Por el contrario, si la edad de la página es mayor que ~ entonces no pertenece al conjunto de trabajo del proceso y es, por lo tanto, una buena candidata para ser seleccionada para ser reemplazada. El algoritmo WSClock mantiene en una cola circular los números de páginas del conjunto de páginas candidatas y un puntero que apunta a un número de página de la cola. Cuando se produce un fallo de página consulta si la página apuntada por el puntero tiene su bit r = l , es decir, si la página ha sido recientemente referenciada. En ese caso la página no es una buena candidata para ser seleccionada, su
Memoria virtual
287
bit r se pone a O y el puntero apunta a la siguiente página de la lista. Si una página tiene el su bit r = O, entonces se consulta su bit m. Si m = O la página no ha sido modificada. En dicho caso se calcula la edad de la página y se compara con la ventana de tiempo 11. Si la edad es mayor que 11, la página no pertenece al conjunto de trabajo del proceso y es seleccionada como página víctima para ser reemplazada. Si la edad es menor o igual que 11, la página pertenece al conjunto de trabajo, por lo que el puntero pasa apuntar a la siguiente página. En el caso de que r = O Y m = 1, significa que la página no ha sido referenciada recientemente en el último intervalo 11 pero fue modificada en algún intervalo anterior, entonces se planifica para ser escrita en el área de intercambio y el puntero pasa apuntar a la siguiente página. El hecho de que una página sea planificada no significa que sea copiada inmediatamente al disco, normalmente se suele esperar a tener un grupo de páginas que tienen que ser copiadas. Además, la primera página planificada no es necesariamente la primera página que es escrita, dependerá de cómo organice el driver del disco la critura del grupo de páginas. Cuando la copia se complete, su bit m se pondrá a O. En definitiva, el algoritmo WSClock busca páginas con r = O, m = O Y que no pertenezcan al onjunto de trabajo del proceso. Si durante una vuelta completa se da la situación de que todas las páginas pertenecen al conjunto de trabajo del proceso, entonces seleccionará la primera página que encuentre con T = O Y m = O, aunque pertenezca al conjunto de trabajo .
• Ejemplo 7.15
,
upóngase que un determinado sistema operativo asigna cinco marcos de página para la ejecución de un determinado proceso. Además utiliza el algoritmo de reemplazamiento WSClock. Supóngase además que el conjunto de trabajo del proceso se forma considerando una ventana de tiempo virtual 11 = 25 ut. En la Figura 7.15 se muestra el estado de la cola circular para diferentes instantes de tiempo y un puntero a una página de la cola. Además se muestra para cada página de la cola el estado de su bit referenciada (r), e su bit modificada (m) y de su campo tiempo virtual de último uso (tus) de sus entradas correspondientes e la tabla de páginas del proceso. upóngase que en el instante de tiempo to, que coincide con el instante de tiempo virtual del proceso = 325 ut, una referencia a la página i = 7 produce un fallo de página y hay que seleccionar una página para ser reemplazada.
1,.
En primer lugar se comprueba el estado del bit r de la página i = 3 apuntada por el puntero. Como T = 1 significa que la página ha sido recientemente referenciada por lo que pone su bit r = O Y mueve el puntero hacia el siguiente número de página de la lista circular (i = 1). La lista queda en el estado que se muestra en el instante tI. Repite la misma comprobación para la página i = 1. En este caso r = O. A continuación consulta el tado del bit modificada. Como m = O pasa a comprobar si la página pertenece al conjunto actual del proceso. Para ello calcula la edad de la página restando al tiempo virtual actual (tv = 325 ut) el tiempo e último uso de la página (tus = 302). Se obtiene que la edad de esta página es de 325 - 302 = 23 ut. Como este valor es inferior a la ventana de tiempo virtual 11 = 25 ut. Esto significa que la página i = 1 pertenece al conjunto de trabajo del proceso. Por lo que el puntero pasa apuntar al siguiente número de página de la lista circular (i = 2). La lista queda en el estado que se muestra en el instante t2.
288
Fundamentos básicos de los sistemas operativos
r=l m=l
r=O m=l
tus=110 r=l m=O tus=280
o
r=l m=l t us=320
~0 [2]r=om=o tus=302
r=o_m=o0 tus-95
o
r=om=o0 tus=95
t)
r=O m=l tus=110
r=O m=l tus=110
0 ')
r=O m=l tus=320
0
/
[2]r=o_m=o tus-302
r=o::=o0 tus-95 ~
r=O m=O tus=280
r=Om=l tus=320
\ [2]
to
r=O m=O tus=280
0
o
r=O m=O tus=280
0
r=Om=O tus=302
r=O m=l tus=320
0~ r=1_m=o0 tus-325
o
0 [2]r=O_m=1 tus-302
t3
Figura 7.15 - Ejemplo de aplicación del algoritmo WSClock para t v
= 325 ut y !::J. = 25 ut
La página i = 2 tiene su bit r = O Y su bit m = O. La edad de esta página es 325 - 95 = 230 ut que es superior a f... = 25 ut. En consecuencia la página no pertenece al conjunto de trabajo del proceso, por 1 que se selecciona para ser reemplazada por la página i = 7. El número de esta página se incluye en lista circular en la posición que ocupaba la página i = 2. Además, en la entrada de la tabla de págin del proceso asociada a la página i = 7 se configura r = 1 y tus = 325 ut. El estado del bit m depende de si la referencia a la página i = 7 fue de lectura o de escritura, se va suponer por ejemplo que fue de lectura luego m = O. Finalmente el puntero pasa apuntar al siguiente número de página de la lista circul (i = 5). La lista queda en el estado que se muestra en el instante t3.
Memoria virtual
7.4.7.
289
Conclusiones sobre los algoritmos de reemplazamiento
El mejor algoritmo realizable de reemplazamiento de páginas es aquél que produce una tasa de fallos cercana a la producido por el algoritmo de reemplazo óptimo y además su implementación produce poca sobrecarga. Teniendo en cuenta estos criterios, los algoritmos de reemplazamiento de página más utilizados en la práctica por los sistemas operativos modernos son [Tanenbaum, 2009]: el algoritmo de envejecimiento y el algoritmo WSClock, ya sea en la forma descrita o con algunas modificaciones. Por último comentar que la estrategia de reemplazo utilizada por el sistema operativo limita los po siles algoritmos de reemplazamiento que se pueden utilizar. Algunos algoritmos, tales como FIFO, LRU y envejecimiento, pueden utilizarse tanto si la estrategia de reemplazo es local o global. Sin embargo, otros como el algoritmo WSCLock, solo se pueden utilizar si la estrategia de reemplazo es local, ya que se basa en el conjunto de trabajo de un determinado proceso.
7.5.
Asignación de memoria principal
La asignación de memoria principal es otra de las tareas fundamentales que debe realizar el sistema operativo para la implementación de la f11e~oria virtual mediante demanda de páginas. Dicha tarea con. te en decidir cuántos marcos de página de la memoria principal reserva para un proceso que se tiene que ejecutar. El número mínimo de marcos que es necesario asignar a un proceso queda definido por el repertorio de instrucciones del computador. Se deben reservar como mínimo los marcos suficientes para contener rodas las páginas a las que puede referencia cualquier instrucción del repertorio de la máquina. Por ejemplo, si en el repertorio de instrucciones de una máquina todas sus instrucciones que hacen referencia memoria poseen dos campos de direcciones de memoria y utilizan direccionamiento directo, entonces para poder ejecutar esta instrucción se requerían tres marcos de memoria: uno para cargar la página que contiene la instrucción, y otros dos para cargar las dos páginas que contienen las referencias a memoria que se realizan en dicha instrucción. Por otro lado el número máximo de marcos que se pueden asignar a un proceso en teoría podrían ser todos aquellos que no estuvieran bloqueados. Sin embargo se estarían perdiendo los beneficios de la multiprogramación. Existen dos posibles estrategias de asignación de memoria principal: • Asignación fija. Consiste en asignar a cada proceso un número prefijado de marcos. Su principal ventaja es que produce poca sobrecarga ya que el sistema operativo solo tiene que decidir cuántos marcos asigna cuando se va a cargar el proceso. Su principal inconveniente es que si el conjunto de trabajo del proceso crece por encima del número de marcos reservados, entonces se produciría sobrepaginación, aunque existieran marcos libres en memoria. Por otro lado, si el conjunto de trabajo disminuye por debajo del número de marcos reservados se estaría desperdiciando memoria. Si el sistema operativo utiliza una estrategia de asignación fija, entonces la estrategia de reemplazo
290
Fundamentos básicos de los sistemas operativos
de páginas tiene que ser local. Si se reemplaza una página, la página víctima se elige de entre e] conjunto de marcos asignados al proceso. • Asignación variable. Consiste en ir variando a lo largo del tiempo de vida del proceso el número de marcos que tiene asignados. Su principal ventaja es su flexibilidad, lo que permite disminuir la sobrepaginación y la memoria desperdiciada. Además, permite que la política de reemplazo pueda ser local o global. El principal inconveniente de la asignación variable es que introduce una mayor sobrecarga ya que el sistema operativo debe decidir continuamente cuantos marcos reserva a cada proceso.
Se puede afirmar de forma general que la estrategia de asignación variable proporciona mejore resultados que la estrategia de asignación fija, por ello es utilizada por un gran número de sistemas operativos. Para implementar la asignación variable el sistema operativo debe utilizar un algoritmo de asignación de marcos. Entre los algoritmos de asignación más conocidos se encuentran los siguientes: • Algoritmo de asignación equitativa. Cada cierto tiempo comprueba el número de procesos e ejecución y asigna a cada proceso el mismo número de marcos. Se trata de un algoritmo ju ya que todos losí procesos son tratados por igual. Sin embargo desperdicia memoria ya que un proceso de pequeño tamaño se le pueden asignar muchos más marcos de los que realmente necesita. • Algoritmo de asignación proporcional. Asigna a cada proceso un número de marcos en proporció a su tamaño o su prioridad, o una combinación de ambos criterios. • Algoritmo de asignación por la frecuencia de fallos de página o algoritmo PFF (Page Fault Frequency). Este algoritmo se basa en el principio de que cuanto mayor sea el número de marc asignados a un proceso menor será su tasa de fallos. Este principio lo cumplen todos aquell algoritmos de reemplazamiento que no sufren la anomalía de Belady. El algoritmo mide la fre cuencia de fallos de página de un proceso, es decir, el número de fallos de página por segundo. la frecuencia de fallos de página se encuentra por encima de un cierto valor límite superior prefijado (ver Figura 7.16), significa que la tasa de fallos es excesivamente alta y entonces asigna m 'marcos al proceso (bien quitándoselos a otros procesos o bien de la lista de marcos libres) para que se reduzca la tasa de fallos. Por otra parte, si la frecuencia de fallos de página se encuen por debajo de un cierto valor límite inferior prefijado, eso significa que el proceso tiene asigna demasiados marcos, por lo que le quita algunos marcos para dárselos a otros procesos que los necesiten. En conclusión, el objetivo del algoritmo PFF es mantener la tasa de fallos de un proce dentro de un determinado rango de valores. En el caso de que uno o varios procesos tengan frecuencia de fallos de página por encima del valor límite, y no existan marcos libres o proceso los que pueda quitar algún marco, entonces se deberán intercambiar al área de intercambio uno varios procesos.
Memoria virtual
Marcos de página asignados Figura 7.16 - Representación gráfica de la frecuencia de fallos de página en función del número de marcos asignados
u Caída de la utilización debida a la sobrepaginación
I Figura 7.17 - Influencia de grado de multiprogramación sobre la utilización del procesador
291
292
Fundamentos básicos de los sistemas operativos
7.6.
Control de carga
En un sistema multiprogramado con memoria virtual mediante demanda de página, el sistema operativo debe controlar el número de procesos que tienen páginas cargadas en la memoria principal, es decir, debe controlar el grado de multiprogramación del sistema GM. Si GM es pequeño la utilización del procesador U puede ser baja. Además, existen más posibilidades de no encontrar procesos en el estado preparado para ejecución, por lo que hay que realizar intercambio de procesos, con la pérdida de tiempo que el intercambio conlleva. En general, interesa tener un GM alto para aumentar U y mejorar el rendimiento del sistema. El máximo valor de la utilización del procesador U rnax se obtiene para un determinado valor óptimo GMopt del grado de multiprogramación. Sin embargo, si se aumenta GM por encima de GMopt , la memoria principal no podrá contener los conjuntos de trabajo de todos los procesos cargados. En consecuencia se producirán fallos de página constantemente, es decir, se producirá sobrepaginación y U disminuirá debido a que los procesos-,se bloquean por que tienen que esperar por la lectura y escritura de páginas a memoria secundaria. En la Figura 7.17 se representa de forma cualitativa la influencia descrita de ~1 sobre U. Si se detecta la existencia de sobrepaginación, la forma de eliminarla es reduciendo GM . Para ello e deben intercambiar a memoria secundaria uno o varios procesos y repartir los marcos que ocupaban entre los procesos que estaban provocando la sobrepaginación. Esta operación deberá repetirse el número de veces que sea necesario hasta que se detenga la sobrepaginación.
7.7.
Copia en la memoria secundaria de páginas modificadas
El sistema operativo debe decidir en qué momento y de qué forma copiará las páginas que han sido modificadas de la memoria principal a la memoria secundaria. A la estrategia o política seguida por el sistema operativo para realizar esta tarea se le conoce comúnmente como política de limpieza (cleaning policy). Las políticas de limpieza más utilizadas son las siguientes: • Limpieza por demanda. La página modificada se escribe en memoria cuando es seleccionada como página víctima para ser reemplazada por otra página que ha producido un fallo de página. Con esta política se aplaza la escritura hasta que es estrictamente necesaria, con lo que se minimiza el número de operaciones de escritura. Sin embargo, cuando se produce un fallo de página hay que realizar dos operaciones de E/S, una de escritura de la página que se va a reemplazar y la otra de lectura de la página que ha producido el fallo de página, con lo que aumenta el tiempo que transcurre hasta que puede reiniciarse la ejecución del proceso que ha producido el fallo de página. El fallo de página se atendería más rápidamente si la página víctima ya hubiera sido copiada en memoria secundaria con anterioridad a que se produjese el fallo de página . • Limpieza por adelantado. Las páginas que han sido modificadas se agrupan en lotes y se planifi cada cierto tiempo su escritura en memoria secundaria antes de que sean elegidas por el algoritmo de reemplazamiento. La principal ventaja de esta política es que permite atender los fallos de
Memoria virtual
293
página más rápidamente al ahorrar, normalmente, la operación de escritura de la página víctima. Su principal inconveniente es que desperdicia tiempo de E/S, ya 'que una página que ha sido modificada una vez y que todavía no ha sido elegida como página víctima, puede volver a ser modificada en un futuro próximo por lo que tendrá que ser copiada varias veces. Una posible solución a las escrituras innecesarias consiste en seleccionar para ser copiadas solamente a aquellas páginas modificadas que son candidatas a ser reemplazadas .
.8.
Consideraciones adicionales sobre la paginación por demanda
Otros aspectos adicionales a considerar a la hora de diseñar la memoria virtual de un sistema con · ación por demanda son: el tamaño de página, la realización de paginación por adelantado y la erva de marcos libres (buffering) .
.8.1.
Tamaño de página,
El tamaño de una página o equivalentemente de un marco de página es de 2n bytes donde n es un tero positivo. En general, el tamaño de una página viene definido por la arquitectura del computador. in embargo, algunos computadores permiten que el sistema operativo pueda configurarlo dentro de un -erto rango de valores. Por ejemplo, el procesador Pentium II permite páginas de 4KiB o de 4 MiB yel esador UltraSPARC permite páginas de 8 KiB, 64 KiB, 512 KiB 04 MiB. A la hora de seleccionar el tamaño de página hay que tener en cuenta los siguientes factores:
• Fragmentación interna. En promedio la fragmentación interna es de media página por proceso. En consecuencia, cuanto mayor sea el tamaño de la página mayor será la fragmentación interna y mayor será el desperdicio de espacio de la memoria principal. • Tamaño de una tabla de páginas. Cada proceso tiene una tabla de páginas cargada en memoria principal que posee un número de entradas igual al número de páginas en que se descompone el espacio de direcciones virtuales del proceso. Cuanto menor sea el tamaño de una página, en más páginas se descompondrá el espacio virtual del proceso, y las tablas de páginas serán de mayor tamaño. Por lo tanto, consumirán más espacio de memoria. Además, si el tamaño de la tabla de páginas aumenta, el tiempo de cambio de proceso será mayor ya que el sistema operativo tendrá que cargar o vaciar más registros si se tiene una MMU con banco de registros o con 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 por lo que la probabilidad de que se produzca un fallo de página será mayor. • Tiempo de uso de E/S. Como se comentará en la sección 8.6.2, el tiempo de una lectura o escritura en un disco se descompone en tiempo de búsqueda, tiempo de latencia rotacional y tiempo de transferencia. De estos tres tiempos el tiempo de transferencia es mucho más pequeño que los tiempos de búsqQeda y de latencia. Por ello se tarda menos tiempo en transferir una página de
294
Fundamentos básicos de los sistemas operativos
tamaño grande que en transferir varias páginas de tamaño más pequeño. Por otra parte las páginas se escriben o se leen en memoria secundaria una a una. Si el tamaño de página es pequeño, el espacio de direcciones virtuales del proceso se descompondrá en un mayor número de páginas por lo que la probabilidad de realizar operaciones de E/S será mayor. En consecuencia el tiempo empleado en E/S por el sistema operativo será mayor, tiempo de E/S que no puede ser utilizado por la ejecución de los procesos. En conclusión, tener una tamaño de página grande disminuye el tamaño de las tablas de páginas, el número de fallos,de página y el tiempo de uso de la E/S. Sin embargo aumenta la fragmentación interna Como el tamaño de la memoria principal de los ordenadores actuales es cada vez mayor, se da meno importancia a la existencia de fragmentación interna. Por ello se tiende a que el tamaño de página sea cada vez mayor.
7.8.2.
Paginación por adelantado
En un sistema con memoria virtual mediante demanda de página cuando comienza la ejecución de un proceso o se continúa con la ejecución de un proceso que estaba bloqueado o intercambiado, se producen un conjunto de fallos de página iniciales hasta que el proceso tiene cargadas las páginas de su conjunto de trabajo. Para evitar este conjunto de fallos iniciales se puede usar la estrategia conocida como paginación por adelantado (prepaging) que consiste en cargar un cierto número de páginas NpA asociadas a un proce o antes de iniciar o continuar con su ejecución. También se puede utilizar paginación por adelantado cada vez que se produce un fallo de página, con el objetivo de evitar futuros fallos de página. El punto clave de esta estrategia radica en cargar las páginas adecuadas para evitar los fallos de página, ya que si se cargan varias páginas que no van a ser referenciadas se estaría perdiendo tiempo e cargar dichas páginas y no se evitarían los fallos . En general si se cargan NpA páginas por adelantado, se referenciarán N pR páginas y no se referenciarán NpA - N pR páginas. Cada página referenciada cargada por adelantado evita un fallo de página La paginación por adelantado se considera que es efectiva si el tiempo ahorrado en tratar NpR fallos de páginas es superior al tiempo empleado en cargar NpA - NpR que no son referenciadas. En caso contrario no compensa utilizar paginación por adelantado. Con respecto a la selección del conjunto de NpA páginas de un proceso que se van cargar por adelantado las opciones más utilizadas son: • Cargar el conjunto de trabajo del proceso, que debe ser mantenido por el sistema operativo. E opción se puede emplear cuando se va a continuar con la ejecución un proceso que fue intercambiado o bloqueado. • Cargar un conjunto de páginas ubicadas de forma contigua en el área de intercambio, ya que e tiempo de una operación de E/S para traer a memoria desde el disco NpA páginas contiguas es más pequeño que el tiempo empleado en realizar NpA operaciones de E/S para traerlas una a una cuando sean referenciadas.
Memoria virtual
295
• Ejemplo 7.16
upóngase que el sistema operativo cuando comienza o continua con la ejecución de un proceso realiza la prepaginación de su conjunto de trabajo en los marcos asignados al proceso. En un cierto instante de tiempo tI un proceso A, cuyo conjunto de trabajo en dicho instante está formado por los números de página 0, 1 Y 3, se bloquea y pasa a ejecutarse otro proceso B. En t2 el proceso A vuelve a ser planificado para ejecución y realiza la siguiente secuencia de referencias de página: 3, 1, 2, 1, 6, 7, 9, 5, 2, 3, 2, 9,3 , . 6 Y 2. Se desea determinar el número de fallos de página producidos por la ejecución del proceso A a partir del instante t2 supuesto que el sistema asigna tres marcos a la ejecución del proceso A y utiliza el goritmo de reemplazamiento FIFO. En primer lugar, antes de continuar con la ejecución del proceso A, el sistema operativo carga en los
cos j, k YI las páginas 0, 1 Y 3, respectivamente, es decir, el conjunto de trabajo del proceso. Además, ooloca en la cola FIFO dichos números de página. Una vez realizada la prepaginación del conjunto de iJabajo, se continúa con la ejecución del proceso. Las dos primeras referencias (i = 3 e i = 1) producen - ndos aciertos. La tercera referencia (i = 2) produce un fallo de página. La página que se sustituye es uella cuyo número aparece al principio de la cola, en este caso i = O. El número de página i = 2 se loca al final de la cola y el número i = se elimina de ella. La página i = 2 es cargada en el marco e contenía la página i = 0, es decir, en el marco j . Examinando de forma análoga cada referencia de cadena se obtiene que se producen 10 fallos de página. En la Figura 7.18 se muestra el contenido de ola FIFO y el contenido de los marcos j , k y I antes y después de cada referencia de la secuencia. Se - .ca también si dicha referencia provoca un fallo o un acierto.
°
3 3
2 3
3
2 3
o
2 3
° °
9
7
6
6
7
5 9
5
2
3
2
2
3
3
3
3
9
9
9
2
6 9
6
2 Cola
2
6
7
9
5
2
2
3
3
3
9
6 FIFO
3
2
6
7
9
5
5
2
2
2
3
9
F
A
F
F
F
A
~~~~~~~~~~~~~~~~ \
o 3
~j
1
1
1
1
6
6
6
5
5
5
5
9
9
9
9
9 Marco k
3
3
3
3
3
7
7
7
2
2
2
2
2
2
6
6
Marco 1
Prepaginación del conjunto de trabajo {O, I ,3}
Figura 7.18 - Ejemplo de aplicación del algoritmo de reemplazamiento FIFO con prepaginación del conjunto de trabajo
•
296
7.8.3.
Fundamentos básicos de los sistemas operativos
Reserva de marcos libres
El tiempo de tratamiento de un fallo de página se reduce si se dispone de un marco libre de memoria principal donde cargar la página referenciada por la dirección virtual que ha producido el fallo de página. Por este motivo el sistema operativo puede mantener una reserva de marcos libres implementada en la forma de una lista de marcos libres. En cada entrada de la lista de marcos libres se mantiene el número de marco j y la página i que contiene actualmente. Nótese que un marco j calificado como libre puede o bien estar vacío o contener una página i que es reemplazable. Si la reserva de marcos libre cae por debajo de un cierto límite se utiliza el algoritmo de reemplazamiento para seleccionar páginas reemplazables, cuyos marcos se agregan a la lista hasta alcanzar un cierto límite máximo. Cuando se necesita un marco libre se coge el situado en la cabecera de la lista de marcos libre . Por otro lado, si se selecciona alguna página i como reemplazable su marco j es colocado al final de lista si la página no ha sido modificada. Además el campo válida de la entrada i de la tabla de páginas correspondiente se desactiva. Si la página ha sido modificada, entonces ingresa en una lista de páginas modificadas que serán escritas por lotes en la memoria secundaria. Una vez escritas pasan a ser colocadas al final de la lista de marcos libres. Mientras la página i siga cargada en el marco j puede ser utilizada. Por este motivo cuando se produ e un fallo de página se comprueba la lista de marcos libres por si alguno de ellos contuviera la página que ha producido el fallo, y de este modo ahorrarse la lectura de la página en memoria secundaria. Así, lista de marcos libres se utiliza cOJIlO una memoria caché software de páginas. En la literatura, a esta estrategia se le denomina en ocasiones como buffering de páginas ya que lista de marcos libres también hace las veces de un buffer de marcos libres. En la sección 8.4 se estudi el concepto de buffering aplicado a la gestión de la E/S.
7.9.
Resumen
La técnica de gestión de memoria conocida como memoria virtual consiste en tener cargada memoria principal solo aquellas partes (páginas o segmentos) del espacio de direcciones lógicas, aho denominadas direcciones virtuales, de un proceso que se van necesitando durante su ejecución. Si ejecutar una instrucción de un proceso se requiere acceder a una dirección virtual que no está carg en memoria principal entonces se produce una excepción que es atendida por el sistema operativo. É trae desde memoria secundaria a memoria principal la parte del proceso a la que hace referencia dic dirección virtual. Posteriormente la instrucción del proceso que produjo la excepción debe ser reinicia Luego esta técnica solo se puede utilizar en arquitecturas que soporten el reinicio de instrucciones. Una de las implementaciones más usadas de la memoria virtual es la técnica de paginación demanda, que se diferencia de la paginación simple en que las páginas de un proceso solo se van cargan en la memoria principal según van siendo referenciadas durante la ejecución del proceso. Cuando referencia una página que no está cargada, el hardware produce una excepción llamadafallo de pági que requiere la búsqueda de un marco libre o reemplazar uno ocupado.
Memoria virtual
297
Para implementar la paginación por demanda el sistema operativo debe mantener varias estructuras datos: la tabla de marcos de página, la lista de marcos libres y las tablas de páginas. Las dos primeras =structuras son similares a las utilizadas en paginación simple. Por su parte las tablas de páginas usadas paginación por demanda contienen más información que las usadas en paginación simple. Como , . o, una entrada de una tabla de páginas asociada a una página i de un proceso, aparte del marco de :ñgina j donde se aloja la página, debe contener un bit denominado presente/ausente o validez/invalidez :Jara indicar si la página está cargada en memoria principal. Dentro de la implementación de memoria virtual mediante demanda de página, una de las tareas . cipales en el tratamiento de un fallo de página es el reemplazamiento de página, que consiste en leccionar una página k cargada en un determinado marco j de memoria principal para ser reemplazado otra página i referenciada por' la dirección virtual que produjo el fallo de página. Para ello, el sistema rativo debe fijar un conjunto de páginas candidatas a ser reemplazadas, también denominado conjunto marcos candidatos, y un algoritmo de reemplazamiento de página. La página elegida se conoce como '~. a víctima. Si el conjunto de páginas candidatas está formado exclusivamente por las páginas cargadas en meria principal en marcos no bloqueados (aquellos cuyo contenido se puede reemplazar) pertenecientes proceso que ha producido el fallo de página, se dice que el sistema operativo utiliza una estrategia reemplazamiento de páginas local. Otra posibilidad es que el conjunto de páginas candidatas a ser ~mplazadas esté formado por todas las páginas cargadas en memoria principal ubicadas en marcos no ueados. En este caso se dice que el sistema operativo utiliza una estrategia de reemplazamiento de 'ginas global. Una vez fijado el conjunto de páginas candidatas a ser reemplazado, se debe seleccionar un algoritmo reemplazamiento que elija la página víctima. Existen diferentes algoritmos de reemplazamiento de ' !!Ína:
• Algoritmo óptimo. Selecciona la página que tardará más en volver a ser referenciada, Este algoritmo no es realizable en la práctica ya que requiere conocer las referencias futuras; pero sirve de modelo con el que comparar a los demás algoritmos. r
• Algoritmo LRU. Selecciona la página que lleva más tiempo sin ser referenciada. Este algoritmo es bastante eficaz. Su principal inconveniente es que su implementación es compleja y produce bastante sobrecarga al sistema. • Algoritmo mediante envejecimiento. Es una aproximación del algoritmo LRU que produce una sobrecarga más pequeña. Consiste en asignar un registro de desplazamiento software a cada página cargada en memoria principal. El registro se inicializa a O cuando la página es cargada en memoria principal. Cada cierto tiempo preestablecido el sistema operativo desplaza un bit a la derecha el contenido del registro asignado a cada página cargando el bit referenciada en el bit más significativo. Además pone a O el bit referenciada de cada página. La página que se selecciona para ser reemplazada es aquella cuyo registro contiene el número binario más pequeño, ya que será la página menos usada recientemente.
298
Fundamentos básicos de los sistemas operativos
• Algoritmo FIFO. Selecciona la página que lleva más tiempo cargada en memoria principal. Es sencillo de implementar pero no resulta muy eficaz. Además sufre de la anomalía de Belady, es decir, puede aumentar el número de fallos de página si aumenta el número de marcos de la memoria principal. • Algoritmo de la segunda oportunidad. Es una mejora del algoritmo FIFO que busca la página que lleva más tiempo cargada en memoria principal sin ser referenciada. Este algoritmo cuando se implementa con una cola circular se denomina algoritmo del reloj. • Algoritmo WSClock. Es una variante del algoritmo del reloj que considera el conjunto de trabaj o del proceso, es decir, el conjunto de páginas distintas que el proceso en ejecución ha referenciado en un determinado intervalo de tiempo virtual.
El mejor algoritmo realizable de reemplazamiento de páginas es aquél que produce una tasa de fallo cercana a la producido por el algoritmo de reemplazo óptimo y además su implementación produce poca sobrecarga. Teniendo en cuenta estos criterios, los algoritmos de reemplazamiento de página más utilizados en la práctica por los sistemas operativos modernos son: el algoritmo de envejecimiento y el algoritmo WSClock. Otra de las tareas para la implementación de la memoria virtual mediante demanda de página es la asignación de memoria principal, que consiste en determinar cuántos marcos de página de memoria principal se reservan para un proceso. El número rninimo necesario queda definido por el repertorio de instrucciones, y coincide con el número de marcos suficientes para contener todas las páginas a la que puede referencia cualquier instrucción. Es recomendable que un proceso tenga asignados el suficiente número de marcos para poder tener cargado en memoria su conjunto de trabajo. En caso contrari estará constantemente provocando fallos de página, es decir, se produce el fenómeno conocido com sobrepaginación o trasiego. Existen dos posibles estrategias de asignación de memoria principal: asignación fija y asignació variable. La asignación fija consiste en asignar a cada proceso un número prefijado de marcos. La asi nación variable consiste en ir variando a lo largo del tiempo de vida del proceso el número de marcos que tiene asignados. Cuando se utiliza la estrategia de asignación variable el sistema operativo debe utilizar algún algoritmo de asignación de marcos, como por ejemplo: el algoritmo de asignación proporcional el algoritmo de asignación equitativa o el algoritmo de asignación por la frecuencia de fallos de página. Por otro lado, en un sistema multiprogramado con memoria virtual mediante demanda de página. el sistema operativo debe controlar el número de procesos que tienen páginas cargadas en la memo . principal, es decir, debe controlar el grado de multiprogramación del sistema. También, el sistema operativo debe decidir cómo y cuándo se copian de memoria principal a cundaria las páginas modificadas, tarea conocida como política de limpieza, destacando entre las utilizadas la limpieza por demanda y la limpieza por adelantado. Otras cuestiones adicionales a considerar a la hora de diseñar la memoria virtual con paginaci ' por demanda son: la selección del tamaño de página, la realización de paginación por adelantado, q consiste en cargar un número de páginas asociadas a un proceso antes de iniciar o continuar con ejecución, y la reserva de marcos libres, que reduce el tiempo de tratamiento de un fallo de página.
Memoria virtual
299
7.10. Lecturas recomendadas Si se desea obtener una explicación adicional de los contenidos tratados en este capítulo se pueden onsultar, por ejemplo: el capítulo 3 de [Tanenbaum, 2009], el capitulo 10 de [Silberschatz et. al, 2002], el capítulo 8 de [Stallings, 2005] y el capítulo 6 de [Milenkovic, 1994].
7.11.
Autoevaluación
7.1. ¿Qué ventajas e incorivenientes presenta el uso de memoria virtual? (Respuesta en sección 7.1) 7.2. ¿Qué requisitos debe reunir el hardware de un computador para poder implementar la memoria virtual? (Respuesta en sección 7.1)
7.3. Describir brevemente el funcionamiento de la técnica de paginación por demanda. (Respuesta en sección 7.2.1)
7.4. ¿Qué tareas debe realizar el sistema operativo cuando usa la técnica de paginación por demanda? (Respuesta en sección 7.2.1) 7.5. Enumerar y describir brevemente los campos que suele contener una entrada de la tabla de páginas de un proceso cuando se utiliza paginación por demanda. (Respuesta en sección 7.2.1) 7.6. ¿Qué elementos hardware son necesarios para lograr el reinicio de instrucciones en la técnica de paginación por demanda? (Respuesta en sección 7.2.2) 7.7. En la técnica de paginación por demanda ¿qué eventos provocan que el sistema operativo tenga que acceder a la memoria secundaria para leer o escribir páginas de procesos? (Respuesta en sección 7.2.3) 7.8. ¿En qué localizaciones de memoria secundaria puede buscar el sistema operativa una página de un proceso? (Respuesta en sección 7.2.3) 7.9. Señala las ventajas e inconvenientes de que el sistema operativo copie por adelantado en el área de intercambio todas las páginas del espacio de direcciones virtuales de un proceso. (Respuesta en sección 7.2.3) .10. ¿Qué significa que un marco esté bloqueado o pinchado? Señalar una situación donde se realice el bloque de marcos. (Respuesta en sección 7.2.4) .11. ¿Qué acciones realiza el sistema operativo para el tratamiento de un fallo de página? (Respuesta en sección 7.2.5) .12. ¿Qué afirma el principio de localidad de referencias? ¿Qué es una zona de localidad? (Respuesta en sección 7.3)
300
Fundamentos básicos de los sistemas operativos
7.13. ¿Qué es el conjunto de trabajo de un proceso? (Respuesta en sección 7.3) 7.14. ¿Qué conclusiones se derivan del estudio del conjunto de trabajo de un proceso? (Respuesta en sección 7.3) 7.15. ¿Qué es la sobrepaginación? (Respuesta en sección 7.3) 7.16. Definir los siguientes términos: a) Página víctima. b) Conjunto de marcos candidatos. (Respuesta en sección 7.4) 7.17. Señalar las diferencias entre las estrategias de reemplazamiento de páginas local y global. (Respuesta en sección 7.4) 7.18. ¿Qué criterios se tienen en cuenta para establecer el rendimiento de un algoritmo de reemplazamiento? (Respuesta en sección 7.4) 7.19. ¿Qué es la anomalía de Belady? (Respuesta en sección 7.4) 7.20. Describir el algoritmo de reemplazamiento óptimo, sus ventajas e inconvenientes. (Respuesta en sección 7.4.1) 7.21. Describir el algoritmo de reemplazamiento LRU, sus ventajas e inconvenientes. (Respuesta en sección 7.4.2) 7.22. Describir dos posibles implementaciones del algoritmo de reemplazamiento LRU. (Respuesta en sección 7.4.2) 7.23. Describir el algoritmo de reemplazamiento mediante envejecimiento. ¿Qué ventaja presenta este algoritmo frente al LRU? (Respuesta en sección 7.4.3) 7.24. Describir el algoritmo de reemplazamiento PIFO, sus ventajas e inconvenientes. (Respuesta en sección 7.4.4) 7.25. Describir el algoritmo de reemplazamiento de la segunda oportunidad. (Respuesta en sección 7.4. 7.26. Describir el algoritmo de reemplazamiento del reloj mejorado. (Respuesta en sección 7.4.5) 7.27. Describir el algoritmo de reemplazamiento WSClock. (Respuesta en sección 7.4.6) 7.28. ¿Qué condiciones debería cumplir un buen algoritmo de reemplazamiento? ¿Cuáles son los algoritmos de reemplazamiento más utilizados en los sistemas operativos modernos? (Respuesta en sección 7.4.7) 7.29. ¿En qué consiste la tarea de asignación de memoria principal que realiza el sistema operativo para implementar la paginación por demanda? (Respuesta en sección 7.5)
Memoria virtual
301
¿Cuál es el número mínimo de marcos que es necesario asignar a un proceso? (Respuesta en sección 7.5) 1. Describir las dos posibles estrategias de asignación de memoria principal en paginación por demanda. (Respuesta en sección 7.5) .32. Enumerar y describir brevemente los algoritmos de asignación de marcos más conocidos que se pueden emplear)en la asignación variable. (Respuesta en sección 7.5) Representar gráficamente la influencia del grado de multiprogramación sobre el porcentaje de uso del procesador. (Respuesta en sección 7.6) ¿Qué es la política de limpieza? (Respuesta en sección 7.7) ~
Señalar las principales ventajas e inconvenientes de las políticas de limpieza por demanda y por adelantado. (Respuesta en sección 7.7) ¿Qué factores hay que tener en cuenta a la hora de seleccionar el tamaño de página? (Respuesta en sección 7.8.1)
7. ¿Cuáles son las ventajas e inconvenientes de tener un tamaño de página grande? (Respuesta en sección 7.8.1) ¿En qué consiste la estrategia conocida como paginación por adelantado? ¿Cuándo se considera que esta estrategia es efectiva? (Respuesta en sección 7.8.2) 9. ¿Qué opciones se emplean en relación a la selección de páginas que van a ser cargadas por adelantado? (Respuesta en sección 7.8.2)
- .40. ¿En qué consiste la reserva de marcos libres y qué ventajas ofrece? (Respuesta en sección 7.8.3)
.12.
Problemas
.1. El sistema operativo en colaboración con el hardware gestiona la memoria principal usando la técnica de demanda de página con un tamaño de página de 4 KiB. La memoria principal del computador tiene una capacidad de 256 MiB con un tamaño de palabra de 16 bits. La unidad direccionable es la palabra. En la Tabla 7.1 se muestra parte del contenido (expresado en decimal) de la tabla de páginas asociada a un proceso A cuyo espacio de direcciones virtuales ocupa 128 MiB. En dicha tabla r es el bit referenciada, m es el bit modificada y v es el bit validez. Estos bits se consideran activados si contienen el valor 1. Se pide: a) Determinar el tamaño en bits de cada uno de los campos en que se descompone una dirección física y una dirección virtual.
302
Fundamentos básicos de los sistemas operativos
Determinar la dirección física expresada en decimal que le corresponde a la siguiente dirección virtual expresada en binario 00000111111000111111 00 1111. c) Determinar el tamaño de la tabla de páginas del proceso A. ¿Qué tanto por ciento de la memoria principal ocuparía dicha tabla?
1;»
Páginai 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010
Marcoj 400 10256 2596 8793 5621 1526 325 9800 3256 7899 3323
r 1 1
O 1 1 O 1 1 1 O O
m 1
O O O 1 O O O O 1 1
v 1 O O O 1 O O 1 1 O O
Tabla 7.1- Parte de la tabla de páginas del proceso A del Problema 7.1
7.2. El sistema operativo en colaboración con el hardware gestiona la memoria principal mediante paginación por demanda. La traducción de direcciones se realiza usando una MMU con banco registros. Se pide: a) Despreciando el tiempo de traducción de direcciones y la existencia de memoria caché, determinar el tiempo medio de despacho de una referencia a memoria, también conocido co tiempo de acceso efectivo a memoria, en función del tiempo medio de acceso a memo . principal t am , el tiempo medio de gestión de un fallo de página tgf y la tasa de fallos de gina p , que se define como el cociente entre el número de fallos de página y el número referencias a memoria que se producen durante un determinado intervalo de observación la actividad de un sistema informático. b) Supuesto que t am = 100 ns y tgf = 25 ms calcular el tiempo medio de despacho de referencia a memoria en los siguientes casos: p = O Y P = 0,001. c) Calcular el factor de retardo R en el acceso a memoria cuando p = 0,001, que se de como. el cociente entre el tiempo medio de despacho de una referencia a memoria cu p = 0,001 Y el tiempo medio de despacho de una referencia a memoria cuando p = O. los datos y resultados del apartado anterior. d) Determinar el valor máximo de la tasa de fallos de página si se desea que el tiempo medio despacho de una referencia a memoria exceda en menos del 10 % el tiempo medio de ac a memoria.
Memoria virtual
303
7.3. El sistema operativo en colaboración con el hardware gestiona la memoria principal mediante paginación por demanda. El tiempo medio de acceso a memoria es de 100 ns. La traducción de direcciones se realiza usando una MMU con banco de registros. El tiempo medio de acceso al banco de registros es despreciable. La atención de un fallo de página emplea en promedio 7 ms si existe disponible un marco vacío o si la página reemplazada no se modifica y 25 ms si la página reemplazada se modifica. La página que se va a reemplazar se modifica el 50 % de las veces. ¿Cuál es la tasa máxima aceptable de fallos de página para obtener un tiempo medio de despacho de una referencia a memoria menor de 210 ns? Despreciar la existencia de memoria caché. 7.4. El sistema operativo en colaboración con el hardware gestiona la memoria principal mediante paginación por demanda. La traducción de direcciones se realiza usando una MMU con un TLB. El tiempo medio de acceso al TLB es despreciable y su tasa de aciertos es del 90 %. Determinar el tiempo medio de despacho de una referencia a memoria si se tienen: una tasa de fallos de página del 10 %, un tiempo medio de acceso a memoria de 100 ns y un tiempo medio de gestión de un fallo de página de 25 ms. Despreciar la existencia de memoria caché. 7.5. Un sistema operativo en colaboración con el hardware gestiona la memoria principal mediante paginación por demanda. El sistema operativo asigna a cada proceso cuatro marcos de memoria para su ejecución y utiliza una estrategia de reemplazamiento local. En un cierto instante de tiempo un proceso A tiene cargadas en memoria sus páginas O, 1,2 Y 3. En la Tabla 7.2 se muestra para cada una de las páginas del proceso A cargada en memoria principal el número de marco j, el tiempo que lleva cargada en memoria te, el tiempo transcurrido desde que fue referenciada por última vez tus, el bit referenciada r y el bit modificada m. En un instante de tiempo posterior se produce un fallo de página durante la ejecución del proceso A. Determinar la página víctima si se utilizan los siguientes algoritmos de reemplazamiento: a) LRU. b) FIFO. c) Segunda oportunidad.
Página i O 1 2 3
Marcoj
te (ut)
150 100 98 175
120 250 150 100
tus (ut) 385 360 375 390
r
m
1 1
O
O
O
1
1
1
Tabla 7.2 - Parte de la tabla de páginas del proceso A del Problema 7.5
7.6. Considérese un sistema informático donde se ejecutan procesos con un tamaño promedio de C x bytes y un tamaño de página Sp bytes. Además cada entrada de una tabla de página requiere E bytes. a) Calcular el número de páginas que necesita cada proceso y el tamaño de su tabla de páginas. b) El espacio de memoria principal desperdiciado por la paginación de un proceso es la suma del tamaño de su tabla de páginas y de la fragmentación interna promedio. Demostrar que el
304
Fundamentos básicos de los sistemas operativos
tamaño óptimo de página que minimiza este espacio desperdiciado es igual a Sp = y2 C x E. ~uponer que C x y Sp son potencias de dos. )
c) Calcular el tamaño de página óptimo supuesto que C x
~l
,
= 1 MiB Y E = 8 bytes.
Capítulo 8
Gestión de la Entrada/ Salida Objetivos docentes Los objetivos docentes de este capítulo son los siguientes: • Conocer cómo gestiona la Entrada/Salida (E/S) un sistema operativo. • Saber cuáles son las diferentes capas del núcleo de un sistema operativo encargadas de la gestión de la E/S, y conocer cuáles son sus características y tareas. • Saber qué son y cómo se implementa el buffering y el spooling. • Conocer los detalles de la gestión de la E/S de algunos dispositivos de E/S básicos .
.1.
Introducción
Existen una gran variedad de dispositivos de E/S: discos y cintas magnéticas, discos ópticos (CD, DVD y Blue-Ray), impresoras, ratones, monitores, teclados, tarjetas de red, módem, etc. Cada tipo de . positivo de E/S posee unas características (finalidad, velocidad de comunicación, capacidad de almanarniento, etc) muy distintas entre sí. De forma general los dispositivos de E/S se pueden clasificar en grandes categorías: dispositivos modo bloque y dispositivos modo carácter. Un dispositivo modo bloque almacena información en bloques de tamaño fijo, normalmente 512 '}'tes o una potencia de dos múltiplo de la anterior, cada uno de los cuales tiene asignado un determinado Úffiero identificador o dirección. Ej'emplos de dispositivos modo bloque son los discos y las unidades cinta. Un dispositivo modo carácter envía o recibe información como una secuencia o flujo lineal de bytes, en ellos la información no se organiza con una estructura concreta por lo que no es direccionable, y en consecuencia no permite la realización de operaciones de búsqueda. Ejemplos de dispositivos modo carácter son las impresoras, el ratón, el teclado y el módem. 305
306
Fundamentos básicos de los sistemas operativos
Otros dispositivos no encajan en ninguna de las dos categorías anteriores, como por ejemplo los relojes hardware. Para que un dispositivo de E/S pueda ser utilizado por el computador se debe conectar a un módulo hardware denominado controlador o adaptador de E/S. Cada controlador permite controlar a uno o varios dispositivos de E/S de un mismo tipo. Por ejemplo, un controlador de discos SCSI puede controlar varios discos duros y unidades de CD-ROM SCSI. Cada controlador de E/S recibe órdenes, direcciones y datos del módulo que le supervisa (procesador, procesador de E/S, controlador de interrupciones, ... ). A su vez el controlador informa al supervisor del estado de los dispositivos de E/S que controla y de los posibles errores que se puedan producir durante la operación de E/S. Además le envía los datos leídos en el dispositivo de E/S. Cada controlador de E/S utiliza un conjunto determinado de señales de control para controlar a los dispositivos de E/S de los que es responsable, y les envía los datos en las operaciones de escritura. Cada controlador posee sus correspondientes registros para el almacenamiento temporal de órdenes y datos. También posee registros para almacenar el estado de los dispositivos que controla. Desde el punto de vista del software es el sistema operativo el encargado de gestionar el acceso de los procesos a los dispositivos de E/S. Para ello el sistema operativo oculta los detalles particulares de cada dispositivo proporcionando una interfaz uniforme de forma que los procesos puedan acceder a los dispositivos de E/S utilizando un conjunto sencillo de instrucciones de lectura y escritura. Ademá el sistema operativo gestiona el buffering, es decir, el almacenamiento temporal de los datos que lo procesos o el propio núcleo desean enviar (operación de escritura) o recibir (operación de lectura) de los dispositivos de E/S. Dicho almacenamiento se realiza en buffers, que son áreas reservadas para este cometido en memoria principal pertenecientes al espacio del núcleo. También el sistema operativo debe regular y asignar el uso de los dispositivos de E/S. En el caso de dispositivos dedicados que solo pueden ser utilizados por un proceso simultáneamente, como por ejemplo una impresora, el control de acceso se realiza mediante la técnica conocida como spooling, que requiere el uso de un proceso demonio. El subsistema de E/S es el componente del sistema operativo que se encarga de la gestión de la E/S. Para comunicarse con el hardware, el subsistema de E/S utiliza un código específico para cada dispositivo denominado driver. de dispositivo. Los drivers son suministrados por los fabricantes de los dispositivo de E/S existiendo una distribución del driver para cada sistema operativo con los que puede funcionar el dispositivo. Cuando un dispositivo termina una operación de E/S, el controlador de E/S avisa al driver correspondiente mediante la generación de una interrupción. Para atender a dicha interrupción el sistema operativo invoca al manejador de la interrupción apropiado. Este capítulo está dedicado a explicar la gestión de la E/S por parte de un sistema operativo. En primer lugar se describe cómo se realizan las peticiones de E/S. En segundo lugar, se explican las características y las tareas que realizan las diferentes capas (subsistema de E/S, drivers de dispositivos y manejadores de interrupciones) en que se estructura el software encargado de E/S del núcleo de un si tema operativo. En tercer lugar se explica qué son y cómo se realiza el buffering y el spooling. La parte final de este capítulo está dedicada a comentar la gestión de la E/S de algunos dispositivos de E/S como los relojes, los disco duros, la pantalla, el teclado y el ratón.
,
1
Gestión de la Entrada/ Salida
.2.
307
Peticiones de E/S
Una operación de E/S sobre un determinado dispositivo de E/S puede ser realizada a petición de un erminado proceso o del propio sistema operativo. Los procesos de usuario o los procesos demonio solicitan al sistema operativo la realización de una ración de E/S invocando a la llamada al sistema apropiada. Recuérdese (ver sección 1.5) que un eso invoca a una llamada al sistema como si se tratase de una función de librería cualquiera. Las ibrerías de llamadas al sistema, como cualquier otra librería, se enlazan por defecto con el código de los programas en tiempo de carga o en tiempo de ejecución. Los procesos deben pasarle la siguiente información a la llamada al sistema que invoquen, ya sea de tura o de escritura: la dirección lógica del dispositivo de E/S sobre la que desea operar (usualmente especificada mediante una ruta simbólica que debe ser traducida por el subsistema de E/S), la dirección , .ca del espacio del proceso donde se almacenarán los datos que se lean en el dispositivo (o donde se al uentran almacenados los datos que se escribirán en el dispositivo) y el número de bytes que se van a oansferir. Aparte de las librerías de llamada al sistema, existen otras librerías de E/S cuyas funciones permiten realizar un cierto procesamiento de los datos antes o después de invocar a la llamada al sistema apropiada, mo por ejemplo, dar formato a una cadena de caracteres para que sea mostrada en la pantalla de una terminada forma, o interpretar una cadena de caracteres introducida por teclado para asociarla a las .ables del proceso adecuadas. Ejemplo 8.1
Considérese un cierto proceso que se ejecuta en un sistema operativo que soporta las especificaciones POSIX. Supóngase que una de las líneas de código en lenguaje e de dicho proceso es: scanf ( 11 %s %d %f 11
I
concepto
I
&ident
I
&coste)
i
La función de librería de E/S scanf invoca a la llamada al sistema read para que lea la entrada
introducida por el usuario de un terminal a través del dispositivo de entrada estándar, por defecto, el lado. Supóngase que la entrada introducida por el usuario es: compra 20 150.23
A continuación la función scanf realiza un procesamiento de los datos, de acuerdo con sus parámetros e entrada. Así la cadena de control %s %d %f le indica que la entrada leída consta de tres partes, separadas por un espacio en blanco. La primera parte es una cadena de caracteres ( %s), la segunda parte es un número entero decimal ( %d) Y la tercera parte un número en coma flotante ( %f) . La función scanf almacena la cadena de caracteres compra en el espacio de memoria del proceso ociado a la variable concepto. Acto seguido almacena 2 O en el espacio de la variable ident. Finalmente, almacena 150.23 en el espacio de la variable coste.
•
308
Fundamentos básicos de los sistemas operativos
El sistema operativo aparte de gestionar las peticiones de E/S de los procesos, también requiere realizar operaciones de E/S durante la realización de alguna de sus tareas administrativas. Por ejemplo, durante la atención de los fallos de página, donde debe escribir en disco la página que es seleccionada para ser reemplaza por la página que originó el fallo de página, la cual debe ser leída en el disco. Otro ejemplo, es el intercambio fuera de memoria principal de las páginas de un proceso bloqueado en espera de que ocurra algún evento. Dichas páginas son escritas en el área de intercambio del disco. Cuando el evento se produzca las páginas del proceso serán leídas en el área de intercambio.
8.3.
Capas del núcleo de un sistema operativo encargadas de la E/S
De forma general, el software del núcleo de un sistema operativo necesario para la gestión de las operaciones de E/S se puede organizar en tres capas: subsistema de E/S, drivers de los dispositivos de E/S y manejadores de las interrupciones. Cada capa posee una interfaz bien definida (en término de funciones y datos que acepta y recibe) para comunicarse con las capas adyacentes. Además cada capa realiza unos servicios determinados. En la Figura 8.1 se muestra un diagrama de las capas de software del núcleo encargadas ' de la E/S y las principales funciones que realiza cada una de ellas, las cuales serán descritas en detalle en las siguientes secciones.
Generación petición de E/S
Retomo de llamada al sistema
---------,
Asignación de dispositivo Bloquear proceso (si procede) Planificación de E/S Asignación buffers Invocar al driver del dispositivo adecuado Comprobación de estado dispositivo Emitir ordenes al controlador del dispositivo
so
Subsistema de E/S
J
i Drivers de dispositivos
I,-----.------r---.. .
t
•Núcleo
Manejadores de las interrupciones
- - - - - - - - {- - - --
Procesar petición de E/S
}
.---__L..-___ Hardware
Transferir datos al espacio del proceso Devolver código de { terminación o de error Comprobación de errores Notificar que la E/S se ha completado
{
Transferir datos al espacio del núcleo ( Avisar para desbloquear al driver
I{ Generar interrupción si E/S completada
Figura 8.1- Capas de software del núcleo de un sistema operativo encargadas de la E/S
)
Gestión de la Entrada/ Salida
.1.
309
Subsistema de E/S
El subsistema de E/S es el componente del sistema operativo que se encarga de efectuar todas aquetareas necesarias para la realización de las operaciones de E/S que son comunes a todos los dispo- 'vos e independientes de los mismos. Es decir, el subsistema de E/S, gestiona la parte independiente 1 dispositivo de todas las operaciones de E/S. Entre las tareas que se encarga de realizar el subsistema de E/S se encuentran las siguientes: • Asignación y liberación de dispositivos dedicados. Algunos dispositivos de E/S, como por ejemplo un disco, pueden ser utilizados simultáneamente por varios procesos. No existe ningún inconveniente en que varios procesos tengan abiertos diferentes archivos de un disco. Sin embargo, otros dispositivos, como una unidad de cinta magnética o una impresora, solo puede ser utilizados simultáneamente por un único proceso. A estos últimos dispositivos se les conoce como dispositivos dedicados. Es responsabilidád del subsistema de E/S determinar si una petición de E/S de un proceso A sobre un dispositivo dedicado puede ser aceptada o debe ser rechazada. Si la petición es aceptada, pero el dispositivo se encuentra ocupado atendiendo la petición de otro proceso B, el subsistema de E/S puede bloquear al proceso A y colocarle en una cola de procesos bloqueados en espera del uso del dispositivo. Cuando el dispositivo se encuentre disponible el primer proceso de la cola será desbloqueado y se le asignará el uso del dispositivo. De esta forma, el proceso A obtendrá cuando le llegue su tumo el uso del dispositivo. • Bloqueo de procesos que solicitan una operación de E/S. Cuando al subsistema de E/S le llega, a través de la interfaz de llamadas al sistema, una petición de un proceso para la realización de una operación de E/S, éste puede pasar o no al estado bloqueado al proceso que solicitó la operación de E/S. La decisión de bloquear un proceso dependerá de si el proceso invocó una llamada al sistema de tipo bloqueante o del tipo y estado del dispositivo involucrado en la operación de E/S solicitada. • Planificación de la E/S. Con el objetivo de disminuir el tiempo de espera promedio para la finalización de una operación de E/S y distribuir equitativamente el uso de los recursos entre todos los procesos; el subsistema de E/S realiza una planificación del uso de los dispositivos de E/S. Para ello puede organizar los procesos en las colas de los dispositivos siguiendo un determinado criterio. En esta planificación el subsistema de E/S también debe tener en cuenta que algunas peticiones de E/S deben ser atendidas con mayor prioridad que otras. Por ejemplo las peticiones de E/S del núcleo del sistema operativo para paginación o intercambio, deben ser atendidas antes que las peticiones de E/S de los procesos de usuario. Además las peticiones de escritura deben ser atendidas antes que las de lectura si no existe espacio disponible en memoria o éste es muy pequeño. • Invocación del driver de dispositivo apropiado. Desde el punto de vista del subsistema de E/S, un dispositivo de E/S es una caja negra que soporta un conjunto estándar de operaciones. En realidad cada dispositivo implementa estas operaciones de forma diferente pero el subsistema de E/S no es consciente de ello. Son los drivers de los dispositivos los que conocen las particularidades propias
310
Fundamentos básicos de los sistemas operativos
de cada dispositivo y permiten manejarlos. Cuando el subsistema de E/S tiene que realizar alguna operación de E/S, a petición de un proceso, debe invocar al driver adecuado. El subsistema de E/S traduce la cadena de caracteres que es utilizada por los procesos para hacer referencia a los dispositivos, en la dirección de inicio del driver correspondiente. Para ello mantiene diferentes tablas que le permiten realizar la correspondencia. Una división bastante usual es disponer de una tabla para dispositivos modo bloque y otra tabla para dispositivos modo carácter.
• Almacenamiento temporal de datos de E/ S o buffering. El subsistema de E/S se encarga de asignar buffers para el almacenamiento temporal de los datos que se leen o se escriben en las operacione de E/S sobre los dispositivos. Un buffer es área en memoria principal que almacena temporalmente datos mientras éstos se transfieren entre un proceso y un dispositivo, o viceversa. La necesidad del buffering y las posibles formas de realizarlo serán explicadas en la sección 8.4. • Proporcionar un tamaño de bloque uniforme a los niveles superiores de software. Así las capas superiores de software pueden trabajar con tamaños de bloques lógicos independientemente del tamaño de los bloques físicos del dispositivo de E/S. • Gestión de los errores producidos en una operación de E/S. El subsistema de E/S se encarga de decidir las acciones a tomar cuando se producen errores en una operación de E/S. Básicamente estos errores se pueden clasificar en dos tipos: errores de programación y errores en el dispositivo. Los errores de programación se producen cuando un proceso solicita una operación de E/S que es imposible de realizar, obviamente debido a un fallo de programación. Por ejemplo, leer en un dispositivo de salida (como una impresora), escribir en un dispositivo de entrada (como un ratón), o hacer referencia a un dispositivo que no existe (como intentar leer de una unidad de cinta en un computador que no tiene conectada ninguna). Cuando se produce un error de este tipo el subsistema de E/S notifica al proceso que solicitó la operación de E/S el error cometido devolviéndole un código de error como resultado de la llamada al sistema. Los errores en el dispositivo se producen cuando un dispositivo está intentando realizar la operación de E/S solicitada. Por ejemplo, un fallo de lectura de un sector de un disco. Cuando produce un error de este tipo, el driver intenta solucionarlo, por ejemplo, intentando leer el sector un número de veces determinado. Algunos errores son transitorios y pueden desaparecer si se repite la operación. Si el error no se soluciona, el driver informará al subsistema de E/S que deberá decidir qué acciones tomar. Acciones típicas son notificar el error al proceso, abortar al proceso o ignorar el error. Por otra parte, el subsistema de E/S debe proporcionar una interfaz para los drivers de los dispositivos. Esta interfaz queda definida por dos tipos de rutinas. El primer tipo está formado por aquellas rutinas que puede invocar el subsistema de E/S para solicitarle algún servicio a un driver, como por ejemplo leer o escribir en el dispositivo. El segundo tipo está formando por las rutinas del núcleo del sistema operati, que un driver puede invocar, como por ejemplo, rutinas para interactuar con el controlador de DMA con el controlador de interrupciones.
Gestión de la Entrada/ Salida
311
En los sistemas operativos modernos, esta interfaz es uniforme [Tanenbaum, 2009], es decir, las fun- es que debe aportar el driver y las funciones del núcleo que puede invocar son las mismas para todos drivers (ver Figura 8.2a). Si la interfaz no fuese uniforme (ver Figura 8.2b) habría que modificar el - ·go del sistema operativo para adaptar el subsistema de E/S a cada nuevo driver. Además el subsisa de E/S tendría la necesidad de conocer qué funciones puede ejecutar cada driver, ya que todos no en ejecutar las mismas. Con este enfoque son los fabricantes de drivers los que se deben adaptar a interfaz uniforme de drivers del subsistema de E/S de cada sistema operativo, y no al revés. El disponer de una interfaz de drivers de dispositivos uniforme permite cargar dinámicamente el - °er de un nuevo dispositivo, sin necesidad de tener que recompilar y enlazar el código del sistema rativo. Antiguamente como el número de dispositivos de E/S no era muy amplio, los sistemas operallevaban integrados los drivers de dichos dispositivos. Si se deseaba añadir un nuevo dispositivo el 3b:ninistrador tenía que recompilar el núcleo del sistema operativo con el código del nuevo driver.
Driver Teclado
Driver Impresora
- - - --
Driver Discos SCSI
(a)
Driver Teclado
Driver Impresora
- - - --
Driver Discos SCSI
(b)
Figura 8.2 - Interfaz de drivers de dispositivo: uniforme (a) y no uniforme (b)
.2.
Drivers de dispositivos de E/S
El funcionamiento y las características de los dispositivos de E/S varían considerablemente de un ositivo a otro. Debido a estas diferencias el sistema operativo necesita disponer de un código especí-co para poder controlar cada dispositivo de E/S. Un driver de dispositivo contiene el código que permite a un sistema operativo controlar un determido tipo de dispositivo de E/S. Así, se requiere un driver para el ratón, otro driver para el teclado, otro ·ver para el disco duro, etc. Los drivers son facilitados por los fabricantes de los dispositivos para cada - tema operativo. Un driver se diseña teniendo en cuenta las especificaciones de la interfaz de drivers 1 subsistema de E/S de cada sistema operativo y las características del dispositivo. Un driver de dispositivo interactúa (ver Figura 8.3) con el subsistema de E/S y con el controlador de E/ S que controla el dispositivo. Un driver suministra al subsistema de E/S el conjunto de funciones que se pueden realizar sobre el dispositivo, tales como lectura o escritura. Además un driver puede invocar a ·ertas rutinas o procedimientos del núcleo. Los procedimientos a los que tiene acceso un driver quedan efinidos por la interfaz de drivers del subsistema de E/S .
312
Fundamentos básicos de los sistemas operativos
l...... Driver Teclado
Subsistema de E/S
....... Driver
----- - ---------
......J Driver Discos SCSI
Figura 8.3 - Interacción de la capa de drivers con el subsistema de E/S y con los controladores de E/S El driver de un dispositivo interactúa con el controlador de E/S, cargando en sus registros diferente órdenes para que las efectúe sobre el dispositivo, comprobando su estado e inicializándolo si es necesario. Cuando el subsistema de E/S invoca a una función de un driver, éste debe realizar un conjunto de acciones. Las acciones que realiza un driver y el orden en que las realiza, pueden variar dependiendo del tipo de dispositivo y sistema operativo. De forma general un driver suele realizar las siguientes accione : 1. Comprobar que los parámetros de la función invocada por el subsistema de E/S son correctos _ que la operación de E/S solicitada se puede realizar. En caso contrario devuelve un error.
2. Traducir los parámetros de dicha función en parámetros específicos del dispositivo. 3. Comprobar si el dispositivo de E/S está ocupado atendiendo alguna petición anterior de E/ S. Si el dispositivo está ocupado entonces coloca la petición en una cola. Si el dispositivo no e tá atendiendo ninguna petición, comprueba si se encuentra preparado, ya que quizás el driver deba activar e inicializar el dispositivo. 4. Generar un conjunto de órdenes para el controlador del dispositivo dependiendo de la petició de E/S solicitada por el subsistema de E/S. Dichas órdenes son cargadas en los registros de controlador. El driver puede comprobar que el controlador acepta una orden y que se encuentra listo para aceptar la siguiente. 5. Una vez trasmitidas todas las órdenes al controlador, el driver debe esperar a que el controlador las ejecute. Si el tiempo de espera estimado es importante, entonces el driver se bloquea usando algún
Gestión de la Entrada/Salida
313
mecanismo de sincronización (semáforos, paso de mensajes, etc) hasta que el controlador finalice. Cuando la operación de E/S se complete el controlador activará una interrupción. El manejador o rutina de servicio de dicha interrupción despertará al driver, si éste se bloqueó. 6. Comprobar que no se han producido errores en la operación de E/S. En dicho caso, quizás transfiera al subsistema de E/S el resultado de la operación de E/S, por ejemplo, un bloque leído en el disco, o puede que simplemente le informe de que la operación se ha completado. Si se ha producido algún error y el driver sabe cómo resolverlo realiza la acción correspondiente. Si no sabe cómo resolverlo o la solución que plantea no surte efecto, entonces informa del error al subsistema de E/S para que tome las medidas que considere oportunas. 7. Examinar la cola de peticiones de E/S pendientes, si existe alguna procede a atenderla. Si la cola está vacía el driver se bloqueará en espera de la llegada de nuevas peticiones. Una característica importante de los drivers es que su código es reentrante, es decir, no se modifica, por lo que es posible ejecutar varias instancias de un mismo driver simultáneamente. Esta característica re ulta muy útil. Por ejemplo, supóngase que una instancia del driver está bloqueada en espera de que se produzca la interrupción del controlador del dispositivo. Simultáneamente otra instancia del mismo driver puede estar procesando otra petición de E/S.
3 .3. Manejadores de las interrupciones Cuando finaliza una operación de E/S en un dispositivo y éste se encuentra preparado para 'procesar , el controlador de E/S que lo supervisa genera una interrupción. En un computador que implemente sistema de interrupciones vectorizadas cada interrupción suministra un número denominado número 1 vector de interrupción que se utiliza como índice en una tabla, denominada tabla de vectores de . errupción. Esta tabla usualmente se encuentra almacenada en las posiciones más bajas de memoria. Cada entrada de esta tabla se denomina vector de interrupción, que entre otras informaciones contiene dirección de comienzo del manejador (handler) de la interrupción. Los manejadores de interrupciones forman parte del núcleo del sistema operativo y son extremadante dependientes del hardware, Por este motivo, a la hora de portar un sistema operativo a una nueva uitectura, esta parte del núcleo siempre tiene que ser reescrita. Con objeto de que el rendimiento del computador sea óptimo, los manipuladores de interrupciones . nen una alta prioridad de ejecución. Además su código suele ser pequeño y rápido de ejecutar, Las iones específicas que realiza un manejador de interrupciones dependen de cada tipo de interrupción. Si el driver del dispositivo se bloqueó en espera de que el controlador de E/S estuviera preparado procesar otra petición de E/S, entonces una acción que debe realizar un manejador de interrupción el desbloqueo del driver del dispositivo mediante el uso del mismo mecanismo de sincronización máforo, mensajes, ...) que utilizó el driver para bloquearse. En el caso de que no se realice DMA un manejador de una interrupción también se puede encargar transferir datos desde un registro del controlador del dispositivo a un buffer en el espacio del núcleo,
314
Fundamentos básicos de los sistemas operativos
o viceversa, en función de si se trata de una operación de lectura o de escritura, respectivamente. Esta función, en ocasiones, la puede realizar el propio driver en lugar del manejador.
8.4. Buffering 8.4.1. Definición En una transferencia de datos se puede distinguir un agente productor, que actúa de emisor de los datos, y un agente consumidor, que recibe los datos. Cuando un proceso solicita una operación de lectura sobre un dispositivo, el proceso actúa de consumidor y el dispositivo de E/S de productor. Por el contrario si un proceso solicita la realización de una operación de escritura entonces el proceso actúa de productor y el dispositivo de E/S de consumidor. Considérese un proceso que desea realizar una operación de lectura en un disco, la cual requiere 1 transferencia de un bloque del disco. Una posible forma de realizar la transferencia (ver Figura 8.4) serí almacenar el bloque directamente en una zona contigua de la región de datos del espacio de direcciones virtuales del proceso. En un sistema con paginación, dicha zona formará parte de una página i de proceso.
Espacio de usuario
Espacio del núcleo
Controlador de E/S Registro
Registro
(a)
(b)
Figura 8.4 - Operación de lectura (a) y operación de escritura (b) con E/S sin buffers
Esta forma de realizar la transferencia de datos obliga al sistema operativo a mantener cargada en marco j de la memoria principal la página i mientras no se complete la operación de E/S, ya que en c contrario se perderían los datos. Para evitar que la página sea reemplazada, el sistema operativo tiene que bloquear el marco. Las operaciones de E/S son lentas, en comparación con los accesos a memo · principal, por lo que el marco quedará bloqueado durante un tiempo importante. Cuanto mayor sea e número de marcos bloqueados, menor será el número de marcos candidatos para ser reemplazado atender un fallo de página, lo que puede conducir a que se produzca sobrepaginación.
Gestión de la Entrada/ Salida
315
Otro problema con la transferencia directa del bloque al espacio de usuario, es la imposibilidad de er intercambiar al proceso hasta que la operación de E/S no se haya completado. Para evitar los problemas que plantea la transferencia directa de datos desde el dispositivo al espacio usuario del proceso los sistemas operativos implementan la técnica conocida como buffering, que iste en almacenar temporalmente en buffers los datos que se transfieren entre un dispositivo y un eso, o viceversa. Un buffer es un área de memoria principal a la que únicamente tiene acceso el ma operativo, es decir, pertenece al espacio del núcleo. El subsistema de E/S es el encargado de asignar buffers para las operaciones de E/S. Por su parte, las =tinas de servicio de las interrupciones o los drivers, se encargan de transferir los datos entre los buffers _ os dispositivos, o viceversa, dependiendo de si se trata de una operación de escritura o de lectura. Otra ventaja del buffering es que permite realizar durante una transferencia de datos una adaptación velocidades entre el agente productor (proceso o dispositivo) y el agente consumidor (dispositivo o so). Asimismo permite lograr una adaptación entre dispositivos que tienen diferentes tamaños de -dad de transferencia de datos.
E'pocio de ",mmo
~
L...-----=¡F-----I
Espacio del núcleo Buffer
Buffer
Buffer
c::::J
Controlador de E/S
c::::J
Registro
Registro
Registro
Registro
Paso 1
Paso 2
Paso 1
Paso 2
(a)
(b)
Figura 8.5 - Operación de lectura (a) y operación de escritura (b) usando buffering con buffer único
4.2.
Estrategias
Existen diferentes estrategias para la realización del buffering, las más usuales son los siguientes: • Buffering con buffer único. En una operación de lectura (ver Figura 8.Sa), los datos son transferidos primero desde el dispositivo al buffer ubicado en el espacio del núcleo. Posteriormente los datos se transfieren desde el buffer al espacio del proceso. En una operación de escritura (ver Figura 8.5b), los datos se transfieren primero desde el espacio del proceso al buffer en el espacio del núcleo. Posteriormente dichos datos son transferidos desde el buffer al dispositivo. Esta estrategia
316
Fundamentos básicos de los sistemas operativos
mejora el rendimiento del sistema en la realización de la E/S en comparación con la estrategia de la transferencia directa. Ahora el proceso puede estar procesando un bloque mientras se está transfiendo el siguiente, o ser intercambiado fuera de memoria principal mientras se completa la operación, sin peligro de que se pierdan los datos. El principal inconveniente que tiene esta estrategia consiste en que si una operación de lectura o escritura requiere el uso del buffer varias veces, el agente productor no podrá producir más datos hasta que el buffer no se vacíe, o el agente consumidor no podrá consumir más datos hasta que el buffer no se llene . • Buffering con dos buffers O buffering doble. En una operación de E/S (ver Figura 8.6 y Figura 8.7) se asignan dos buffers. De esta forma cuando el primer buffer se llena, se pasa inmediatamente a
Espacio de usuario 1
Espacio del núcleo
1
Buffer 1 Buffer 2
Buffer 2
Buffer 1
1
1
1
1I
I
1
1 ••~.~.~.~.~.
Buffer 1 Controlador de E/S
Buffer 2
1~!·!·!·!·!4
Registro
Registro
Registro
Paso 1
Paso 2
Paso 3
Figura 8.6 - Operación de lectura usando buffering doble
Espacio de usuario
f\."""~
":-":-":-":-"::'1
1
1I
1
I
l__ .
I-"",--_I_--,
1
Buffer 2
Buffer 1 Buffer 2
Controlador de E/S
Buffer 2
Buffer 1
Espacio del núcleo
1
1
1 ~~~~~~~~~~~
Buffer 1
1
Registro
Registro
Registro
Paso 1
Paso 2
Paso 3
Figura 8.7 - Operación de escritura usando buffering doble
Gestión de la Entrada/ Salida
317
llenar el segundo buffer. Mientras se llena el segundo buffer, se realiza el vaciado del primer buffer. Cuando el segundo buffer está lleno, si se ha completado el vaciado del primer buffer, se puede comenzar a llenarlo de nuevo. Mientras tanto, se va vaciando el segundo, y así sucesivamente hasta que se completa la operación de E/S. Esta estrategia permite desacoplar al productor y del consumidor, a diferencia de la estrategia del buffer único, donde el productor solo podía actuar cuando finalizaba el consumidor o viceversa. Además permite reducir el tiempo de espera del productor o del consumidor. • Buffering circular. Consiste en utilizar más de dos buffers para una operación de E/S. Primero se llena el primer buffer, luego el segundo, luego el tercero, etc. Cuando se termina de llenar el primer buffer, se pueden comenzar a vaciar. Si se termina de llenar el último buffer del conjunto y el primero ya ha sido vaciado, se puede comenzar otro ciclo. Esta estrategia resulta más adecuada que el buffering doble, cuando un proceso realiza ráfagas rápidas de E/S. Sin embargo debe tenerse en cuenta que por muchos buffers que se utilicen, si el productor es más rápido que el consumidor, llegará un momento en que todos los buffers acabarán llenándose, y el productor tendrá que esperar a que el consumidor termine de vaciar un buffer. Por otra parte, si el consumidor es más rápido que el productor, llegará un momento en que todos los buffers se vacíen, y el consumidor tendrá que esperar a que el productor llene un buffer.
.4.3.
Caché de buffers de bloques de disco
Una operación de lectura o escritura sobre un dispositivo de E/S es mucho más lenta que una opera'ón de lectura o escritura sobre la memoria principal. Por este motivo las operaciones de E/S suelen ser de las principales causas de los cuellos de botella de un sistema informático. Con el fin de reducir al mínimo el número de operaciones de E/S a disco, muchos sistemas operativos - plementan vía software una caché de buffers de bloques de disco. Se trata de un área de memoria principal del espacio del núcleo reservada para almacenar buffers. Dichos buffers contienen los bloques disco que han sido recientemente transferidos. El funcionamiento de esta caché es similar al de una memoria caché hardware. Cuando un proceso solicita la realización de una operación de lectura en disco, el sistema operativo comprueba si los datos solicitados se encuentran almacenados en la caché de buffers. En caso afirmativo, sirve los datos al ceso. Si los datos solicitados no están en la caché de buffers, entonces es necesario realizar una ración de E/S. Cuando el subsistema de E/S asigna buffers para una operación de E/S en disco debe mprobar si existen buffers libres en la caché de buffers. Si no es así, tendrá que utilizar algún algoritmo reeemplazamiento, como los comentados al estudiar paginación (FIFO, LRU, etc), para seleccionar lo buffers cuyo contenido va a ser reemplazado. La implementación de la caché de buffers depende de cada sistema operativo. Una posibilidad es un conjunto de colas hash (ver Apéndice B) basadas en el número de dispositivo yen el número bloque. Los buffers ubicados en una cierta cola de dispersión son enlazados como una lista circular blemente enlazada. Cada cola posee un buffer mudo, a modo de cabecera, para marcar el principio y el final de la lista. Existe también una lista de buffers libres.
318
8.5.
Fundamentos básicos de los sistemas operativos
Spooling
En sistemas multiprogramados el sistema operativo se debe encargar de asignar y controlar el uso de los dispositivos de E/S. En el caso de los dispositivos de E/S dedicados, como es el caso de una impresora, una técnica de control bastante utilizada es el spooling. Esta técnica se implementa con un proceso demonio (ver sección 2.2.3) y con un directorio especial, denominado directorio de spooling o spool. El proceso demonio es el único autorizado para escribir en el dispositivo. Si un proceso de usuario quiere escribir en el dispositivo, debe enviar los archivos que desea escribir al directorio de spooling. El proceso demonio irá mandando al dispositivo de salida uno a uno los archivos que encuentre en este directorio, ya sean de un proceso u otro. Usando spooling se previene que un proceso obtenga el uso de un dispositivo de salida y no lo ceda durante un tiempo excesivo, impidiendo que lo puedan usar otros procesos. El spooling no solo se usa para el control de la impresora, también se puede usar para la transferencia de paquetes de datos por una red.
8.6.
Detalles de la gestión de la E/S de algunos dispositivos
8.6.1.
Relojes
Los circuitos digitales requieren una señal periódica denominada señal de reloj para regir su funcionamiento. Una forma común de generar esta señal es mediante un chip denominado reloj programable. que contiene, entre otros elementos, un contador, un registro y un cristal de cuarzo. El cristal al ser sometido a un determinado voltaje es capaz de generar una señal periódica bastante precisa. El periodo de esta señal puede ser de cientos o miles de megahercios. Esta señal es alimentada al resto de circuitos digitales del computador, así como al propio contador del reloj para que vaya decrementándose, desde un valor inicial preestablecido, hasta llegar al valor cero. Cuando alcanza dicho valor genera una interrupción. Un reloj programable dispone de varios modos de operación, dos de los más utilizados son el modo de disparo único y el modo de onda cuadrada. En el modo de disparo único, cuando el contador alcanza el valor cero y genera la interrupción, se detiene hasta que el contador es inicializado por el software. En el modo de onda cuadrada el reloj se rearma automáticamente. Para ello carga en el contador el valor almacenado en el registro y comienza a decrementarse de nuevo. Se consigue, en este modo, generar interrupciones periódicas. Al tiempo transcurrido entre dos interrupciones del reloj se le denomina tic tk reloj o simplemente tic. Nótese que el valor de un tic se puede ajustar en función del valor que se cargue. por software, en el registro del reloj. La mayoría de computadores soporta un rango flexible de valores de tic. Se denomina frecuencia de la interrupción del reloj o simplemente frecuencia del reloj al núme de tics por segundo. Por ejemplo, para un tic de 10 ms la frecuencia de la interrupción de reloj sería de 100 Hz. Un reloj programable también puede trabajar incrementando el valor del contador, en vez de decrementarlo. Esta propiedad resulta muy útil para mantener el tiempo real, es decir, la fecha y la ho actuales.
Gestión de la Entrada/ Salida
319
Un chip de reloj programable suele contener varios relojes programables independientes. Además computadores disponen de un reloj de reserva alimentado con una pila de botón, para mantener el .empo real, mientras el computador está apagado. Los relojes programables son utilizados por el sistema operativo como ayuda para la realización de ersas tareas: • Planificación de procesos. Si el sistema operativo utiliza el algoritmo de tumo rotatorio para la planificación de procesos debe vigilar que el proceso en ejecución no exceda el cuanto de uso de CPU asignado. Para ello carga en un reloj programable el valor del cuanto y en cada tic de reloj lo va decrementando. Cuando llega a O, significa que se ha terminado el cuanto, entonces se despierta al planificador para que planifique otro proceso. Por otra parte, en aquellos sistemas operativos que utilizan un algoritmo de planificación basado en prioridades, la prioridad de un proceso se puede ir adaptando dinámicamente en función del tiempo de uso del procesador que lleve acumulado. Para registrar dicho tiempo, el sistema operativo puede usar un reloj programable. Durante la ejecución del proceso cada vez que se produce un tic de reloj el reloj se va incrementando. Cuando se bloquea la ejecución del proceso el valor del reloj se almacena en el bloque de control del proceso. • Mantenimiento del tiempo real. Para mantener el tiempo real es necesario fijar un punto de referencia temporal inicial a partir del cual se va llevando la cuenta. En los sistemas operativos basados en UNIX el punto de referencia son las 00:00:00 UCT del 1 de enero de 1970. Mientras que en Windows son las 00:00:00 UCT del 1 de enero de 1980. El contador del reloj de reserva o de cualquier otro .reloj que se destine a llevar el tiempo real mantiene el tiempo transcurrido en tics desde ese punto de referencia inicial. Cada vez que se produce un tic el contador se incrementa. Si el tiempo real se mantiene en tics y se utiliza como punto de referencia alguno de los comentados anteriormente, sería necesario usar un contador de 64 bits. El problema que presenta este tipo de contadores, aparte de su coste, es que cuanto mayor es la capacidad de un contador más lenta es su manipulación. Una posible solución sería mantener en un contador de 32 bits el tiempo real en segundos yen otro contador más pequeño el número de tics del segundo actual. Otra solución sería mantener en alguna posición de memoria el valor del tiempo real en tics calculado en el momento de arranque del computador, y usar un contador de 32 bits para llevar la cuenta del número de tics transcurridos desde dicho momento de arranque. El tiempo real se calcula a partir de la suma del valor del contador y el del tiempo de arranque. • Disparo de alarmas. Los procesos pueden solicitar al sistema operativo mediante alguna llamada al sistema que éste le avise cuando haya transcurrido un determinado intervalo de tiempo. El aviso o alarma se realiza enviando algún mensaje, señal o interrupción. Una forma de implementar una alarma sería usar un reloj programable que se fuese decrementando. Esta solución no sirve si el número de alarmas que hay que disparar es superior al número de relojes programables disponibles. Por ello, el sistema operativo suele gestionar las alarmas manteniendo una lista de alarmas.
320
Fundamentos básicos de los sistemas operativos
Existen varias formas de implementar la lista de alarmas. Una posibilidad es ordenar la lista en función del tiempo que le quede a cada alarma para ser disparada. A dicho tiempo se le conoce como tiempo de disparo . En cada entrada de la lista se almacena la diferencia entre el tiempo de disparo de su alarma asociada y el tiempo de disparo de la alarma de la entrada anterior. De esta forma, el sistema operativo tiene que decrementar en cada tic de reloj únicamente el valor almacenado en la primera entrada, no en las restantes. Cuando dicho valor llega a O dispara 1 alarma al proceso correspondiente y elimina dicha entrada de la lista. • Invocación de tareas periódicas del sistema. Existen diversas tareas del sistema operativo que deben realizarse de forma periódica, como ciertas funciones de administración de memoria y de planificador, la transmisión de paquetes de red, etc. Generalmente el sistema operativo mantiene una lista de tareas periódicas que se implementa y se utiliza de forma similar a la lista de alarmas .
• Ejemplo 8.2 En la Figura 8.8a se muestra una posible implementación de la lista de alarmas en un cierto instante de tiempo. Se observa que dicha lista contiene cuatro entradas asociadas a cuatro peticiones de alarmas realizadas por cuatro procesos que han sido ordenados en función de su tiempo de disparo, es decir. tiempo que resta para que sean disparadas. En cada entrada de la lista se almacena el identificador numérico del proceso (piel) que solicitó la alan:na y la diferencia entre el tiempo de disparo de su alarma asociada y el tiempo de disparo de la alarma de entrada anterior. Cabecera de la lista de alarmas
t=2 pid=1024
Tiempo de disparo:
2
t=1 pid=925
t=4 pid=897
3
7
t~O
pid=963
7
(a) Lista de alarmas en un cierto instante de tiempo
Cabecera de la lista de alarmas
t=1 pid=1024
Tiempo de disparo:
t=1 pid=925
t=4 pid=897
2
6
t=O pid=963 6
(b) Lista de alarmas un tic más tarde
Figura 8.8 - Una posible implementación de la lista de alarmas de un sistema operativo La primera entrada está asociada a una petición de alarma realizada por el proceso con pid ella también se almacena su tiempo de disparo que igual a 2 tics.
= 1024.
La segunda entrada está asociada a una petición de alarma realizada por el proceso con pid = 925. su entrada de la lista se almacena el tiempo que resta para ser invocada con respecto a la entrada ante
Gestión de la Entrada/Salida
321
a asociada al proceso con pid = 1024), en este caso es 1 tic. Su tiempo de disparo es la suma de los tiempos almacenados en esta segunda entrada y en la primera entrada, es decir, 2 + 1 = 3 tics.
La tercera entrada está asociada a una petición de alarma realizada por el proceso con pid = 897. En su entrada de la lista se almacena el tiempo que resta para ser invocada con respecto a la entrada anterior la asociada al proceso con pid = 925), en este caso es 4 tics. Su tiempo de disparo es la suma de los tiempos almacenados en esta tercera entrada y en las dos entradas anteriores, es decir, 2 + 1 + 4 = 7 tics. La cuarta entrada está asociada a una petición de alarma realizada por el proceso con pid = 963 . En su entrada de la lista se almacena el tiempo que resta para ser invocada con respecto a la entrada anterior la asociada al proceso con pid = 897), en este caso es O tics. Su tiempo de disparo es la suma de los 'empos almacenados en esta cuarta entrada y en las tres entradas anteriores, es decir, 2 + 1 + 4 + O = 7 ?or otra parte, en la Figura 8.8b se muestra la lista de alarmas un tic más tarde. Se observa cómo se restado 1 tic a la primera entrada de la lista. En consecuencia, el tiempo de disparo para las cuatro armas se ha reducido también en 1 tic.
•
El sistema operativo utiliza el driver del reloj para interactuar con el reloj del computador. Cuando el oj genera una interrupción, el manipulador de la interrupción desbloquea el driver y éste debe realizar erentes tareas, como por ejemplo: decrementar el cuanto del proceso en ejecución, incrementar el po de uso del procesador de dicho proceso, incrementar el reloj de tiempo real y decrementar el po de disparo en la lista de alarmas (yen la lista de tareas de periódicas). Puesto que a lo largo de un segundo se producen muchas interrupciones de reloj, dichas tareas deben ~arse lo más rápidamente posible para que el rendimiento del sistema no se resienta. Éste es el 'vo por el que las interrupciones de reloj tienen una prioridad muy elevada. Finalmente, cabe señalar que, dependiendo de cada sistema operativo, algunas de las tareas anteriorte comentadas que debe realizar el driver del reloj son delegadas en el manipulador de la interrupción . reloj .
.2. Discos duros ctura física Los discos duros son el principal soporte de la memoria secundaría de un computador debido a po ibilidad de realizar accesos a posiciones aleatorias en un tiempo relativamente pequeño (varios , egundos), ya su alta capacidad de almacenamiento (centenares o miles de gigabytes). Un disco duro (ver Figura 8.9) está formado por varios platos circulares de aleaciones de metal o , 'co que giran, gracias a un motor, a una velocidad de rotación constante (típicamente 5400, 7200 o rpm) en torno a un eje vertical central. Las dos superficies de un plato están recubiertas con un rial magnetizable. Cada superficie se divide en miles de anillos concéntricos denominados pistas. pistas adyacentes se encuentran separadas por un pequeño espacio. su vez las pistas se subdividen en cientos de sectores, donde se almacena la información. Entre dos
322
Fundamentos básicos de los sistemas operativos
Brazo móvil
Cabeza lectura/escritura
! /
Eje de giro
/
Superlicie
[:¿~~=~==~§+- Plato
[:~~~=~~===":::::J
Superficie
..........
.......•
(a)
(b)
Figura 8.9 - Estructura de un disco duro: perfil (a) y vista oblicua de los platos (b)
sectores adyacentes, existe un pequeño hueco de separación. El sector es la unidad básica de transferen . de información de un disco. Sobre cada superficie existe un brazo en cuyo extremo se monta una cabeza de lectura/escritura permite leer O escribir los sectores de las pistas. El brazo puede moverse para posicionar la cabeza a pequeña distancia vertical de la pista donde se encuentra el sector que se desea leer o escribir. Una ,. posicionada sobre la pista adecuada, la cabeza permanece inmóvil mientras la pista gira debajo de ella. Al conjunto formado por las pistas de todas las superficies de todos los platos del disco si das a la misma distancia del eje de rotación del disco se le denomina cilindro. Todas las cabeza lectura/escritura del disco se mueven al unísono hasta posicionarse sobre el cilindro adecuado. Antiguamente los discos se organizaban con un número de sectores constante en todas las pistas. embargo, sus capacidades de almacenamiento no eran muy grandes ya que no explotaban la propiedad que las pistas externas pueden contener un mayor número de sectores que las pistas internas. Nótese la longitud lineal de una pista aumenta conforme mayor es su radio. Los discos modernos aprovec esta propiedad organizando los cilindros en zonas. Dentro de una zona el número de sectores por p. se mantiene constante. Las zonas más internas poseen un menor número de sectores por pista que zonas más externas. Esta organización permite una mayor capacidad de almacenamiento aunque impli un circuitería un poco más compleja. Formateo a bajo nivel del disco Un disco duro recién fabricado no es más que un conjunto de platos bañados con una película de material magnetizable, que no contiene ninguna información. Para poder ser utilizado dentro de un compu-
,~'i iIIl 111111
Gestión de la Entrada/ Salida
323
r el disco duro debe ser sometido primero a unformateo de bajo nivel, también denominado formateo ·co. El formateo de bajo nivel es realizado por el fabricante del disco mediante software y el uso del trolador del disco. Consiste en dividir cada superficie de los platos en pistas y cada pista en sectores. ector es una estructura de datos que consta principalmente de tres elementos: • Cabecera o preámbulo. Contiene, entre otra informaciones, un cierto patrón de bits que permite reconocer al controlador del disco el comienzo del sector, el número de sector y el número de cilindro. • Área de datos. En ella se almacena la información accesible para el sistema operativo y los usuarios. Su tamaño típico suele ser 512 bytes. Aunque es posible usar tamaños de 256 bytes o 1024 bytes. • Código de corrección de errores (Error Correcting Code, ECC). Contiene información que permite al controlador del disco detectar y corregir posibles errores de lectura. El ECC suele ocupar 16 bytes.
La capacidad de un disco formateado a bajo nivel es inferior a la capacidad del disco sin formatear - .do a tres motivos. En primer lugar, existe una pequeña separación física entre pistas contiguas, así o entre sectores contiguos. Estas separaciones físicas ocupan un espacio que no se puede aprovechar almacenar datos. En segundo lugar, debido a que durante el proceso de fabricación y de utilización - un disco pueden aparecer sectores defectuosos, es necesario reservar espacio para sectores de reserva. - o espacio de reserva se puede implementar de dos formas: con sectores de reserva dentro de un - dro y con cilindros completos de reserva. En tercer lugar, debe tenerse en cuenta que la cabecera y ECC de un sector consumen espacio. En general, tras el formateo a bajo nivel la capacidad del disco reducida en tomo a un 20 %. Dentro de una pista los sectores se enumeran comenzando por O. En contra de lo que podría pensarse, umeración no se realiza de forma contigua sino intercalada en función de un determinado factor de alado o entrelazado. El motivo para intercalar la numeración de los sectores es que el controlador disco no es lo suficientemente rápido para poder leer/escribir dos sectores adyacentes en una pista .::; ~ pasan en una sola vuelta por la cabeza de lectura/escritura. Sin embargo, sí que los puede leer/esir en una misma vuelta si los dos sectores que se desean leer/escribir están separados por uno o varios ores que no se van a leer/escribir. Por otra parte, en una determinada zona de cilindros, la numeración de los sectores de una pista está lazada con respecto a la numeración de la pista adyacente. A dicho desplazamiento se le denomina o de cilindro (cylinder skew). Dicho desplazamiento se realiza para mejorar el rendimiento del disco e't'Ítar que tenga que esperar toda una vuelta para poder leer el principio de una pista una vez que ha . ado de leer la pista adyacente. De esta forma se tiene en cuenta que las cabezas de lectura/escritura un disco tardan un cierto tiempo en posicionarse sobre un cilindro contiguo al que se encontraban. Una vez finalizado el formateo físico, la dirección física de un sector queda totalmente definida ificando la tripleta formada por el número de cilindro, el número de cabeza y el número de sector. A forma de localización se le denomina sistema cilindro-cabeza-sector (Cylinder-Head-Sector, CHS).
324
Fundamentos básicos de los sistemas operativos
Los discos duros más modernos soportan el método de acceso conocido como direccionamiento de bloques lógicos (Logical Block Addressing, LBA). Con esta técnica un disco duro se considera un array de bloques lógicos de datos. Cada bloque tiene asignado un número de bloque identificativo o dirección lógica. Cada bloque lógico se hace corresponder con un sector durante el formateo físico. El bloque lógico O se suele hacer corresponder con el sector O de la primera pista del cilindro más externo. Luego se \' realizando la correspondencia de forma secuencial con los restantes sectores de dicha pista. A continuación, por las restantes pistas del cilindro. Después se continúa el proceso por los restantes cilindros has llegar al más interno. En resumen la correspondencia consiste en numerar todos los sectores del disco de forma consecutiva comenzando por O. En los discos duros que soportan LBA, el driver del disco solo debe especificar al controlador de disco el número de bloque lógico que hay que leer o escribir. El controlador del disco se encarga traducir dicho número en una tripleta CHS. En los discos que no soportan LBA, el driver tiene que pasarle en cada operación de E/S una tripleta CHS al controlador del disco.
Particionamiento y formateo a alto nivel del disco Un disco duro formateado a nivel físico, para poder almacenar datos u archivos, debe ser sometí primero a un proceso de particionarniento y a continuación a un formateo a alto nivelo formateo lógi El particionamiento del disco consiste en establecer por software una o más particiones en el di Una partición es un conjunto de cilindros contiguos. Desde un punto de vista lógico cada partición considera como un disco distinto. Por ejemplo, se puede particionar un disco en dos particiones: partición para contener una copia de los archivos del sistema operativo y otra partición para almace los datos de los usuarios. La información sobre el cilindro de comienzo, el tamaño de cada partición y la partición aclÍ\ (aquella que contiene el sistema operativo que se quiere lanzar al arrancar el computador) se mantíe en el propio disco en una estructura denomina tabla de particiones que se localiza al final del registro ,arranque maestro (Master Boot Record, MBR) dentro del sector O del disco. Después de particionar el disco, se debe realizar unformateo de alto nivel de cada partición, tambi denominado formateo lógico, que consiste en establecer el bloque o sector de arranque (si es una partici activa) y las estructuras de datos de un sistema de archivos (lista o mapas de espacio libre y asignado.. un directorio raíz o inicial vacío). Es posible no establecer ningún sistema de archivos en una partición y trabajar con ella sin estruc los datos en archivos y directorios, sino directamente como un array grande de bloques lógicos. A forma de realizar la E/S se le conoce como E/S en bruto. Un ejemplo típico de partición con la que trabaja de esta forma es la dedicada al área o espacio de intercambio en un sistema operativo UNIX Linux. Es más rápido trabajar con una E/S en bruto que buscar la ubicación de un archivo en un siste de archivos, lo cual es una operación que requiere diversos pasos, como se verá en el Capitulo 9. También se coloca en la tabla de particiones información sobre el tipo de sistema de archivo existe) colocado en cada partición. Una vez finalizado el formateo lógico el sistema operativo puede ser arrancado desde el disco d
Gestión de la Entrada/ Salida
325
. cación del disco E tiempo de lectura o escritura de un bloque del disco duro depende, entre otros factores, del tiempo ~icionamiento de la cabeza de lectura/ escritura sobre el comienzo del sector apropiado y del tiempo mmsferencia del bloque desde el disco al controlador o viceversa. El tiempo de posicionamiento, también conocido como tiempo de acceso, es suma de dos compo: el tiempo de búsqueda, que es el tiempo requerido para mover las cabezas hasta el cilindro donde i:Ilcuentra el sector que se desea leer, y la latencia rotacional o retardo rotacional, que es el tiemnecesario para que el principio del sector se posicione por el giro del disco debajo de la cabeza de / escritura. i las peticiones de E/S al disco se planifican adecuadamente es posible reducir el tiempo de búspromedio, mejorando apreciablemente el rendimiento del disco duro. Algunos de los algoritmos lanificación más usados son los siguientes:
• Planificación de primero el del tiempo de búsqueda más corto (Shortest Search Time First, SSTF). De entre la cola de peticiones este algoritmo selecciona para atender aquella petición que requiere un tiempo de búsqueda más pequeño con respecto a la posición actual de las cabezas, es decir, aquella que requiera desplazar las cabezas un menor número de cilindros. Su principal inconveniente es que puede producir inanición de las peticiones de E/S con mayor tiempo de búsqueda si están entrando continuamente peticiones en zonas cercanas a la posición actual de las cabezas . • Planificación LOOK. Las cabezas del disco se desplazan en un cierto sentido y atienden todas las peticiones que encuentran en su camino. Las cabezas cambian de sentido cuando ya no existen más peticiones en el sentido en el que se estaban desplazando. Si una petición llega a la cola de peticiones y se encuentra en un cilindro cercano al cilindro donde están actualmente las cabezas y situado en su sentido de desplazamiento, será atendida rápidamente. Sin embargo, si se encuentra cercana pero en dirección contraria tendrá que esperar a que las cabezas cambien de sentido.
Ejempl? 8.3 idérese un disco duro con 300 cilindros. Supóngase que las cabezas de lectura/escritura del disco se uentran sobre el cilindro 50 y que las peticiones pendientes de E/S, por orden de llegada, requieren r sectores ubicados en los cilindros 25, 103, 84, 215, 67 y 70. Se desea determinar el orden en que atienden las peticiones pendientes de E/S si se utilizan los siguientes algoritmos de planificación: a) TF. b) LOOK, suponer que el sentido de movimiento de las cabezas inicialmente es hacia los cilindros , externos, es decir, en orden de número de cilindro creciente. a) El algoritmo SSTF selecciona para atender, de entre la cola de peticiones, aquella petición que requiere un tiempo de búsqueda más pequeño con respecto a la posición actual de las cabezas, es decir, aquella que requiera desplazar las cabezas un menor número de cilindros. Examinando la cola de peticiones se observa que la petición más cercana a la posición inicial de las cabezas (cilindro 50) es la petición en el cilindro 67, que requiere desplazar las cabezas solamente 17 cilindros. Siguiendo con esta estrategia, el orden de atención de las peticiones es:
326
Fundamentos básicos de los sistemas operativos
67,70,84,103 , 25,215 b) En el algoritmo LOOK las cabezas del disco se desplazan comenzando desde el cilindro inicial (cilindro 50) hacia los cilindros más externqs, es decir, en orden de número de cilindro creciente. Durante su desplazamiento se atienden todas las peticiones que se encuentran en los cilindros por los que se pasa, en este caso se atienden las peticiones, 67, 70, 84, 103 Y 215. Como no existen más peticiones pendientes en el sentido de movimiento, entonces invierte el sentido, es decir, pasa a desplazarse hacia los cilindros más internos. La única petición pendiente que encuentra en este desplazamiento es la petición 25. Luego el orden de atención de las peticiones es: 67,70,84,103,215,25
En los discos modernos la latencia rotacional puede ser tan significativa como el tiempo de búsqueda. Para minimizar la latencia rotacional el algoritmo de planificación tendría que considerar también e número de sector, además del número de cilindro. Nótese que dado un conjunto de peticiones de E/S a disco y conocida la posición actual de las cabezas podría calcularse el orden de atención óptimo de las peticiones de forma que se minimizará el tiempo búsqueda o la latencia rotacional. Sin embargo, el tiempo de cálculo requerido para esta optimización superior al uso de cualquier algoritmo de planificación. Si el controlador del disco solo puede aceptar una única petición simultáneamente, entonces el goritmo de planificación se tiene que implementar por software en el driver del disco, ya que es la de software que conoce los detalles de la estructura interna del disco. Por otro lado, si el controlador disco puede aceptar un lote de peticiones, el algoritmo de planificación se puede implementar dentro propio controlador del disco. En los discos duros modernos que soportan LBA, el algoritmo de planificación del disco se imp menta forzosamente en el controlador del disco ya que es el único que conoce los detalles de la nización física del disco. Recuérdese que en dicho caso el driver del disco trabaja exclusivamente direcciones o número de bloques lógicos. Con dicha información no es posible implementar los alg mos de planificación del disco comentados anteriormente, los cuales necesitaban conocer el número cilindro de cada petición de E/S al disco. Tratamiento de los errores del disco
El error más frecuente que se puede presentar en un disco duro es un error de lectura o esc:rinlQ de un sector debido a que está dañado o defectuoso. En un sector dañado no es posible asegurar contenido que se puede leer de su área de datos es el que realmente se escribió. Los sectores defectuosos se pueden producir tanto durante el proceso de fabricación del disco durante su uso en un computador. El controlador del disco mantiene una lista con los sectores de'tectuc)illlj del disco. Dicha lista se inicializa durante el formateo a bajo nivel del disco.
Gestión de la Entrada/ Salida
327
Para identificar si un sector está dañado, el controlador utiliza el ECC del sector. Cuando el controdor del disco realiza una operación de escritura sobre un sector, el ECC del sector se calcula usando ona función de comprobación de redundancia cíclica (CRC) que usa como parámetro de entrada todos lo bytes almacenados en el área de datos del sector. Cuando se requiere la lectura de dicho sector en a operación de lectura, el controlador calcula de nuevo el ECC y lo compara con el valor de ECC almacenado en el sector. Si el nuevo ECC difiere del almacenado, entonces significa que el sector está -ado. Si en el área de datos solo existen uno o dos bits corrompidos, el controlador es capaz, usando el ECC, de identificarlos y calcular sus valores correctos. En caso contrario, la información contenida en el Zea de datos es irrecuperable. En dicho caso el sector es marcado como dañado por el controlador del . co y es necesario sustituirlo por un sector de reserva. El controlador del disco puede realizar el reemplazamiento del sector defectuoso de dos posibles rmas : • Sustitución directa. Supóngase que el sector j de una pista está dañado, entonces este método consiste en usar un sector de reserva como sector j . El principal atractivo de esta estrategia es que se realiza bastante rápido, simplemente hay que posicionar la cabeza de lectura/escritura sobre el sector de reserva y escribir la cabecera del sector defectuoso al que sustituye. Sin embargo, puede alterar la organización del entrelazado del disco, empeorando el rendimiento del disco . • Desplazamiento de sectores. Consiste en desplazar una posición cada sector situado entre el sector de reserva y el sector defectuoso. El sector de reserva se utiliza para contener al primer sector que se desplaza. La posición ocupada por el último sector desplazado es utilizada para albergar al número de sector que estaba defectuoso. Esta estrategia presenta como ventaja que mantiene la orgaruzación de una pista por lo que no repercute en el rendimiento del disco. Sin embargo, se trata de una operación lenta, ya que múltiples sectores de una pista tienen que ser reescritos de nuevo. ,Ejemplo 8.4 En la Figura 8.lOa se representa la superficie de un disco con una única zona de cuatro pistas y doce
tores por pista con entrelazado simple, uno de los cuales es un sector de reserva (R). Se observa que la pista más externa el sector n° 3 está defectuoso (D). 3 reemplazamiento del sector defectuoso por el método de sustitución directa consistiría en usar el sector reserva como sector n° 3 (ver Figura 8.lOb). La principal ventaja de este método es su rapidez ya que lo hay que escribir un único sector, el sector de reserva. Sin embargo la organización del entrelazado ve alterada con lo que empeora el rendimiento del disco, ya que ahora se emplea más tiempo en leer os los sectores de una pista. Nótese que después que se lea el sector n° 2 hay que esperar más de media elta para poder leer el sector n° 3 y luego más de tres cuartos de vuelta para leer el sector n° 4. 3 reemplazamiento del sector defectuoso por el método del desplazamiento de sectores (ver Figura lOc) consistiría en reescribir el sector de reserva como sector n° 5, el sector n° 5 como sector n° 10, el tor n° 10 como sector nO 4, el sector nO 4 como sector n° 9 y el sector n° 9 como sector n° 3.
-328
Fundamentos básicos de los sistemas operativos
(b)
Figura 8.10 - a) Pista externa de un disco con un sector defectuoso (D) y un sector de reserva (R). b) Reemplazamiento del sector defectuoso mediante sustitución directa. c) Reemplazamiento del sector defectuoso mediante desplazamiento de sectores.
Este método es más lento que el anterior ya que en este caso requiere realizar cinco reescrituras. S' embargo afecta mínimamente a la organización del entrelazado y en consecuencia al rendimiento de disco.
Si el controlador del disco no tiene implementada ninguna técnica de reemplazamiento de sectores defectuoso, entonces ésta debe ser implementada por el sistema operativo, que deberá ir enviando controlador mediante el driver los comandos oportunos. Un disco duro es un dispositivo propenso a fallos ya que está compuesto de partes móviles (plato . brazo) con tolerancias pequeñas (las cabezas se mueven horizontalmente por encima de las superfici de los platos a una altura vertical muy pequeña). Si los fallos son recuperables, como en el caso los sectores defectuosos, el disco se puede seguir utilizando. Pero si el fallo es total, la unidad de ser reemplazada por otra. Por ello es importante mantener copias de seguridad de todos los datos disco. El reemplazamiento del disco duro dañado por un nuevo y el volcado en el mismo de la co de seguridad puede llevar varias horas, durante las cuales el sistema quedaría inutilizable. Esto res inadmisible en algunos sistemas informáticos, como los utilizados en consulta de bases de datos. Para resolver este problema se desarrollaron soluciones que utilizan múltiples discos duros que tra jan en cooperación, pero que desde el punto de vista del sistema operativo constituyen una única uni de almacenamiento. Usando múltiples discos se logra mejorar la confiabilidad, ya que los datos y co de los mismos son distribuidos por los diferentes discos del conjunto de forma que se garantice que caso de que falle un disco sus datos no se pierdan. Por otra parte se mejora el rendimiento de la E/S _ que es posible atender en paralelo las peticiones de E/S independientes, es decir, que residan en diferentes discos duros. También una misma petición de E/S se puede atender en paralelo si el bloque de d que se requiere está distribuido en subbloques entre los diferentes discos del conjunto. La organizaci ' de múltiples discos duros más conocida por ser un estándar de la industria es la denominada como a redundante de discos independientes (Redundant Array of Independent Disks, RAID).
Gestión de la Entrada/Salida
.6.3.
329
Dispositivos de E/S adaptados al usuario
Desde el punto de vista del usuario, en la mayoría de los tipos de computadores, los dispositivos de E/ S más utilizados son la pantalla, el teclado y el ratón. El teclado y el ratón son dispositivos de entrada, mientras que la pantalla es un dispositivo de salida. Aunque se tratan de dispositivos físicamente indeiJendientes, el usuario los emplea de manera cooperativa. Así cuando el usuario pulsa una determinada la (o combinación de teclas), o cuando mueve el ratón o pulsa alguno de sus botones espera que el re ultado de su acción produzca algún cambio en la imagen que se muestra en la pantalla. T
Gestión de la salida por pantalla
La pantalla de un computador es un dispositivo de salida de gráficos de trama (raster graphics) bién denominados gráficos de mapa de bits (bitmap graphics). La salida que se muestra en pantalla una red de puntos denominados píxels. Cada píxel tiene asociado un número binario que indica el lor con que se representa en la pantalla. Por ejemplo, se pueden utilizar un número de 24 bits para presentar cada píxel, dedicando 8 bits para especificar cada intensidad de rojo, verde y azul. Nótese e para evitar el parpadeo de la pantalla en la misma se deben mostrar una imagen de 60 a 100 veces r segundo. La pantalla se suele conectar al computador a través de un adaptador o controlador gráfico que puede estar integrado en la propia placa base del computador, o en una tarjeta que se pincha sobre la misma. Un ptador gráfico tiene, entre otros componentes, una memoria de video (Video RAM, VRAM), que es a memoria RAM en la que se almacena los pixeles de la imagen que se mostrará en la pantalla. Nótese e el tamaño en bits que ocupará una imagen en la VRAM dependerá del número de bits utilizados para presentar a un píxel y del tamaño en píxels de una imagen, es decir, de la resolución de pantalla (1024 x 768, 1280 x 960, 1600 x 1200, etc). La imagen que se carga en la VRAM es generada por paquetes de rutinas de creación y manipulación gráficos independientes del hardware, las cuales son invocadas por las aplicaciones o por el gestor de "entanas de un OUI. Estos paquetes pueden formar parte del núcleo del sistema operativo (Windows) o ser externos al mismo (UNIX y Linux). En el primer caso, dichas rutinas se ejecutarán en modo núcleo, en el segundo caso en modo usuario. Para interactuar con el adaptador gráfico las propias rutinas (Windows) o el subsistema de E/S (UNIX YLinux) invocan al driver del adaptador, que es el que conoce los detalles 1 hardware. Gestión de la entrada del teclado
Un teclado es un dispositivo modo carácter de entrada. Cuando un usuario pulsa una tecla y también uando la libera el hardware del teclado envía el número de tecla a un registro del controlador de E/S que lo supervisa. Éste genera una interrupción que al ser atendida por el manejador correspondiente provoca ue se despierte al driver del teclado. El driver extrae del registro de E/S el número de tecla y lo traduce en un carácter usando unos mapas de teclas, también denominados páginas de códigos, que mantiene el sistema operativo en función del idioma que haya elegido el usuario al instalar el sistema operativo. El número de tecla suele tener un
330
Fundamentos básicos de los sistemas operativos
tamaño de 8 bits, el bit más significativo se utiliza para indicar si la tecla ha sido presionada o no. Nótese que un teclado suele tener entre 99 y 108 teclas, por lo que se necesitan 7 bits para codificar el número de tecla. El driver también tiene que llevar la cuenta de las teclas que han sido pulsadas y todavía siguen presionadas. Con dicha información es capaz de determinar si la última tecla pulsada, hace referencia a un carácter en minúscula o en mayúscula o si es una combinación de teclas del tipo CTRL + [carácter] o ALT + [carácter]. Una vez establecido el carácter o la combinación de teclas pulsadas el driver almacena dicha información en un buffer para que sea leída y procesada por el proceso adecuado.
Gestión de la entrada del ratón
Un ratón es un dispositivo modo carácter de entrada. Cada vez que el usuario desplaza el ratón o pulsa un botón del mismo se transmite un mensaje al registro del controlador de E/S que lo supervisa.. El mensaje suele tener un tamaño de unos 3 bytes y contiene la siguiente información: desplazamiento horizontal (eje x), desplazamiento vertical (eje y) y estado (pulsado o sin pulsar) de los diferentes botones del ratón. Debe tenerse en cuenta que los desplazamientos son relativos, es decir, se miden en relación a la posición del ratón indicada en el último mensaje enviado. Cada vez que recibe un mensaje, el controlador de E/S que supervisa al ratón genera una interrupción. El manejador de la interrupción despierta el driver del ratón que lee el mensaje y lo coloca en una cola de mensajes para que sea leído y procesado por el proceso adecuado.
8.7. Resumen El software del núcleo de un sistema operativo necesario para la gestión de la E/S se organiza en t:rls capas: el subsistema de E/S, los drivers de los dispositivos de E/S Ylos manejadores de las interrupci{}nes. Cada capa realiza unos servicios concretos y posee una interfaz bien definida. El subsistema de E/S gestiona la parte independiente del dispositivo de todas las operaciones de E/ Entre otras realiza las siguientes tareas: asignación y liberación de dispositivos dedicados, bloqueo procesos que solicitan una operación de E/S, planificación de la E/S, invocación del driver de dispo tivo apropiado, almacenamiento temporal de datos de E/S, y gestión de los errores producidos en operación de E/S. Por otro lado, el subsistema de E/S también debe proporcionar una interfaz para los drivers de 1 dispositivos. En general esta interfaz es uniforme, lo que permite cargar dinámicamente el driver de nuevo dispositivo sin tener que recompilar y enlazar el código del sistema operativo. Un driver de dispositivo permite que un sistema operativo controle un determinado tipo de dispositi de E/S. Los drivers de cada dispositivo son diferentes, y son facilitados por los fabricantes para sistema operativo, que tienen en cuenta las especificaciones de la interfaz de drivers del subsiste de E/S y las características del dispositivo. Un driver interactúa con el subsistema de E/S, a quien
Gestión de la Entrada/ Salida
331
suministra el conjunto de funciones a realizar sobre el dispositivo, y con el controlador de E/S, donde carga órdenes a ejecutar sobre el dispositivo. Los manejadores de interrupciones forman parte del núcleo del sistema operativo. Cuando una operación de E/S finaliza, el controlador de E/S que supervisa el dispositivo genera una interrupción cuando encuentra preparado para procesar otra operación. Cada interrupción suministra un número del vector interrupción, que contiene la dirección de comienzo de la rutina de servicio de la interrupción. Con el fin de evitar los problemas derivados de la transferencia directa de datos desde un dispositivo espacio de usuario del proceso o viceversa, los sistemas operativos emplean la técnica de buffering que nsiste en el almacenamiento temporal de los datos en posiciones de memoria del espacio del núcleo nominadas buffers. El subsistema de E/S se encarga de asignar buffers para las operaciones de E/S, : las rutinas de servicio de las interrupciones o los drivers transfieren los datos entre los buffers y los di positivos. Entre las estrategias de buffering más usuales se encuentran: el buffering con buffer único, ~l buffering con dos buffers y el buffering circular. Dado que las operaciones de E/S son una de las principales causas de los cuellos de botella, muchos . temas operativos implementan vía software una caché de buffers de bloques de disco, cuyo funciona.ento es similar al de una caché hardware. También el sistema operativo debe regular y asignar el uso de los dispositivos de E/S. En el caso dispositivos dedicados que solo pueden ser utilizados por un proceso simultáneamente, como por ejemplo una impresora, el control de acceso se realiza mediante la técnica conocida como spooling, que requiere el uso de un proceso demonio. Entre los dispositivos de E/S básicos de un computador se encuentran los relojes, los discos duros, pantalla, el teclado y el ratón. Los relojes son utilizados por el sistema operativo como ayuda para la realización de diversas tareas: lanificación de procesos, mantenimiento del tiempo real, disparo de alarmas e invocación de tareas periódicas del sistema. Durante un segundo se producen muchas interrupciones de reloj, las cuales tienen nivel de prioridad muy elevado para que se puedan ser atendidas lo antes posible y el rendimiento del tema no se resienta. Los discos duros son el principal soporte de la memoria secundaría de un computador debido a la posibilidad de realizar accesos a posiciones aleatorias en un tiempo de relativamente pequeño y a su alta capacidad de almacenamiento. Los discos duros más modernos soportan el método de acceso LBA. Con .. ta técnica un disco duro se considera un array de bloques lógicos de datos. Cada bloque tiene asignado un número de bloque identificativo o dirección lógica. Cada bloque lógico se debe hacer corresponder con un sector durante el formateo físico . El driver del disco solo debe especificar al controlador del disco el número de bloque lógico que hay que leer o escribir. El controlador del disco se encarga de traducir .cho número en una tripleta cilndro-cabeza-sector. Un disco duro para poder almacenar datos u archivos debe ser sometido primero a un proceso de particionamiento y a continuación a un formateo a alto nivelo formateo lógico. El particionamiento del disco consiste en establecer por software una o más particiones en el disco. El formateo de alto nivel de una partición consiste en establecer el bloque o sector de arranque (si es una partición activa) y las tructuras de datos del tipo de sistema de archivos que se van a ubicar en dicha partición.
332
Fundamentos básicos de los sistemas operativos
Si las peticiones de E/S al disco se planifican adecuadamente es posible reducir el tiempo de bú queda promedio, mejorando apreciablemente el rendimiento del disco duro. Algunos de los algoritmo de planificación más usados son SSTF y LOOK. En los discos duros modernos que soportan LBA, el algoritmo de planificación del disco se implementa forzosamente en el controlador del disco ya que es el único que conoce los detalles de la organización física del disco. El error más frecuente que se puede presentar en un disco duro es un error de lectura o escritura de un sector debido a que está dañado o defectuoso. Si el controlador del disco no tiene implementada ninguna técnica de reemplazamiento de sectores defectuoso, ya sea desplazamiento o sustitución directa, entonces éstas deben ser realizadas por el sistema operativo que deberá ir enviando al controlador mediante el driver los comandos oportunos. La pantalla de un computador es un dispositivo de salida de gráficos de trama, también denominad gráficos de mapa de bits. La salida que se muestra en pantalla es una red de puntos denominados píxels.. Cada píxel tiene asociado un número binario que indica el color con que se representa en la pantalla. pantalla se suele conectar al computador a través de un adaptador o controlador gráfico que tiene, entre otros componentes, una memoria de video (VRAM) que es una memoria RAM en la que se almace los pixeles de la imagen que se mostrará en la pantalla. La imagen que se carga en la VRAM es genera por paquetes de rutinas de creación y manipulación de gráficos independientes del hardware que pued formar parte del núcleo del sistema operativo o ser externas al mismo. Tanto el teclado como el ratón son dispositivos modo carácter de entrada. Cuando un usuario p una tecla, y también cuando la libera, el hardware del teclado envía el número de tecla a un registro de controlador de E/S que lo supervisa. Éste genera una interrupción que al ser atendida por el manejad correspondiente provoca que se despierte al driver del teclado. El driver extrae del registro de E /S e número de tecla, lo traduce en un carácter y lo almacena en un buffer. Asimismo cada vez que el usu desplaza el ratón o pulsa un botón del mismo se transmite un mensaje al registro del controlador de E que lo supervisa. Cada vez que recibe un mensaje, el controlador de E/S genera una interrupción. manejador de la interrupción despierta el driver del ratón que lee el mensaje y lo coloca en una cola mensajes.
8.8.
Lecturas recomendadas
Si se desea obtener una explicación adicional de los contenidos tratados en este capítulo se pu consultar, por ejemplo: el capítulo 5 de [Tanenbaum, 2009], los capítulos 12 y 13 de [Silberschatz et. 2002], el capítulo 8 de [Stallings, 2005] y el capítulo 5 de [Nutt, 2006].
8.9.
Autoevaluación
8.1. Explicar qué es un dispositivo modo bloque y un dispositivo modo carácter. Señalar algunos eje plos de cada tipo. (Respuesta en sección 8.1) 8.2. ¿Qué información debe pasar un proceso a la llamada al sistema que invoque para solicitar
Gestión de la Entrada/ Salida
333
petición de E/S? (Respuesta en sección 8.2) 8.3. Señalar dos ejemplos donde el propio sistema operativo realiza operaciones de E/S dutante la realización de alguna de sus tareas administrativas. (Respuesta en sección 8.2) 8.4. ¿Cuáles son las capas de software de E/S del núcleo de un sistema operativo? (Respuesta en sección 8.3) 8.5. ¿Qué función tiene el subsistema de E/S? (Respuesta en sección 8.3 .1) 8.6. Enumerar las tareas del subsistema de E/S. (Respuesta en sección 8.3.1) .7. ¿Qué es un driver de dispositivo? (Respuesta en sección 8.3 .2) .8. ¿Qué significa y qué ventajas presenta el hecho de que la interfaz para los drivers de los dispositivos de un subsistema de E/S sea uniforme? (Respuesta en sección 8.3 .2) .9. ¿Con qué elementos interactúa el driver de un dispositivo? (Respuesta en sección 8.3.2) 10. ¿Qué acciones realiza un driver? (Respuesta en sección 8.3.2) 11. Explicar las características y el funcionamiento de los manejadores de interrupciones. (Respuesta en sección 8.3.3) 12. ¿Qué es el buffering? ¿Qué problemas resuelve? (Respuesta en sección 8.4.1) 13. Enumerar y explicar brevemente las diferentes estrategias para la realización del buffering. (Respuesta en sección 8.4.2) 14. ¿En qué consiste una caché de buffers de bloques de disco? (Respuesta en sección 8.4.3) 5. ¿Qué es el spooling y cómo se implementa? (Respuesta en sección 8.5) 16. ¿En qué casos se usa la técnica de spooling? (Respuesta en sección 8.5) 7. Describe las partes que componen un reloj programable y su funcionamiento. (Respuesta en sección 8.6.1 ) 18. ¿Qué es un tic de reloj? (Respuesta en sección 8.6.1) Enumerar y explicar brevemente las tareas del sistema operativo en las que utiliza relojes programables. (Respuesta en sección 8.6.1) Explicar la interacción entre el sistema operativo y el reloj del computador. (Respuesta en sección 8.6.1) 1. ¿En qué consiste el formateo a bajo nivelo formateo físico de un disco duro? (Respuesta en sección 8.6.2)
334
Fundamentos básicos de los sistemas operativos
8.22. Describir los elementos en qué se descompone un sector de un disco duro. (Respuesta en sección 8.6.2) 8.23. ¿En qué consiste el método de acceso LBA? (Respuesta en sección 8.6.2) 8.24. ¿En qué consiste el particionamiento de un disco duro? (Respuesta en sección 8.6.2) 8.25. ¿En qué consiste el formateo a alto nivel lógico de un disco duro? (Respuesta en sección 8.6.2) 8.26. ¿Bajo que condiciones el algoritmo de planificación de peticiones de E/S a disco se implemen en el driver del disco? (Respuesta en sección 8.6.2) 8.27. Señalar dos técnicas para realizar el reemplazamiento de un sector defectuoso en un disco duro ¿En qué caso el sistema operativo se debe encargar de realizar esta tarea? (Respuesta en sección 8.6.2) 8.28. Explicar la gestión de la salida por pantalla. (Respuesta en sección 8.6.3) 8.29. Explicar la gestión de la entrada del teclado. (Respuesta en sección 8.6.3) 8.30. Explicar la gestión de la entrada del ratón. (Respuesta en sección 8.6.3)
8.10.
Problemas
8.1. Señalar qué capa de software para E/S del núcleo de un sistema operativo realiza cada una de siguientes tareas: a) Avisar para desbloquear un driver. b) Escribir comandos en los registros del controlador hardware del dispositivo. c) Asignación de dispositivos. d) Convertir enteros binarios en caracteres ASCII para ser impresos. 8.2. Un usuario invoca una llamada al sistema para enviar unos paquetes de datos a otro usuario través de una red de área local, tanto el emisor como el receptor disponen de un computador las mismas características. El sistema operativo primero copia los datos en un buffer del núcleo . después los copia en el adaptador de red. Desde allí son enviados por la red a una velocidad VR bit/s. El paquete está disponible en el adaptador de red del computador receptor Tn s desp de haber llegado el último bit del paquete. Cuando el paquete ya está disponible el controla del adaptador de red envía una interrupción a la CPU. Cuando se trata la interrupción el paq recién llegado es copiado en un buffer del núcleo para inspeccionarlo. Una vez que ha descubi para qué usuario es el paquete, el sistema operativo del computador receptor lo copia al espacio usuario. Determinar la velocidad máxima a la que un proceso puede enviar datos a otro. Su que los paquetes. son de Sp bytes, que el tratamiento de una interrupción requiere TI s y que
Gestión de la Entrada / Salida
335
tarda TB S en copiar un byte en memoria principal ya sea desde otra posición de memoria o desde (o hacia) el adaptador de red. Suponer además que el emisor se bloquea hasta que el receptor le envía un mensaje de agradecimiento de respuesta cuyo tiempo de envío y recepción se puede considerar despreciable. Despreciar también el tiempo de cambio de proceso y de planificación de los procesos emisor y receptor, y el tiempo de inspección de un paquete. 8.3. Un sistema operativo implementa la caché de buffers de bloques de disco con cuatro colas hash (j = O, 1, 2 Y 3). Los buffers ubicados en una cierta cola hash son enlazados como una lista circular doblemente enlazada. Cada cola posee un buffer mudo, a modo de cabecera, para marcar el principio y el final de la lista. Los bloques se ubican en las colas de acuerdo a la siguiente función hash j = NBD % Ne , donde N BD es el número de bloque de disco y Ne es el número de colas hash. En un cierto instante de tiempo T los bloques de disco contenidos en la caché son 50, 17,4,64,10, 35,99,98,97,28, 5 y 3. Dibujar un esquema adecuadamente rotulado del estado de la caché en el instante T. 8.4. Un computador tiene un disco duro con 8 cabezas de lectura/escritura, 512 cilindros, 128 sectores por pista y 256 bytes por sector. El controlador del disco en una operación de lectura (o escritura) lee (o escribe) el contenido de toda una pista. Por su parte el sistema operativo trabaja con un tamaño de bloque de 4 KiB. a) Calcular la capacidad total del disco. b) ¿Cuántos sectores de disco ocupará un bloque? c) ¿Cuántos bloques lee el controlador del disco en una operación de lectura? d) ¿Cuántos bits se necesitan para establecer la dirección de un bloque? e) Determinar los cálculos que debe utilizar el controlador del disco para traducir una dirección de bloque en la tripleta (cilindro, cabeza, sector) asociada al primer sector del bloque. Suponer que los bloques se asignan comenzando desde el cilindro más externo (cilindro n° O) hacía el más interno (cilindro n° 511). Además dentro de un cilindro los bloques se asignan comenzando por la superficie a la que se accede con la cabeza n° O, y desde el sector n° O de cada pista. f) Obtener la tripleta (cilindro, cabeza, sector) del primer sector del bloque 10002 .
.5. La frecuencia de la interrupción del reloj de un computador es de 50 Hz. El sistema operativo emplea 5 Jls en el tratamiento de las interrupciones de reloj , incluyendo el almacenamiento del contexto del proceso en ejecución. Determinar el porcentaje de uso del procesador que requiere el tratamiento de una interrupción de reloj . .6. Un adaptador gráfico tiene una VRAM de 256 MiB y soporta una resolución de pantalla máxima de 1360 x 768 con color de 32 bits. a) Calcular el tamaño en MiB de una imagen de la pantalla. b) Calcular el número de imágenes de pantalla que pueden almacenarse en la VRAM. c) Si la pantalla se reescribe 75 veces por segundo determinar la velocidad de transferencia de datos de la VRAM.
Capítulo 9
Gestión de archivos bjetivos docentes Los objetivos docentes de este capítulo son los siguientes: • Conocer las posibles operaciones y características (tipos, atributos, estructuras internas y métodos de acceso) de los archivos soportadas por un sistema operativo. • Conocer las principales estructuras de los directorios y las operaciones básicas sobre los mismos soportadas por un sistema operativo. • Saber qué es un sistema de archivos y cuál es su estructura general. • Saber qué es y cómo se implementa el montaje de un sistema de ficheros . • Conocer cómo se puede implementar en un sistema de archivos la asignación de espacio, la gestión del espacio libre y los directorios. • Conocer las principales inconsistencias que puede presentar un sistema de archivos y sus posibles soluciones. • Conocer los principales métodos de recuperación de archivos. • Saber cómo influye la gestión de los archivos que realiza el sistema operativo en la eficiencia del sistema informático.
337
338
9.1.
Fundamentos básicos de los sistemas operativos
Introducción
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 . Cuando un usuario trabaja con un programa de aplicación, como por ejemplo un procesador de texto guarda el documento creado en un archivo que se almacena en memoria secundaria, usualmente en un disco duro. En un sistema multiusuario, posteriormente, el usuario creador o algún otro usuario con 1 : permisos de acceso adecuados puede volver a abrir el archivo para leer o modificar el documento. Muchos programas utilizan los archivos como entrada y salida. Por ejemplo, un compilador compil un archivo fuente escrito en un lenguaje de alto nivel y genera como salida un archivo objeto escri en código ensamblador o en código máquina. Si se desea ejecutar el archivo ejecutable generado el proceso de compilación se debe utilizar un programa cargador que cargue el código y los datos e memoria principal. Otro ejemplo son los programas de gestión de bases de datos que consultan datos almacenados archivos. Si se crea una nueva entrada para la base de datos, dicha entrada se almacenará en un regis dentro de un archivo. El sistema operativo y los programas de aplicación también almacenan sus datos de configuraci ' en archivos. Usualmente existe una configuración por defecto que puede ser modificada por el usuario. Cuando se arranca un programa lee su archivo de configuración para ejecutarse de acuerdo con configuración establecida. Los archivos se almacenan en los diferentes dispositivos de almacenamiento secundario (discos magnéticos, discos ópticos, cintas, etc) de acuerdo con un determinado esquema de almacenamiento denomInado sistema de archivos. Este esquema no es único, por lo que es posible distinguir diferentes núme y tipos de sistemas de archivos (FAT-32, NTFS, ZFS, ext4, HFS, ISO 9660, etc). Por ejemplo, en mismo disco duro pueden existir varias particiones cada una de las cuales puede contener un sistema archivos. También en un CD-ROM o en un DVD-ROM existe otro sistema de archivos. El sistema operativo es el responsable de la gestión de los archivos de los diferentes sistemas archivos existentes en la memoria secundaria. Además debe fijar los tipos, los atributos, la estruc interna y los mecanismos de acceso de los archivos que soporta. También debe definir la estructura los directorios en los que los usuarios y las aplicaciones organizan sus archivos, así como los mecanis de búsqueda de archivos permitidos dentro de dicha estructura de directorios. También debe proporcio al usuario las llamadas al sistema oportunas que le permitan operar (leer, escribir, crear, borrar, etc) archivos y directorios. Por otra parte, el sistema operativo se encarga de asignar espacio a los archiv _ . de administrar el espacio libre de la memoria secundaria. Al componente del sistema operativo que realiza todas estas tareas se le denomina subsistema gestión de archivos. Nótese que en otros textos este componente también recibe el nombre de sistema archivos, que no debe confundirse con el término usado para designar un esquema de organización archivos. Este capítulo está dedicado a explicar la gestión de los archivos que realiza el sistema operativo. E primera parte del capítulo se realizan ciertas consideraciones sobre los tipos de archivos soportado un sistema operativo. A continuación se explican los diferentes atributos de un archivo y se describe
Gestión de archivos
339
estructura interna. Posteriormente se explican los métodos de acceso a un archivo y las operaciones que e pueden realizar sobre ellos. En la segunda parte se describen las posibles estructuras de los directorios y las operaciones que se pueden realizar sobre los mismos. En la tercera parte se explican diversos aspectos de los sistemas de archivos: estructura, montaje, asignación de espacio, gestión del espacio libre, implementación de directorios y consistencia. En la cuarta parte se describe la recuperación de archivos . En la última parte se analiza cómo influye la gestión de los archivos en la eficiencia de un istema informático.
9.2.
Archivos
9.2.1. Tipos de archivos Un archivo informático se puede definir como un conjunto de información relacionada que se almacena en memoria secundaria y que se identifica mediante un nombre, que es una cadena de caracteres. El uso de archivos suministra un mecanismo de abstracción del almacenamiento en memoria secundaria que evita que el usuario se tenga que preocupar de cómo y en qué bloques se almacena la información. E el programa que crea el archivo, a petición de un usuario o debido a su propio funcionamiento interno, el que especifica el tipo de información que va a contener un archivo, por ejemplo: programas en código fuente, programas en código objeto, programas binarios, texto, datos numéricos o alfanuméricos, regisnos de bases de datos, imágenes, grabaciones de audio o vídeo, etc. En general la información contenida en un archivo pertenece a alguna de las siguientes categorías: programas o datos. Cada sistema operativo establece los tipos de archivos que soporta. Para cada tipo de archivo sopara el sistema operativo debe ser capaz de reconocerlo y operar sobre el archivo de la forma adecuada. Dos de los tipos de archivos comúnmente soportados por los sistemas operativos son los directorios _ los archivos regulares u ordinarios. Un directorio es un archivo que almacena una lista de los archivos : ubdirectorios que contiene. Un archivo regular puede ser un archivo ASCII o un archivo binario. Un archivo binario es aquél que contiene información de cualquier tipo (código compilado, código compilado y enlazado, texto formateado, imágenes, videos, etc.) codificada en binario con una estructura determinada que únicamente puede ser interpretada por los programas que los utilizan. Si se prueba a imprimir un archivo binario sin usar el programa que lo interpreta se obtendrá como resultado una salida talmente incomprensible. Ejemplos de archivos binarios son los archivos ejecutables que contienen código compilado y datos. La estructura de estos archivos solo puede ser interpretada por el programa cargador encargado de cargar "'1 código y los datos en memoria principal. Otro ejemplo de archivos binarios son los archivos de texto - rmateado. Estos archivos solo pueden ser editados por el procesador de textos que los creó. Algunos archivos binarios contienen una cabecera con metadatos que ayudan a interpretar correc;¡amente la información que contiene. Por ejemplo, los archivos ejecutables en UNIX incluyen en su ecera información sobre el tamaño de la zona de códigos y la zona de datos, así como un identificar denominado número mágico que identifica al archivo como ejecutable. Por su parte, un archivo ASCII es aquél que está compuesto de líneas de caracteres ASCII codificadas ~ binario que no requieren un programa que los interprete. La impresión de un archivo ASCII genera
340
Fundamentos básicos de los sistemas operativos
una salida comprensible: las líneas de caracteres ASCII que lo componen. 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 cadena. El nombre de un archivo puede dar información sobre el tipo de archivo. A la parte del nombre que proporciona esta información se le conoce como extensión del nombre y se separa del nombre propiamente dicho por un carácter punto. Algunos sistemas operativos, como por ejemplo UNIX, ignoran las extensiones de los nombres de lo archivos. El uso de las extensiones en estos sistemas operativos es simplemente un elemento informativo para los usuarios y los programas de aplicación, los cuales pueden ajustar su comportamiento en funció de la extensión. Otros sistemas operativos reconocen e interpretan las extensiones de los archivos. Por ejemplo, e Windows, cuando un usuario abre un archivo haciendo doble dic sobre su icono, el sistema operativ invoca al programa de aplicación adecuado en función de la extensión del archivo y le pasa el archi~ como argumento . • Ejemplo 9.1
Supóngase que el nombre de un archivo es prueba. c. Este nombre se divide en dos partes: el nombre propiamente dicho (prueba) de seis caracteres y la extensión (. c) que consta de un único carácter ( se cuenta el carácter ". "). La extensión . c se suele asociar a archivos que contienen código fuente lenguaje C. Si el archivo prueba. c fuese compilado por un compilador de C de un sistema UNIX, el archi objeto resultante podría denominarse prueba. o o prueba. obj . Las extensiones . o y .obj suel asociarse a archivos que contienen código objeto. Considérese ahora una librería de funciones denominado básico. a. La extensión. a se suele asociar archivos que contienen una biblioteca de funciones compiladas. Otras extensiones usuales para desi a este tipo de archivos son por ejemplo . 1 ib o . dll. Supóngase que el archivo prueba. o hace referencia a las funciones de la librería básico. a. bos archivos deben ser enlazados mediante el uso de un programa enlazador que genera como sali un archivo ejecutable de nombre prueba. out. La extensión. out indica que se trata de un ard m ejecutable. Otras extensiones utilizadas para designar a archivos ejecutables son. exe, . com o . b iAlgunos sistemas operativos, como UNIX, hacen caso omiso a las extensiones, por ello permiten un nombre no contenga ninguna extensión o varias extensiones. Por ejemplo es usual que los arc . ejecutables no tengan ninguna extensión. En este tipo de sistemas operativos también es posible encontrar archivos con varias extensione . ejemplo el archivo prueba. c. gz tiene dos extensiones: la primera. c indica que el archivo conti código fuente en lenguaje C, y la segunda . gz que ha sido comprimido con el programa comp gzip.
Gestión de archivos
.2.2.
341
Atributos de un archivo
Además del nombre de un archivo, el sistema operativo tiene que mantener otras informaciones relativas a un archivo. A los elementos componentes de dicha información se les denomina atributos de un archivo. La lista de atributos de un archivo varía en función de cada sistema de archivos. Entre los arributos de un archivo más frecuentemente mantenidos por un sistema de operativo se encuentran los guientes: • Tipo del archivo. Es un campo compuesto de uno o varios bits que informa al sistema operativo sobre el tipo de archivo. • Tamaño. Incluye al tamaño actual en bytes, palabras o bloques. Además puede incluir información sobre el tamaño máximo permitido. • Localización. Contiene la ubicación del archivo en memoria secundaria. • Creador y propietario. Para identificar al usuario que creó el archivo y a su actual propietario. • Permisos de acceso. Para determinar qué usuarios pueden acceder al archivo y qué operaciones (lectura, escritura, ejecución) sobre el mismo tienen permitidas. • Información asociada al tiempo. Como por ejemplo la fecha y hora de creación del archivo, la fecha y hora del último acceso al archivo, y la fecha y hora de la última modificación .
.2.3.
Estructura interna de un archivo
La información contenida en un archivo se puede estructurar principalmente de tres posibles formas: • Secuencia de bytes. El archivo se estructura como un conjunto de bytes contiguos. En consecuencia las operaciones de lectura y escritura se realizan a nivel de byte. Algunos sistemas operativos, como UNIX o Windows, estructuran el contenido de los archivos de esta forma debido a su alta flexibilidad. El sistema operativo no tiene que interpretar la información contenida en cada byte del archivo. Dicha responsabilidad recae sobre los programas de aplicación que se ejecutan a nivel de usuario. Ejemplos de programas de aplicación que acceden a los archivos como una secuencia de bytes son los procesadores de texto y los compiladores. • Secuencia de registros. El archivo se estructura como un conjunto de registros contiguos de igual longitud. Cada registro posee a su vez una cierta estructura interna. Cuando se realiza una operación de lectura o de escritura se realiza a nivel de registro. • Registros indexados. El archivo se estructura como un conjunto de registros de longitud variable. Cada registro contiene un campo clave o índice que permite identificarlo. El archivo se organiza en función de la clave de los registros que lo componen. Para realizar una operación de lectura o de escritura se debe especificar la clave del registro que se desea leer o escribir. Si se añade un
342
Fundamentos básicos de los sistemas operativos
nuevo registro al archivo, se debe especificar su clave. Es el sistema operativo el que se encarga de ubicarlo dentro del conjunto de registros. Esta forma de estructurar la información de un archi o es utilizada por algunos sistemas operativos de macrocomputadores usados para gestión de dato de transacciones comerciales. Cada sistema operativo establece las formas de estructurar la información de un archivo que soporta Cuantas más formas soporte mayor será el código del sistema operativo ya que cada estructura requiere una implementación distinta de las operaciones de manipulación de archivos. De forma general, un sistema operativo considera que un archivo está formado por un conjunto de registros o bloques lógicos de igual o de distinto tamaño. En el caso de la estructura de secuencia de bytes todos los bloques lógicos tienen el mismo tamaño: un byte. Independientemente de cuál sea la estructura interna de un archivo, las operaciones de E/S con 1 dispositivos de memoria secundaria (principalmente discos duros), donde se almacenan los archivos, realizan en unidades de bloques físicos de igual tamaño. Un bloque físico contiene varios sectores de disco y tiene asignada una determinada dirección física BF, también denominada número de bloque, que permite identificarlo de forma unívoca dentro del disco. Generalmente el tamaño de un bloque físico suele ser mayor que el tamaño de un registro lógico. por lo que dentro de un bloque físico se empaquetan varios registros lógicos. El empaquetamiento de registros lógicos en bloques físicos puede ser realizado por el sistema operativo o por los programas de aplicación. De esta forma un archivo ocupará N bloques físicos, de los cuales es muy probable que e último no sea ocupado por completo, por lo que existirá fragmentación interna. Los posibles métod que utiliza el sistema operativo para asociar bloques físicos a un archivo serán estudiados en la secci 9.4.3. I
9.2.4.
Métodos de acceso a un archivo
Existen diferentes métodos para acceder a la información contenida en un archivo, siendo los más usuales los siguientes:
• Acceso secuencial. Los bytes o registros que componen el archivo se leen o se escriben en orden comenzando desde el principio. El sistema operativo debe mantener un puntero de lectura/ escritu que marca la posición (byte o registro) donde la próxima operación de lectura o escritura debe comenzar. Cada vez que se lee o se escribe un byte o un registro se incrementa el puntero de lectura/escritura del archivo. También es posible volver al principio del archivo para leerlo o escribirlo tantas veces como sea necesario. Asimismo es posible ir al final del archivo para escri . nueva información sin sobreescribir la ya existente. El acceso secuencial es el método de acce más sencillo. Algunas aplicaciones, como los compiladores y lo editores de texto, acceden a 1 archivos que manipulan de esta forma . • Acceso aleatorio. También denominado acceso directo. Los bytes o registros de un archivo pu ser leídos o escritos en cualquier orden. Este método de acceso resulta de gran utilidad cuando tiene una gran cantidad de información, como sucede en las bases de datos, y se desea acceder
Gestión de archivos
343
a una información en particular. Por ejemplo, en un sistema de reserva de plazas en trenes, la ocupación de cada tren se almacena en un registro particular identificado por el número de tren dentro de la base de datos de miles de trenes. Para acceder a dicho registro únicamente es necesario especificar el número de tren, lo cual ahorra gran cantidad de tiempo en comparación con un acceso secuencial. Las operaciones de lectura o escritura sobre archivos con acceso aleatorio se pueden implementar de dos formas. Una posibilidad es especificar el número del byte o registro al que se desea acceder como parámetro de la operación de lectura o escritura. Otra opción es usar primero una operación adicional de posicionamiento o búsqueda para ubicarse al comienzo del byte o registro que se desea leer. Las operaciones de lectura o escritura se realizarán secuencialmente comenzando desde dicha posición. Nótese que usando esta segunda forma es muy sencillo simular acceso secuencial en un archivo de acceso aleatorio ya que el sistema operativo solo debe mantener un puntero de lectura/escritura para el archivo. Ejemplo 9.2 Considérese un cierto archivo estructurado como una secuencia de 55 bytes, numerados del O al 54. Si el . tema operativo soporta un método de acceso secuencial, necesitará mantener en memoria principal un . ntero p de lectura/escritura para cada archivo que se abra para marcar la posición donde la próxima ración de lectura o escritura sobre dicho archivo debe comenzar. Sobre un archivo de acceso secuencial se pueden realizar tres operaciones básicas: • Rebobinar. Consiste en posicionarse al principio del archivo, para realizar esta operación simplemente hay que asignar al puntero de lectura/escritura el valor del primer bloque del archivo. En este caso p = O. • Leer siguiente. Consiste en leer el siguiente byte del archivo. Para realizar esta operación simplemente se lee el bloque apuntado por el puntero de lectura/escritura y se incrementa en una unidad el valor del puntero. Por ejemplo, si p = 23 una operación leer siguiente produce que se lea el byte n° 23 y que p = p + 1 = 24. • Escribir siguiente. Consiste en escribir sobre el siguiente byte del archivo. Su realización es similar a la de la operación leer siguiente.
upóngase ahora que el sistema operativo soporta un método de acceso directo sobre el contenido de los archivos. En dicho caso los bytes del archivo se pueden acceder en cualquier orden. Por ejemplo, se podría acceder al byte n° 12, luego al byte n° 1, posteriormente al byte n° 37, etc. Una posible implemenración de las operaciones de lectura o escritura consistiría en especificar el número de byte que se desea cceder. Por ejemplo leer (prueba ,15) leería el byte n° 15 del archivo prueba.
•
Cada sistema operativo especifica los métodos de acceso a archivos que soporta. Algunos sistemas solo soportan el acceso secuencial, otros solo el acceso aleatorio. Algunos sistemas operativos como los
344
Fundamentos básicos de los sistemas operativos
usados en macrocomputadores soportan los dos tipos de acceso y obligan a que se especifique en el momento de creación del archivo el método de acceso que se va a utilizar para así optimizar el rendimiento de las operaciones de E/S. La gran mayoría de los sistemas operativos modernos, cuando crean un archivo, consideran que se utilizará acceso aleatorio. Debe tenerse en cuenta que es fácil simular el acceso secuencial en un archivo de acceso aleatorio. Los métodos de acceso a un archivo que soporta un sistema operativo no deben confundirse con lo métodos de asignación de espacio en disco para un archivo que se estudiarán en la sección 9.4.3. Aunque la elección de estos últimos está influenciada por los primeros.
9.2.5.
Operaciones sobre archivos
Un sistema operativo proporciona diferentes llamadas al sistema para poder operar sobre los archivo . Las operaciones básicas soportadas y el nombre que reciben las llamadas al sistema asociadas dependen de cada sistema operativo. De forma general las operaciones básicas soportadas son las siguientes: • Crear archivo. Esta operación crea un archivo sin datos en una determinada ubicación de la estructura de directorios. También crea las entradas necesarias en los directorios correspondientes. La llamada al sistema asociada a esta operación necesita como argumentos de entrada el nombre del archivo y el nombre de ruta, es decir, la ubicación del archivo dentro de la estructura de directorio . • Abrir archivo. Para poder manipular un archivo primero debe ser abierto. Esta operación hace que el sistema operativo busque en un directorio la entrada asociada al archivo y cargue en memoria principal dentro de sus estructuras de datos internas toda la información que necesite sobre el archivo, como por ejemplo, los atributos y la lista de direcciones de memoria secundaria donde están alojados los datos del archivo, para poder acceder a ella con rapidez cuando se realicen otras operaciones sobre el archivo, como por ejemplo, leer o escribir. La llamada al sistema asociada a esta operación requiere el nombre de ruta del archivo y devuelve un número entero positivo, . se realiza con éxito, denominado identificador de archivo abierto o simplemente descriptor de archivo, que identifica al archivo dentro del conjunto de archivos abiertos por un mismo proceso o por todo el conjunto de procesos, disminuyendo su tiempo de búsqueda y simplificando la interfaz de llamadas al sistema. • Posicionamiento o búsqueda (seek) en un archivo. Esta operación permite configurar el puntero de lectura/escritura de un archivo para que apunte al comienzo del byte o registro desde donde desea leer o escribir. Esta operación resulta de gran utilidad para implementar el acceso aleatorio o directo a un archivo. • Leer archivo. Esta operación permite leer datos del archivo desde la posición actual indicada por el puntero de lectura/ escritura del archivo y almacenarlos en una posición del espacio de usuario del proceso que solicita la operación. La llamada al sistema que permite solicitar esta operació debe incluir como argumentos el nombre de ruta del archivo o un identificador de archivo abierto. el número de bytes o registros que se desean leer y la dirección de memoria del espacio de usuario del proceso donde deben colocarse los datos leídos.
Gestión de archivos
345
• Escribir archivo. Esta operación permite escribir en el archivo desde la posición actual los datos almacenados en una determinada posición del espacio de usuario del proceso que solicita la operación. La llamada al sistema asociada a esta operación debe incluir como argumentos el nombre de ruta del archivo o un identificador de archivo abierto, el número de bytes o registros que se desean escribir y la dirección de memoria del espacio de usuario del proceso donde se encuentran los datos que van a escribir. Si el puntero de lectura/escritura apunta al final del archivo la operación de escritura producirá un aumento del tamaño del archivo. • Renombrar archivo. Esta operación permite cambiar el nombre de un archivo. La llamada al sistema asociada requiere como argumentos: el nombre de ruta del archivo o el identificador de archivo abierto, y el nuevo nombre que se desea asignar. • Cerrar archivo. Si próximamente no se van a realizar más lecturas o escrituras sobre un archivo, entonces la información que mantiene el sistema operativo en memoria principal relativa al archivo puede ser borrada dejando así espacio disponible para otros archivos. Nótese que algunos sistemas operativos imponen un límite máximo al número de archivos abiertos por un proceso. La operación cerrar archivo realiza precisamente esta acción. Esta operación puede invocarse de forma explícita por un proceso o realizarse de forma implícita por el sistema operativo cuando finaliza un proceso. Si el archivo ha sido abierto por varios procesos, entonces la información que mantiene el sistema operativo en memoria principal asociada al archivo no se elimina hasta que todos los procesos cierren el archivo. • Borrar archivo. Esta operación libera el espacio en memoria secundaria ocupado por el archivo y borra la entrada asociada al archivo dentro del directorio en que se alojaba.
9.3.
Directorios
9.3.1.
Estructura de los directorios
Los usuarios de un sistema informático organizan sus archivos en directorios. Un directorio almacena una lista de archivos y subdirectorios. En cada entrada de dicha lista se almacena el nombre del archivo O subdirectorio. También se almacenan otras informaciones relativas al archivo, las cuales dependen de cada sistema de archivos. Algunos sistemas de archivos, como FAT-32 desarrollado para el istema operativo Windows 95, almacenan todos los atributos del archivo. Otros sistemas, como ext2 desarrollado para el sistema operativo Linux, almacenan un identificador de la estructura de datos en disco que contiene dicha información. Los usuarios deben adaptar la organización de sus archivos a la estructura de directorios soportada por el sistema operativo y los sistemas de archivos. En las siguientes secciones se describen las estructuras de directorios más comunes.
346
Fundamentos básicos de los sistemas operativos
Estructura de directorios de un único nivel La estructura de directorios más sencilla es aquella que consta de un único directorio que almacena una lista con todos los archivos existentes, tanto los creados por los diferentes usuarios como los archivo del sistema (bibliotecas, compiladores, ensambladores, rutinas de servicio, etc) y los archivos de lo programas de aplicación. La principal limitación que presenta esta estructura es que los nombres de todos los archivos deben ser distintos. Esta limitación es poco práctica según va creciendo el número de archivos y el número de usuarios, ya que cada vez se va haciendo más difícil elegir un nombre no repetido que identifique adecuadamente el contenido del archivo . • Ejemplo 9.3 En la Figura 9.1 se representa un ejemplo de estructura de directorios de un único nivel. Se observa que únicamente existe un único directorio que tiene una entrada para cada uno de los múltiples archivo existentes. Se muestran en la figura cuatro entradas del directorio, asociadas a los archivos: carta. txt . da tos . da t, edi tor y msx. a. Supóngase que al sistema pueden acceder dos usuarios: paco _ m y laura_d. El archivo carta. txt rertenece al usuario paco_m y datos. dat pertenece al usuario laura_d. El archivo edi tor es el archivo ejecutable de un editor de textos. Finalmente el archivo msx . a es un archivo de biblioteca del sistema.
Archivo
Figura 9.1 - Estructura de directorios de un único nivel
• Estructura de directorios de dos niveles La estructura de directorios de dos niveles consiste de un directorio raíz, también denominado directorio de archivos maestro, que almacena una lista de directorios, uno por usuario. Con esta estructura todos los archivos de un usuario se encuentran referenciados por la lista almacenada en su directorio. Por lo tanto, dos archivos pueden tener el mismo nombre si residen en directorios diferentes. Cuando un usuario desea acceder a un archivo, el sistema operativo limita su búsqueda del archivo al directorio del usuario. Lo mismo sucede si desea crear o borrar un archivo. En su implementación más sencilla, la estructura de directorio de dos niveles no permite que un usuario acceda a los archivos de los otros usuarios. Esta propiedad resulta útil si los usuarios trabaj an
Gestión de archivos
347
- dependientemente pero es un gran inconveniente si los usuarios desean trabajar en colaboración, es ecir, si un usuario necesita acceder a los archivos de los otros usuarios y viceversa. Otro inconveniente esta propiedad es que obliga a que los archivos del sistema y de los programas de aplicación sean piados en cada directorio de usuario con el desperdicio de espacio en disco que ello supondría. Esta limitación puede ser fácilmente superada si el sistema operativo es capaz de manejar nombres e rutas. Cada archivo dentro de la estructura de dos niveles de directorios posee una ruta de acceso. El mbre de ruta (path name) queda definido por el nombre del usuario que da nombre al directorio del uario y el nombre del archivo. De esta forma, si un usuario tiene los permisos de acceso adecuados ede acceder a los archivos de otros usuarios simplemente indicando en las llamadas al sistema el mbre de ruta. Cada sistema operativo define una sintaxis determinada para especificar los nombres de rotas. El uso de nombres de rutas también permite resolver el problema de la duplicidad de los archivos 1 sistema y de los archivos de los programas de aplicación. Simplemente el sistema operativo crea un uario ficticio especial al que le asigna un directorio donde se referencian a todos estos archivos. De ta forma cuando un usuario desea ejecutar un archivo el sistema operativo busca en primer lugar dentro 1 directorio del usuario, Si no lo encuentra allí entonces pasa a buscarlo en el directorio del usuario pecial. Ejemplo 9.4 En la Figura 9.2 se representa un ejemplo de estructura de directorios de dos niveles. Se observa que el . ectorio raíz referencia tres directorios de usuarios: usuario_O, paco_m y laura_f. El directorio suario _ O es un directorio de usuario especial reservado para alojar los archivos del sistema y de los gramas de aplicación. Por su parte, los directorios paco _m y laura _ f referencian los archivos de tos dos usuarios.
_ ótese como en una estructura de directorios de dos niveles, dos o más archivos pueden tener el mismo nombre siempre y cuando estén referenciados en directorios distintos. En este ejemplo esta circunstancia se produce con el nombre de archivo carta. t xt. Directorio raíz usuari o O
Directorio
Figura 9.2 - Estructura de directorios de dos niveles
Directorio
348
Fundamentos básicos de los sistemas operativos
Si el usuario paco _m desea acceder a uno de sus archivos únicamente debe especificar el nombre del mismo. Por ejemplo, si desea acceder a su archivo carta. txt, debe referenciarlo simplemente como "carta. txt". Sin embargo si desea acceder al archivo carta. txt de laura_f debe referenciarlo por su nombre de ruta: "laura_fjcarta.txt". Nótese que se ha utilizado el carácter "j" como separador entre el nombre del directorio de usuario y del nombre del archivo. En general cada sistema operativo define el carácter que utiliza como separador.
• Estructura de árbol de directorios
La estructura de árbol de directorios se caracteriza porque la lista almacenada en cada directorio. independientemente de su ubicación, puede contener entradas de otros directorios y archivos. De esta forma se pueden crear múltiples niveles de directorios (ver Figura 9.3) lo que dota a los usuarios de una gran flexibilidad para poder organizar adecuadamente sus archivos. El uso del término "árbol" para designar a esta estructura proviene de la analogía existente entre la organización que presenta esta estructura y los elementos de un árbol. El directorio raíz puede asemejar e con las raíces y el tronco, los directorios y subdirectorios se pueden asemejar a las ramas, y los archivo se asemejarían a las hojas. Directorio raíz bin lib
paco_m laura_g log. txt
Directorio
Directorio Directorio
o Figura 9.3 - Estructura de árbol de directorios
Si un usuario desea acceder a un determinado archivo dentro del árbol de directorios debe especifi para ello la ruta de acceso al archivo. El nombre de una ruta, aparte del nombre del archivo debe conte
Gestión de archivos
349
los nombres de los directorios en orden a los que hay que acceder para localizar al archivo. A cada uno de los nombres de directorios y del archivo que aparecen en un nombre de ruta se les denomina componentes del nombre de la ruta. Para que el sistema operativo pueda identificar cada componente, hay que escribirlos separados por algún carácter especial. Por ejemplo en UNIX es el carácter" /" mientras que en Windows es el carácter "\". En general cada sistema operativo define la sintaxis que admite para los nombres de rutas. Usualmente un sistema operativo soporta dos posibles tipos de nombres de rutas: absolutos y relativos. Un nombre de ruta absoluto contiene los nombres de todos los directorios a los que hay que acceder en orden para llegar al archivo comenzando desde el directorio raíz. Por su parte un nombre de ruta relaTivo especifica la ubicación del archivo comenzando desde el directorio de trabajo del usuario, también denominado como directorio actual. Cuando un usuario inicia una sesión de trabajo lo hace desde un cierto directorio de trabajo inicial. El usuario puede moverse por el árbol de directorios y cambiar su directorio de trabajo. Los sistemas operativos que soportan una estructura de árbol de directorios crean dos entradas especiales en cada directorio. Una de ellas es la entrada punto" . " que hace referencia al directorio actual. La otra es la entrada punto-punto" .. " que hace referencia al directorio padre, es decir, aquél directorio que ontiene al directorio actual. Estas entradas pueden usarse como componentes de los nombres de rutas en vez del nombre del directorio actual o del directorio padre, respectivamente, lo que permite simplificar la escritura de los nombres de rutas . • Ejemplo 9.5 En la Figura 9.3 se representa un ejemplo de estructura de árbol de directorios. Se observa que el directorio del usuario paco_m referencia al archivo datos. dat y a los subdirectorios fotos y cartas. El bdirectorio fotos referencia dos archivos playa. jpg y sol. gif. Mientras que el subdirectorio a rtas referencia al archivo carta. txt. Por su parte el directorio de la usuaria laura _g referencia el subdirectorio documentos y el archivo juego. El subdirectorio documentos referencia el archivo carta. txt. En definitiva, en una estructura de árbol de directorios, gracias a la posibilidad de crear ,·arios directorios dentro de un directorio, cada usuario puede organizar sus archivos de la forma que considera más oportuna. Aunque en este ejemplo solo hay tres niveles de directorios, en una estructura de árbol de directorios pueden crearse más. Para acceder a un archivo hay que especificar su ruta de acceso. Por ejemplo el nombre de la ruta absoluta del archivo playa. j pg es: /paco_m/fotos/playa.jpg
En el nombre de ruta anterior se ha usado el carácter" /" para separar cada componente de la ruta. Nótese que una ruta absoluta siempre comienza en el directorio raíz al cual está asociado el primer separador. i el directorio de trabajo es paco _m, entonces el nombre de ruta absoluta se puede simplificar usando la entrada " . " que hace referencia al directorio de trabajo actual: ./fotos/playa . jpg
350
Fundamentos básicos de los sistemas operativos
Por otra parte, una posible expresión del nombre de ruta relativa del archivo playa. j pg con respecto a este directorio de trabajo sería: fotos/playa. jpg
Supóngase ahora que el directorio de trabajo es fotos. El nombre de ruta absoluta de datos. da:: sería: /paco_m/datos.dat
Mientras que la ruta relativa es: · ./datos.dat
La entrada " . . " referencia al directorio pa e o _m que es el directorio padre del directorio fa t o s .
Estructura de directorios de gráfica acíclica
El uso de archivos y directorios compartidos resulta de gran utilidad cuando dos o más usu están trabajando en un proyecto común. En dicho caso suele ser necesario que parte o la totalidad los archivos del proyecto sean compartidos por todos los usuarios miembros del proyecto. Una po 1 forma de implementar la compartición de archivos, compatible con la estructura de árbol de directori es que los archivos compartidos estén referenciados por un subdirectorio del directorio de trabajo de de los usuarios. Los demás usuarios, si desean acceder a los archivos compartidos, deben modificar respectivos directorios de trabajo o indicar los nombres de rutas absolutas, lo cual es una forma de tr incómoda. Lo ideal sería que cada usuario que vaya a compartir los archivos tuviera en su directorio de tr entradas que le permitieran acceder a los archivos compartidos. Con la estructura de árbol de directo ' no es posible implementar esta forma de compartición de archivos, ya que no permite que existan directorios diferentes entradas que hagan referencia a un mismo archivo o directorio. Nótese que en Naturaleza nunca dos ramas de un árbol se unen por sus extremos. Para implementar la compartición de archivos y directorios se puede usar una estructura de di torios de gráfica acíclica (ver Figura 9.4), que permite que el mismo archivo o directorio pueda: referenciado por dos o más directorios diferentes siempre que no se produzcan ciclos, es decir, que directorio X referencie a otro directorio Y el cual referencia de nuevo a X. En una estructura de directorios de gráfica acíclica la compartición de archivos o directorios se r comúnmente mediante el uso de enlaces. Un enlace (link) permite conectar un directorio con un arc o subdirectorio ya existente en otro directorio. Un archivo o subdirectorio referenciado por un enlace dice que está compartido.
Gestión de archivos
351
En lo que resta de sección por simplificar la explicación se utilizará el término directorio origen denominar al directorio en el que reside un enlace y el término elemento destino para denominar al hivo o subdirectorio compartido. El directorio que contiene el elemento destino se denominará como Una posible forma de implementar un enlace es crear en el directorio origen una nueva entrada que una copia parcial o completa de la entrada del directorio destino asociada al archivo o subdirectorio mpartido. La nueva entrada creada en el directorio origen es marcada con algún identificador especial e permita reconocer al sistema operativo que se trata de una entrada asociada a un enlace. Los enlaces esta implementación son denominados en algunos sistemas operativos como enlaces duros (hard ). Con esta implementación de un enlace el acceso al elemento compartido requiere el mismo tiempo E/S independientemente de la entrada de directorio (origen o destino) desde el que se referencie. Si el sistema operativo almacena los atributos de un archivo en su entrada del directorio, entonces un nveniente que presenta esta implementación de un enlace es que cuando los atributos del elemento partido se modifican el sistema operativo debe velar por la consistencia de la información contenida la entrada del enlace en el directorio origen y en la entrada del elemento compartido en el directorio . o. Para poder realizar esta operación el sistema operativo debe mantener una lista con los enlaces posee cada archivo, la cual puede llegar a tener un gran tamaño. A su vez, el hecho de mantener la nsistencia de la información también produce un aumento de las operaciones de E/S, lo que repercute el rendimiento del sistema. Para evitar estos problemas algunos sistemas de archivos almacenan los atributos de un archivo en pequeña estructura de datos denominada nodo índice (o más abreviadamente nodo-i). Ahora en entrada de un directorio se almacena el nombre del archivo e información que permita localizar la ctura de datos donde están contenidos los atributos del archivo. En consecuencia si se modifican atributos de un archivo solo hay que modificar la estructura de datos y no el contenido de todas las tradas de directorios que referencian al archivo compartido. Otro problema que presenta esta forma de implementar los enlaces está relacionada con el borrado archivos. Supóngase que usuario_1 es el propietario de un archivo compartido con usuario_2. i u suario _1 borra el archivo, entonces usuario _ 2 tendrá un enlace a un archivo que ya no existe. -ambién puede suceder que si el espacio del archivo borrado es reutilizado para ubicar otro archivo de o usuario, entonces usuario _ 2 puede tener acceso a parte o a todo el contenido del nuevo archivo, lo cual no suele ser deseable. Para evitar este problema se suele incluir como atributo del archivo un contador de referencias que eva la cuenta del número de entradas de directorios que hacen referencia a dicho archivo. Este contador ulta de gran utilidad para ayudar a gestionar la operación de borrado del archivo. Cuando se crea el hivo este contador toma el valor 1. Cada vez que se crea un enlace al archivo el contador se incrementa ~ una unidad. Cuando se borra una entrada que referencia al archivo el contador se decrementa en una ·dad. Sólo cuando el contador alcanza el valor O el espacio en disco ocupado por los atributos y los tos de un archivo pasa a estar disponible para ser asignado a otros archivos. Esta solución supone un problema en sistemas que mantiene cuotas de uso de recursos para cada
352
Fundamentos básicos de los sistemas operativos
usuario. Es al usuario creador de un archivo compartido, no al resto de usuarios que lo comparten, a quien se le contabiliza el espacio que ocupa en disco dicho archivo. Si el contador de referencias del archivo es distinto de 1, y el propietario del archivo compartido hace una operación de borrado de dicho archivo. entonces esta operación únicamente provocará la eliminación de la entrada de directorio asociada al archivo utilizada por el propietario, pero no la recuperación del espacio ocupado por el archivo. Aunque el archivo ya no existe para el propietario, su espacio seguirá siendo contabilizado al propietario del archivo hasta que el contador de referencias del archivo compartido llegue a O. Otra forma de implementar un enlace es como un tipo especial de archivo que contiene el nombre de ruta absoluta o relativa del archivo o subdirectorio compartido. A los enlaces implementados de esta forma se les denomina enlaces simbólicos. La entrada asociada a un enlace simbólico en el directorio origen es completamente distinta a la entrada del directorio destino asociada al archivo o subdirectorio compartido. En este caso no hace falta marcar la entrada con algún identificador especial ya que el tipo del archivo lo identifica como enlace simbólico. Los enlaces simbólicos presentan como principal ventaja que permite enlazar con cualquier archivo de la estructura de directorios tanto de la máquina local como de máquinas remotas en red. Otra ventaj de usar enlaces simbólicos es el hecho de que borrar un enlace simbólico no afecta al elemento compartido. Además si el usuario propietario borra el elemento compartido, el espacio liberado pasa a estar inmediatamente disponible para él, aunque existan uno o varios enlaces simbólicos apuntando al elemento compartido. Una vez borrado los intentos de acceder al elemento compartido a través de los enla _ simbólicos producirán un error ya que el sistema no encontrará el elemento. El uso de enlaces simbólicos también tiene sus inconvenientes. En primer lugar consumen más espacio que los enlaces duros ya que ocupan bloques de datos mientras que los enlaces duros ocupan so entradas de directorios. En sistemas que almacenan los atributos del archivo en nodos índice si la del nombre del elemento compartido es corta se puede almacenar en el propio nodo índice, con lo que minimiza el espacio consumido por el enlace simbólico. Otro inconveniente de los enlaces simbólicos es que su utilización aumenta tanto el número de operaciones de E/S para acceder al elemento compartido como la sobrecarga al sistema. Nótese que cuan se referencia a un elemento compartido a través de un enlace simbólico el sistema operativo en prim lugar busca la entrada del enlace en el directorio correspondiente para conocer la ubicación en disco archivo del enlace simbólico. A continuación, lee en el disco el archivo del enlace simbólico para obrener el nombre de ruta del elemento compartido. Después debe seguir el nombre de ruta para encontrar entrada del directorio que le permita conocer la ubicación del elemento compartido. Una desventaja que presenta el uso de enlaces, independientemente de la forma en que se implem ten, es que un elemento compartido tiene múltiples nombres de rutas. Esto supone un problema cu se está recorriendo la estructura de directorios para encontrar un archivo, ya que no se desea perder tie po buscando por rutas que conducen a un mismo elemento compartido. También supone un proble cuando se realizan copias de seguridad, pues el archivo compartido será copiado varias veces, una cada enlace, desperdiciando así espacio. En resumen, la estructura de directorios de gráfica acíclica es más flexible que la estructura de ' de directorios, pero su gestión resulta más compleja.
Gestión de archivos
353
• Ejemplo 9.6 En la Figura 9.4 se representa un ejemplo de estructura de directorios de gráfica acíclica. Se observa e el directorio del usuario pedro contiene el enlace simbólico acceso. sc que apunta al archivo edi toro En consecuenci~ los nombres de rutas absolutas /bin/ edi tor y /pedro/ acceso. sc hacen referencia al mismo archivo. Pese a tener ambos nombres de rutas dos componentes, el acceso archivo por la segunda ruta es más lento, ya que hay que acceder previamente al archivo del enlace simbólico que contiene el nombre de ruta del archivo compartido.
Directorio
Figura 9.4 - Estructura de directorios de gráfica acíclica
Por otra parte el directorio de usuario pedro contiene el directorio proyecto que contiene dos arhivos recib. doc y tempo. txt de los que es el propietario. Este último archivo está compartido on la usuaria ana, la cual tiene en su directorio de usuaria un enlace duro de nombre proy_ bp que referencia a dicho archivo. Luego los nombres de rutas absolutas /pedro/proyecto/ tempo. txt y / ana/proy_ bp hacen referencia al mismo archivo.
En consecuencia el contador de referencias de este archivo tendrá el valor 2. Si el propietario del archivo borra el archivo tempo. txt , el contador pasará a tener el valor l. Hasta que la usuaria ana no borre el enlace duro proy_ bp el contador de referencias no tomará el valor O y en consecuencia se liberará el espacio ocupado por el archivo.
•
354
Fundamentos básicos de los sistemas operativos
9.3.2.
Operaciones sobre directorios
El sistema operativo también proporciona diferentes llamadas al sistema para poder operar sobre directorios. Las operaciones soportadas y el nombre que reciben estas llamadas al sistema dependen de cada sistema operativo. De forma general las operaciones más frecuentes son las siguientes: • Crear directorio. Se crea un directorio en la ubicación de la estructura de directorios con el nombre especificado por el nombre de ruta, que se debe dar a la llamada al sistema como argumento de entrada. El directorio cuando se crea no contiene ninguna entrada, salvo en el caso de que el sistema operativo soporte las entradas " . "y " .. ", ya que en dicho caso el directorio se crea inicialmente con estas dos entradas. • Borrar directorio. Algunos sistemas operativos solo permiten borrar un directorio cuando éste encuentra vacío o si solo contiene la entradas " . " y " . . ". Otros permiten borrarlo aunque conten e otros archivos y subdirectorios. En este último caso el borrado del directorio produce también eliminación de todos los elementos que contiene. • Abrir directorio. Para poder manipular un directorio creado primero debe ser abierto. Esta operación consiste en buscar en el directorio padre la entrada asociada al directorio que se desea abrir _ cargarla en memoria principal. Así el sistema operativo puede acceder a ella con rapidez cuan se realicen otras operaciones sobre el directorio. • Cerrar directorio. Si próximamente no se van a realizar más operaciones sobre un directorio, e tonces conviene cerrarlo para liberar así el espacio en memoria principal que ocupa la informaci que mantiene el sistema operativo relativa al directorio. • Leer directorio. Permite leer al contenido de una entrada del directorio, lo cual es necesario operaciones de búsqueda de archivos y de generación de listados de los contenidos de un directori • Renombrar directorio. Permite cambiar el nombre del directorio. • Enlazar. Permite crear en el directorio una entrada para un enlace duro o simbólico. • Desenlazar. Permite borrar en el directorio una entrada de un enlace.
9.4.
Sistemas de archivos
9.4.1.
Estructura de un sistema de archivos
Un sistema de archivos define un esquema de almacenamiento de la información relativa a lo chivos en un dispositivo de almacenamiento secundario. En el caso de los discos duros, un sistema archivos reside en una partición del disco. Asimismo en cada partición solo puede existir un único . ma de archivos. Puesto que en un disco duro pueden existir varias particiones es posible la existencia varios sistemas de archivos en un disco, uno por cada partición disponible. Recuérdese que la tabla
Gestión de archivos
355
particiones ubicada al final del MBR situado en el sector O del disco, contiene las particiones que existen en el disco y el tipo de sistema de archivos que reside en cada una de ellas. En el caso de los medios e almacenamiento extrafbles, como los CD-ROM o los DVD-ROM, solo es posible la existencia de un único sistema de archivos en cada medio. La estructura de un sistema de archivos depende de cada tipo de sistema de archivos en particular, pero de forma general se suelen distinguir en la misma las siguientes áreas: • Bloque de arranque . Se sitúa al comienzo de la partición y puede contener el código necesario para arrancar un sistema operativo. La tabla de particiones indica la partición activa, es decir, aquella que contiene el código de arranque del sistema operativo que se quiera cargar al arrancar el computador. Por defecto todas las particiones de un disco comienzan con un bloque de arranque, solo una de ellas (la partición activa) necesita contener el código de arranque, por lo que el resto de particiones tendrá este área vacfa. • Estructura de datos con metadatos del sistema de archivos. Contiene información administrativa y estadfstica del sistema de archivos, como por ejemplo: un identificador del tipo de sistema de archivos, el número de bloques del sistema de archivos, el número de bloques libres, etc. Algunos sistemas operativos, como por ejemplo UNIX, denominan a esta estructura superbloque. El superbloque se copia en memoria cuando arranca el sistema operativo o se accede por primera vez al sistema de archivos. • Estructura de datos con información sobre los bloques libres en el sistema de archivos. Generalmente denominada como lista de bloques libres. Puede implementarse como un mapa de bits o como una lista enlazada. Cuando se necesita espacio en disco para crear un archivo o para aumentar el tamaño de un archivo ya existente, el sistema operativo consulta esta estructura para asignar dicho espacio. • Estructura de datos para localizar los bloques asignados a los archivos. Algunas de las más utilizadas son las siguientes: - Lista de nodos índice. Un nodo índice o nodo-i es una estructura de datos utilizada por algunos sistemas operativos, como por ejemplo UNIX, para almacenar los atributos de un archivo y la ubicación del archivo en disco. Cada nodo-i tiene asociado un número entero positivo que lo identifica de manera única. Una entrada de la lista de nodos-i contiene la dirección física o número de bloque del disco donde se encuentra el nodo-i asociado a un determinado archivo. La lista de nodos índice tiene un tamaño fijo que se configura al crear el sistema de archivos y que limita el número máximo de archivos que pueden existir en el sistema de archivos. - Tabla de asignación de archivos (File Allocation Table, FAT). Esta tabla tiene una entrada por cada bloque físico existente en la partición del sistema de archivos. Así la entrada j de la tabla hace referencia al bloque físico j. Si el bloque físico j está asignado a un archivo, entonces la entrada j en la FAT contiene la dirección física del siguiente bloque del archivo.
356
Fundamentos básicos de los sistemas operativos
Cuando se utiliza una FAT no es necesario implementar una lista de bloques libres, ya que FAT contiene información sobre los bloques asignados y los bloques libres . • Área de datos . Contiene los bloques libres y los bloques de datos asignados a los archivos y al _ directorios.
9.4.2.
Montaje de un sistema de archivos
Cuando se instala un sistema operativo en un computador éste crea en una partición del disco d realizando un formateo a alto nivel, un determinado tipo de sistema de archivos, el cual suele ser defecto el tipo más actual desarrollado para dicho sistema operativo. Por ejemplo, el sistema operati Windows crea un sistema de archivos NTFS, Linux crea un sistema de archivos ext4, Solaris crea sistema de archivos ZFS y Mac-OS crea un sistema HFS+ . Aparte de este sistema de archivos principal, cada sistema operativo puede ser capaz de recon y manipular otros sistemas de archivos del mismo o distinto tipo que el sistema de archivos princi Por ejemplo Linux soporta, entre otros, los siguientes tipos de archivos ext2, ext3, ext4, FAT-16, FAT-~ NTFS e ISO 9660. Para poder acceder a los contenidos de un determinado sistema de archivos ubicado en mem secundaria, éste debe ser montado en algún punto dentro de la estructura de directorios del sistema archivos principal o asignarle una estructura de directorios independiente. A dicho punto se le suele nominar punto de montaje. La estructura o estructuras de directorios que son accesibles por los usu queda así formada por todos los sistemas de archivos montados. El montaje de los sistemas de archivos es realizado por el sistema operativo cuando se arranca el tema operativo y cuando éste detecta un nuevo dispositivo de memoria secundaria conectado al ca tador. Cómo se implementa el montaje de un sistema de archivos depende de cada sistema operativo. ejemplo, el sistema operativo Windows trata cada sistema de archivos que soporta, presente en mem secundaria, como volúmenes o unidades lógicas independientes, cada una de las cuales posee su estructura de directorios. Windows asigna una letra (C:, D:, E:, ... ) a cada unidad. Luego un nombre ruta absoluta siempre comienza con la letra de la unidad donde se encuentra el archivo al que se acceder. Otra filosofía de montaje distinta es, por ejemplo, la del sistema operativo Linux, que monta sistema de archivos que soporta, presente en memoria secundaria, en un directorio del sistema de ardm principal. Luego todos los sistemas de archivos quedan integrados dentro de una única estructura directorios. Así, para acceder a un determinado archivo en un sistema de archivos diferente del princi simplemente hay que incluir en la ruta el nombre del directorio donde se ubica dicho sistema de arcM
9.4.3.
Asignación de espacio
Un aspecto importante en el diseño de un sistema de archivos es establecer la forma en que asignarán a los archivos los bloques físicos del área de datos del sistema. Existen diferentes mét
Gestión de archivos
357
asignación del espacio, cada uno con sus ventajas y sus inconvenientes. En las siguientes secciones describen los tres métodos más utilizados: asignación contigua, asignación enlazada y asignación ada . ación contigua El método de asignación contigua consiste en asignar a un archivo un conjunto de bloques físicos tiguos. De esta forma si un archivo consta de N bloques y el primer bloque se almacena en el bloque dirección física BFO, el segundo bloque ocupará el bloque físico BFO + 1, el tercer bloque ocupará bloque físico BFO + 2, Y así sucesivamente hasta llegar al bloque enésimo del archivo que ocupará el ue físico BFO + N-l . El método de asignación contigua minimiza las operaciones de búsqueda en disco, aumentando así rendimiento. Para leer un archivo completo en disco cuyos bloques están ubicados de forma contigua o hay que buscar el primer sector del primer bloque ocupado por el archivo. Si el archivo ocupa más un cilindro, las cabezas de lectura/escritura se mueven al cilindro contiguo, por lo que el movimiento las cabezas, y en consecuencia el tiempo de búsqueda, es el mínimo posible. Otra ventaja del método de asignación contigua es que permite soportar archivos tanto de acceso uencial como de acceso aleatorio, ya que la localización de los bloques de un archivo se realiza de a rápida y sencilla. El sistema operativo únicamente necesita conocer la dirección física del primer ue BFO Y el número N de bloques que ocupa el archivo. Dicha información está almacenada dentro la entrada del directorio que contiene al archivo o en un nodo índice. La dirección física del bloque i, fi del archivo se obtiene simplemente sumando a BFO al índice del bloque, es decir, BF¡ = BFO + i. Una desventaja del método de asignación contigua es que produce fragmentación externa. lnicialnte la partición del disco está prácticamente vacía y cada archivo que se crea se almacena contiguo al timo archivo creado. Con el paso del tiempo la partición se irá llenando, por lo que llegará un momento e no será posible asignar espacio a un archivo al final de la partición. Afortunadamente los usuarios bién borran archivos, lo que genera huecos (conjuntos de bloques físicos contiguos libres) en diferentes lugares de la partición. Luego en general una partición de disco se compone de archivos y huecos. 1:11 ese escenario, cuando se crea un archivo, el sistema operativo tiene que buscar en la partición del . ca un hueco lo suficientemente grande para asignárselo al archivo. Para ello debe mantener una lista huecos y utilizar algún algoritmo de asignación de espacio, como los comentados en la sección 6.5.2 hablar de la técnica de particionamiento dinámico de memoria principal. Con el paso del tiempo, al crearse nuevos archivos y borrarse otros, en la partición de disco irán areciendo huecos cada vez más pequeños, algunos de los cuales no pueden ser utilizados por sí solos para asignárselos a nuevos archivos debido a su pequeño tamaño. A este desaprovechamiento del espacio la partición de disco debido a la dispersión del espacio libre en una serie de huecos de pequeño tamaño - le denomina fragmentación externa. La fragmentación externa supone un problema si ninguno de los huecos existentes es del tamaño que necesita el sistema operativo para asignárselo a un archivo. Para solucionar la fragmentación externa que produce la asignación contigua se hace necesario compactar el disco, es decir, desplazar todos los archivos a un lado de la partición para crear un único hueco de mayor tamaño. Sin embargo, la compactación del disco requiere bastante tiempo, y mientras se realiza
358
Fundamentos básicos de los sistemas operativos
no puede usarse dicho disco. Otro inconveniente del método de la asignación contigua consiste en que el sistema operativo debe conocer el tamaño que ocupará el archivo que se va a crear, lo cual en la mayoría de las ocasiones e un dato que no es posible predecir a priori. Si el sistema operativo asigna a un archivo un hueco de un tamaño superior al que llegará a tener un archivo, se estará desaprovechando espacio que no será posible asignar a otros archivos, es decir, se producirá fragmentación interna. En el otro extremo si el sistem operativo asigna al archivo un hueco con un tamaño inferior al que puede llegar a alcanzar el archivo. entonces el sistema operativo tendrá que seguir alguna estrategia cuando el archivo necesite más espacio. Una posibilidad es terminar el proceso de usuario que manipulaba el archivo y enviar al usuario algún mensaje de error apropiado. El usuario tendrá que volver a ejecutar al proceso proporcionando al sistema una estimación más adecuada del tamaño de los archivos que creará. Obviamente, esta estrategia resulta bastante molesta para los usuarios. Otra posibilidad es buscar un hueco de mayor tamaño para alojar el archivo, copiar allí el archivo . liberar el espacio que ocupaba inicialmente. El problema es que estas operaciones consumen un tiempo no despreciable con lo que se aumenta la sobrecarga del sistema .
• Ejemplo 9.7 En la Figura 9.5 se representan 18 bloques físicos de una cierta partición de disco, se utiliza el método de asignación contigua para asignar espacio a los archivos. Se observa la existencia de cuatro archivos ~ dos huecos. prog.c
datos . txt
editor
~
i= O
1
~~:~~~ 1111111111111 B F= 90 91
O
1
1 I
2
o
3
I
92 93 94 95
log.c
r . - - - -A - - - _ ,
1 1 I 96 97 98
2
3
4
~ 012
1~~~U~~~~~I~~~l~~l@l ~ 99 100 101 102 103 104 105 106 107
Figura 9.5 - Espacio del disco asignado mediante el método de asignación contigua
El archivo prog. e consta de dos bloques (i = O e i = 1) que ocupan los bloques físicos BF = 90. BF = 91. El archivo datos. txt consta de cuatro bloques (i = O a i = 3) que ocupan los bloques físic BF = 92 a BF = 95. El archivo editor consta de cinco bloques (i = O a i = 4) que ocupan los bloqu físicos BF = 99 a BF = 193. Finalmente el archivo 10g. e consta de tres bloques (i = O a i = 2) q ocupan los bloques físicos BF = 105 a BF = 107. El primer hueco está formado por los bloques físicos libres BF hueco lo forma el bloque físico libre BF = 104.
= 96 a BF = 98. Mientras que el segun
Nótese que para acceder a un determinado bloque de un archivo simplemente hay que conocer la dirección física de su primer bloque BFO. Por ejemplo, la dirección física del cuarto bloque (i = 3) del archi edi tor se obtiene de la siguiente forma:
Gestión de archivos
359
Bp = Bpo + i = 99 + 3 = 102 Conociendo también el tamaño del archivo se evita el acceso a bloques físicos incorrectos. Así por ejemplo, el archivo edi tor ocupa N= 5 bloques, por lo que antes de calcular la dirección física de uno sus bloques (i = 0, 1, 2, . .. ) se comprueba si i::; (N - 1). Si no se cumple la condición se produciría un error.
• Asignación enlazada El método de asignación enlazada consiste en almacenar al principio de cada bloque físico asignado un archivo la dirección física del siguiente bloque físico del archivo. De esta forma el espacio ocupado por un archivo en el disco se organiza como una lista enlazada de bloques físicos. El sistema operativo para localizar un determinado bloque del archivo únicamente necesita conocer la dirección física del primer bloque. Dicha información está almacenada dentro de la entrada del directorio que contiene al hivo o en un nodo índice. El método de asignación enlazada permite usar cualquier bloque físico libre para asignárselo a un hivo, por lo que no produce fragmentación externa. Además evita la necesidad de conocer por adelando el tamaño de un archivo. Cuando un archivo necesita más espacio se buscan bloques físicos libres y se enlazan al final de la lista. En consecuencia la asignación enlazada evita todos los inconvenientes que introducía la asignación contigua .
• Ejemplo 9.8 En la Figura 9.6 se muestra la distribución de los bloques de un archivo en una cierta partición de un . co usando el método de asignación enlazada. 1=
3
2
o
Figura 9.6 - Espacio del disco asignado mediante el método de asignación enlazada upóngase que el primer bloque del archivo (i = O) ocupa el bloque físico Bp = 101. Este bloque ntiene en su inicio la dirección física Bp = 91 del segundo bloque (i = 1) del archivo. El segundo loque contiene en su inicio la dirección física Bp = 97 del tercer bloque (i = 2) del archivo. El tercer
360
Fundamentos básicos de los sistemas operativos
bloque contiene en su inicio la dirección física BF = 93 del cuarto (i = 3) del archivo. El cuarto bloque contiene en su inicio el valor -1 para indicar al sistema operativo que es el último bloque del archivo .
•
La principal desventaja del método de asignación enlazada radica en que resulta muy lento si se u para asignar espacio a archivos de acceso aleatorio, ya que para poder localizar la ubicación del bloque j del archivo es necesario buscar y leer en disco los anteriores j - 1 bloques del archivo. Otra desventaja del método de asignación enlazada proviene del hecho de que al principio de cada bloque del archivo se almacena la dirección física del siguiente bloque. Esta dirección consume uno_ pocos bytes del espacio del bloque, el cual ya no estará disponible para almacenar los datos del archi o. Obviamente el porcentaje de espacio consumido por la dirección aumentará conforme más pequeño ea el tamaño del bloque, aunque en general no suele ser muy significativo. Sin embargo, produce que 1 cantidad de información del archivo almacenada en el bloque ya no sea una potencia de dos, lo cual reduce la eficiencia y complica el procesamiento de la información en muchos programas que trabajan con bloques de datos que son potencia de dos. Nótese que los datos que antes cabrían en un solo bloque potencia de dos deben distribuirse en dos bloques si se usa asignación enlazada, lo que genera un lectura o escritura adicional y un trabajo de concatenamiento adecuado de los datos .
• Ejemplo 9.9 Supuesto una partición de disco de 64 GiB con un tamaño de bloque de 1 KiB , el número total de bloques físicos NT contenidos en la partición se calcularía de la siguiente forma:
(2 2
6 30
NT= floor (
64 GiB) = floor bytes ) = 226 bloques 1 KiB/bloque 2 10 bytes/bloque
El número n de bits de una dirección física de un bloque de disco se calcula resolviendo la siguiente desigualdad:
Como NT = 226 entonces n = 26 bits. Luego en un bloque de 1 KiB se necesitan 26 bits para direccio el siguiente bloque del disco, es decir, el 0,32 % del espacio del bloque. Una solución bastante utilizada para reducir este problema consiste en asignar el espacio de los archivo en agrupamientos (clusters) de bloques físicos contiguos. Al comienzo del primer bloque del agrupamiento se almacena la dirección física del siguiente agrupamiento asociado al archivo. Por ejempl . cada vez que un archivo necesita espacio se le puede asignar un agrupamiento de 4 bloques. El princi inconveniente de esta solución es que aumenta la fragmentación interna y que produce fragmentaci ' externa dado que los huecos de tamaño inferior al tamaño de un agrupamiento no pueden utilizarse p ser asignados a los archivos. Otra desventaja de este método es la sensibilidad a posibles errores del disco o del sistema operati\ ya que si se pierde o se daña un puntero en uno de los bloques de la cadena el resto de los bloques
Gestión de archivos
361
hivo no serán accesibles. Dichos bloques se podrían considerar erróneamente como libres o enlazados otro archivo. Para eliminar las desventajas del método de asignación enlazada, se puede usar una FAT que se icaria en bloques contiguos después del sector de arranque de la partición asociada al sistema de hivos. Esta tabla tiene una entrada por cada bloque físico existente en la partición del sistema de hivos. Así la entrada j de la tabla, hace referencia al bloque físico j. Si el bloque físico j está asignado un archivo, entonces la entrada j en la FAT contiene la dirección física del siguiente bloque del archivo. L~ego en una entrada de la FAT se almacena lo que antes se almacenaba al principio de cada bloque. De esta forma el espacio ocupado por un archivo en el disco se organiza como una lista enlazada de entradas la FAT, en vez de como una lista enlazada de bloques físicos. Al igual que antes la dirección física 1 primer bloque del archivo se almacena o en la entrada del directorio que contiene al archivo o en un nodo índice. Por otro lado, si un bloque físico h es el último asociado a un determinado archivo, entonces la entrada h de la FAT contendrá un identificador especial de fin de archivo, por ejemplo, el valor -1. Si bloque físico k está libre, entonces la entrada k de la FAT contendrá un número entero especial, por ejemplo, el valor O. Usando la FAT es posible dar un mejor soporte a los archivos de acceso aleatorio, ya que para acceder un determinado bloque de un archivo únicamente debe seguirse la cadena leyendo entradas de la FAT. Además, el espacio de los bloques físicos se puede utilizar únicamente para alojar datos de archivos. La principal desventaja del uso de una FAT es que para que su uso sea eficiente conviene tener una copia de la FAT en memoria principal. En caso contrario se generan muchos movimientos de las cabezas de lectura/escritura del disco desde los cilindros iniciales de la partición donde se encuentra ubicada la F: T hasta los cilindros donde se encuentre el bloque que se desea leer o escribir. El problema reside en e la copia de la FAT puede ocupar una cantidad de memoria principal no despreciable si la partición disco es grande . • Ejemplo 9.10
Supóngase un sistema de archivos contenido en una partición de disco de 64 GiB con un tamaño de loque de 1 KiB. En el ejemplo anterior se calculó que dicha partición contendría 226 bloques físicos y ue un bloque físico se direcciona con direcciones físicas de 26 bits. En la parte izquierda de la Figura 9.7 se ha representado la FAT asociada a este sistema de archivos. Se observa que la tabla tiene una entrada por cada bloque físico existente. Supóngase que el primer bloque ( i = O) de un cierto archivo es el bloque físico Bp = 101 , esta información se encuentra entre los atributos e la entrada del directorio que contiene al archivo. La entrada 101 de la FAT contiene la dirección física Bp = 91 del segundo bloque (i = 1) del archivo. La entrada 91 de la FAT contiene la dirección física Bp = 97 del tercer bloque (i = 2) del archivo. La entrada 97 de la FAT contiene la dirección física Bp = 93 del cuarto bloque (i = 3) del archivo. Finalmente la entrada 93 de la FAT contiene el valor -1 que indica que este bloque es el último del archivo.
En la parte derecha de la Figura 9.7 se puede ver como al utilizar una FAT se elimina la necesidad de almacenar en cada bloque del archivo la dirección física del siguiente bloque del archivo. Usando una FAT se tiene por lo tanto una lista enlazada de entradas en vez de una lista enlazada de bloques físicos.
362
Fundamentos básicos de los sistemas operativos
Tabla de asignación de archivos (FA T)
O
Bl,oqu",
FlSlCOS
I
BF- 90
I I I I
2
3
1=
O
I I I I I I I I I I I 91
92
93
94
95
96 97
98
II
99 100 10 1 102
90 91
97
92 93
-1
94 95 96 97
93
98 99 100 101
91
102 I I I I
I
Nombre archivo
I
J Atributos
I
Entrada directorio
26 bits Figura 9.7 - Espacio del disco asignado mediante el método de asignación enlazada usando una FAT
Gestión de archivos
363
i la FAT tiene 226 entradas y cada entrada tiene un tamaño de 26 bits, entonces el tamaño de la FAT es -= al a:
26 (bits/entrada)·2 26 (entradas) = 1664.220 bits = 208.220 bytes = 208 MiB ego se necesitan 208 MiB en la partición de disco asociada al sistema de archivos para mantener la '=.-\1'. Además si se desea disminuir el tiempo de acceso a los bloques de los archivos habría que copiar
FAT en memoria principal, lo que consumiría 208 MiB de memoria principal.
•
.!signación indexada El método de asignación indexada consiste en almacenar en un nodo-i los atributos de un archivo _ las direcciones físicas de los ocho o diez primeros bloques de un archivo. También se almacenan las cciones físicas de uno o varios bloques de indirección simple, doble o triple. Un bloque de indirección - pIe es un bloque físico que almacena direcciones físicas de bloques del archivo. Por su parte un bloque indirección doble es un bloque físico que almacena direcciones de bloques de indirección simple. ~ lientras que un bloque de indirección triple es un bloque físico que almacena direcciones de bloques de - dirección doble. El tamaño de un nodo-i suele ser pequeño, unos pocos bytes, por lo que dentro de un loque físico de discos se pueden almacenar múltiples nodos-i. Cada archivo tiene asociado un nodo-i que queda identificado mediante un número entero positivo nominado número de nodo-i. Al principio de la partición asociada al sistema de archivos se mantiene a lista con todos los nodos-i existentes. El número de nodo-i asociado a un archivo se almacena en la ~trada del directorio que contiene el archivo. Cuando se abre un archivo, su nodo-i se lee en la lista de os-i y se carga en memoria principal para poder conocer las direcciones físicas de los bloques del hivo y sus atributos. El método de asignación indexada se puede usar tanto para archivos de acceso secuencial como para hivos de acceso aleatorio. No produce fragmentación externa y permite que el espacio de los bloques ~ icos que contienen datos del archivo pueda ser utilizado en su totalidad. Además su implementación requiere el uso de menos espacio en memoria principal que el método de asignación enlazada con FAT. _~ótese que solo es necesario mantener en memoria principal los nodos-i de los archivos abiertos, no los e todos los archivos existentes en la partición. La principal desventaja del método de asignación indexada es que el tiempo de acceso a un bloque el archivo depende de la estructura interna del nodo-i, del tamaño del archivo y de la posición del bloque al que se desea acceder. Supuesto que el nodo-i del archivo ya ha sido cargado en memoria principal, si se desea acceder a uno de los primeros bloques del archivo, como el nodo-i contiene su dirección física, simplemente hay que hacer una lectura en disco para leer dicho bloque. Pero si se trata de bloques del archivo a los que se accede a través de bloques de indirección simple, doble o triple entonces habrá que hacer una, dos o tres lecturas adicionales en disco, respectivamente. Luego en el mejor de los casos, descontando la lectura del nodo-i, hay que hacer una lectura en disco, mientras que en el peor de los casos habrá que hacer tres lecturas.
364
Fundamentos básicos de los sistemas operativos
• Ejemplo 9.11 Supóngase un sistema de archivos contenido en una partición de disco de 64 GiB con un tamaño de bloque de 1 KiB. En la Figura 9.8 se representa el nodo-i asociado a un determinado archivo. Se observa que el nodo-i de este sistema de archivos permite almacenar los atributos del archivo, las direccione físicas de los diez primeros bloques del archivo (i = O a i = 9), la dirección física de un bloque de indirección simple y la dirección física de un bloque de indirección doble. Nodo índice
Atributos del archivo
Bloque Físico
Dirección física del bloque O del archivo
BF=2467 Dirección física del bloque 1 del archivo
BF=2468
BF=2468 I I I I I I
BF=2476
I
Dirección física del bloque 9 del archivo
BF=3569
BF=2476 Dirección física bloque de indirección simple
BF=3012
BF=3012
/
Dirección física bloque de indirección doble
BF=3120
..
26 bits
V
•
BF=5000
V
BF=3569
BF=7000 -
V -
Figura 9.8 - Espacio del disco asignado mediante el método de asignación indexada
Un bloque de indirección simple es un bloque físico que almacena ND direcciones físicas de bloques archivo (ver Figura 9.9). Para este sistema de archivos, se calculó en el Ejemplo 9.9 que el tamaño una dirección física es de 26 bits, luego el número de direcciones físicas ND que se pueden almacenar un bloque de indirección simple se calcularía mediante la expresión:
Gestión de archivos
1KiB ND = floor ( -) 26 bits
365
.. (. = floor ( 8192 bitS) = 315 dIreCCIOnes flslcas 26 bits
Luego el bloque de indirección simple ubicado en el bloque físico BF de los bloques i = 10 a i = 324 del archivo (ver Figura 9.9).
= 3012 contiene las direcciones
Bloque de indirección simple j=O
Dirección Física Bloque i= 10
j=l
Dirección Física Bloque i=ll
j=2
Dirección Física Bloque i=12 I I I I
j=314
Dirección Física Bloque i=324
26 bits
Figura 9.9 - Estructura del bloque de indirección simple del Ejemplo 9.11 Un bloque de indirección doble es un bloque físico que almacena N D direcciones físicas de bloques de indirección simple. Como un bloque de indirección simple contiene ND direcciones físicas, entonces a través de un bloque de indirección doble se puede acceder a un total de direcciones del archivo. En 2 este ejemplo con un bloque de indirección doble se puede acceder a 315 = 99225 bloques del archivo. En concreto se puede acceder a los bloques del archivo i = 325 a i = 99549.
Nb
Con esta estructura de nodo-i el número máximo de bloques que puede tener un archivo sería de 10 + 315 + 315 2 = 99550 bloques. Como se ha supuesto un tamaño de bloque de 1 KiB , el tamaño máximo de un archivo sería por tanto de 99550 KiB, es decir, de 97,2 MiB.
• 9.4.4.
Gestión del espacio libre
Otro aspecto importante en el diseño de un sistema de archivos es la localización del espacio libre del área de datos del sistema. Para esta función se suele utilizar una estructura de datos que se suele denominar lista de bloques libres, aunque a veces dicha estructura no se implementa como una lista. La lista de bloques libres se almacena al comienzo del sistema de archivos, en algún lugar entre el bloque de arranque y el área de datos del sistema de archivos, necesitando de varios bloques de disco para su almacenamiento. El sistema operativo consulta y modifica la lista de bloques libres cuando tiene que asignar espacio para la creación de nuevos archivos o para ampliar el tamaño de archivos ya creados. Además debe
366
Fundamentos básicos de los sistemas operativos
actualizar el contenido de la estructura cuando se libera espacio al eliminar o reducir el contenido de un archivo. Para reducir el número de operaciones de E/S a disco, el sistema operativo suele cargar en la memoria principal una copia de parte de la lista de bloques libres. Las modificaciones realizadas sobre la copia son actualizadas en el disco ante la aparición de determinados eventos. La lista de bloques libres se puede implementar de diferentes formas, cada una de las cuales tiene sus ventajas y sus inconvenientes. En las siguientes secciones se describen las implementaciones más utilizadas.
Mapa de bits La lista de bloques libres se puede implementar como un mapa de bits. Cada bloque de disco de la partición del sistema de archivos tiene asignado un bit. Si el bloque está ocupado se marca con un O y está libre con un 1, o viceversa. Si la partición asociada al sistema de archivos ocupa N bloques de disco. entonces el mapa de bits ocupará N bits. La principal ventaja de un mapa de bits es la sencillez para encontrar el primer bloque libre o conjunto de k bloques libres consecutivos. Su principal inconveniente es que para que su gestión eficiente es necesario mantener todo el mapa de bits en memoria principal, lo cual puede que no posible si el tamaño de la partición del sistema de archivos es muy grande . • Ejemplo 9.12 Considérese una partición de un disco duro con un tamaño de 256 GiB Y con un tamaño de bloque de _ KiB. El número total de bloques NT existentes en dicha partición es: 38
NT= fioor (
256 GiB) = fioor ( 2 bytes ) = 2 27 bloques 11 2 (KiB/bloque) 2 (bytes/bloque)
Si la lista de bloques libres se implementa con un mapa de bits, dicho mapa tendrá un tamaño de 227 bi = 128 Mib = 16 MiB. El número de bloques NMB que se necesitan para almacenar el mapa de bits en disco se calcula de la siguiente forma: NMB = ceil (
27
bits ) ( 2 bits ) = ceil 14 = 2 l3 = 8192 bloques 2 (KB/bloque) 2 (bits/bloque) 227
Por otra parte, el número de palabras N p que se necesitan para almacenar la copia del mapa de bits en memoria principal supuesto un tamaño de palabra de 32 bits es: Np= ceil (
bits ) = 222 palabras = 4 MiPalabras 32 (bits/palabra) 227
Supóngase que el contenido de la palabra del mapa de bits que contiene información sobre los bl 64000 a 64031 es el siguiente: 11110000110000110000000000001100
Gestión de archivos
367
Entonces, supuesto que un 1 en el mapa de bits indica que un bloque está libre, los bloques 64000 a 003,64008,64009,64014,64015,64028 Y 64029 se encuentran libres.
•
Lista enlazada La lista de bloques libres también se puede implementar como una lista enlazada de bloques de disco. Supóngase que en un bloque de disco se puede almacenar ND direcciones de bloque, entonces cada bloque de la lista contendrá ND - 1 direcciones de bloques libres y la dirección del siguiente bloque la lista. La principal ventaja de esta implementación consiste en que solo es necesario mantener simultá~ente en memoria principal un bloque de la lista enlazada. Cuando se necesitan bloques libres para ~gnárselos a un archivo se utilizan los apuntados por el bloque de la lista enlazada. Sólo cuando se agolos bloques libres a los que hace referencia dicho bloque es necesario cargar en memoria principal d siguiente bloque de la lista enlazada. Por otra parte, cuando se libera espacio asignado a un archivo, direcciones de los nuevos bloques libres son incluidas en el bloque de la lista enlazada cargado en emoria principal. Si un bloque de la lista ya no tiene capacidad para almacenar más direcciones de oques libres se escribe en el disco y se añade un nuevo bloque al principio de la lista. Ejemplo 9.13
Considérese una partición de disco duro que contiene NT = 227 bloques con un tamaño de bloque de _ KiB. El número n de bits que ocuparía la dirección de un bloque o número de bloque se calcularía olviendo la siguiente desigualdad:
Como NT = 227 entonces n = 27 bits. -upóngase que la lista de bloques libres se implementa como una lista enlazada. El número de direcciones bloques que se pueden almacenar en un bloque de disco se calcula de la siguiente forma: . /bl oque) ND= fl oor ( 2 (KiB /bloque) ) = fl oor ( 16384 (bitS/blOqUe)) = 606 (d·rreCClOnes 27 (bits/dirección) 27 (bits/dirección) las 606 direcciones de bloques que caben en un bloque hay que reservar una para almacenar la . ección del siguiente bloque que forma parte de la lista. Luego en cada bloque es posible almacenar las :fuecciones de 605 bloques libres. Nótese que estas 606 direcciones de bloque ocupan 16362 bits por lo e en cada bloque se desperdician 22 bits, lo que supone un 0,13 % del espacio del bloque. ?ara la partición de disco considerada suponiendo que todos los bloques de la partición están libres, lo :ual no es cierto ya que hay reservar espacio para las estructuras de datos del sistema de archivos incluida lista de bloques libres, el número de bloques NLE de que consta la lista enlazada de bloques libres se ::alcula de la siguiente forma:
368
Fundamentos básicos de los sistemas operativos
NLE = ce!'1 (
27
2 (direcciones) ) =221848 bl oques 605 (direcciones/bloque)
Multiplicando por el tamaño de un bloque se obtiene que el espacio que ocupa la lista enlazada de bloques libres en este caso es de 433,3 MiB. Obviamente la lista de bloques libres implementada como una li enlazada ocupa más espacio que cuando se implementa como un mapa de bits (ver Ejemplo 9.12). Sól cuando el disco está muy lleno y existen pocos bloques libres el tamaño de la lista enlazada es men que el de un mapa bits.
606 direcciones de disco
Bloque de disco nO96
Bloque de disco n° 97
97
98
85623
65249
8956
5489 89321
I I I I 33879 98
Figura 9.10 - Implementación de la lista de bloques libres mediante una lista enlazada En la Figura 9.10 se representan los dos primeros bloques de la lista enlazada que implementa la lista bloques libres de la partición considerada en este ejemplo. Se observa que el primer bloque de la . BF = 96, almacena la dirección del siguiente bloque que forma parte de la lista (el bloque BF = 97) _. dirección de dos bloques libres (BF = 85623 Y BF = 8956). Luego dicho bloque tiene todavía capaci para almacenar 603 direcciones de bloques libres. El primer bloque de la lista enlazada siempre se encuentra cargado en memoria principal para asignar rápidamente bloques de disco. Supóngase que se liberan 604 bloques, entonces el bloque BF = se escribiría en el disco y se añadiría un nuevo bloque al principio de la lista. La lista enlazada tendrí aspecto que se muestra en la Figura 9.11 . Ahora el primer bloque de la lista es el bloque BF = 95 y que se requiere que esté cargado en memoria principal. Nótese que se ha supuesto en este ejemplo que el sistema de archivos ya tiene reservados de antemano comienzo de la partición los bloques con los que se implementa la lista enlazada. Aunque también posible usar bloques libres ubicados en otras partes de la partición.
Gestión de archivos
--- ----
Bloque de disco nO 95
Bloque de disco n° 96
96
97
55841
I I I I
369
Bloque de disco n° 97
.....
98
85623
65249
8956
5489
45897
89321
I I I I
I I I I
45597
33879
10025
98
~
Figura 9.11 - Aspecto de la lista de bloques libres tras liberarse 604 bloques
.4.5. Implementación de directorios Un directorio es un archivo que almacena una lista de los archivos y subdirectorios que contiene. La información que almacena cada entrada de la lista depende de cada sistema de archivos, aunque en .: neral se suele almacenar el nombre del archivo y otras informaciones adicionales asociadas al archivo. Cuando se abre un archivo el sistema operativo cargar en memoria principal la entrada del directorio que 10 referencia para poder acceder a la información que contiene. Algunos sistemas de archivos, como por ejemplo FAT-32 de Windows, almacenan en cada entrada de un directorio el nombre de un archivo o subdirectorio y sus atributos (ver Figura 9.12a). Recuérdese que entre los atributos de -un archivo se incluye la información necesaria que permite localizar los bloques de datos del archivo. Otros sistemas de archivos, como por ejemplo UFS de UNIX o ext2 de Linux, almacenan en cada entrada de un directorio el nombre de un 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 (ver Figura 9.12b). Esta organización supone un acceso más al disco para copiar el nodo-i en memoria principal cuando se abre un archivo que si los atributos estuvieran directamente en la entrada del directorio, pero facilita la ompartición de archivos mediante enlaces. Los directorios se pueden implementar de diferentes formas, entre las implementaciones más comunes se encuentran las siguientes:
• Directorios con entradas de igual tamaño. Todas las entradas de un directorio poseen el mismo tamaño. En cada entrada de un directorio primero se almacenan las informaciones asociadas al archivo (atributos o número de nodo-i) y a continuación el nombre del archivo. La ventaja de esta implementación es que es sencilla de gestionar. Su principal inconveniente es que para dar soporte
370
Fundamentos básicos de los sistemas operativos
Bloque de datos de un directorio
Primer bloque de datos de un fichero
(a)
Bloque de datos de un directorio
I
Nombre N° nodo-i
Bloque de nodos-i
Primer bloque de datos de un fichero
V Atributos
(b)
Figura 9.12 - Diferentes contenidos de la entrada de un directorio: a) Nombre y atributos. b) Nombre y
número de nodo-i
a nombres de archivos largos (del orden de 255 caracteres) se requiere reservar en cada en el espacio máximo que puede ocupar el nombre. Esto supone un desperdicio de espacio ya normalmente la mayoría de los archivos no tienen nombres tan largos .
• Directorios con entradas de tamaño variable. Cada entrada del directorio tiene un determin tamaño. En cada entrada de un directorio primero se almacena el tamaño que ocupa la entrada _ continuación se almacenan las informaciones asociadas al archivo (atributos o número de nodoy finalmente se almacena el nombre del archivo que no puede superar un cierto tamaño m' . Al nombre del archivo se le añade un carácter especial, por ejemplo un 0, para marcar el final nombre. Además se añaden algunos caracteres de relleno para que el tamaño de una entrada sea número entero positivo de palabras de memoria principal. De este modo se evita que dentro de misma palabra haya información sobre dos entradas de directorios distintas, lo que complicaría administración de los directorios. La principal ventaja de esta implementación es que se reduce
Gestión de archivos
371
espacio desperdiciado dentro de un directorio, como máximo el tamaño desperdiciado por entrada puede ser de casi una palabra. Por otra parte un inconveniente de esta organización es que cuando se eliminan archivos de un directorio se crean huecos de longitud variable, lo que puede generar un problema de fragmentación externa a nivel de directorio, es decir, que exista espacio en el directorio pero cuando se desea añadir una nueva entrada no se pueda hacer porque ningún hueco tiene el tamaño suficiente. Dicho problema se puede solucionar realizando una compactación del directorio .
l.
• Directorios con entradas de igual tamaño y uso de un montículo (heap) para almacenar los nombres de los archivos. Cada entrada del directorio tiene el mismo tamaño, en ella se almacena un puntero al comienzo del nombre archivo dentro del montículo y las informaciones asociadas al archivo (atributos o número de nodo-i). Al final del directorio se almacena la estructura de datos de tipo montículo para almacenar de nombres de archivos. Dentro del montículo los nombres se almacenan de forma contigua incluyendo un carácter especial para marcar el final de un nombre de archivo. Esta implementación presenta como principal ventaja que elimina la fragmentación externa a nivel de directorio, por lo que si existen entradas libres siempre es posible añadir una nueva entrada al directorio. Además como las entradas son de tamaño fijo no es necesario incluir caracteres de relleno para que el tamaño de una entrada sea igual a un número entero de palabras. Su principal inconveniente es que las operaciones sobre el montículo, que básicamente son añadir o eliminar nombres de archivos de distinta longitud, complican la administración del directorio.
Ejemplo 9.14
upóngase un computador con un tamaño de palabra de la memoria principal de 32 bits, un sistema de archivos que soporta nombres de archivos de 255 caracteres ASCII, y un directorio que tiene dos entradas para los archivos tar y trabaj os. Los atributos (o el número de nodo-i) de cada archivo ocupan 64 bits. a) Si el directorio se implementa con entradas de igual tamaño (ver Figura 9.13a) entonces cada entrada debe tener el tamaño suficiente para poder alojar el nombre de archivo más largo posible, es decir, 255 caracteres. Como un carácter ASCII ocupa 1 byte entonces se dedicaran 255 bytes para almacenar el nombre de un archivo. A estos 255 bytes hay que sumar un byte adicional del carácter de fin de nombre (en este ejemplo un O) y 64 bits de los atributos. En consecuencia el tamaño de una entrada será de 255 + 1 + 8 = 264 bytes. Si se carga esta entrada del directorio en memoria principal ocupará 66 palabras. De las 66 palabras necesarias para la entrada asociada al archivo tar solamente contienen información útil 3 palabras, luego dicha entrada desperdicia 63 palabras (2016 bits). En el caso de la entrada asociada al archivo trabaj os se están desperdiciando 61 palabras (1952 bits). b) Si el directorio se implementa con entradas de tamaño variable (Figura 9 .13b), la entrada asociada al archivo tar ocuparía 4 palabras y la entrada asociada al archivo trabaj os ocuparía 6 palabras. En esta última entrada se desperdician 24 bits.
372
Fundamentos básicos de los sistemas operativos
32 bits ~
111
Atributos o n° de nodo-i
a
t
r
O Entrada del
32 bits
32 bits
> directorio
-
Tamaño entrada Entrada del ~ d· . lrectono
Atributos o n° de nodo-i Atributos o n° de nodo-i
t
a
r
Puntero a nombre
O
Atributos o nO de nodo-i
r--
Puntero a nombre
Tamaño entrada t
r
a
b
a
j
o
s
O
Atributos o n° de nodo-i
Entrada del > directorio t
r
a
b
a
J
o
s
}
Entrada del directorio
Atributos o nO de nodo-i
....
t
a
r
O
~
t
r
a
b
a
J
o
s
Montículo
I I I I L (a)
--'-
O
O (b)
(e)
Figura 9.13 - Posibles implementaciones de un directorio: a) Entradas de igual tamaño. b) Entradas de tamaño variable. e) Entradas de igual tamaño y montículo de nombres.
c) Si el directorio se implementa con entradas de igual tamaño y un montículo para los nomb (Figura 9. 13c), cada entrada ocuparía 3 palabras. El montículo con los nombres tar y traba j ocuparía 4 palabras y en él se desperdiciarían 24 bits. En general si un directorio se implementa con entradas de igual tamaño se desperdicia más espacio q si se implementa con entradas de tamaño variable o con entradas de igual tamaño y un montículo. embargo su administración es más simple. Por otra parte, si un directorio se implementa con entradas de igual tamaño y un montículo se evita existencia de fragmentación externa a nivel de directorio a diferencia de lo que ocurre con las entra de tamaño variable. Sin embargo su administración es más compleja. Otro aspecto a considerar en la implementación de los directorios está relacionado a la forma en el sistema operativo realiza la búsqueda de un archivo en un directorio. Una posible forma de búsqu
Gestión de archivos
373
onsiste en ir examinando una a una las entradas contenidas en un directorio, comenzando desde la primera, en busca de aquella entrada que contenga el nombre de archivo sobre el que desea operar un proceso. Esta búsqueda lineal es fácil de implementar, sin embargo consume mucho tiempo si en el directorio existen alojados cientos o miles de archivos. Para ahorrar tiempo algunos sistemas operativos mantienen una memoria caché software denominada caché de directorios con las entradas de los directorios recientemente accedidas. Cuando se tiene que buscar la entrada de un archivo determinado primero se busca en la caché. En caso de acierto se ahorra el tiempo de leer en disco el bloque de datos que contiene la lista del directorio y buscar dentro de la lista. Otra posibilidad para acelerar la búsqueda consiste en implementar cada directorio con una tabla hash (ver Apéndice B) y su lista de archivos y subdirectorios. La tabla hash tiene un tamaño de N entradas (ver Figura 9.14). Cada entrada de la tabla contiene un puntero a una entrada de la lista. Cuando se desea buscar un archivo en el directorio se introduce su nombre en una función hash que genera un valor
Entradas de un directorio
Tabla hash
o
Nombre Función hash
o
t--
Nombre Atributos Nombre Atributos
l+i
k
4
m
I (*) -.k
N-2
Nombre Atributos
(*) Entradas en las que se busca
N-l N
(*)
-.m
Nombre Atributos
Nombre Atributos
M-2
Nombre Atributos
M-l
Nombre Atributos
Figura 9.14 - Implementación de un directorio con una tabla hash para acelerar la búsqueda de archivos
374
Fundamentos básicos de los sistemas operativos
comprendido entre O y N-l . Dicho valor indica la entrada de la tabla hash que hay que leer. Si la entrada está vacía significa directamente que el archivo no está en el directorio. Si la entrada no está vacía hay que seguir el puntero contenido en la entrada de la tabla hash a la entrada correspondiente de la lista de archivos y comprobar que se corresponde con la del archivo buscado. Para tratar las colisiones que se pueden producir debido a que la función hash puede generar el mismo valor con diferentes nombres de archivos, cada entrada de la tabla hash se puede implementar como una lista enlazada. En dicho caso, en vez de comprobar una única entrada de la lista de archivos habrá que ir comprobando una a una las entradas a las que apunta la lista enlazada de la entrada de la tabla hash. Obviamente esto relantiza la búsqueda pero todavía sigue siendo mucho más rápida que una búsqueda lineal. El inconveniente que tiene implementar los directorios con tablas hash es que su administración es más complicada. Por ello solo es recomendable utilizarlas en sistemas en los que se espera que lo directorios contengan un número elevado de archivos.
9.4.6.
Consistencia
Cuando se abre un archivo el bloque que contiene la entrada de su directorio (y el bloque que contiene su nodo-i, si se utiliza esta estructura) tienen que ser copiados en memoria principal para que el sistema operativo disponga de toda la información que necesita para manipular adecuadamente dicho archivo. También cuando se lee o se escribe un bloque de datos de un archivo o directorio, éste debe ser carga previamente en memoria principal. Si se tiene que realizar alguna modificación del contenido de un bloque de disco, las modificacion se realizan en primer lugar sobre la copia del bloque cargada en memoria principal y en algún momen posterior se actualizan los contenidos de dicho bloque en memoria secundaria. Si se produjese algún fallo en el sistema, como una caída de tensión, antes de que los bloques de disco modificados en memoria principal fueran actualizados en memoria secundaria, el sistema de archivos podría quedar en un estado inconsistente. La situación puede ser especialmente problemática si inconsistencias corresponden a bloques de nodos-i, bloques con lista de directorios o los bloques de . de bloques libres. Para verificar la consistencia del sistema de archivos los sistemas operativos suelen incluir un ve .cador de consistencia que se suele ejecutar cuando se vuelve a arrancar el computador si el sistema no sido apagado de forma adecuada, por ejemplo, por haberse quedado colgado. También el administra del sistema puede ejecutar el verificador cuando lo considere oportuno. Dicho verificador informa de inconsistencias que detecta en el sistema de archivos y las corrige si le es posible. Las inconsisten . más frecuentes que se pueden presentar son las siguientes: • Un bloque no aparece en la lista de bloques libres y tampoco está asignado a ningún archivo. solución de esta inconsistencia consiste en añadir al archivo a la lista de bloques libres . • Un bloque figura en la lista de bloques libres y también está asignado a un archivo. La inco tencia se soluciona eliminando el bloque de la lista de bloques libres.
Gestión de archivos
375
• Un bloque figura varias veces en la lista de bloques libres. Esta inconsistencia solo se puede presentar en el caso de que la lista de bloques libres se implemente como una lista enlazada. Su solución pasa por reconstruir la lista de bloques libres dejando una única aparición del bloque . • Un bloque está asignado a N archivos con N > 1. Se trata de la peor inconsistencia posible. Una posible solución consiste en coger N - 1 bloques libres, copiar en ellos el contenido del bloque y asociar cada copia a un archivo. Así se recupera la consistencia del sistema de archivos aunque seguramente la información contenida en N - 1 de los archivos contendrá errores . • Ejemplo 9.15 IX dispone de un verificador de consistencia denominado f sck. Este verificador, entre otra acciones, construye una tabla de uso de bloques y una tabla de presencia en la lista de bloques libres. Ambas tablas tienen una entrada por cada bloque del sistema de archivos. Cada entrada de una tabla contiene un ontador. El verificador f sck lee uno a uno todos los nodos-i, a partir de los cuales determina los bloques usados por un determinado archivo. Cada vez que un número de bloque es referenciado por un nodo-i entonces e incrementa su contador de la tabla de uso de bloques. . continuación f sck examina la lista de bloques libres (lista enlazada o mapa de bits) para determinar qué bloques se supone que están libres. Si un bloque está libre incrementa su contador en su entrada de la tabla de presencia en la lista de bloques libres. Una vez construidas ambas tablas f sck examina para cada bloque j su contador Uj en la tabla de uso de bloques y su contador Lj en la tabla de presencia en la lista de bloques libres en busca de inconsistencias. Supóngase que el contenido de las tablas construidas por f sck para los bloques BF = 2000 a BF = 2007 es el que se muestra en la Figura 9.15. Se observa que los bloques BF = 2000,2001 , 2005 y 2007 no presentan inconsistencias ya que solo son usados por un único archivo (Uj = 1, Lj = O) o figuran una única vez en la lista de bloques libres (Uj = O, Lj = 1). Por otra parte los bloques BF = 2002, 2003, 2004 Y2006 presentan inconsistencias. El bloque BF = 2002 tiene sus contadores distintos de O en ambas listas, en concreto (Uj La inconsistencia se soluciona eliminando el bloque de la lista de bloques libres. El bloque BF = 2003 tiene su dos contadores nulos (Uj añadiendo el archivo a la lista de bloques libres.
= O, Lj = O).
= 1, Lj = 1).
La inconsistencia se soluciona
El bloque BF = 2004 tiene su contador en la tabla de bloques en uso mayor que la unidad, en concreto Uj = 3, lo que significa que es referenciado por tres archivos distintos. Una posible solución consiste en oger 2 bloques libres, copiar en ellos el contenido del bloque y asociar cada copia a un archivo. Así se recupera la consistencia del sistema de archivos aunque seguramente la información contenida en dos de los archivos contendrá errores. Finalmente el bloque BF = 2006 tiene su contador en la tabla de presencia en la lista de bloques libres mayor de la unidad, en concreto Lj = 2. La solución de esta inconsistencia pasa por reconstruir la lista bloques libres dejando una única aparición del bloque.
376
Fundamentos básicos de los sistemas operativos
BF
2000
o
1
2001
1
O
2002
1
1
2003
O
O
2004
3
O
2005
1
O
2006
O
2
2007
1
O
Tabla de uso Tabla de presencia de bloques en la lista de bloques libres Figura 9.15 - Contenido asociado a los bloques BF = 2000 a BF = 2007 de la tabla de uso de bloques y la tabla de presencia en la lista de bloques libres construidas por fsck en el Ejemplo 9.15
El programa f sck aparte de realizar una verificación de la consistencia a nivel de bloque también realiz.¡ una verificación de la consistencia a nivel de directorios. Para ello crea una tabla de uso de archiv con una entrada que almacena un contador para cada nodo-i. fsck va comprobando todos las entra de los directorios comenzando desde el directorio raíz e incrementa el contador asociado a un ncxJ<>,i cada vez que una entrada de un directorio referencia a dicho nodo-i. Recuérdese que en UNIX permite la existencia de enlaces duros, por lo que un mismo nodo-i puede ser referenciado desde distin directorios. Una vez completada la tabla, lee el contador de enlaces duros ubicado en cada nodo-i y lo compara el contador de su entrada asociada en la tabla creada. Si el sistema de archivos se encuentra en es consistente a nivel de directorios, ambos contadores deben ser iguales. Asimismo se pueden presentar posibles inconsistencias. El primer tipo de inconsistencia se produce si el valor del contador de enla de un nodo-i es mayor que el contador de su entrada asociada en la tabla de archivos en uso creada f sck. En este caso puede llegar a suceder que el nodo-i siga estando asignado aunque todas las entra de directorios que hacen referencia a dicho nodo-i sean borradas, con lo que se estaría desperdici espacio. El segundo tipo de inconsistencia se produce cuando el valor del contador de enlaces de un nodo-i menor que el contador de su entrada asociada en la tabla de archivos en uso creada por fsck. En
Gestión de archivos
377
caso puede llegar a suceder que existan todavía entradas en directorios que hacen referencia al archivo al que está asociado el nodo-i, pero el contador de enlaces duros del nodo-i alcance el valor O con lo que el nodo-i y los bloques que ocupaba el archivo son marcados como libres y pueden ser asignados a otros archivos. Ambos tipos de inconsistencias se solucionan asignando al contador de enlaces duros del nodo-i el valor del contador de la tabla de archivos en uso creada por f sck.
•
El principal inconveniente de los verificadores de consistencia radica en que requieren un tiempo no despreciable de ejecución, ya que examinan de principio a fin todas las estructuras de datos de un sistema de archivos. La mayoría de los sistemas de archivos modernos como NTFS de Windows, ext4 de Linux y HFS+ de Mac-OS para evitar el uso de verificadores implementan la técnica conocida como registro por diario (journaling), que consiste en que el sistema operativo genera un informe con las operaciones que tiene que realizar sobre el sistema de archivos antes de realizarlas. Dicho informe se almacena en un área reservada de la partición de disco denominada diario (journal). Una vez que el informe ha sido escrito en el diario se comienzan a realizar las operaciones planificadas. Cuando dichas operaciones han sido ompletadas el informe se borra. Si se produce algún fallo antes de que se puedan completar todas las operaciones planificadas, cuando se reinicia el sistema operativo éste lee el diario para comprobar si existe un informe. En caso afirmativo se repiten una a una todas las operaciones para que el sistema de archivos quede de nuevo en un estado consistente.
9.5.
Recuperación de archivos
9.5.1.
Copias de seguridad
En previsión de que los sistemas de archivos queden en un estado inconsistente irrecuperable o que sea destruido totalmente debido a un fallo del disco o cualquier otro desastre (incendio, caída, borrao accidental de archivos importantes, etc) es muy recomendable realizar copias de seguridad de los si temas de archivos. Las copias de seguridad se suelen realizar por un programa de aplicación, a petición del administrador o el usuario, sobre cintas magnéticas, discos duros portátiles o varios discos ópticos regrabables. Para mayor seguridad es recomendable ir cambiando el medio de respaldo donde se realiza la copia de seguódad ya que éste se va desgastando con el uso. Además las copias de seguridad deben almacenarse en una ubicación que garantice que no se verán afectadas por el mismo desastre que el sistema de archivos original. 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 en el medio de respaldo. Permite acceder a dichos contenidos de forma individualizada, con lo que si se ha borrado un cierto archivo del sistema de archivos se puede recuperar fácilmente de la copia de seguridad (si fue incluido en ella). Las copias de seguridad lógicas pueden ser de tres tipos:
378
Fundamentos básicos de los sistemas operativos
- Copia completa. Contiene todos los archivos seleccionados por el administrador o el usuario. - Copia diferencial. Contiene únicamente los archivos que han sido creados o modificado_ desde una última copia completa determinada. - Copia incremental. Contiene únicamente los archivos que han sido creados o modificad _ desde la última copia de seguridad completa o incremental. La realización de una copia incremental requiere de menos tiempo que la realización de una copi completa o una copia diferencial. Sin embargo para recuperar los archivos a partir de una copo incremental determinada X se requieren, además del archivo de X, los archivos de las copias incrementales anteriores a X y el archivo de la copia completa a partir de la cual se hizo la prime copia incremental. En general se suele recomendar hacer copias completas cada cierto tiempo . copias incrementales o diferenciales diariamente .
• Copia de seguridad física. También conocida como imagen de disco. Consiste en copiar uno a cada uno de los bloques físicos de la partición de disco donde se ubica el sistema de archivos en e medio de respaldo elegido para contener la copia de seguridad o imagen del disco. Las copias seguridad físicas son más simples y rápidas de realizar que las copias lógicas completas de todo sistema de archivos, sin embargo son menos flexibles ya que para poder recuperar un archivo particular es necesario restaurar o montar toda la imagen. Puesto que la realización de una copia de seguridad consume recursos del computador y lleva tiempo no despreciable, se suele hacer cuando no se requiere utilizar el sistema informático. Si el siste informático debe estar siempre disponible entonces conviene realizarlas en el horario de menor activi U n aspecto a considerar a la hora de realizar una copia de seguridad es si se desea comp · . Si se comprime la copia de seguridad ocupa menos espacio en el medio de respaldo. Sin embargo comprensión ralentiza el proceso de realización de la copia de seguridad. Además existe el peligro que un error de escritura en el medio de respaldo haga que se no se pueda descomprimir posteriorme la copia compriniida.
9.5.2.
Instantáneas
Algunos sistemas de archivos, como por ejemplo ZFS de Solaris, utilizan un modelo de funci miento basado en la técnica de copiar al escribir (copy-on-write). Según este modelo, cuando el siste operativo necesita modificar el contenido de un bloque en el disco, en primer lugar localiza un bloque bre y copia el contenido modificado en dicho bloque, y a continuación modifica los punteros en mem principal que apuntaban al bloque antiguo de tal forma que referencien al bloque nuevo. Puesto que estos punteros también se encuentran en las estructuras de control del sistema de archÍ\ en el disco, los bloques correspondientes tendrán que ser posteriormente reescritos siguiendo la política. La reescritura de estas estructuras de control consume cierto tiempo, por este motivo el si operativo agrupa las modificaciones y las realiza cada cierto periodo de tiempo preestablecido (un \ típico es de 30 segundos). Cada una de las modificaciones de las estructuras de control se etiqueta un número de versión diferente basado en el tiempo de modificación de las mismas.
Gestión de archivos
379
De esta forma, la versión actual del sistema de archivos coexiste con las versiones anteriores del mismo. Cada vez que el número de versión actual se modifica se crea una nueva versión del sistema de archivos denominada instantánea (snapshot). Cada instantánea permite acceder al estado del sistema de archivos en el instante de tiempo de su creación. Las instantáneas pueden montarse como un sistema de archivos de solo lectura para recuperar datos individualmente o bien pueden montarse en modo de escritura restaurando así el sistema de archivos completo a un estado anterior. Es importante destacar que una instantánea no es una copia de seguridad. Las diferencias fundamentales entre ambas son las siguientes: • Las instantáneas se toman de forma prácticamente inmediata y no ocupan espacio en el momento de su creación. Tomar una instantánea solo requiere cambiar el número de versión actual. Además no se copia ningún bloque de disco hasta que sea necesario modificarlo. • Las instantáneas pueden ser restauradas con gran rapidez. Para ello basta con volver a montar el sistema de archivos a partir de la versión anterior del sistema que se encuentra en el disco. Esto proporciona un mecanismo de recuperación frente a fallos muy eficiente. Por el contrario, la restauración de una copia de seguridad requiere en general mucho tiempo ya que obliga a reescribir completamente todos los archivos que se encuentren en la copia. • Las instantáneas residen en el mismo disco físico que los datos que respaldan. De este modo si el disco se daña se perderá el acceso a las instantáneas y no podría restaurarse el sistema de archivos. Por este motivo las instantáneas deben complementarse copias de seguridad que almacenen los datos en un medio físico de respaldo separado que pueda utilizarse en caso de desastre.
9.6. Eficiencia La velocidad de acceso al disco duro es varios órdenes de magnitud más pequeña que la velocidad e acceso a memoria principal. El uso del sistema de archivos produce accesos al disco duro para leer o escribir bloques del disco que contienen las estructuras de datos del sistema de archivos (superbloque, . ta de bloques libres, nodos-i, . . . ) Y los datos de directorios y archivos. La eficiencia del sistema aumenta notablemente si se reduce al mínimo imprescindible el número de cesas de E/S a disco. Para intentar lograr este objetivo muchos sistemas operativos implementan en memoria principal una caché de buffers de bloques de disco (ver sección 8.4.3). Cuando se necesita ceder a un bloque de disco, el sistema operativo comprueba en primer lugar si existe una copia del laque en la caché de bloques. En caso de acierto se ahorra un acceso al disco. Una estrategia para mejorar la tasa de aciertos de la caché de bloques de disco es la lectura por adelantado de bloques que consiste en copiar en la caché no solo el bloque que ha producido un fallo sino varios bloques contiguos a éste, en previsión de que próximamente se tenga que acceder a ellos. ta estrategia solo resulta de utilidad en el caso de archivos de acceso secuencial, pero no en el caso de chivos de acceso aleatorio. Para mejorar la eficiencia del sistema, aparte de disminuir todo lo posible el número de accesos disco, también se puede intentar que los accesos a disco consuman poco tiempo. Recuérdese que el
/'
380
Fundamentos básicos de los sistemas operativos
factor que más influía en el tiempo de acceso a disco era el tiempo de posicionamiento de las cabezas de lectura/ escritura en el cilindro de disco que contiene los sectores del bloque que se desea leer o escribir. Una estrategia para reducir el movimiento de las cabezas de lectura escritura consiste en almacenar en e mismo cilindro o en cilindros cercanos los bloques a los que se espera acceder de forma secuencial. También en el caso de sistemas que utilizan nodos-i la lectura de un archivo en disco requiere n solo leer sus bloques de datos en disco sino también una lectura adicional al principio de la operaci ' para leer el nodo-i asociado al archivo, ya que esta estructura de datos contiene la información sobre ubicación del archivo en el disco. Usualmente los nodos-i se suelen almacenar en la zona más exte de la partición del disco. Si los bloques de datos del archivo están cercanos a su nodo-i se reduciría e movimiento de las cabezas del disco, por ello sería más conveniente almacenar los nodos-i en la zo central. Otro aspecto que afecta a la eficiencia del sistema es el tamaño del bloque de disco que se va a utilizar Si el tamaño de bloque es muy pequeño un archivo puede ocupar muchos bloques, lo que aumen el número de accesos al disco. Sin embargo la fragmentación interna dentro de un bloque será m _ pequeña con lo que se reduce el desperdicio de espacio. Por otra parte si el tamaño de bloque es ID _ grande un archivo constará de pocos bloques y se reduce el número de accesos, pero por el contrario fragmentación interna será grande desperdiciando mucho espacio. En consecuencia, el tamaño de bl debe ser un compromiso entre el espacio en disco desperdiciado y el número de bloques que se requie para almacenar un archivo. Diversos estudios han puesto de manifiesto que el tamaño óptimo de bl debe ser de unos pocos KiB.
9.7.
Resumen
Un archivo ofichero se puede definir como un conjunto de información relacionada que se alma en memoria secundaria y se identifica con un nombre. El programa que crea el archivo especifi tipo de información que va a contener un archivo. Los archivos regulares y directorios son dos tipos archivos soportados por varios sistemas operativos. Un directorio es un archivo que almacena una lis archivos y subdirectorios, y un archivo regular es un archivo ASCII (compuesto de líneas de carac ASCII codificados en binario que no requieren un programa que los interprete) o un archivo h mnn.i (contiene información de cualquier tipo codificada en binario que necesita un programa intérprete). Los atributos de un archivo son elementos que contiene información relativa al archivo, como ejemplo: tipo de archivo, tamaño, localización, usuario propietario, permisos de acceso, e . asociada al tiempo. En relación a la estructura interna, la información contenida en un archivo puede tructurarse de las siguientes formas: secuencia de bytes, secuencia de registros y registros indexado . otro lado, existen diferentes métodos de acceso para acceder a la información que contiene un " r rtmu_ entre los que cabe señalar el acceso secuencial y el acceso aleatorio. Los sistemas operativos DfC)OOIO. nan diferentes llamadas al sistema para poder operar sobre los archivos. Entre las operaciones que se pueden realizar sobre un archivo se encuentran las siguientes: crear, abrir, posicionarni búsqueda, leer, escribir, renombrar, cerrar y borrar. Un directorio almacena una lista de archivos y subdirectorios. Las estructuras de directorios
Gestión de archivos
381
comunes son las siguientes: • Estructura de directorios de un único nivel. Consiste en un único directorio que contiene todos los archivos existentes. • l!structura de directorios de dos niveles. Consiste en un directorio raíz que almacena una lista de directorios, uno por cada usuario. • Estructura de árbol de directorios. Se caracteriza porque la lista almacenada en cada directorio, independientemente de su ubicación, puede contener entradas de otros directorios y archivos. De esta forma se pueden crear múltiples niveles de directorios. • Estructura de gráfica acíclica. Similar a la estructura de árbol pero permite además que un mismo archivo o directorio pueda ser referenciado por dos o más directorios diferentes siempre que no se produzcan ciclos. La compartición de archivos se implementa mediante el uso de enlaces, los cuales pueden ser de dos tipos: duros y símbólicos. Un enlace duro es una copia total o parcial de la entrada del directorio asociada al archivo o subdirectorio que se desea compartir. Por su parte, un enlace simbólico es un tipo especial de archivo que contiene el nombre de ruta del archivo o subdirectorio compartido, es decir, la ubicación del archivo dentro de la estructura de directorios. El nombre de ruta puede ser absoluto, si contiene el nombre de todos los directorios a los que hay que acceder hasta llegar al archivo comenzando por el directorio raíz, o puede ser relativo, si especifica la ubicación del archivo comenzando desde el directorio de trabajo del usuario.
Al igual que sucede con los archivos, los sistemas operativos también proporcionan llamadas al istema para operar sobre los directorios. Entre las operaciones básicas que se pueden realizar sobre un directorio se encuentran las siguientes: crear, borrar, abrir, cerrar, leer, renombrar, enlazar y desenlazar. Los archivos se almacenan en los diferentes dispositivos de almacenamiento secundario (discos magnéticos, discos ópticos, cintas, etc.) de acuerdo con un determinado esquema de almacenamiento denominado sistema de archivos. Este esquema no es único, por lo que es posible distinguir diferente número y tipos de sistemas de archivos (FAT-32, NTFS, ZFS, ext4, HFS, ISO 9660, etc). Por ejemplo, en un mismo disco duro pueden existir varias particiones cada una de las cuales puede contener un sistema de archivos. También en CD-ROM o en un DVD-ROM existe otro sistema de archivos. La estructura de un sistema de archivos depende de cada tipo de sistema de archivos en particular, pero de forma general se suelen distinguir en la misma las siguientes áreas : bloque de arranque, estructura e datos con metadatos del sistema de archivos, estructura de datos con información sobre los bloques libres en el sistema de archivos, estructura de datos para localizar los bloques asignados a los archivos, y área de datos. Cuando se instala un sistema operativo en un computador éste crea en una partición del disco duro, realizando un formateo a alto nivel, un determinado tipo de sistema de archivos. Aparte de este sistema de archivos principal, cada sistema operativo es capaz de reconocer y manipular otros sistemas de archivos el mismo o distinto tipo que el sistema de archivos principal. El montaje de los sistemas de archivos es realizado por el sistema operativo cuando se arranca el sistema operativo y cuando éste detecta un nuevo dispositivo de memoria secundaria conectado al computador.
(
382
Fundamentos básicos de los sistemas operativos
Un aspecto importante en el diseño de un sistema de archivos es establecer la forma en que asignarán a los archivos los bloques físicos del área de datos del sistema. Existen diferentes método asignación del espacio del disco, cada uno con sus ventajas y sus inconvenientes. Los más comunes • Asignación continua. Consiste en asignar a un archivo un conjunto de bloques físicos contiguo . • Asignación enlazada. Consiste en almacenar al principio de cada bloque físico asignado a archivo la dirección física del siguiente bloque del archivo. • Asignación indexada. Consiste en almacenar en una estructura de datos denominada nodo índi (nodo-i) los atributos de un archivo y las direcciones físicas de los primeros bloques de un archÍ\ También se almacenan las direcciones físicas de uno o varios bloques de indirección simple, d o triple. Otro aspecto importante en el diseño de un sistema de archivos es la localización del espacio del área de datos del sistema. Para esta función se utiliza una estructura de datos que se suele deno lista de bloques libres, que se puede implementar como una lista enlazada o como un mapa de bits. Asimismo, otro aspecto a considerar en el diseño de un sistema de archivos es la implementación los directorios. La información que almacena cada entrada de la lista almacenada en un bloque de .perteneciente a un directorio depende de cada sistema de archivos, aunque en general se suele almaa!nar el nombre del archivo y otras informaciones adicionales asociadas al archivo. Algunos sistemas archivos, almacenan en cada entrada de un directorio el nombre de un archivo o subdirectorio y sus butos. Recuérdese que entre los atributos de un archivo se incluye la información necesaria que pe localizar los bloques de datos del archivo. Otros sistemas de archivos almacenan en cada entrada de directorio el nombre de un archivo o subdirectorio y un puntero a la estructura de datos (nodo-i) se almacenan los atributos del archivo. Los directorios se pueden implementar de diferentes formas, entre las implementaciones más e nes se encuentran las siguientes: directorios con entrada de igual tamaño, directorios con entradas tamaño variable, directorios con entradas de igual tamaño y uso de un montículo para almacenar nombres de los archivos. Cuando se abre un archivo el bloque que contiene la entrada de su directorio (y el bloque que con su nodo índice, si se utiliza esta estructura) tienen que ser copiados en memoria principal para sistema operativo disponga de toda la información que necesita para manipular adecuadamente archivo. También cuando se lee o se escribe un bloque de datos de un archivo o directorio, éste debe cargado previamente en memoria principal. Si se tiene que realizar alguna modificación del CUIllel¡JJa. de un bloque de disco, las modificaciones se realizan en primer lugar sobre la copia del bloque CaJ'glIIIIIlI en memoria principal y en algún momento posterior se actualizan los contenidos de dicho bloque memoria secundaria. Si se produjese algún fallo en el sistema, como una caída de tensión, antes de q bloques de disco modificados en memoria principal sean actualizados en memoria secundaria, el SlSllCB. de archivos puede quedar en un estado inconsistente. Para detectar y corregir las posibles mc:onslsteIJIIC:a. se ejecuta un programa denominado verificador de consistencia. También para tratar las mc:onslstelllOl. algunos sistemas de archivos soportan la técnica denominada registro por diario (journalist).
Gestión de archivos
383
En previsión de que los sistemas de archivos queden en un estado irrecuperable o que sea destruido totalmente debido a un fallo del disco o cualquier otro desastre es muy recomendable realizar copias de seguridad de los sistemas de archivos. Existen dos tipos de copias de seguridad: copia lógica, que solo copia los contenidos del sistema de archivo que el administrador o usuario desean copiar, y copia física (imagen de disco) que copia uno a uno cada uno de los bloques físicos de la partición de disco donde se ubica· el sistema de archivos. Una forma de reducir al mínimo el número de accesos a disco necesarios en la gestión de archivos y mejorar así la eficiencia de un sistema informático es usar una caché de buffers de bloques de disco. Para mejorar la tasas de aciertos de la caché, se emplea la estrategia de lectura por adelantado de bloques.
9.8.
Lecturas recomendadas
Si se desea obtener una explicación adicional de los contenidos tratados en este capítulo se pueden consultar, por ejemplo: el capítulo 4 de [Tanenbaum, 2009], el capítulo 11 de [Silberschatz et. al, 2002], el capítulo 12 de [Stallings, 2005] y el capítulo 11 de [Nutt, 2006].
9.9. Autoevaluación 9.1. ¿Qué es el subsistema de gestión de archivos? (Respuesta en sección 9.1) 9.2. ¿Qué es un archivo? ¿Y un directorio? (Respuesta en sección 9.2.1) 9.3. ¿Qué diferencia hay entre un archivo binario y un archivo ASCII? (Respuesta en sección 9.2.1)
9.4. Enumerar los atributos de un archivo más frecuentemente mantenidos por un sistema operativo. (Respuesta en sección 9.2.2)
9.5. Enumerar y explicar brevemente las posibles formas en que se puede estructurar la información contenida en un archivo. (Respuesta en sección 9.2.3) 9.6. Enumerar y explicar brevemente los diferentes métodos para acceder a la información contenida en un archivo. (Respuesta en sección 9.2.4)
9.7. ¿En qué consiste la estructura de directorios de dos niveles? (Respuesta en sección 9.3.1) 9.8. Describir la estructura de árbol de directorios. (Respuesta en sección 9.3.1) 9.9. Explicar las diferencias entre un nombre de ruta absoluto y un nombre de ruta relativo. (Respuesta en sección 9.3.1) 9.10. Explicar el significado de las entradas "." y ".. " de un directorio. (Respuesta en sección 9.3.1)
9.11. ¿Qué ventaja ofrece la estructura de directorios de gráfica acíclica frente a la de árbol? (Respuesta en sección 9.3.1)
384
Fundamentos básicos de los sistemas operativos
9.12. Explicar la diferencia entre un enlace duro y un enlace simbólico. (Respuesta en sección 9.3.1) 9.13. ¿Qué define un sistema de archivos? ¿Pueden existir diferentes sistemas de archivos en un mis disco duro? (Respuesta en sección 9.4)
9.14. Enumerar y describir brevemente las diferentes áreas que se distinguen de forma general en estructura de un sistema de archivos. (Respuesta en sección 9.4.1)
9.15. Explicar brevemente en qué consiste el montaje de un sistema de archivos y cuándo se realiza. (Respuesta en sección 9.4.2)
9.16. ¿Qué ventajas e inconveniente tiene el método de asignación contigua de espacio de disco? (Respuesta en sección 9.4.3)
9.17. Describir el método de asignación de espacio de disco conocido como asignación enlazada. ¿C . les son sus ventajas e inconvenientes? (Respuesta en sección 9.4.3)
9.18. ¿Qué es una tabla de asignación de archivos o FAT? Señalar las principales ventajas e incon nientes de su uso. (Respuesta en sección 9.4.3)
9.19. Describir el método de asignación de espacio de disco conocido como asignación indexada, ¿C les son sus ventajas e inconvenientes? (Respuesta en sección 9.4.3)
9.20. ¿Qué es un nodo índice? (Respuesta en sección 9.4.3) 9.21. Enumerar diferentes implementaciones de una lista de bloques libres y sus principales venta' (Respuesta en sección 9.4.4)
9.22. ¿Qué información se suele almacenar de forma general en una entrada de un directorio? (Respuesta en sección 9.4.5)
9.23. Señalar y describir brevemente tres formas diferentes de implementación de directorios. (Respuesta en sección 9.4.5)
9.24. Señalar y describir brevemente diferentes formas de búsqueda de un archivo en un direct (Respuesta en sección 9.4.5)
9.25. ¿Cómo se puede verificar la consistencia de un sistema de archivos ? (Respuesta en sección 9.4.6 9.26. Enumerar diferentes tipos de inconsistencias que se pueden dar en un sistema de archivos y , se pueden solucionar. (Respuesta en sección 9.4.6)
9.27. ¿En qué consiste la técnica de registro por diario (journaling)? (Respuesta en sección 9.4.6) 9.28. ¿Qué diferencia existe entre copia de seguridad física y una copia de seguridad lógica? (Respuesta en sección 9.5.1)
Gestión de archivos
385
9.29. Describir los diferentes tipos de copias de seguridad lógicas que se pueden realizar. (Respuesta en sección 9.5.1) 9.30. ¿Qué es una instantánea (snapshot)? (Respuesta en sección 9.5.2) 9.31. .¿Qué diferencias existen entre una instantánea y una copia de seguridad? (Respuesta en sección 9.5.2) 9.32. Señalar tres formas de reducir el número de accesos a disco asociados a la gestión de archivos. (Respuesta en sección 9.6)
9.10. Problemas 9.1. Considérese la estructura de árbol de directorios de la Figura 9.3. Supóngase que los componentes de un nombre de ruta se separan usando el carácter "/" como separador, el primer separador que aparece en una ruta absoluta designa al directorio raíz.
a) Si el directorio de trabajo es / paco _ m/ cartas , ¿cuál sería el nombre de ruta absoluta para el archivo cuyo nombre de ruta relativa es .. /f otos/sol. gif? b) Una entrada de un directorio contiene el nombre de un archivo o subdirectorio y su número de nodo-i. Determinar el número de lecturas en disco que es necesario realizar para buscar y copiar en memoria principal el nodo-i del archivo cuyo nombre de ruta absoluta es /paco _mi cartas/ carta. txt. Suponer que únicamente el nodo-i del directorio raíz ya está cargado en memoria principal. Suponer además que la lista de entradas de un directorio cabe en un solo bloque de disco. 9.2. Un sistema operativo maneja un tamaño de bloque físico de SB bits. La dirección de un bloque físico requiere d bits. La partición de disco donde se monta el sistema de archivos principal está compuesta de NB bloques, F de los cuales están libres. Determinar la condición que se debe cumplir para que la lista de bloques libres implementada como una lista enlazada ocupe menos bloques de disco que si fuera implementada como un mapa de bits. 9.3. El sistema de archivos FAT-12 desarrollado para el sistema operativo MS-DOS tiene la siguiente estructura dentro de una partición: bloque de arranque, tabla de asignación de archivos (FAT) , copias de la FAT, clusters asociados al directorio raíz y área de datos. Cada entrada de la FAT ocupa 12 bits para especificar la dirección de un cluster de bloques o el estado de dicho cluster. Las direcciones FFO a FF6 son direcciones de clústeres reservados por el sistema de archivos (como por ejemplo para los clusters del directorio raíz que no se encadenan mediante la FAT). La dirección FF7 indica que un cluster está defectuoso y la dirección 000 que un cluster está libre. Además, las direcciones FF8-FFF indican el último cluster de un archivo. El resto de direcciones se pueden usar para especificar los clusters donde continúan los datos de un archivo o de un directorio Si el sistema operativo utiliza un tamaño de cluster de 2 KiB determinar el tamaño máximo que puede tener un archivo.
386
Fundamentos básicos de los sistemas operativos
9.4. En el sistema de archivos FAT-12 desarrollado para MS-DOS una entrada de un directorio ti la siguiente estructura comenzando por los bytes más significativos: nombre del archivo (8 byt extensión del archivo (3 bytes), atributos del archivo (1 byte), espacio reservado (10 bytes), hora _ bytes) y fecha (2 bytes) de creación o de la última modificación del archivo, dirección del p . bloque del archivo (2 bytes) y el tamaño del archivo (4 bytes). a) Determinar el número de entra de directorio que caben en un cluster de 2 KiB. b) Determinar la precisión de la hora de crea ' o modificación de un archivo almacenada en una entrada de un directorio. 9.5. En un cierto sistema de archivos una entrada de un directorio tiene la siguiente estructura co zando por los bytes más significativos: número de nodo-i (2 bytes) y nombre del archivo (14 b Un nodo-i tiene un tamaño de 64 bytes y entre otras informaciones (atributos) contiene nueve teros directos a bloques de datos, un puntero a un bloque de indirección simple, y un puntero a bloque de indirección doble. El sistema operativo considera un tamaño de bloque físico de 1 ~ Y utiliza 3 bytes para especificar la dirección o número de un bloque físico. Además O no es número de nodo-i válido. a) Calcular el número máximo de archivos que pueden existir en una partición de disco tenga instalada este sistema de archivos. b) Determinar los números de los bloques de datos a los que se puede acceder con los 11 teros contenidos en un nodo-i. c) Supuesto que el sistema operativo ha leído ya el nodo-i de un determinado archivo en me ria principal, determinar el número de lecturas a disco que se requerirán para leer su bl de datos: i) 325. ii) 605.
Capítulo 10
Seguridad y protección Objetivos docentes Los objetivos docentes de este capítulo son los siguientes: • Conocer de forma general cuáles son los principales objetivos y políticas de seguridad de un sistema informático. • Conocer las principales técnicas de autenticación de usuarios que se utilizan para conceder el acceso a un sistema informático. • Conocer las características de los diferentes tipos de software malicioso existentes. • Conocer los mecanismos de protección que implementa el sistema operativo. • Saber en qué consiste el modelo de protección por matriz de accesos y sus dos implementaciones más comunes: las listas de acceso y las listas de capacidades. • Conocer los principios que debe cumplir un sistema operativo para ser considerado seguro o confiable .
.1.
Introducción
Los sistemas informáticos se usan principalmente para almacenar información y poder realizar dintes operaciones y transacciones sobre la misma. En muchos casos la información que usan es conncial, por ejemplo, expedientes médicos, cuentas bancarias, planos de nuevos diseños o estrategias erciales, nuevas creaciones intelectuales, etc. Obviamente dicha información solo debe poder ser ultada y modificada por los usuarios autorizados. Los sistemas informáticos deben garantizar la confidencialidad y la integridad de la información que tienen, así como la adecuada prestación de sus servicios a los usuarios autorizados. Para garantizar 387
388
Fundamentos básicos de los sistemas operativos
su seguridad frente a las posibles amenazas (errores humanos, accidentes o desastres, ataques de al.':: intruso humano o software malicioso) se deben definir políticas e implementar mecanismos de seguri Las políticas establecen lo que se hará y los mecanismos cómo se hará. En ocasiones se habla de seguridad O de protección de un sistema informático de forma sinó . Sin embargo el término seguridad de un sistema informático suele ser más general ya que invol consideraciones legales, políticas, administrativas y técnicas. Mientras que es habitual reservar el té protección del sistema informático para referirse a aspectos internos del sistema, como los mec ...... .u·~_ de protección que suministra el sistema operativo. La seguridad de los sistemas informáticos constituye una materia en sí misma, y su estudio en p didad está fuera del alcance y objetivos de este texto. En este capítulo se realiza una breve introducci ' tema haciendo especial hincapié en aquellos contenidos que involucran al sistema operativo. En lugar se realizan unas consideraciones generales acerca de los objetivos y las políticas de segurid un sistema informático. En segundo lugar se describen las principales técnicas de autenticación de rios que son necesarias para conceder acceso al sistema únicamente a los usuarios autorizados. En lugar se describen los principales tipos de software malicioso existentes. En cuarto lugar se Qe:~crLDC:. los mecanismos de protección del sistema operativo, se introduce el modelo de protección por matriz accesos y sus dos implementaciones más comunes: las listas de acceso y las listas de capacidad parte final del capítulo está dedicada a describir las características que debe cumplir un sistema p considerado seguro o confiable.
10.2.
Seguridad de un sistema informático
10.2.1.
Objetivos de la seguridad
Un sistema informático, desde el punto de vista de la seguridad, debe cumplir los siguientes OOli ~L_ • Confidencialidad. Los datos almacenados en un sistema informático solo deben ser leía aquellos usuarios autorizados por el usuario propietario de los datos. • Integridad. El contenido de los datos almacenados en un sistema informático únicamente ser modificados por su propietario y por los usuarios autorizados por él. Entre las mC)(111tJ.c,lCK_ posibles se incluyen las operaciones de escritura, borrado, cambio de estado y creación. • Disponibilidad. Los recursos del sistema deben encontrarse disponibles para los usuario zados.
Los objetivos anteriores establecen los tres principales peligros que pesan sobre la seguridad sistema informático: robo de información, manipulación o destrucción de información y denegaci ' servicio a usuarios autorizados. La seguridad de un sistema informático requiere que el sistema se encuentre en un estado seguro. implica, por una parte, evitar la exposición a situaciones de peligro, y por otra, disponer de u",,,Qjut..:lo.... para protegerse de los mismas. Un sistema informático se considera que se encuentra en un estado
Seguridad y protección
389
. us recursos hardware y software son accedidos y utilizados únicamente por los usuarios autorizados según una política de seguridad preestablecida.
0.2.2. Políticas de seguridad Las políticas de seguridad aplicadas a un sistema informático fijan el conjunto de reglas que especi-can: qué usuarios pueden acceder al sistema y bajo qué restricciones, cómo se puede leer y escribir la fuformación del sistema, y cuáles son los flujos de información permitidos dentro del sistema. En general las políticas de seguridad seleccionadas suelen basarse en el principio del mínimo privi'gio, es decir, cada usuario debe tener los mínimos derechos de acceso necesarios para completar las eas que está autorizado a realizar. Las políticas de seguridad de los sistemas informáticos se pueden agrupar en dos categorías: control 'e acceso discrecional y control de acceso obligatorio. Las políticas de seguridad de control de acceso discrecional son definidas por el propietario de un recurso y especifican cuáles son los derechos de acceso de los restantes usuarios a dicho recurso. Por ejemplo, en UNIX se pueden especificar permisos de lectura, escritura y/o ejecución sobre un archivo de orma independiente para el usuario propietario, el grupo de usuarios propietario y el resto de usuarios. Las políticas de seguridad de control de acceso obligatorio son definidas a nivel de diseño del sistema regulan el acceso y el flujo de información dentro del mismo. Por ejemplo, en un sistema pueden existir varios niveles de seguridad o autorización. Cada recurso tiene asignado un determinado nivel de seguridad. Cuando un usuario ingresa en el sistema lo hace dentro de un determinado nivel de seguridad : 0 10 puede acceder a los recursos de su mismo nivel y quizás de niveles inferiores. En un mismo sistema informático pueden existir dos políticas de seguridad de categorías distintas. L.a selección de las políticas de seguridad más adecuadas para un sistema informático debe realizarse evaluar los posibles riesgos y el coste de lograr un determinado nivel de seguridad. En dicho coste se incluye tanto el económico asociado al equipo y al personal como la reducción de rendimiento del . tema debido a la existencia de las medidas de seguridad seleccionadas. ¿ '
10.3.
Autenticación de usuarios
El cumplimiento de los objetivos de confidencialidad, integridad y disponibilidad implica la exisrencia de mecanismos de autenticación de usuarios que permitan identificar a los usuarios autorizados y denegar el acceso al sistema a los intrusos. Básicamente las mecanismos de autenticación se basan en alguno de los siguientes elementos que debe poseer el usuario: secreto o conocimiento (nombre de usuario y contraseña), objeto físico (llave o tarjeta) y rasgo fisiológico o de comportamiento que posee el usuario (huellas dactilares, patrón de retina, firma, etc). La eficacia de un mecanismo de autenticación se mide por el porcentaje de intrusos a los que se les oncede el acceso y el porcentaje de usuarios legítimos a los que se les deniega el acceso. Un mecanismo erá tanto más eficaz cuanto más pequeño sean ambos porcentajes.
390
Fundamentos básicos de los sistemas operativos
10.3.1.
Contraseñas
El método de autenticación de usuarios más utilizado es el uso de una palabra clave a modo de con seña. Típicamente cuando un usuario desea acceder al sistema se le solicita su nombre usuario (login _ su contraseña (password). Solo si los valores introducidos por el usuario coinciden con los que el siste tiene almacenados en su archivo de cuentas de usuarios, éste consigue acceder al sistema. Obviame este mecanismo requiere que el sistema o el administrador del mismo haya creado una cuenta para usuario proporcionándole un nombre de usuario y una contraseña iniciales, que normalmente pueden cambiados a posteriori por el usuario. Aparte de la contraseña de entrada el sistema, también se pueden utilizar contraseñas para controlar acceso a un recurso, como por ejemplo un archivo, con unos determinados privilegios (lectura, escri y/o ejecución). El método de autenticación mediante contraseñas es muy popular ya que es fácil de implementar ' usar. El principal inconveniente de las contraseñas es que el grado de seguridad que ofrecen es limi ya que pueden ser fáciles de obtener o adivinar. U sualmente los usuarios utilizan contraseñas que les resultan fáciles de recordar, como por ejemp nombre de familiares o mascotas, fechas (cumpleaños, aniversarios, etc), expresiones vulgares o alg otra palabra del diccionario, ya estén escritas como deberían o al revés. El problema con este tipo contraseñas es que son relativamente fáciles de obtener o adivinar por un intruso cualificado. El intrus puede obtener la contra~eña espiando físicamente o electrónicamente al usuario cuando la introduce. también recopilando información sobre la vida privada del usuario. Otra forma, menos sutil pero eficaz, de adivinar la contraseña es usar un programa que vaya probrur do automáticamente una a una diferentes contraseñas, a partir de un diccionario de contraseñas comun elaborado por el intruso o probando las posibles combinaciones de caracteres alfanuméricos. Para protegerse contra estos programas de fuerza bruta podría pensarse en deshabilitar temporalmente la cuen de un usuario si el usuario no introduce correctamente sus datos tras un número prefijado de intentos. problema que surge con esta estrategia es que produce la denegación del servicio al verdadero usuario debido a los intentos de penetración de un intruso. Algunos intrusos pueden provocar con fines malicio .: la deshabilitación temporal de todas las cuentas de usuario de un sistema. Las contraseñas que más resisten a los ataques son aquellas que usan todo la longitud disponible para la contraseña, y que mezclan letras en mayúsculas y minúsculas con números, signos de puntuaci ' y caracteres especiales. Éste es el tipo de contraseñas iniciales que suelen proporcionar el sistema o e administrador cuando se crea una cuenta para un usuario. El problema con este tipo de contraseñas es que son muy difíciles de recordar, y en consecuencia el usuario las suele dejar anotadas en algún lugar. por lo que son presas fáciles del espionaje. Lo ideal sería que el usuario usase una contraseña que cumpl con las directrices anteriores y que pueda ser capaz de recordar. Para reforzar la seguridad del mecanismo de autenticación por contraseñas se han propuesto varias técnicas auxiliares, como por ejemplo: • Envejecimiento de contraseñas. Las contraseñas solo son validas durante un determinado periodo de tiempo, transcurrido el cual expiran y deben ser cambiadas.
Seguridad y protección
391
• Contraseñas de un solo uso. Es el caso extremo de la situación anterior, ahora la contraseña expira cuando finaliza la sesión del usuario, por lo que cuando inicia otra nueva sesión debe usar una nueva contraseña. Para ello el usuario posee un libro de contraseñas que deben ser utilizadas en orden. Esta técnica permite detectar fácilmente si un intruso ha accedido a la cuenta de un usuario ya que si el usuario introduce la contraseña que le tocaba para esa sesión y se le deniega el acceso e·so significa que dicha contraseña ya ha sido utilizada por el intruso . • Reto dinámico . El sistema presenta al usuario un reto que el usuario debe resolver para poder acceder o para poder continuar trabajando. Por ejemplo, el sistema le puede presentar al usuario un número aleatorio sobre el cual el usuario debe aplicar una transformación secreta que solo conocen el sistema y el usuario, como por ejemplo, obtener la raíz cuadrada y decrementarlo en una unidad.
El mecanismo de autenticación mediante contraseñas requiere que el sistema almacene en un archivo las contraseñas asociadas (u otras informaciones secretas) a los usuarios. Obviamente si un intruso onsigue acceder a dicho archivo la seguridad de todo el sistema estará comprometida. Para reforzar la protección de las contraseñas el sistema las cifran antes de almacenarlas. Cuando el usuario escribe su ontraseña el sistema le aplica el algoritmo o función de encriptación, el resultado se compara con la ontraseña almacenada, y solo si ambas coinciden se permite el acceso.
10.3.2.
Objetos físicos
Otro método de autenticación de usuarios se basa en el uso de un objeto físico como por ejemplo una tarjeta electrónica inteligente. Para que el usuario pueda acceder al sistema, debe introducir la tarjeta en un lector conectado al sistema. Sólo si el sistema reconoce la tarjeta como válida permite el acceso al usuario. De esta forma la autenticación se reduce a la posesión de un objeto. En consecuencia si un intruso sustrae el objeto de identificación a su propietario también podrá acceder al sistema. Para evitar te problema, la introducción de la tarjeta requiere la posterior introducción de una contraseña. Esta forma de autenticación es utilizada por ejemplo en los cajeros automáticos. Para reforzar la seguridad la contraseña se puede almacenar cifrada dentro de la propia tarjeta en vez de en el sistema. Así la contraseña que introduce el usuario se compara con la que contiene la tarjeta.
10.3.3.
Características fisiológicas o de comportamiento
Otro mecanismos de autenticación de usuarios se basan en técnicas biométricas, es decir, técnicas basadas en el reconocimiento de una característica fisiológica o de comportamiento que es única e inrransferible de la persona, como por ejemplo: la huella digital, los patrones capilares de las retinas, el patrón de voz o la dinámica de la firma. El sistema debe disponer de un lector de la característica que se va utilizar como autenticación. La lectura realizada se compara con la almacenada en el sistema, si coiniden se permite el acceso. Los principales inconvenientes de este tipo de mecanismos son su elevado oste y el potencial rechazo de los usuarios al considerar que pueden invadir su intimidad. Su principal ventaja es que el porcentaje de intrusos a los que se les concede el acceso suele ser muy pequeño.
392
Fundamentos básicos de los sistemas operativos
10.4.
Software malicioso
Se denomina software malicioso (malicious software, malware) a todo aquel software diseñado causar daños o utilizar recursos de un computador (o de una red de computadores) sin el conocimien _ consentimiento de sus usuarios legítimos. Existen diferentes tipos de software malicioso. Algunos, como las bombas lógicas, las puertas secretas o los virus, son pequeños fragmentos de código insertados dentro del código de un programa. O como los caballos de Troya, los gusanos y los programas espías, son programas completos. Por otra pane.. algunos tipos de software malicioso, como los virus y los gusanos, tienen la capacidad de reproducirse infectar a otros programas y computadores. En las siguientes secciones se describen las características básicas de los principales tipos de softw malicioso existentes: bomba lógica, puerta secreta, caballo de Troya, virus, gusano y programa espía.
10.4.1. Bomba lógica Una bomba lógica es un fragmento de código insertado en un programa legítimo que únicamente se activa cuando se cumplen o dejan de darse unas condiciones prestablecidas, como por ejemplo, fecha y hora determinadas. Una vez activada la bomba puede provocar diferentes acciones: modificar, encriptar o borrar 1 archivos del disco duro, detener el computador, mostrar un mensaje por pantalla, enviar correos electrónicos, reproducir una canción o un video, etc.
10.4.2.
Puerta secreta
Una puerta secreta es un fragmento de código insertado en un programa o sistema con la finalidad de poder saltarse los procedimientos de autenticación o ganar privilegios. Se activa al introducir cierto secuencias especiales de entrada o con una determinada secuencia de eventos. Las puertas secretas comenzaron a utilizarse por los programadores como ayuda para acelerar la depuración del código o como puerta de emergencia ante un mal funcionamiento del procedimiento de autenticación. Aunque las puertas secretas pueden ser muy útiles suponen un peligro si son utilizadas con fine nocivos.
10.4.3.
Caballo de Troya
Un caballo de Troya, también denominado con el término troyano, es un programa aparentemente inofensivo que aparte de realizar aparentemente la función para la que está diseñado realiza una función desconocida y no deseable por el usuario del programa, como el borrado de archivos, el envío de información a un intruso o permitir el acceso remoto de un intruso al sistema. Un ejemplo clásico de caballos de Troya es un emulador de pantalla de autenticación utilizado para robar contraseñas. Cuando un usuario introduce su nombre de usuario y su contraseña sobre la falsa
Seguridad y protección
393
pantalla el troyano capta los datos, se los envía al intruso, genera un mensaje, de error de autenticación y llama al verdadero procedimiento de autenticación. El usuario no se da cuenta de lo que ha sucedido, simplemente piensa que había introducido mal su contraseña. El intruso, por su parte, ahora podrá usar esos datos para acceder cuando guste al sistema. Otros ejemplos típicos de caballo de Troya tienen la forma de un juego o de un reproductor de música o vidéo que el usuario ha descargado gratuitamente de Internet en páginas no seguras.
10.4.4.
Virus
Un virus informático es un fragmento de código insertado dentro del código de un programa anfitrión que se ejecuta si el usuario abre el programa anfitrión. Un virus puede realizar diferentes funciones nocivas, como por ejemplo el borrado de archivos, o funciones molestas, como por ejemplo mostrar mensajes en pantalla. Además un virus se propaga insertando copias de su código en otros archivos ejecutables. Los virus se extienden a otros computadores por la compartición de programas infectados entre usuarios. Un computador se infecta cuando el usuario ejecuta un programa infectado. Pueden llegar a distinguirse hasta cuatro fases en la actividad de un virus: fase latente, fase de propagación, fase de activación y fase de ejecución. En la fase latente el virus se encuentra dormido. Éste despierta cuando se produce algún evento, omo por ejemplo, que se alcance una determinada fecha. En lafase de propagación el virus inserta copias de sí mismo en otros archivos ejecutables ubicados en memoria secundaria, o en ciertas partes del disco duro como el sector de arranque maestro. También un virus puede estar residente en memoria principal, infectando a todo programa que es cargado en la memoria. Lafase de activación sirve de transición hacia lafase de ejecución en la cual se ejecuta la función para la que fue diseñado el virus. En la fase de activación se comprueba si se ha producido un determinado vento, por ejemplo, haber contaminado a un número mínimo de programas, antes de pasar a la fase de jecución, en la cual realiza la acción nociva para la que fue diseñado. Otro forma de virus que ha proliferado en los últimos años son los virus insertados en macros, que son programas ejecutables embebidos en un documento de un procesador de texto, en una hoja de cálculo o en tro archivo. Las macros se utilizan para automatizar tareas y ahorrarse pulsaciones de teclas. Algunas de tas macros tienen carácter autoejecutable, es decir, se ejecutan sin la intervención explícita del usuario. Usualmente el documento con la macro infectada se introduce en el computador como archivo adjunto en un mensaje de correo electrónico o por transferencia de archivos. Cuando el archivo es abierto por el usuario la macro infectada se autoejecuta y el virus actúa primero replicándose dentro de las macros de otros documentos y posteriormente realizando la función dañina o molesta para la que fue diseñado. En general el alcance del daño y la propagación que puede causar un virus está limitado por los ;nivilegios de ejecución que tenga el programa anfitrión. Así en sistemas operativos donde es posible limitar estos privilegios la acción de los virus puede ser acotada. En aquellos sistemas operativos que no dispongan de medidas de seguridad es fundamental tener - talado un software antivirus. Un antivirus busca en todos los archivos del computador susceptibles rle estar infectado, los patrones de instrucciones que, de acuerdo con su base de datos, identifican a un
394
Fundamentos básicos de los sistemas operativos
posible virus. Obviamente un nuevo virus cuyo patrón no esté recopilado en la base de datos del antiv· no podrá ser detectado. Para prevenir la entrada de virus en un computador lo más aconsejable es usar exclusivamente so ware original adquirido de proveedores seguros y no usar copias piratas descargadas en Internet. Adem -no se deben abrir los archivos adjuntos en los correos electrónicos enviados por remitentes conocid sin antes ser analizados por un antivirus. En el caso de remitentes desconocidos lo más seguro es bo directamente el mensaje.
10.4.5.
Gusano
U n gusano informático es un programa capaz de reproducirse y propagarse a otros computado generalmente a través de una red informática. Básicamente provoca una denegación del servicio o servicio deficiente a los usuarios de los computadores, ya que en su función de reproducción realiza consumo desproporcionado de los recursos de los computadores y del ancho de banda.de la red por que se propaga. Normalmente los gusanos informáticos no se dedican a dañar archivos o programas. El modo de funcionamiento de un gusano informático consiste en replicarse completamente den de un computador y enviar las copias creadas a otros computadores de la red valiéndose habitualme de la información contenida en las listas de correos de los usuarios: los nombres y las direcciones otros computadores. Cuando un gusano llega" por este medio a otro computador de la red repite el mi procedimiento para seguir propagándose. De esta forma la infección se expande con rapidez.
10.4.6.
Programa espía
Un programa espía (spy software, spyware) es un programa que se instala de forma furtiva en computador por un virus o un troyano y que se dedica a recopilar información sobre la actividad de usuarios para enviárselás a terceros. Entre la información que recopila un programa espía se encuentra: los datos de la conexión a Inte la clave del correo electrónico, los mensajes enviados y recibidos, las páginas web visitadas, las des realizadas e información intercambiada a través de formularios electrónicos (datos personales, núme de cuentas bancarias y números de tarjetas de créditos). Los programas espías pueden ser utilizados por criminales o espías, pero también por la policía tareas de investigación de delicuentes y terroristas.
10.5.
Mecanismos de protección
La necesidad de incluir dentro del sistema operativo mecanismos de protección surgió con la a ción de los sistemas multiprogramados en los que múltiples procesos deben compartir los recurso computador. Un proceso de usuario puede, de forma intencionada o involuntaria, intentar ejecutar acciones perjudiquen el funcionamiento del sistema, como por ejemplo, acaparar el uso del procesador, gen
Seguridad y protección
395
instrucciones de E/S ilegales, escribir o leer en las direcciones de memoria asignadas al sistema operativo o a otros procesos, leer o modificar archivos, etc. Para evitar que un proceso acapare el uso del procesador se utiliza el reloj del computador. El reloj provoca periódicamente una interrupción hardware que debe ser atendida rápidamente por el sistema operativo ya que tiene un alto nivel de prioridad. Si se estaba ejecutando un programa en modo usuario y llega una interrupción de reloj, se produce una conmutación hardware a modo núcleo y se transfiere el control del procesador al sistema operativo para que atienda la interrupción. Así es posible limitar el tiempo que un proceso puede estar usando el procesador. Basta con configurar un contador con la cantidad de tiempo de ejecución permitida. Cada vez que se produzca una interrupción de reloj el contador se va decrementando. Cuando llega a un valor negativo el sistema operativo finaliza o suspende la ejecución del proceso. La forma de prevenir que un proceso de usuario realice operaciones de E/S ilegales es establecer que todas las instrucciones de E/S sean instrucciones privilegiadas. Recuérdese que generalmente las instrucciones privilegiadas del repertorio de un procesador solamente se pueden ejecutar en modo núcleo por el sistema operativo, y el acceso a dicho modo se consigue activando el bit de modo del registro de estado del procesador. Si un proceso de usuario intenta ejecutar una instrucción privilegiada, se produce una excepción cuyo tratamiento por parte del núcleo suele producir la finalización del proceso. En los capítulos 6 y 7 ya se analizaron las formas de protección de la memoria principal, las cuales variaban en función de la técnica de gestión utilizada. En general el sistema operativo se apoya en el hardware para proteger la memoria principal. Por otra parte, las estructuras de datos que mantiene el sistema operativo para implementar una técnica de gestión de memoria contienen campos o bits de protección que permiten especificar los derechos de acceso (lectura, escritura y/o ejecución) a una determinada área de memoria. En el caso de los archivos, algunos sistemas operativos permiten especificar los permisos de acceso (lectura, escritura y ejecución) sobre un archivo de forma independiente para el usuario propietario, el grupo de usuarios propietario y el resto de usuarios. Dichos permisos se almacenan en la entrada del directorio que referencia el archivo, o en una estructura de datos (nodo-i) a la que apunte dicha entrada. Se observa, por tanto, que el sistema operativo dispone de una gran variedad de mecanismos de protección de los recursos del computador. Para facilitar la implementación de una determinada política de protección conviene usar un modelo general que abarque todos los mecanismos de protección existentes. El modelo de protección más utilizado se basa en la abstracción conocida como matriz de acceso. En las siguientes secciones se describe cómo se define la matriz de acceso y sus dos implementaciones más frecuentes: las listas de control de acceso y las listas de capacidades.
10.5.1.
Matriz de acceso
Un sistema informático dispone de un conjunto de recursos hardware y software, también denominados objetos, que son utilizados por los procesos de los usuarios. Cada objeto posee un identificador o nombre que lo distingue de los demás. Estos objetos son utilizados por un conjunto de procesos, también denominados sujetos.
396
Fundamentos básicos de los sistemas operativos
Un dominio de protección (o simplemente dominio) establece para un subconjunto de objetos las operaciones permitidas o derechos de acceso sobre cada uno de ellos. De esta forma un dominio queda definido por un conjunto de pares de la forma [objeto, derechos]. Un mismo objeto puede estar en varios dominios simultáneamente con los mismos o con distinto derechos de acceso .
• Ejemplo 10.1 En la Figura 10.1 se ilustran tres dominios de protección: DI, D2 Y D3. El dominio DI permite ejecutar el archivo A, leer y escribir el archivo B, leer el archivo C y escribir en la impresora 1. El dominio D_ también permite escribir en la impresora 1, además permite leer en el archivo B, así como leer y escribir en el archivo C. Finalmente el dominio D3 permite leer y escribir el archivo D, y además permite escribir en la impresora 2.
[Impresora 2, Escribir]
Figura 10.1 - Tres dominios de protección
Se observa que el objeto impresora 1 está tanto en el dominio DI como en D2 con los mismos derecho de acceso. También los archivos B y C se encuentran simultáneamente en ambos dominios, aunque con diferentes derechos de acceso.
• Un dominio se puede asociar a un usuario o a un proceso, incluso a un procedimiento. Si el dominio asignado no cambia durante toda la sesión del usuario o durante el tiempo de vida del proceso, entonces se dice que la asociación del dominio es estática. Por el contrario, en una asociación de dominio
Seguridad y protección
397
dinámica un usuario o un proceso puede cambiar de dominio. En este último caso el sistema operativo debe disponer de mecanismos que permitan el cambio o conmutación de dominio. Queda dentro de las políticas de protección el establecimiento de las reglas que regulan las conmutaciones de dominio . • Ejemplo 10.2 En el sistema operativo UNIX, a cada usuario se le asocia un identificador de usuario uid y un identificador de grupo de usuarios gid. En función de la dupla (uid, gid) se accede a un determinado dominio D. Todos los procesos que ejecute dicho usuario se ejecutarán dentro de ese dominio. UNIX permite cambiar temporalmente la identidad de un usuario pudiendo así acceder a otro dominio distinto del asignado inicialmente. Cada archivo tiene asignado una máscara de bits, denominada máscara de modo que permite especificar, entre otras cosas, los derechos de acceso (lectura, escritura y ejecución) al archivo para el usuario propietario, el grupo de usuarios propietario y el resto de usuarios. Además tiene un bit denominado SETUID que si se activa hace que el usuario que usa el archivo adquiera temporalmente los valores del uid del usuario propietario del archivo. Lo mismo se puede hacer a nivel de grupo con el bit SETGID. Se habla así de identificadores de usuario efectivo euid y de grupo efectivo egid para diferenciarlos de los asignados uid y gid asignados originalmente.
•
Todos los dominios de protección existentes en un sistema operativo pueden mantenerse en una matriz A denominada matriz de acceso o matriz de protección. Cada fila i de la matriz está asociada un dominio Di . Mientras que cada columna j de la matriz está asociada a un objeto Oj oCada elemento Aj de la matriz contiene los derechos de acceso asociados al objeto Oj dentro del dominio D¡. Las conmutaciones de dominio también se pueden implementar con la matriz de acceso. Para ello simplemente es necesario incluir a los dominios como objetos dentro de la matriz. Cada dominio tendrá asignado así una columna. Si desde el dominio Di se puede conmutar al dominio Dj entonces el elemento A¡j de la matriz de acceso debe tener como derecho de acceso la operación conmutar, también denominada operación entrar. • Ejemplo 10.3 En la Figura 10.2 se muestra la matriz de acceso asociada a los dominios de protección DI , D2 Y D3 descritos en el Ejemplo 10.1. Además se ha supuesto que desde DI se puede conmutar a D2 y que desde D2 se puede conmutar a D3. Se observa que la matriz de acceso tiene tres filas, una por cada dominio, y nueve columnas, una por cada objeto incluyendo los dominios como tales. Cada elemento Aij de la matriz de acceso indica los derechos de acceso asociados a un objeto Oj dentro del dominio Di. Por ejemplo el elemento A22 contiene los derechos de acceso al Archivo B dentro del dominio D2, en este caso leer.
•
La matriz de acceso es un objeto dinámico, ya que durante el tiempo de vida del sistema se crean y borran objetos (columnas) y dominios (filas). Además es posible cambiar el contenido de los elementos de la matriz, es decir, los derechos sobre un determinado objeto dentro de un determinado dominio. El sistema operativo debe disponer de un conjunto de funciones primitivas que permitan manipular la matriz de acceso. Las funciones primitivas básicas son [Harrison et al., 1976]: crear objeto, eliminar
398
Fundamentos básicos de los sistemas operativos
Archivo A Archivo B Archivo C Archivo D Impresora 1 Impresora 2 Ejecutar
Leer Escribir Leer
Leer
Conmutar
Escribir
Leer
Conmutar
Escribir
Escribir Leer Escribir
Escribir
Figura 10.2 - Matriz de acceso del Ejemplo 10.3
objeto, crear dominio, eliminar dominio, insertar derecho y eliminar derecho. Estas funciones primitivas son invocadas por algunos comandos y llamadas al sistema. En general, la matriz de acceso puede llegar a tener un gran tamaño y muchos de sus elementos suelen estar vacíos. Almacenar una matriz de estas características. requiere mucho espacio de memoria principaL por lo que parte de ella se debe mantener en disco, lo que perjudica el rendimiento del sistema al aumentar las operaciones de E/S. Para evitar estos inconvenientes la matriz de acceso se suele implementar como un conjunto de listas de control de acceso para objetos o como un conjunto de listas de capacidades para dominios.
10.5.2.
Listas de control de acceso
Una posible forma de implementar la matriz de acceso consiste en asociar con cada objeto una lista denominada lista de control de acceso (Access Control List, ACL). Cada entrada de la lista contiene pares de la forma [dominio, derechos]. Cuando un proceso va a acceder a un objeto, se consulta su ACL usando como parámetro de búsqueda el dominio de protección. Si un dominio Di no tiene una entrada en la lista eso significa que no tiene ningún derecho sobre el objeto y se produce una excepción. Si el domino Di tiene una entrada en la lista, se comprueba que los derechos en el dominio Di sobre el objeto permiten realizar la operación solicitada. En caso contrario se deniega el acceso .
• Ejemplo 10.4 En la Figura 10.3 se muestran las listas de control de acceso asociadas a los archivos A, B YC de acuerdo con los dominios DI, D2 YD3 especificados en el Ejemplo 10.1. Supóngase que un proceso ejecutándose dentro del dominio D2 intenta leer el archivo A. En dicho caso se buscaría en la ACL del archivo A una entrada asociada al dominio D 2 . Como no existe ninguna se denegaría esta operación y se generaría una excepción. Supóngase ahora que el proceso ejecutándose en el dominio D2 intenta leer el archivo B. Como la ACL del archivo B contiene una entrada asociada al dominio D2 con el derecho de lectura, entonces al proceso se le permite realizar dicha operación.
•
Seguridad y protección
Lista de control de acceso del archivo A (DI' Ejecutar) .
399
Lista de control de acceso Lista de control de acceso del archivo B del archivo C (DI' Leer)
(DI' {Leer, Escribir})
(D 2, {Leer, Escribir})
(D 2 , Leer)
Figura 10.3 - Listas de control de acceso del Ejemplo 10.4
La principal ventaja de implementar la matriz de acceso como un conjunto de ACLs es que por su propia estructura permite fácilmente revocar derechos de forma selectiva sobre objetos que pueden estar presentes en varios dominios. Simplemente hay que buscar en la ACL asociada al objeto los derechos que se quieren revocar y eliminarlos de la ACL. El principal inconveniente de esta forma de implementación de la matriz de acceso es que la ACL e comprueba en cada acceso al objeto. Si los accesos son muy frecuentes o/y la lista es larga se pierde tiempo en las búsquedas en la lista. Una estrategia para reducir el tiempo de búsqueda consiste en reducir el número de entradas de las ACLs asociando un dominio a un grupo de usuarios en vez de un dominio a cada usuario individual.
10.5.3.
Listas de capacidades
Otra forma de implementar la matriz de acceso consiste en asociar con cada dominio una lista, denominada lista de capacidades. Cada entrada de la lista contiene un identificador de un objeto, que indica la localización del objeto o de una estructura de datos que contiene su localización, y sus derechos de acceso. A la dupla (objeto, derechos) se le denomina capacidad.
• Ejemplo 10.5 En la Figura lOA se muestran las listas de capacidades asociadas a los dominios DI , D2 Y D3 , de acuerdo on la información contenida en la matriz de acceso de la Figura 10.2. Lista de capacidades del dominio DI
Lista de capacidades del dominio D2
Lista de capacidades del dominio D3
(Archivo A, Ejecutar)
(Archivo B, Leer)
(Archivo D, {Leer, Escribir})
(Archivo B, {Leer, Escribir})
(Archivo C, {Leer, Escribir})
(Impresora 2, Escribir)
(Archivo C, Leer)
(Impresora 1 , Escribir)
(Impresora 1 , Escribir)
(Dominio D 3, Conmutar)
(Dominio D 2 , Conmutar) Figura 10.4 - Listas de capacidades del Ejemplo 10.5
•
400
Fundamentos básicos de los sistemas operativos
Una posible implementación de la lista de capacidades asociada a un dominio consiste en almace en el espacio de direcciones del núcleo y asociar a cada capacidad un identificador numérico que coín con su posición en la lista (se empieza a contar desde O). Cuando un proceso que está ejecutándose den de un cierto dominio desea realizar una cierta operación sobre un objeto, éste debe especificar co parámetro en la correspondiente llamada al sistema el identificador de la capacidad. Por ejemplo, si proceso ejecutándose en el dominio DI del Ejemplo 10.1 desea leer datos contenidos en el archi o debe especificar en la llamada al sistema el identificador de esa capacidad que en este caso es el 1. Obviamente esta forma de proceder presupone la existencia de llamadas al sistema que permitan a proceso poder obtener capacidades y conocer así sus identificadores. La obtención de dicho identifica de capacidad significa automáticamente que se permite el acceso al
Seguridad y protección
401
10.6. Sistemas confiables 10.6.1.
Definición
Un sistema informático se denomina confiable si cumple con los requerimientos de seguridad o política de seguridad que se había impuesto. Todo sistema confiable dispone de una base de computador confiable (Trusted Computer Base, TCB), e,s decir, un conjunto de elementos hardware y software que le permiten implementar los requisitos de seguridad establecidos. Generalmente la TCB está formada [Tanenbaum, 2009] por la mayoría de los elementos hardware del sistema (excepto los dispositivos de E/S) y una parte del núcleo del sistema operativo. Entre las funciones del sistema operativo que se deben incluir dentro de la TCB se encuentran las relativas a creación de procesos, cambio de contexto, gestión de memoria y parte de la gestión de la E/S y del istema de archivos. Una parte muy importante de la TCB es el monitor de referencia que se encarga de comprobar todas las llamadas al sistema que pueden comprometer la seguridad del sistema, como son la creación de procesos o la apertura de archivos, y decidir si pueden ser procesadas o deben ser rechazadas. Nótese que el monitor de referencia toma las decisiones en base a la política de seguridad que se haya decidido eguir en el sistema que se plasma en el contenido de la matriz de acceso. Algunos sistemas no disponen de monitor de referencia en su TCB lo cual compromete su seguridad.
10.6.2.
Seguridad multinivel
Existen diferentes ámbitos, como por ejemplo el militar, donde la seguridad es uno de los principales objetivos que debe garantizar el sistema informático que se utiliza. En estos entornos, aparte de disponer de políticas de control de acceso discrecional, es necesario disponer de políticas de control de acceso obligatorio. Se suele utilizar un modelo de seguridad multinivel que distingue varios niveles de seguridad. A cada objeto y usuario se le asigna un determinado nivel. El modelo debe especificar un conjunto de reglas para establecer el acceso de los usuarios a la información (objetos). Uno de los modelos de seguridad multinivel más utilizados es el modelo propuesto en [Bell y La Padula, 1973] que sigue las siguientes reglas: • Imposibilidad de leer objetos de niveles superiores. Un usuario solo puede leer un objeto con un nivel de seguridad igualo inferior al del usuario. Esta regla se conoce en la literatura como propiedad de seguridad simple . • Imposibilidad de escribir objetos de niveles inferiores. Un usuario puede escribir un objeto con un nivel de seguridad igual o superior. Esta regla se conoce en la literatura como propiedad * (se pronuncia propiedad estrella o asterisco) ya que los autores no sabían qué nombre ponerle y optaron por poner un asterisco hasta que encontraran un nombre apropiado, algo que nunca ocurrió.
Si se cumplen escrupulosamente estas dos reglas se puede garantizar que no existirá fugas de información desde un nivel de seguridad superior hacia un nivel inferior.
402
Fundamentos básicos de los sistemas operativos
• Ejemplo 10.6 Supóngase que el sistema infonnático del Ministerio de Defensa de un cierto país utiliza el modelo de seguridad multinivel de Bell y La Padula. Existen cuatro niveles de seguridad para los objetos: nivel O (sin clasificar), nivel 1 (confidencial), nivel 2 (secreto) y nivel 3 (alto secreto). Cada objeto del sistema pertenece a una clase de seguridad y cada sujeto tiene asignado un determinado nivel de autorización. Supóngase por ejemplo que el presidente, el ministro de defensa y los generales tienen asignado el nivel 3 de autorización, y que los oficiales tienen asignado el niveÍ 1. De acuerdo con la propiedad de seguridad simple, el ministro de defensa podría leer cualquier documento de cualquier nivel. Mientras que un oficial solo puede leer los docume,ntos confidenciales y sin clasificar. Por otra parte, de acuerdo con la propiedad * un oficial en este sistema puede escribir un mensaje al ministro pero éste no puede responderle para evitar la fuga de infonnación de los niveles superiores a lo inferiores.
• 10.6.3.
Principios de diseño de sistemas operativos seguros
En 1975 Saltzer y Schroeder basados en su experiencia con el sistema Multics establecieron vario principios generales que se deberían seguir para diseñar un sistema seguro. Pese a su relativa antigüedad. estos principios siguen siendo válidos en la actualidad. Sus ideas pueden resumirse en los siguiente puntos [Tanenbaum, 2009] :
• El diseño del sistema deber ser público. Confiar la seguridad del sistema en el hecho de que su diseño es secreto solo sirve como medida disuasoria temporal. Es cuestión de tiempo que el diseño se descubra. • El estado por defecto es el de no acceso. Los derechos de acceso de un usuarios sobre un objeto deben concederse explícitamente. • Comprobación de los derechos de acceso. Cada vez que un usuario solicita acceder a un recurso se debe comprobar que tiene los derechos de acceso adecuados. • Principio del mínimo privilegio. Los procesos solo deben tener los derechos de acceso mínimo necesarios para completar su tarea. De esta fonna se limitan los daños que puede ocasionar el ataque de un caballo de Troya. • Los mecanismos de protección debe ser simples y estar integrados en las capas más bajas del sistema. De esta fonna se facilita la verificación y el buen funcionamiento de las implementaciones. • Los mecanismos de protección deben ser aceptados por los usuarios. Los mecanismos de protección deben ser fáciles de usar por los usuarios ya que en caso contrario los usarán incorrectamente o directamente no los usarán.
Seguridad y protección
403
Para diseñar un sistema seguro, además de estos seis principios de diseño también conviene tener en cuenta el principio propuesto en [Tanenbaum, 2009] que establece que desde el punto de vista de la seguridad los mejores diseños son los diseños más sencillos. Un sistema con un diseño complejo y grande tiene más probabilidades de poseer agujeros en su seguridad y errores (bugs) de programación.
10.7.
Resumen
Un sistema informático debe garantizar la confidencialidad e integridad de la información. El término seguridad involucra consideraciones legales, administrativas y técnicas, mientras que el término protección se refiere a aspectos internos del sistema, tales como los mecanismos de protección que suministra el sistema operativo. Los objetivos de un sistema informático desde el punto de vista de la seguridad son: la confidencialidad, la integridad y la disponibilidad. Un sistema se considera en estado seguro cuando sus recursos hardware y software son accedidos solamente por los usuarios autorizados. En general, las políticas de eguridad suelen basarse en el principio del mínimo privilegio por el cual cada usuario debe tener los mínimos derechos de acceso necesarios para completar las tareas que está autorizado a realizar. Las políticas de seguridad se pueden agrupar en dos categorías: control de acceso discrecional, que son definidas por el propietario de un recurso y especifican los derechos de acceso a dicho recurso, y las políticas de control de acceso obligatorio, que son definidas a nivel de diseño y regulan el acceso y el flujo de información del sistema. El cumplimiento de los objetivos de confidencialidad, integridad y disponibilidad implica la existencia de mecanismos de autenticación de usuarios que permitan identificar a los usuarios autorizados y denegar el acceso a los intrusos. Los mecanismos de autenticación se basan en alguno de los siguientes elementos que debe poseer el usuario: secreto o conocimiento (nombre de usuario y contraseña), objeto físico (llave o tarjeta) y rasgo fisiológico o de comportamiento que posee el usuario (huellas dactilares, patrón de retina, firma, etc) Un software maliCioso es todo aquel software diseñado para causar daños o utilizar recursos de un computador sin el consentimiento o conocimiento de sus usuarios legítimos. Existen diferentes ejemplos de software malicioso:
• Bomba lógica. Fragmento de código insertado en un programa que se activa cuando se cumple una determinada condición. • Puerta secreta. Fragmento de código insertado en un programa que se salta los procedimientos de autenticación. • Caballo de Troya o troyano . Programa aparentemente inofensivo que realiza una función no deseable por el usuario. • Virus. Fragmento de código insertado dentro del código de un programa anfitrión que se ejecuta cuando el usuario abre dicho programa.
404
Fundamentos básicos de los sistemas operativos
• Gusano. Programa capaz de reproducirse y propagarse a otros computadores que consume una gran cantidad de recursos. • Programa espía. Programa que se instala de forma furtiva en el computador por un virus o troyano y recopila información sobre la actividad de los usuarios.
Un proceso de usuario puede, de forma intencionada o no, ejecutar acciones que perjudiquen el funcionamiento del sistema. Por ello, el sistema operativo contiene una gran variedad de mecanismos de protección, algunos de los cuales se apoyan en el hardware. Para facilitar la implementación de una determinada política de protección, se emplea el modelo de protección basado en la abstracción conocida como matriz de acceso, que es una matriz que mantiene todos los dominios de protección existentes en un sistema operativo. Un dominio de protección establece las operaciones permitidas o derechos de acceso para un subconjunto de recursos (objetos). Las do implementaciones más comunes de la matriz de acceso son: las listas de control acceso y las listas de capacidades. Una lista de control de acceso asocia a cada objeto una lista de pares [dominio, derechos]. Una lista de capacidades asocia a cada dominio una lista de pares [objeto, derechos] . Un sistema informático es confiable si cumple con los requerimientos de seguridad que tiene impuestos. Todo sistema confiable dispone de una base de computadores confiable o TCB, que le permiten implementar los requisitos de seguridad establecidos. Una TCB debe incluir funciones del sistema operativo tales como creación de procesos, cambio de contexto, gestión de memoria y parte de la gestión de la E/S y sistema de ficheros. El monitor de referencia de una TCB es el encargado de comprobar todas las llamadas al sistema que puedan comprometer la seguridad de sistema. Un modelo de seguridad multinivel distingue varios niveles de seguridad, y uno de los modelos más empleados es el propuesto por Bell y La Padula en 1973 que se basa en las siguentes reglas: imposibilidad de leer objetos de niveles superiores, e imposibilidad de escribir objetos en niveles inferiores. Algunos principios de diseño de sistemas operativos seguros son los siguientes: el principio del mínimo privilegio, el diseño del sistema debe ser público, el estado por defecto es el de no acceso. se deben comprobar los derechos de acceso, y los mecanismos de protección deben ser simples, estar integrados en las capas más bajas y ser aceptados por los usuarios.
10.8.
Lecturas recomendadas
Si se desea obtener una explicación adicional de los contenidos tratados en este capítulo se pueden consultar, por ejemplo: el capítulo 9 de [Tanenbaum, 2009], el capítulo 16 de [Stallings, 2005], los capítulos 18 y 19 de [Silberschatz et. al, 2002], Y el capítulo 8 de [Milenkovic, 1994].
10.9.
Autoevaluación
10.1. ¿Cuáles son los objetivos, desde el punto de vista de la seguridad, que debe cumplir un sistema informático? (Respuesta en sección 10.2.1)
Seguridad y protección
405
10.2. ¿Cuándo se considera que un sistema informático se encuentra en un estado seguro? (Respuesta en sección 10.2.1) 10.3. ¿Qué afirma el principio del mínimo privilegio? (Respuesta en sección 10.2.2) 10.4 .. ¿En qué consisten las políticas de seguridad de control de acceso discrecional? ¿Y las políticas de control de acceso obligatorio? (Respuesta en sección 10.2.2) 10.5. Señalar algunas técnicas de autenticación de usuarios. (Respuesta en sección 10.3) 10.6. ¿Cómo se mide la eficacia de un mecanismo de autenticación? (Respuesta en sección 10.3) 10.7. ¿Qué técnicas se pueden emplear para reforzar la seguridad del mecanismo de autenticación por contraseñas? (Respuesta en sección 10.3.1) 10.8. ¿Qué es el software malicioso? (Respuesta en sección 10.4) 10.9. ¿Qué es una bomba lógica? (Respuesta en sección 10.4.1) 10.10. ¿Qué es una puerta secreta? (Respuesta en sección 10.4.2) 10.11. ¿Qué es un caballo de Troya? (Respuesta en sección 10.4.3) 10.12. ¿Qué es un virus? (Respuesta en sección 10.4.4) 10.13. ¿Qué es un gusano informático? (Respuesta en sección 10.4.5) 10.14. ¿Qué es un programa espía? ¿Qué tipo de información recopila? (Respuesta en sección 10.4.6) 10.15. ¿Qué.establece un dominio de protección? (Respuesta en sección 10.5.1) 10.16. ¿Qué información contiene la matriz de acceso? (Respuesta en sección 10.5.1) 10.17. Explicar la implementación de la matriz de acceso como listas de control de acceso. ¿Cuáles son sus ventajas e inconvenientes? (Respuesta en sección 10.5.2) 10.18. Explicar la implementación de la matriz de acceso como listas de capacidades. ¿Cuáles son sus ventajas e inconvenientes? (Respuesta en sección 10.5.3) 10.19. ¿Cuándo se puede afirmar que un sistema es confiable? (Respuesta en sección 10.6.1) 10.20. ¿Qué es una TCB? ¿Cuáles son las funciones del sistema operativo que debe incluir? (Respuesta en sección 10.6.1) 10.21. ¿Qué función realiza el monitor de referencia de una TCB? (Respuesta en sección 10.6.1) 10.22. ¿Qué es un sistema de seguridad multinivel? (Respuesta en sección 10.6.2)
406
Fundamentos básicos de los sistemas operativos
10.23. ¿Qué reglas sigue el modelo de seguridad multinivel de Bell y La Padula? (Respuesta en sección 10.6.2)
10.24. Señalar los principios de diseño de sistemas operativos seguros propuestos por Saltzer y Sehr (Respuesta en sección 10.6.3)
Apéndice A
Unidades y funciones matemáticas usadas en el texto A.1.
Unidades
A.1.1.
Unidades de almacenamiento de la información
La unidades básicas de almacenamiento u organización de la información son el bit (símbolo b) Y el byte (símbolo B). Un bit es un dígito binario, es decir, un O o un 1, que se utiliza para representar una pareja de posibles estados, por ejemplo: encendido y apagado, presente y ausente, etc. Un byte son ocho bits contiguos. En la Tabla A.1 se incluyen los prefijos que se utilizan en este texto para especificar los múltiplos de las unidades anteriores, de acuerdo con el SI y el estándar 1541 del IEEE. Prefijo kibi kilo mebi mega gibi giga tebi tera
Símbolo Ki k Mi M Gi G Ti T
Valor
2
10
103
220 106
230 109
240 1012
Sistema de unidades IEEE 1541 SI IEEE 1541 SI IEEE 1541 SI IEEE 1541 SI
Tabla A.l - Prefijos usados en el texto para especificar múltiplos de las unidades de almacenamiento de la información
407
408
Fundamentos básicos de los sistemas operativos
A.1.2.
Unidades de tiempo
La unidad básica de tiempo es el segundo (símbolo s). En la Tabla A.2 se incluyen los prefijos que se utilizan en este texto para especificar los submúltiplos del segundo de acuerdo con el SI. Prefijo mili micro nano
Símbolo m j1
n
Valor
1O. j 10-6 10-9
Tabla A.2 - Prefijos usados en el texto para especificar submúltipios del segundo
Además en este texto se utiliza de forma general la abreviatura ut para el término unidades de tiempo. que hace referencia al segundo o sus submúltiplos. También en este texto se utiliza como unidad de frecuencia la inversa del segundo (S-l), unidad conocida como hertzio (símbolo Hz).
A.2.
Funciones matemáticas
A.2.1.
Función módulo
Lafunción modulo devuelve el resto i de la división entera entre k y N. Esta función se suele denotar de la siguiente forma:
i = kmodN
(A.1 )
= k%N
(A. 2)
Otra notación bastante utilizada es: i
• Ejemplo A.l
Calcular: a) 0%100. b)l1 %100. c) 127 %100. a) Realizando la división entera de O entre 100 se obtiene que el cociente es O y el resto es O. Luego i = 0%100 = O. b) Realizando la división entera de 11 entre 100 se obtiene que el cociente es Oy el resto es 11. Luego i=11%100=11. c) Realizando la división entera de 127 entre 100 se obtiene que el cociente es 1 y el resto es 27. Luego i = 127 %100 = 27.
• i
Unidades y funciones matemáticas usadas en el texto
Á.2.2.
409
Función ceil
Lafunción ceil ofunción techo aproxima el número x al número entero y mayor o igual más cercano. Se denota de la siguiente forma:
y
= ceil(x)
(A.3)
• Ejemplo A.2 Calcular el resultado de: a) ceil(2). b) ceil(2,1). c) ceil(67,5). d) ceil(225/23). e) ceil(2 12 /2 3 ) . a) y
= ceil(2) = 2.
b) Y = ceil(2,1) c) y
= 3.
= ceil(67,5) = 68.
d) Y = ceil(225/23)
= ceil(9,78) = 10. = ceil(2 12 /23 ) = 2 12 /23 = 29 = 512. Nótese que en el caso de operar con potencias
e) y resultado siempre es un número entero por ello es posible eliminar la función ceil.
de 2 el
• En el contexto de sistemas informáticos la función ceil se suele utilizar, por ejemplo, para determinar el número N de elementos de tamaño S que son necesarios para almacenar un elemento de tamaño C: N
Á.2.3.
= ceil(C/S)
Función floor
Lafunciónfloor ofunción suelo aproxima el número x al número entero z menor o igual más cercano. Se denota de la siguiente forma:
z=
ftoor(x)
• Ejemplo A.3 Calcular el resultado de: a) ftoor(2). b) ftoor(2 ,1). c) ftoor(67 ,5). d) ftoor(225/23). e) ftoor(2 12 /2 3 ) . a)
z = ftoor(2) = 2.
b)
z = ftoor(2,1) = 2.
c)
z = ftoor(67,5) = 67.
d)
z = ftoor(225/23) = ceil(9,78) = 9.
(AA)
410
Fundamentos básicos de los sistemas operativos
e)
= 2 12 /2 3 = 29 = 512. Nótese que en el caso de operar con potencias de 2 el resultado siempre es un número entero por ello es posible eliminar la función floor.
Z
= floor(2 12 /23 )
• En el contexto de sistemas informáticos la función floor se suele utilizar, por ejemplo, para determinar el número M de elementos de tamaño S que se pueden almacenar dentro de un elemento de tamaño C: M = floor(C/S)
A.2.4.
Codificación binaria de N elementos
Un problema que aparece frecuentemente en diferentes aspectos relativos al diseño del hardware _ al software de un computador es el de determinar el número mínimo n de bits necesarios para ~ codificar N elementos distintos en código binario. Este problema es equivalente al problema de obte el menor entero positivo n que verifica la siguiente desigualdad: N:-:;2 n
(A5
Este problema se va a denotar resumidamente en este texto de la siguiente forma: (
La solución exacta de este problema se determina de la siguiente forma:
n = ceil(log2N) Nótese que en el caso de que N sea una potencia de 2, es decir N= 2d , entonces n = d. Otra forma alternativa de resolver este problema, que no requiere calcular un logaritmo en 2, consiste en probar diferentes valores de n hasta encontrar el menor entero positivo que verifi desigualdad .
• Ejemplo A.4 Resolver: a) mín {512 :-:; 2n }. b) mín {33 :-:; 2n }. n
n
a) Como 512 = 29 entonces n = 9. También se podría haber resuelto de la siguiente forma: n = ceil(log2512) = ceil(log229) = ceil(9) = 9
b) Para n = 5 se obtiene 25 = 32 que no cumple la desigualdad. Si n = 6 se obtiene 26 = 64 que cumple la desigualdad, luego n = 6. También se podría haber resuelto de la siguiente ~
n = ceil(log233) = ceil(5,044) = 6
Apéndice B
Tablas hash B.l.
Definición
Supóngase que una empresa tiene una aplicación informática para gestionar la lista de sus clientes. Cada entrada de la lista almacena los datos personales (Número de Identificación Fiscal (NIF), nombre, apellidos, teléfono y domicilio) y los servicios contratados por un determinado cliente. Cuando se desea acceder a los datos de un cliente se puede introducir, por ejemplo, su NIF. Una posible implementación de la búsqueda consistiría en examinar el campo NIF de cada entrada de la lista, comenzando desde el principio. Obviamente en este caso el tiempo de búsqueda dependerá del número de entradas de la lista que haya que inspeccionar. La búsqueda puede llevar mucho tiempo si se tiene una lista con muchas entradas y hay que inspeccionar bastantes hasta dar con la buscada. Una tabla hash es una estructura de datos que permite acceder asociativamente a los datos que contiene y que garantiza un tiempo de búsqueda prácticamente constante independientemente del número de elementos que almacene la estructura. Básicamente una tabla hash se implementa con un array de N elementos. Además se requieren una función hash y una función de resolución de colisiones. El array de N elementos se utiliza para almacenar directamente la información a la que se desea acceder o para direccionar hacia otra estructura que contiene dicha información. El acceso a un elemento o registro del array se realiza especificando su posición o índice i dentro del array. En consecuencia el índice i puede tomar los valores 0,1, .. . , N - 1. Una función hash es una función matemática f que genera un número entero positivo i comprendido entre y N - 1 a partir de una llave o clave numérica entera positiva x:
°
i
= f( x ,N)
(B .1)
Existen varias funciones matemáticas que se pueden usar como funciones hash. Una de las más utilizadas es la función módulo (ver Apéndice A): i=x %N 411
(B .2)
412
Fundamentos básicos de los sistemas operativos
Llave -----.,~
Función r-hash
Índice
Tablahash
o
Libre
Área de desbordamiento
1------------------------------1 1
Llave
N-2 N-l Llave
1
------------------------------
Figura B.l - Implementación de una tabla hash
La llave es el dato que se utiliza para obtener información, en el ejemplo propuesto, sería el NIF de los clientes. Nótese que si se utilizan claves alfabéticas (como apellidos o nombres) o alfanuméricas (como un NIF) estas deberán ser pasadas previamente a una clave numérica entera positiva utilizando algún proceso de conversión. La búsqueda de información en una tabla hash se realiza de la siguiente forma: dada una llave x, la función hash genera el registro i del array que puede contener la información que se busca. Si el registro i está vacío dicha información no se encuentra en la tabla. Por el contrario si el registro i está ocupado ha que comprobar que la llave almacenada dentro del registro coincide con la llave x. En caso afirmativo se lee el resto de la información contenida en el registro, ya que son los datos buscados. En caso negativo la información buscada no se encuentra en la tabla. El tamaño de una memoria hash no debe ser muy grande para que no consuma mucho espacio de memoria principal. Puesto que el número de claves o llaves posibles es mucho mayor que el tamaño N del array, la funciones hash puede generar el mismo indice i para dos o más claves distintas. A este problema se le conoce con el nombre de colisión y para resolverlo se pueden usar diferentes técnicas que deben ser programadas en una función de resolución de colisiones. La técnica más simple de resolución de colisiones es el encadenamiento que consiste en utilizar otra estructura de datos auxiliar denominada área de desbordamiento (ver Figura B.1) donde almacenar los registros que colisionen y crear una lista enlazada con todos los registros asociados a un mismo índice i. En este caso la búsqueda ya no se limita solo al registro almacenado en la entrada i de la tabla hash sino que se realiza en toda la lista enlazada asociada a dicha entrada.
Tablas hash
B.2.
413
Operaciones básicas
En una tabla hash se pueden realizar tres operaciones básicas: • Inserción de un registro. La función hash, a partir de la llave, genera el índice i que especifica la entrada de la tabla hash donde debe ser almacenado el registro. Si la entrada i de la tabla hash está libre el registro se añade allí. Si la entrada i está ocupada, se dice que se ha producido u.na colisión, en dicho caso se añade el registro en el área de desbordamiento y se enlaza adecuadamente dentro de la lista enlazada asociada a dicha entrada i. • Búsqueda de un registro. La función hash, a partir de la llave, genera el índice i que especifica la entrada de la tabla hash donde se debe buscar el registro. Si la entrada está libre dicho registro no se encuentra en la tabla. Por el contrario si la entrada está ocupada se comprueba si la llave almacenada en la entrada i coincide con la llave x. En caso afirmativo se ha encontrado el registro buscado. En caso negativo se continuará la búsqueda en el área de desbordamiento en aquellos registros que formen parte de la lista enlazada asociada a la entrada i. • Borrado de un registro. Requiere las mismas acciones que la operación de búsqueda, pero ahora cuando el registro se encuentra se procede a su borrado y a actualizar los punteros de la lista enlazada asociada a la entrada i de la que formaba parte.
B.3.
Ventajas e inconvenientes
La principal ventaja de las tablas hash es que garantizan un tiempo de búsqueda más o menos constante. Obviamente el tiempo de búsqueda aumenta si se producen colisiones pero aún así es más rápido que una búsqueda lineal. En general si una tabla hash posee menos del 75 % de sus entradas ocupadas su eficiencia es bastante alta, por encima de este valor aumenta considerablemente el número de colisiones y su eficiencia disminuye. También es importante que la función hash que se utilice garantice una distribución uniforme de las claves, ya que en caso contrario se producirán muchas colisiones. El principal inconveniente de las tablas hash es que si el volumen de datos que tienen que almacenar crece demasiado se debe ampliar su tamaño, lo cual es una operación costosa ya que requiere modificar la función de dispersión y reorganizar los registros existentes.
Apéndice
e
Soluciones completas de los problemas C.l. Soluciones problemas capítulo O Solución Problema 0.1 a) La frecuencia del reloj del procesador es f = 3 GHz, o equivalentemente f = 3 109 ciclos/s, y emplea en promedio NCI = 2 ciclos/instrucción. La velocidad v del procesador expresada en instrucciones/s se calcula de la siguiente forma:
V
f 3109 (ciclos/s) 9 . . = = . = 1,510 (InstruccIones/s) NCI 2 (CIclos InstrucclOn)
r
./
b) La capacidad de la memoria principal es CMP = 4 GiB = 322 30 bits y el tamaño de una palabra es L= 32 bits. Luego el número de palabras de la memoria principal es: CMP 32· 230 bits 30 N= - - = = 2 palabras L 32 (bits/palabra) El número n de bits necesarios para representar en binario una dirección física de esta memoria se obtiene resolviendo la siguiente desigualdad:
Corno N = 230 entonces n = 30 bits. c) El tiempo de acceso medio a la memoria principal es tp = 1 ns y el número total de accesos a memoria principal son N= 20000 accesos. El tiempo de acceso total T se calcula de la siguiente forma: 415
416
Fundamentos básicos de los sistemas operativos
T
= N tp = 20000 (accesos) 1 (ns / acceso) = 20000 ns
d) El número N de accesos realizados a la memoria caché se puede expresar de la siguiente forma: (1
NA es el número de aciertos y NF es el número de fallos. La tasa de aciertos es h
= 0,98 Y se define de la siguiente forma: h= NA
(2)
N
Despejando NA de (2), sustituyendo valores y operando, se obtiene:
NA
= hN = 0,98·20000 = 19600aciertos
Despejando NF de (1), sustituyendo valores y operando, se obtiene:
NF
=N -
NA
= 20000 -
19600
= 400 fallos
e) El tiempo de acceso medio tpe al conjunto memoria principal - memoria caché se puede calcular de la siguiente forma: tpe
= htga + (1- h)tgf
(3
Donde h es la tasa de aciertos de la caché, tga es el tiempo medio de gestión de un acierto y tgf e el tiempo medio de gestión de un fallo. tga es igual al tiempo medio de acceso a la caché: t ga
= tae = 0,3 ns
Por otra parte, de acuerdo con el enunciado cuando se produce un fallo, primero se copia el bloque que contiene la palabra direccionada desde la memoria principal a la memoria caché. Como el bloque consta de 8 palabras el tiempo empleado será 8 tapo A continuación se lee el dato desde la caché. Luego tgf es: tgf
= 8 t ap + tae = 8 + 0,3 = 8,3 ns
Sustituyendo valores en (3) y operando se obtiene: t pe
= 0,98·0,3 + 0,02·8,3 = 0,294 + 0,166 = 0,46ns
Soluciones completas de los problemas
417
f) Del apartado anterior se sabe que t pe = 0,46 ns. Como N= 20000 accesos, entonces el tiempo de acceso total T al conjunto es:
T = Nt pe = 20000 (accesos) 0,46 (ns/acceso) = 9200ns Luego el uso de la memoria caché provoca un ahorro de tiempo de 10800 ns, es decir, del 54 %.
Solución Problema 0.2 Para resolver este problema se debe recordar que a la hora de ejecutar una instrucción el computador realiza dos pasos o fases: la fase de búsqueda y la fase de ejecución. De acuerdo con el enunciado todas las instrucciones se encuentran en la memoria principal, luego en la fase de búsqueda independientemente del tipo de instrucción, se realizará un acceso a la memoria principal para leer la palabra que contiene la instrucción. Luego si el computador ejecuta 5107 (instrucciones/s) el número de accesos NB que se realizarán debido a la fase de búsqueda de cada instrucción se calcula de la siguiente forma: NB =5107 (instrucciones) .1 (. acces~ , ) =5107 (accesos) s mstrucclOn s En el caso de la fase de ejecución hay que considerar aquellas instrucciones que requieren leer o escribir en memoria. Este es el caso de LOAD (Acum~M[dir]) y de STORE (M[dir]~Acum) . De acuerdo con la Tabla 0.4 el porcentaje de utilización de este tipo de instrucciones es del 30 % Y del 10 %, respectivamente. En ambos casos solo hay que hacer un acceso a memoria, bien para leer o bien para escribir. Luego si el computador ejecuta 5 107 (instrucciones/s), el número de accesos NE que se realizarán debido a la fase de ejecución de cada instrucción se calcula de la siguiente forma: NE= (0,3 .5107+0,1.5107) (instrucciones).1 (. acces~ , ) = 0,4.5107 (accesos) s mstruCClOn s
Finalmente el número total de accesos a memoria por segundo vendrá dado por la suma de NB y de NE:
Solución Problema 0.3 Para la resolución de este problema se va a utilizar la siguiente nomenclatura: M [M] Ac [Ac]
- Indica una dirección de memoria. - Hace referencia al contenido de la dirección de memoria M. - Indica la dirección del acumulador. - Hace referencia al contenido del acumulador.
418
Fundamentos básicos de los sistemas operativos
La equivalencia en hexadecimal y el significado de los códigos de operación son los siguientes: 0011 0101 0110
316 516 616
Ac +- [M] M+- [Ac] Ac +- [Ac] + [M]
De acuerdo con el enunciado del problema la operación que se desea realizar es sumar el contenido de la dirección de memoria 3A516 al contenido de la dirección de memoria 3B916 y almacenar el resultado en la dirección de memoria 3A516. Es decir, de forma esquemática dicha operación se puede representar de la siguiente forma:
Esta operación se puede realizar mediante la siguiente secuencia de instrucciones: 1) 33A5 16 que indica la operación Ac+- [3A5 16].
2) 63B916 que indica la operación Ac+- [Ac] + [3B916]. 3) 53A5 16 que indica la operación 3A5 16 +- [Ac]. Otra posible secuencia sería: 1) 33B916 que indica la operación Ac+- [3B916].
2) 63A516 que indica la operación Ac+- [Ac] + [3A516]. 3) 53A5 16 que indica la operación 3A5 16 +- [Ac].
Solución Problema 0.4 a) La E/S controlada por programa se puede considerar formada por tres etapas, tal y como se muestra en la Figura C.I . El tiempo total T que se tarda en ejecutar la E/S controlada por programa será la suma del tiempo t1 que permanece la CPU en el bucle de espera y del tiempo t2 que emplea la CPU en leer un dato y solicitar el siguiente:
Del enunciado se sabe que tI = 6 ms y que el número de instrucciones que emplea el programa en leer un dato y pedir el siguiente son N2 = 10 instrucciones. Como también se conoce el tiempo que se emplea en ejecutar una instrucción ti , entonces t2 se puede calcular de la siguiente forma: t2
= N2 ti = 10 (instrucciones) 200 (j1s/instrucción) = 2 ms
J l'
1' ,
Soluciones completas de los problemas
Tiempos de ejecución
419
Número de instrucciones empleadas
ji "
T
Lectura de un dato
N
Petición del siguiente dato
Figura C.I - Etapas de la E/S controlada por programa
Por lo tanto T=2+6=8ms !: I
Luego el tanto por ciento P de tiempo de CPU que consume la ejecución del bucle de espera es: 6
ti
P = - 100 = - 100 = 75 % T 8 b) El número total de instrucciones NT que emplea el programa de E/S se determina de la siguiente forma: N
-:!: -
T -
ti -
3
8 10- S = 40 instrucciones 20010- 6 (s/instrucción)
c) El número total de instrucciones NI que ejecuta el programa de E/S se calcula de la siguiente forma: ti 610- 3 S NI = - = . . , = 30 instrucciones ti 20010- 6 (s/mstrucclon) También puede calcularse de la siguiente forma:
NI
= NT -
N2 = 40 - 10 = 30 instrucciones
420
Fundamentos básicos de los sistemas operativos
d) De acuerdo con el enunciado ejecutar una vez el bucle de espera requiere de una única instrucción (NBE = 1), luego el número V de veces que se ejecuta el bucle de espera se calcula de la siguiente forma: NI 30 instrucciones 30 veces V =NBE = l(instrucción/vez)
Solución Problema 0.5 PI¡
PI3 PI 2
1 11 O
I
PI¡
1
10
I
3 5
~
20
14
~
40
30
I
I
I
24
~
Rutina Rutina Rutina Disco duro 1 CD-ROM Disco duro 2
50 ut
I •
~
Rutina CD-ROM
Figura C.2 - Cronograma de atención de las interrupciones del Problema 0.5
De acuerdo con el enunciado la forma de atender a las interrupciones (ver Figura C.2) es la siguiente: 1) En t = O ut comienza a ejecutarse la rutina de servicio del primer disco duro, que requiere un tiempo total de ejecución de t s l = 10 ut. 2) En t = 3 ut llega la petición de interrupción de la impresora (PI)), como P3 < PI la interrupción se ignora y se coloca en una cola de interrupciones pendientes a la espera de ser atendida. 3) En t = 5 ut llega la petición de interrupción del CD-ROM (PIz), como P2 < PIla interrupción se ignora y se coloca en la cola. 4) En t = 10 ut la CPU termina de ejecutar la rutina de servicio del primer disco duro y comienza a ejecutar la rutina de servicio del CD-ROM, que es la interrupción pendiente de mayor prioridad. La ejecución de esta rutina de servicio emplea ts 2 = 30 ut. 5) En t = 14 ut la CPU está ejecutando todavía la rutina de servicio del CD-ROM cuando llega la petición de interrupción del segundo disco duro (PI l ). Puesto que PI > P2 se detiene la ejecución de la rutina de servicio del CD-ROM y comienza a ejecutarse la rutina de servicio del segundo disco duro que requiere un tiempo de ejecución de t s l = 10 ut. 6) En t = 24 ut termina la ejecución de la rutina de servicio del segundo disco duro y se retoma la ejecución de la rutina de servicio del CD-ROM a la que le faltaban 26 ut por ejecutar.
Soluciones completas de los problemas
421
7) En t = 50 ut finaliza la rutina de servicio del CD-ROM y se comienza a ejecutar la rutina de servicio de la impresora que se encontraba en la cola de espera, que requiere un tiempo total de servicio de t s3 = 15 ut. 8) En t = 65 ut finaliza la ejecución de la rutina de servicio de la impresora. Luego la respuesta al problema se obtiene en el paso 7, es decir, en t = 50 ut finaliza la ejecución de la rutina de servicio de la interrupción del CD-ROM.
Solución Problema 0.6 a) El tiempo T de procesador que consume la transferencia de los 500 bytes será la suma de dos componentes: T = TinicioDMA + T cesi6nBUS TinicioDMA es el tiempo en gestionar la inicialización del proceso de DMA y T cesi6nBUS es el tiempo que deja de usar la CPU el bus para cedérselo al controlador de DMA. TinicioDMA se puede calcular de la siguiente forma: TinicioDMA = NinicioDMA(instrucciones) ti (s/instrucción) = 10·200 1O-9 s = 2J1s Asimismo puesto que hay que transmitir 500 bytes y en la transmisión de cada byte se ocupa el bus durante 100 ns entonces: T ces i6nBUS= 500 (bytes) 100 10-9 (ns/byte) = 5010-6 S = 50 J1s Luego T = TinicioDMA + T cesi6nBUS= 2 + 50 = 52J1s b) El tiempo de transferencia de un bloque de datos una vez que se ha inicializado el DMA es: Tt
500 bytes = 333,33 J1S 1,5106 (bytes/s)
De este tiempo, la CPU podría ejecutar instrucciones solamente si no tiene que ceder el uso del bus al controlador del DMA. En el apartado anterior se cálculo que Tces i6nBUS = 50 J1S. Luego el tiempo útil T útil de que dispone la CPU para ejecutar instrucciones es: Tútil= T t - T ces i6nBUS= 333,33 - 50 = 283,33 J1S
422
Fundamentos básicos de los sistemas operativos
El número de instrucciones N de otro proceso que puede ejecutar el procesador mientras se realiza la transferencia del bloque de datos se calcula de. la siguiente forma:
N
C.2.
= floor ( -Tútil ) = floor ( ti
6
283,331O- s ) 9' ./ 20010- (s/mstrucclOn)
= floor(1416,65) = 1416
instrucciones
Soluciones problemas capítulo 2
Solución Problema 2.1 Las principales consecuencias de limitar el número de entradas de la tabla de procesos son las siguientes: • La tabla de procesos es más fácil de gestionar. • El espacio de memoria principal que es necesario reservar para alojar la tabla de procesos queda fijado. • Puesto que cada entrada se asigna a un proceso, el número máximo de procesos que pueden existir simultáneamente queda limitado al número de entradas que pueda tener la tabla de procesos.
Solución Problema 2.2 El diagrama de transición de estados se muestra en la Figura C.3.
Solución Problema 2.3 Se cumple la siguiente relación: T
= Tno_cpu + T mu + T mn
Donde T es el intervalo de observación, T n03pu es el tiempo que la CPU ha estado inactiva, T mu es el tiempo de ejecución en modo usuario y Tmn es el tiempo de ejecución en modo núcleo. Como los procesos se han ejecutado exclusivamente en modo usuario entonces el tiempo de ejecución en modo núcleo coincide con la sobrecarga. Despejando T mn , sustituyendo valores y operando se obtiene que la sobrecarga es: T mn
=T
- T no_cpu - T mu
= 125 -
5 - 95
= 25 ut
Para expresar la sobrecarga en tanto por ciento hay que dividirla entre el tiempo de uso del procesador y multiplicar por cien. Procediendo de esta forma se obtiene el siguiente resultado: T mn T - T no_cpu
25
100
25
= 125 _ 5 100 = 120 100 = 20,83 %
Soluciones completas de los problemas
423
Terminación
Intercambio
Intercambio Intercambio
Intercambio
Se produce el evento
Figura C.3 - Diagrama de transición de estados del Problema 2.2
Solución Problema 2.4 a) De acuerdo con el enunciado cuando llega una interrupción de reloj (IR) el sistema operativo realiza las siguientes acciones: 1) Salva el contexto del proceso en ejecución. Está tarea requiere un tiempo promedio de ejecución (ver Tabla 2.1) de 1,25 J1S. 2) Ejecuta la rutina de reconocimiento de interrupciones. Está tarea requiere un tiempo promedio de ejecución de 2 J1s. 3) Invoca a la rutina de tratamiento de la interrupción de reloj. La ejecución de esta rutina requiere un tiempo promedio de 2 J1s. 4) Restaura el contexto del proceso interrumpido. Está tarea requiere un tiempo promedio de ejecución de 1,25 J1S.
424
Fundamentos básicos de los sistemas operativos
Luego el tiempo promedio TIR que emplea'el sistema operativo (SO) en tareas asociadas a una IR es: T IR = 1,25 + 2 + 2 + 1,25 = 6,5 J1S Se sabe por el enunciado que cada ~ T= 10 ms = 10000 J1s llega una IR. Si denotamos como T p al tiempo disponible entre dos interrupciones de reloj para ejecutar un proceso (supuesto que no llegan otro tipo de interrupciones) se cumplirá por tanto la siguiente relación (ver Figura C.4): ~T
= TIR+Tp
Despejando T p, sustituyendo valores y Operando se obtiene: Tp =
~T
- TIR= 10000 - 6,5 = 9993,5J1s
En TI = 100 s llega una IR y al proceso A le restan por ejecutarse 0,8 s. El diagrama asociado a la ejecución del proceso A desde el instante TI hasta que finaliza en T F tiene la forma general que se muestra en la Figura C.5. Interrupción del reloj (IR)
IR
~
+ Proceso )
TIR E
)
~T
Figura C.4 - Problema 2.4: uso del procesador entre dos interrupciones de reloj
E
~T
)
IR
IR
¡
¡
A
-------
A
A
IR
IR
E
R
A
)
T¡
Tp Figura C.S - Problema 2.4: uso del procesador en el intervalo de tiempo [T ¡, TF]
Tp
Soluciones completas de los problemas
425
De la observación de este diagrama se deduce que el instante de finalización T F del proceso A se puede calcular mediante la siguiente expresión: TF= TI +N llT + TIR+R = TI +NTp+(N + l)T IR +R N es el número de periodos completos T p que requiere el proceso A para poder completar los Ts = 0,8 s = 800000 J.lS de ejecución que le restan y se calcula de la siguiente forma: N = Ts = 800000 = 80052 Tp 9993 ,5 ' Se observa que no es un número entero eso significa que necesita para completarse de 80 periodos completos Tp y una parte R de otro periodo. R es el resto de la división entera entre Ts Y Tp . Se cumple por tanto la siguiente relación:
Luego R= Ts-NTp= 800000 - 80·9993,5 = 520J.ls Sustituyendo valores en la expresión del tiempo de finalización y operando se obtiene finalmente el siguiente resultado: TF= TI +N llT + T IR + R = 100106 + 8010000 + 6,5 + 520 = 100800526,5 J.lS b) En este apartado piden determinar el porcentaje de tiempo que el procesador ha sido utilizado por el SO durante el intervalo de tiempo comprendido entre TI = 100 s Y T2 = 101 s. De acuerdo con el diagrama de la Figura C.4 desde T I = 100 s hasta T= 100,80 s el tiempo TSOl que el SO ha usado el procesador es: Tso I = NTIR= 80·6,5 = 520J.ls Hasta que llega la próxima interrupción de reloj en T= 100,81 s (ver Figura C.6), se atiende una IR, se ejecuta el proceso A hasta su finalización, se ejecuta el planificador del SO durante 4 J.ls y se realiza un cambio de proceso que tarda 6 J.ls. Luego el planificador elige a un proceso F para ser ejecutado, cuyo tiempo de servicio es de 1,6 s. Luego desde TI = 100,80 s hasta T= 100,81 s el tiempo T S02 que el SO ha usado el procesador es: TSOF 6,5
+4 +6
= 16,5 J.lS
426
Fundamentos básicos de los sistemas operativos
IR
IR
A
IR
IR
A
F
100.80 s
100 s
F
100.81 s
101
Figura C.6 - Problema 2.4: uso del procesador en el intervalo de tiempo [100 s, 101 s]
Desde T= 100,81 s hasta T= 101 s hay que atender un total de NIR interrupciones de reloj. E: cantidad se determina de la siguiente forma:
NIR=
101s - 100,81s 0,19 . =--= 19 interrupciones lOms 0,01
Luego desde TI = 100,81 s hasta T= 101 s el tiempo TS03 que el SO ha usado el procesador es: TS03= NIR TIR= 19·6,5 = 123,5 j1S
Finalmente, el porcentaje de tiempo Pso que el procesador ha sido utilizado por el SO durante e intervalo de tiempo comprendido entre TI = 100 s y T2 = 101 s se calcula de la siguiente forma: Pso= TSOI + TS02+ TS03 100 = 520 + 16,5 + 123,5 100 = 0,066 % T2- T I (101 - 100) 106
Solución Problema 2.5 Los índices de prestaciones del diagrama de Kiviatt-Kent se pueden calcular a partir del diagrama de uso de recursos de la Figura 2.9: • La CPU ha sido utilizada durante 70 ut, luego como el tiempo total de observación es de 100 ut tiene que CPU= 70 %. • La CPU ha estado en modo supervisor ejecutando código del sistema operativo durante 30 ut luego CPUs = 30 %. • El tiempo que la CPU ha estado en modo usuario ejecutando código de procesos de usuario se obtiene restando el tiempo que ha estado en uso la CPU y el tiempo que ha estado ejecutándose en modo supervisor: 70 - 30 = 40 ut. Luego CPUu = 40 %. • Durante el intervalo de observación la CPU ha estado inactiva 30 ut, luego CPU = 30 %.
Soluciones completas de los problemas
427
• La CPU y los dispositivos de E/S han estado en uso simultáneamente durante 40 ut. Por lo tanto se tiene que CPU·E/S = 40 %. • La CPU ha estado en uso sin estarlo los dispositivos de E/S durante 30 ut, luego CPU·E/S
= 30 %.
• Los dispositivos de E/S han estado en uso sin estarlo la CPU durante 20 ut, por lo tanto se tiene que CPU·E/S = 20 %. • Los dispositivos de E/S han estado en uso durante 60 ut, luego E/S = 60 %. En la Figura C.7b se representa el diagrama de Kiviatt - Kent de este sistema informático. Para analizarlo conviene compararlo con el diagrama de Kiviatt - Kent que debería presentar un sistema informático ideal. A dicho diagrama se le denomina "Estrella de Kiviatt" (ver Figura C.7a). En este caso se observa que la utilización de la CPU y de los dispositivos de E/S es adecuada. Sin embargo para mejorar el rendimiento del sistema convendría mejorar el solapamiento de la CPU y los dispositivos de E/S, aumentar el uso de la CPU en modo usuario y disminuir el uso de la CPU en modo supervisor. CPU (70%)
CPU CPUs
CPU
CPU
* E/S
CPUu f-~~$=:~~$$~+-I CPU
* E/S
* E/S
CPUu CPU * E/S (40 %) !--+--+--+r..."....*,,"-+.r?i--+--.;--! ! ( (40%)
(30%) E/S
E/S (60%)
(a)
(b)
Figura C.7 - Diagrama de Kiviatt - Kent de un sistema informático ideal (a) y del sistema del Problema 2.5 (b)
Solución Problema 2.6 Los sistemas operativos que soportan un modelo de proceso multihilo utilizan los procesos como unidad de gestión de recursos mientras que utilizan a los hilos como unidad de asignación del procesador. Cada hilo sigue una determinada traza de ejecución.
428
Fundamentos básicos de los sistemas operativos
En consecuencia las informaciones y recursos comunes a todos los hilos deben almacenarse en el bloque de control de proceso, este es el caso de el nombre de usuario, la memoria primaria asignada y los archivos abiertos. Por el contrario las informaciones asociadas a la ejecuc~ón de cada hilo deben almacenarse en su bloque de control de hilo correspondiente, este es el caso de los valores de los registros contador de programa y puntero de pila. Por otra parte, aquellas informaciones que son distintas a nivel de proceso y a nivel de hilo deben almacenarse tanto en el bloque de control del proceso como en los bloques de control de los hilos. Este es el caso del estado y el nivel de prioridad de ejecución. Por ejemplo, si un proceso A tiene tres hilos H Al , HA2 Y HA3, cada uno de ellos tendrá su propio estado EAl, EA2 Y EA3 . Obviamente el estado EA del proceso A limita los estados en que pueden encontrarse sus hilos. Por ejemplo, si el estado EA es preparado obviamente ninguno de sus hilos puede encontrarse en el estado ejecutándose. Obviamente EA debe almacenarse en el bloque de control del proceso A , y EAi debe almacenarse en el bloque de control del hilo HAi .
C.3.
Soluciones problemas capítulo 3
Solución Problema 3.1 a) En la Figura C.8 se muestra el diagrama de uso del procesador para cada uno de los algoritmos de planificación propuestos. b) La sobrecarga es el tiempo que el procesador se encuentra en modo supervisor ejecutando código del sistema operativo. En este problema la sobrecarga esta asociada a los cambios de procesos. De acuerdo con la Figura C.8 el algoritmo de planificación de turno rotatorio con cuanto q = 2 ut e el que produce un mayor número de cambios de procesos, un total de seis. Como un cambio de proceso consume 1 ut, el tiempo total de sobrecarga que produce este algoritmo es de 6 ut. La sobrecarga puede reducirse eligiendo un valor del cuanto que sea ligeramente superior al tiempo de servicio promedio. Como los procesos A, B, C Y D tienen un tiempo de servicio de 4, 2, 3 . 5 ut, el tiempo de servicio promedio es 3,5 ut. Puede comprobarse que si se considera un cuanto q = 3,6 ut se producen 5 cambios de contexto. Por otra parte sise considera un cuanto q = 4 ut se producen 4 cambios de proceso, que es el mínimo que se puede conseguir. En este caso el algoritmo de turno rotatorio se comporta como el algoritmo FCFS . c) Se observa en la Figura C.8a que el proceso C llega en TLL = 1 ut y finaliza en Tp su tiempo de retorno es: T R = T p - T LL = 11 - 1 = 10 ut Como el tiempo de servicio del proceso C es de Ts TE
= TR -
Ts
= 3 ut, su tiempo de espera es :
= 10 -
3
= 7 ut
= 11 ut. Luego
Soluciones completas de los problemas
B D A C
++ (a)
U,odel procesador
I
A
A
B
D
t
t
t
&
B
O
•
++t (b)
Uso del procesador
I
++ A
I
t
t
t
A
I
I
5
10
I
I
I
C
D
t
t t
t
D
C
A
_c_
10
B
D
t
t
t
-- C
5
10
I
I
15 Tiempo (ut) 20
A
B
D I
I
A
I
15 Tiempo (ut)
A
I
O
D
B
5
++ I
D
----
B D A C
U,o del procesador
A
B
O
(d)
C
C
B D A C
Uso del procesador
15 Tiempo (ut)
- - -
B O
(e)
I
10
5
B D A C B
- -
D
C
D I
I
I
15 Tiempo (ut)
Figura C.S - Diagrama de uso del procesador del Problema 3.1 usando los siguientes algoritmos de planificación: a) FCFS. b) SJF. e) Tumo rotatorio con q = 2 ut. d) Planificación por prioridades.
429
430
Fundamentos básicos de los sistemas operativos
Solución Problema 3.2 D
e B
A
A
Uso del procesador
B
e
D
t
t
t
e
B
I
TSA+ T SB
D
I
I
T SA+ T SB + T se + T SD
T SA+ T SB + T se
Tiempo (ut)
Figura C.9 - Diagrama de uso del procesador del Problema 3.2 Sean T LLX , TFX, Tsx, TRX Y TEX los tiempos de llegada, finalización, servicio, retomo y espera, respectivamente, de un proceso X. El tiempo de espera T EX se calcula de la siguiente forma: T EX Como T LLX
= TRX -
Tsx
= TFX -
TLLX - Tsx
= Oentonces: TEX
= TFX -
Tsx
En el caso de completarse N= 4 procesos A, B, C y D, el tiempo de espera promedio es: TFA - TS A + TFB - TSB + TFC - Tsc + TFD - TSD
4
(1)
U sando el algoritmo de planificación SJF, se planifica primero el proceso de tiempo de servicio más corto. Luego el orden de ejecución de los procesos es A, B , C y D. En este caso el tiempo de finalización se puede expresar en función del tiempo de servicio (ver Figura C.9): TFA T FB TFC
= = =
TS A TSA + TSB TSA + TSB + Tsc TS A + TSB + Tsc + TSD
T FD
Sustituyendo en (1) estas expresiones del tiempo de finalización y reordenando términos se obtiene la siguiente expresión: TE = TSA + (TSA + Ts B) + (TsA + TSB + Tsc)
4 Tal y como se quería demostrar.
= 3 TSA + 2 TS B + Tsc 4
Soluciones completas de los problemas
431
Solución Problema 3.3 En la Figura C.1O se muestra el diagrama de uso de los recursos del computador.
CPU
C
A
B
A
CH1
B
CH2
C
o
10
20
30
40
50
60
70
A
80
90
100
Tiempo (ut) Figura C.lO - Diagrama de uso de recursos del Problema 3.3
Solución Problema 3.4 a) Cuando llega el proceso A en t = O ms, se coloca en la cola 1 y se planifica inmediatamente, ya que no se está ejecutando ningún proceso. El proceso A ejecuta 1 ms de CPU. En t = 1 ms llega el proceso B, se coloca en la cola 1 y se planifica inmediatamente, ya que el proceso A ha entrado en el estado bloqueado en espera de la finalización de una operación de E/S de duración 5 ms, es decir, hasta t = 6 ms. En t
= 2 ms llega el proceso C que se coloca en la cola 1. El proceso B sigue usando la CPU.
En t = 3 ms llega el proceso D que se coloca en la cola 1, el proceso B es expropiado de la CPU ya que ha consumido su cuanto y colocado en la cola 2. Le restan para finalizar su ejecución 8 ms de CPU. El proceso seleccionado para ejecutarse es el primer proceso de la cola 1 (ver Figura C.11), es decir, el proceso C. En t = 5 ms el proceso C entra en el estado bloqueado en espera de la finalización de una operación de E/S de duración 4 ms. Dicha operación no puede comenzar hasta t = 6 ms que es cuando concluye la operación de E/S del proceso A. Se planifica para ejecución el primer proceso de la cola 1 (ver Figura C.12), es decir, el proceso D. En t = 6 ms el proceso D continua su ejecución. El proceso A finaliza su operación de E/S , es desbloqueado y colocado en la cola 1 (ver Figura C.13). Se inicia la operación de E/S de 4 ms de duración del proceso C.
432
Fundamentos básicos de los sistemas operativos
Antes
CPU
[I]
t=3 ms
Después
Cola 1
ID l c ~
ID~
Cola 2
~
IB~
~
~
IA ~
IA~
Cola 3 Cola Bloqueados
CPU
@]
Figura C.11 - Estado de las colas de procesos del Problema 3.4 antes y después del instante t = 3 ms
Antes
CPU
t=5 ms
Después
~
Cola 1
ID ~
I
Cola 2
IB ~
IB~
~
~
IA ~
IcIA~
@] Cola 3 Cola Bloqueados
CPU
[QJ
Figura C.12 - Estado de las colas de procesos del Problema 3.4 antes y después del instante t = 5 ms
Antes
CPU
t=6 ms
Después
Cola 1
~
IA~
Cola 2
IB~
IB ~
~
~
ICIA ~
Ic~
[QJ Cola 3 Cola Bloqueados
CPU
[QJ
Figura C.13 - Estado de las colas de procesos del Problema 3.4 antes y después del instante t
= 6 ms
Soluciones completas de los problemas
Antes
CPU
[RJ
t=7ms
Después
~
Cola 1
IA~
Cola 2
IB~
IDIB~
Cola 3
~
~
IC~
IC~
Cola Bloqueados
I
CPU
0
Figura C.14 - Estado de las colas de procesos del Problema 3.4 antes y después del instante t = 7 ms
Antes
CPU
0
t=9 ms
Después
~
Cola 1
~
Cola 2
IDIB~
ID~
Cola 3
~
~
Ic~
Ic~
Cola Bloqueados
I
CPU
[I]
Figura C.15 - Estado de las colas de procesos del Problema 3.4 antes y después del instante t = 9 ms
Antes
CPU
[I]
t= 10 ms
Después
Cola 1
~
Ic~
Cola 2
ID~
ID~
~
~
IC~
~
Cola 3 Cola Bloqueados
CPU
[I]
Figura C.16 - Estado de las colas de procesos del Problema 3.4 antes y después del instante t = 10 ms
433
434
Fundamentos básicos de los sistemas operativos
Antes
CPU
[I]
t= 13 ms
Después
Cola 1
Ic~
~
Cola 2
ID~
ID~
~
IB~
~
~
Cola 3 Cola Bloqueados
CPU
[I]
Figura C.17 - Estado de las colas de procesos del Problema 3.4 antes y después del instante t = 13 ms
Antes
CPU
[I]
t= 14 ms
Después
Cola 1
~
~
Cola 2
ID~
~
Cola 3
IB~
IB~
~
~
Cola Bloqueados
CPU
[RJ
Figura C.18 - Estado de las colas de procesos del Problema 3.4 antes y después del instante t = 14 ms
Antes
CPU
t= 16 ms
Después
Cola 1
~
I
~
Cola 2
~
I
~
[RJ Cola 3 Cola Bloqueados
IB~
~
~
~
CPU
[I]
Figura C.19- Estado de las colas de procesos del Problema 3.4 antes y después del instante t = 16 ms
Soluciones completas de los problemas
435
En t = 7 ms el proceso D es expropiado de la CPU ya que ha consumido su cuanto y es colocado en la cola 2. El proceso seleccionado para ejecutarse es el primer proceso de la cola 1 (ver Figura C.14), es decir, el proceso A. En t = 9 ms el proceso A finaliza. Como la cola 1 está vacía se planifica el primer proceso de la cola 2 (ver Figura C.15), es decir, el proceso B. En t = 10 ms finaliza la operación de E/S del proceso C, que es pasado al estado preparado para ejecución dentro de la cola 1 (ver Figura C.16). En t = 13 ms el proceso B es expropiado de la CPU, ya que ha consumido su cuanto, y es colocado en la cola 3. Se planifica el primer proceso de la cola 1 (ver Figura C.17), es decir, el proceso C. En t = 14 ms el proceso C finaliza su ejecución. Como la cola 1 está vacía, se planifica para ejecución el primer proceso de la cola 2 (ver Figura C.18), es decir, el proceso D. En t = 16 ms el proceso D finaliza su ejecución. Se planifica el primer proceso de la cola 3 (ver Figura C.19) ya que la cola 1 y la cola 2 están vacías, es decir, el proceso B. En t = 20 ms finaliza el proceso B En la Figura C.20 se representa el diagrama de uso del procesador y de la E/S. A BCD
A
Uso del procesador
B
D
B
t
t
t
B I
o
5
I
o
20
10
15
I
I
10
15
20
e
A
Uso E/S
B
I
5
Tiempo (ut)
Figura C.20 - Diagrama de uso de recursos del Problema 3.4
b) El proceso A nunca requiere cambiar de cola de planificación, siempre cuando está en el estado preparado está dentro de la cola 1. El proceso B es degradado a la cola 2 en el instante t = 3 ms y a la cola 3 en el instante t = 13 ms. El proceso C nunca requiere cambiar de cola de planificación, siempre cuando está en el estado preparado está dentro de la cola 1. El proceso D es degradado a la cola 2 en el instante t = 7 ms.
436
Fundamentos básicos de los sistemas operativos
Solución Problema 3.5 a) Para resolver este apartado conviene recordar que en un sistema operativo que soporta exclusivamente hilos a nivel de usuario, cuando u!l hilo realiza una llamada al sistema que requiere el bloqueo del hilo, por ejemplo en una operación de E/S, entonces se bloquea el proceso completo. El procesador comienza a utilizarlo el hilo HA 1 del proceso A, ya que es el de mayor prioridad. Lo usa durante 20 ut y se bloquea durante 60 ut en espera de que se complete una operación de E/S . Esto produce el bloqueo de todo el proceso A. Se realiza un cambio de proceso y se planifica al hilo HBl del proceso B, que realiza una ráfaga de CPU de 40 ut. A continuación, se bloquea todo el proceso B en espera de que se complete una operación de E/S solicitada por HB1 . En t = 80 ut finaliza la operación de E/S solicitada por HA1 y comienza la operación de E/S solicitada por HBl. Además se desbloquea el proceso A, se realiza un cambio de contexto y se planifica a HA1 , que realiza una ráfaga de CPU de 20 ut y finaliza.
= 100 ut se planifica a HA2 que realiza una ráfaga de CPU de 60 ut y finaliza. Se planifica que realiza una ráfaga de CPU de 20 ut. A continuación se bloquea todo el proceso A al tener que esperar HA3 por una operación de E/S.
En t HA3
En t = 180 ut se realiza un cambio de proceso y se planifica a HB1 . Éste realiza una ráfaga de CPU de 20 ut y finaliza. Se planifica a HB 2 que realiza una ráfaga de CPU de 40 ut. A continuación se bloquea todo el proceso B al tener que esperar HB2 por una operación de E/S. En t = 240 ut, como finaliza la operación de E/S solicitada por HA3, se realiza un cambio de proceso y se planifica a H A3. Éste realiza una ráfaga de CPU de 40 ut y finaliza. En t = 300 ut, como finaliza la operación de E/S solicitada por HB2, se realiza un cambio de proceso y se planifica a HB2. Éste realiza una ráfaga de CPU de 20 ut y finaliza.
CPU
HAll
HB1
I
HA2
HB2
HA3
I I I E/S
HA1
HB1
I
O
100
I I
!HA3
HB2
i ii
I
I
200
Tiempo (ut)
300
Figura C.21- Diagrama de uso de recursos del apartado a) del Problema 3.5
Soluciones completas de los problemas
437
,1
En la Figura C.21 se muestra el diagrama de uso de recursos. Se observa que se producen 5 cambios de proceso y 3 cambios de hilo. Los procesos A y B finalizan en TFA = 280 ut y TpB = 320 ut, respectivamente. b} Para resolver este apartado conviene recordar que en un sistema operativo que soporta un hilo del núcleo por cada hilo de usuario la planificación se realiza a nivel de hilos del núcleo. Luego si un hilo de usuario realiza una llamada al sistema que requiere el bloqueo del hilo, por ejemplo en una operación de E/S, no es necesario bloquear el proceso completo. El procesador comienza a utilizarlo el hilo H A1 del proceso A, ya que es el de mayor prioridad. Lo usa durante 20 ut y se bloquea durante 60 ut, en espera de que se complete una operación de E/S. Se planifica a HA2, que realiza una ráfaga de CPU de 60 ut y finaliza. En t = 80 ut se planifica a HAl, puesto que ya ha finalizado la operación de E/S por la que estaba esperando, realiza una ráfaga de CPU de 20 ut y finaliza. En t = 100 ut se planifica a H A3, que realiza una ráfaga de CPU de 20 ut y se bloquea durante 60 ut, en espera de que se complete una operación de E/S de 60 ut. En t = 120 ut se realiza un cambio de proceso y se planifica a HBl, que realiza una ráfaga de CPU de 40 ut y se bloquea en espera de que se realice una operación de E/S de 60 ut. En t = 160 ut, como todavía no ha finalizado la E/S de HA3, se planifica a HB2, que realiza una ráfaga de CPU de 40 ut y se bloquea en espera de que se realice una operación de E/S de 60 ut. En t = 200 ut se realiza un cambio de proceso y se planifica a H A3, que realiza una ráfaga de CPU de 40 ut y finaliza.
11
En t = 240 ut, como ya ha finalizado la operación de E/S solicitada por HBl, se realiza un cambio de proceso y se planifica a HBl. Éste realiza una ráfaga de CPU de 20 ut y finaliza.
I 11,
li
CPU
f-H_A_l!--~H_A_2~_+-llH_A_l+-H_A_3+-I_H..,...B_l--+_H...,...B2_+--H_A.,-3_f-H_B~1
I
E/S
HA 1
!
I
HA3
¡HB2¡
HB 2 1---''-HB-l--'---T---i.- -
-'-----11
r-----~--~--~-;--~--~--~~
O
100
200
Tiempo (ut)
300
Figura C.22 - Diagrama de uso de recursos del apartado b) del Problema 3.5
il
!
438
Fundamentos básicos de los sistemas operativos
En t = 300 ut, finaliza la operación de E/S solicitada por planifica. Éste realiza una ráfaga de CPU de 20 ut y finaliza.
HB2,
por lo que se desbloquea y se
En la Figura C.22 se muestra el diagrama de uso de recursos. Se observa que se producen 3 cambios de proceso y 5 cambios de hilo. Los procesos A y B finalizan en TFA = 240 ut y TFB = 320 ut, respectivamente. Si se comparan con los resultados obtenidos en el apartado anterior, la sobrecarga es más pequeña, ya que aunque aumenta el número de cambios de hilo de 3 a 5, el número de cambios de proceso pasa de 5 a 3. Recuérdese que el tiempo que requiere un cambio de proceso es mucho mayor que el tiempo que requiere un cambio de hilo. Por otra parte el proceso A ahora termina antes.
C.4.
Soluciones problemas capítulo 4
Solución Problema 4.1 a) La solución que se propone en la Figura C.23 utiliza las siguientes variables globales y semáforos binarios: • contador. Variable global de tipo entero para llevar la cuenta del número de ciudadanos en la cola o en la ventanilla. • S 1. Semáforo binario que se utiliza para garantizar la exclusión mutua en el uso de la variable
global contador. • S 2 . Semáforo binario que se utiliza para sincronizar el acceso a las ventanillas de la oficina. b) La solución que se propone en la Figura C.24 utiliza un único semáforo general S 1 que se inicializa con el número de ventanillas de la oficina. c) La definición de monitor que se propone en la Figura C.25 utiliza las siguientes variables globales y variables de condición: • contador. Variable global de tipo entero para llevar la cuenta del número de ciudadanos en la cola o en las ventanillas. • ventanilla_disponible. Variable de condición para bloquear en su cola a los proce. sos hasta que exista alguna ventanilla disponible.
d) En la solución mediante paso de mensajes que se muestra en la Figura C.26, el buzón buzón1 se inicializa con tantos mensajes como ventanillas existen, es decir, con 5 mensajes. Así los primeros cinco ciudadanos acceden a la ventanilla sin esperar. Si las ventanillas están ocupadas, no existirá ningún mensaje en el buzón y el ciudadano que realice la operación recei ve (buzón1, X) se quedará bloqueado hasta que llegue un mensaje al buzón. Dicho mensaje lo enviará un proceso cuando termina su gestión en la ventanilla realizando la operación send (buzón1, X) .
Soluciones completas de los problemas
int contador=O; /* Definición e inicialización de la variable global */ semáforo binario 51, 52; /* Definición semáforos binarios */ void ciudadano()
/* Proceso ciudadano */
wait sem(51); contador = contador + 1; if (contador> 5) { signal_sem(51) ; wait sem(52); /* Esperar a que haya una ventanilla libre */ else{ signal sem(51); realizar_gestión() ; wait sem(51); contador = contador - 1; signal sem(52); /* Queda una ventanilla libre */ signal sem(51);
main() /* Inicialización semáforos y ejecución concurrente */
{ init sem(51,1); init sem(52,1); ejecución_concurrente (ciudadano, . .. ,ciudadano) ;
Figura C.23 - Solución del apartado a) del Problema 4.1
semáforo SI;
/* Definición semáforo */
void ciudadano()
/* Proceso ciudadano */
wait sem(51); realizar_gestión() ; signal sem(51);
main()
/* Inicialización semáforo y ejecución concurrente * /
{ init sem(51, 5) ; ejecución_concurrente (ciudadano, ... ,ciudadano) ;
Figura C.24 - Solución del apartado b) del Problema 4.1
439
440
Fundamentos básicos de los sistemas operativos
/* Definición del monitor */ monitor oficina condición ventanilla_disponible; int contador=O; void procedimiento1()
{ contador = contador + 1; if (contador> 5) wait_mon(ventanilla disponible) ; realizar_gestión() ; contador = contador - 1; signal_mon(ventanilla_disponible) ;
/* Proceso ciudadano */ void ciudadano () oficina.procedimiento1() ;
/* Ejecución concurrente*/ main()
{ ejecución_concurrente (ciudadano, ... ,ciudadano) ;
Figura C.25 - Solución del apartado c) del Problema 4.1
void ciudadano() /* Proceso ciudadano * / mensaje X; receive(buzón1,X) ; realizar_gestión() ; send (buzón1, X) ;
void main() /* Inicialización del buzón y ejecución concurrente */ mensaje M; crear_buzón (buzón1) ; for(h == 1; h < 6; h
h+1)
/* Inicialización del buzón * /
{ send (buzon1, M) ; ejecución_concurrente (ciudadano, ... ,ciudadano) ;
Figura C.26 - Solución del apartado d) del Problema 4.1
Soluciones completas de los problemas
441
Solución Problema 4.2 a) La solución que se muestra en la Figura C.27 para modelar el punto de encuentro entre los procesos A y B utiliza dos semáforos S 1 Y S 2. Ambos semáforos son inicializados al valor O ya que se utilizan para sincronizar. semáforo 81, 82; void proceso_A()
1* 1*
Definición semáforos Proceso A *1
*1
tareas 1(); signal_sem(82) ; wait_sem(81) ; tareas_2() ;
void proceso_B()
1*
Proceso B
*1
tareas 3 () ; signal sem(81); wait sem(82); tareas_4() ;
main()
1*
Inicialización de semáforos y ejecución concurrente
*1
{ init_sem(81,O) ; init sem(82,O); ejecución_concurrente (proceso_A,proceso_B ) ;
Figura C.27 - Solución del apartado a) del Problema 4.2
b) La solución que se muestra en la Figura C.28 para modelar el punto de encuentro entre los procesos Ay B mediante paso de mensajes utiliza dos buzones (buzónl y buzón2) que inicialmente están vacíos.
Solución Problema 4.3 La solución que se propone en la Figura C.29 para este problema utiliza las siguientes variables globales y semáforos binarios: • contador. Variable global de tipo entero para llevar la cuenta del número de caballeros . • semI. Semáforo binario que se utiliza para garantizar la exclusión mutua en el uso de la variable global contador.
442
Fundamentos básicos de los sistemas operativos
• sem2. Semáforo binario que se utiliza para sincronizar la actividad del operario de limpieza y lo
caballeros. • sem3. Semáforo binario que se utiliza para sincronizar la entrada al baño de los caballeros.
Solución Problema 4.4 La solución que se propone en la Figura C.30 utiliza las siguientes variables globales y semáforo binarios: • contador. Variable global de tipo entero para llevar la cuenta del número de clientes dentro de la peluquería. • S 1. Semáforo binario que se utiliza para garantizar la exclusión mutua en el uso de la variable
global contador. • S 2. Semáforo binario que se utiliza para despertar al peluquero. • S 3. Semáforo binario que se utiliza para implementar la espera de los clientes a acceder al sillón
del peluquero. void proceso_A ()
/*P roceso A*/
mensaje X; tareas - l(); send(buzónl,X) ; receive(buzón2,X) ; tareas - 2();
void proceso_B() / *Proceso B* / mensaje X; tareas - 3(); send (buzón2, X) ; receive(buzónl,X) ; tareas - 4();
main()/*Creación de buzones , y ejecución concurrente*/
{ crear_buzón (buzónl) ; crear_buzón (buzón2) ; ejecución_concurrente (proceso_A,proceso_B) ;
Figura C.28 - Solución del apartado b) del Problema 4.2
Soluciones completas de los problemas
/ * Definición variables y semáforos * / semáforo binario semI, sem2, sem3; int contador=O; void caballero()
/ * Proceso caballero * /
wait sem(seml); contador=contador + 1; if(contador == 1)
{ wait_sem(sem2) ; signal sem(seml); else if(contador > 6)
{ signal sem(seml); wait sem(sem3); else signal_sem(seml);
signal_sem(sem3) ; wait sem(seml); contador = contador - 1; if (contador == O) signal_sem(sem2); signal sem(seml);
void operario_limpieza() / * Proceso operario limpieza * / wait_sem(sem2) ; limpiar_baño() ; signal_ sem(sem2) ;
void main()
/ * Inicialización de semáforos y ejecución concurrente */
init sem(seml,I); init sem(sem2,1); init sem(sem3,1); ejecución_concurrente (caballero, ... ,caballero,operario_limpieza);
Figura C.29 - Solución Problema 4.3
443
444
Fundamentos básicos de los sistemas operativos
/ * Definición variables y semáforos */ #define TRUE 1 semáforo_binario S1, S2, S3 , S4 ; int contador=O; void cliente() / * Proceso cliente */ / * Entrar */ wait_sem(S1 )¡ contador = contador + 1; if (c o ntador > N) signal sem(S1 ); else if (contador==1) signal_sem(S2 ) ; / * Despierta al peluquero */ else sentarse en silla() ; signal sem(S1); wait sem(S3 ) ; / * Espera a que le a v ise el peluquero */ sentarse_en_sillón( ) ; wait sem(S4); / * Espera a que el peluquero termine de cortarle el pelo */
/ * Salir * / wait sem(S1); contador = contador - 1; signal_sem(S1) ; void peluquero() /* Proceso peluquero * / while (TRUE)
{ wait sem(S1); if(contador == O)
{ signal_sem(S1) ; wait sem(S2); / * Duerme hasta que lleguen clientes */
} signal_sem(S3 ); / * Avisa a un cliente para que se siente */ cortar_el-pelo() ; signal_sem(S4) ; / * Avisa al cliente para que se levante * /
void main() / * Inicialización de semáforos y ejecución concurrente */ init_sem(S1,1 ) ; init_sem (S2,0 ) ; init_sem(S3,0); init sem (S4 , 0); ejecución_concurrente (cliente, . . . ,cliente,peluquero);
Figura C.30 - Solución Problema 4.4
Soluciones completas de los problemas
445
Semáforo binario que se utiliza para implementar la espera de un cliente en el sillón del peluquero mientras éste le corta el pelo.
• 84 .
Solución Problema 4.5 La solución que se propone para este problema se muestra en las Figuras e.3I y C.32. / * Definición constantes, variables y semáforos * / #define TRUE 1 #define FALSE O int puestos_libres=M, aviso_depen=FALSE; semáforo_binario a-pagar, ex_mut1, ex_mut2, finalizar-pago; void cliente() /* Proceso cliente * / entrar en restaurante(); wait_sem(ex_mut1) ; if (puestos libres>O)
{ dejar-pertenencias-para_reservar() ; puestos_libres = puestos_libres - 1; signal sem(ex_mut1); coger_comida() ; wait_sem(a-pagar ) ; wait sem(ex_mut2); aviso_dependiente = TRUE; signal sem(ex_mut2); wait_sem(finalizar-pago) ; signal_sem(a-pagar ) ; comer() ; wait_sem(ex_mut1) ; puestos_libres = puestos_libres + 1; signal_sem(ex_mut1) ; abandona_restaurante() ;
} else
{ signal sem(ex_mut1); abandona_restaurante() ;
Figura C.31- Primera parte de la solución del Problema 4.5
446
Fundamentos básicos de los sistemas operativos
vo id dependiente () 1* Pro ceso dependiente * 1 while (TRUE )
{ wait_sem(ex_mut2) ; if (aviso_dependiente
TRUE )
{ cobrar_client e() ; signal_sem (finalizar-pago ) ; a v iso_dependiente = FALSE; signal_sem (ex_mut2 ) ; else signal sem(ex_mut2); tarea_de_reposición( ) ;
1* Inicialización de semáfo ros y ejecuci ó n concurrente * 1 v oid main () init_ sem (a-pagar,l ) ; init sem(ex_mutl,l ) ; init_sem(ex_mut2,1 ) ; init_ sem(fina l izar_pago, O) ; ejecución_concurrente (cliente, ... , c liente, depend i ente ) ;
Figura C.32 - Segunda y última parte de la solución del Problema 4.5
Esta solución tiene en cuenta lo siguiente: • Cuando un cliente llega al restaurante, lo primero que hace es buscar un puesto libre, de los M disponibles, si no encuentra ninguno se marcha. Para modelar esta situación se va a utilizar una variable global de nombre puestos_l ibres que será consultada por los procesos clientes. Inicialmente puestos_ libres=M. Si puestos_libres=O entonces el cliente se marcha, en caso contrario dicha variable debe ser decrementada en una unidad. Cuando el cliente termine de comer y se levante para irse la variable se incrementará en una unidad. Puesto que se trata de una variable que puede ser leída o escrita por diferentes procesos clientes es necesario asegurar la exclusión mutua en su uso. Para ello se va a utilizar el semáforo binario ex_ mu t 1 que se inicializa con el valor 1. • Una vez que el cliente coge lo que quiere comer se pone en una cola para pagar. Esta situación se puede modelar con un semáforo binario de nombre a_pagar. Inicialmente se inicializa a 1, ya que el primero que llega no tiene que esperar cola.
Soluciones completas de los problemas
447
• Cada cliente debe avisar al dependiente para que le cobre, ya que este puede estar realizando tareas de reposición. Por tarea de reposición se entiende, por ejemplo, sacar un producto de una caja y colocarlo en un mostrador, llevar una caja de un sitio a otro, etc. Una tarea de reposición se ejecuta rápidamente, por lo que cuando el dependiente es avisado por el cliente, bien de viva voz o pulsando un llamador, el dependiente tarda poco en estar listo para cobrarle. • Nótese que el dependiente no permanece sin hacer nada, es decir, bloqueado en espera de que le avise un cliente, sino que realiza una espera activa. Por ello no es posible utilizar un semáforo para avisar al dependiente. Se puede utilizar una variable global entera de nombre avi so _ depen, el cliente si desea ser atendido debe hacer aviso _ depen=TRUE. El dependiente cuando termina de atender a un cliente hace avi so _ depen= FALSE. Inicialmente está variable se configura a FALSE, ya que el dependiente está haciendo tareas de reposición. Puesto que se trata de una variable que puede ser leída o escrita por los clientes en el mostrador o el dependiente es necesario asegurar la exclusión mutua en su uso. Para ello se va a utilizar el semáforo binario ex_ mu t 2 que se inicializa con el valor 1. • Finalmente es necesario usar un semáforo binario en el que espere el cliente hasta ser cobrado por el dependiente. Dicho semáforo se va a denotar como finalizar_pago, que debe inicializar a 0, el cliente debe hacer una operación wait_sem(finalizaryago) mientras que corresponde al dependiente hacer una operación signal_sem (finalizaryago).
Solución Problema 4.6 La solución que se propone [Tanenbaum, 2009] en la Figuras C.34 y la Figura C.35, para evitar la posible existencia de interbloqueos, establece que cada filósofo pueda coger los tenedores solo si los dos se encuentran disponibles. Además, puesto que solo hay cinco tenedores disponibles el máximo grado de concurrencia se corresponde a permitir que dos filósofos puedan estar comiendo simultáneamente. Cada filósofo utiliza dos tenedores, luego se utilizan cuatro tenedores simultáneamente y quedaría uno sin usar. La solución utiliza un vector de cinco semáforos binarios denominado comensales , uno por filósofo, para bloquear a un filósofo en el caso de que no estén disponibles los dos tenedores que necesita. La solución supone que un filósofo puede encontrarse en tres estados: pensando, hambriento y comiendo. Inicialmente se supone que todos los filósofos están pensando. Para poder consultar y modificar el estado de un filósofo con exclusión mutua se utiliza el semáforo binario exm. También es importante tener en cuenta la ubicación de cada filósofo en la mesa. Sea N el número de filósofos , si se asigna a cada filósofo un identificador numérico i, con i = 0, 1, . . . , N - 1 en sentido contrario a las agujas del reloj (ver Figura C.33), entonces el filósofo i tiene a su izquierda al filósofo (i + N - 1) %N y a su derecha al filósofo (i + 1) %N. Recuérdese (ver Apéndice A) que % hace referencia a la operación módulo. En la Tabla C.1 se muestra para el caso N = 5 los vecinos a la izquierda y a la derecha que tiene cada filósofo i. Cuando un filósofo termina de pensar invoca a la función coger_ten para coger los dos tenedores. Si los consigue puede comer. Cuando termina de comer invoca a la función dej ar_ ten para dejar los
448
Fundamentos básicos de los sistemas operativos
i=O
i= 1
i= 4
Figura C.33 - Ubicación de los filósofos en la mesa
tenedores sobre la mesa y avisar a sus vecinos por si estaban esperando para utilizarlos. El procedimiento coger_ten en primer lugar realiza una operación wai t _ sem (exm) que bloqueará al filósofo i en la cola del semáforo si dicho semáforo estaba a O. Si el semáforo estaba a 1 entonces cambia el estado del filósofo i a hambriento e invoca a la función comprobar que comprueba si los vecinos del filósofo i no se encuentran comiendo. En caso afirmativo cambia el estado del filósofo i a comiendo y realiza una operación signal_sem(comensales [i]) para desbloquear al filósofo i. En caso negativo, es decir, alguno de los vecinos del filósofo i estaban comiendo, entonces la función comprobar no realiza ninguna acción. Al retornar de ella se ejecuta una operación signal_sem (exm) ya continuación una operación wait_sem (comensales [i] ) para bloquear al filósofo i mientras quedan disponibles los tenedores. El procedimiento de j ar_ten en primer lugar realiza una operación wa i t _ s em ( exm) que bloqueará al filósofo en la cola del semáforo si dicho semáforo estaba a O. Si el semáforo estaba a 1 entonces cambia el estado del filósofo i a pensando e invoca dos veces a la función comprobar. La primera vez con el identificador del vecino de la izquierda y la segunda con el identificador del vecino de la derecha. Con ello lo que se pretende es desbloquear a dichos filósofos por si estaban esperando para comer. El proceso finaliza con una operación signal_sem (exm). Filosofo a la izquierda (i + N -1)%N 4 O 1 2 3
Filosofo i O 1 2 3 4
Filosofo a la derecha (i + 1) %N 1 2 3 4 O
Tabla C.I - Vecinos de cada filosofo para N = 5
Soluciones completas de los problemas
449
#define TRUE 1 #define N 5 #define pensando O #define hambriento 1 #define comiendo 2 semáforo binario exm, comensales [N] ; int estado [N] ; void filósofo(int i) while (TRUE)
{ pensar() ; coger_ten(i) ; comer() ; dejar_ten(i) ;
void coger_ten(int i) wait_sem(exm) ; estado[i] = hambriento; comprobar(i) ; signal_sem(exm) ; wait sem(comensales[i]);
void dejar_ten(int i) wait sem(exm); estado[i] = pensando; comprobar ( (i+N-l) %N) ; comprobar ( (i+l) %N) ; signal_sem (exm) ;
void comprobar(int i) if (estado(i)==hambriento && estado((i+N-l) %N) !=comiendo && estado((i+l) %N) !=comiendo) estado[i] = comiendo; signal sem(comensales[i]);
Figura C.34 - Primera parte de la solución del Problema 4.6
JI
l' 11
450
Fundamentos básicos de los sistemas operativos
void main () { init sem(exm,l); for(i=0,i
Figura C.35 - Segunda y última parte de la solución del Problema 4.6
c.s.
Soluciones problemas capítulo 5
Solución Problema 5.1 En la Figura C.36 se muestra el grafo de asignación de recursos pedido. Para dibujarlo se ha supuesto que: el procesador es el recurso R¡, el disco duro es el recurso R2 y las dos unidades de DVD son dos instancias de un mismo recurso R3. En el grafo no hay ningún camino que sea un ciclo luego no existe interbloqueo.
Figura C.36 - Grafo de asignación de recursos del Problema 5.1
Solución Problema 5.2 En la Figura C.37 se muestra el grafo de asignación de recursos pedido. Se observa la existencia del ciclo Cl ---7 A ---7 C3 ---7 D ---7 C4 ---7 C ---7 C2 ---7 B ---7 Cl. Como solo hay una instancia de cada recurso, la existencia de un ciclo es una condición necesaria y suficiente para garantizar la existencia de interbloqueo.
Soluciones completas de los problemas
451
Figura C.37 - Grafo de asignación de recursos del Problema 5.2
Solución Problema 5.3 a) En primer lugar hay que calcular el número de instancias de cada recurso que todavía necesita cada proceso. Éste se obtiene restando la matriz N y la matriz A:
N-A=
~l-(~ ~ ~l=(~ ~ ~l
22 1 1 ( 3 1 O
100
210
En segundo lugar hay que comprobar si existe alguna fila i de N - A, es decir, algún proceso Pi que cumpla la siguiente condición: (Ni - A i ) ~ RD
i = 1,2, 3
La primera fila asociada al proceso PI no cumple la condición:
(1
1
O)~(l
01)
La segunda fila asociada al proceso P2 si cumple la condición:
(1
O
1)~(1
01)
La tercera fila asociada al proceso P3 no cumple la condición:
(2
1
O)~(l
O 1)
452
Fundamentos básicos de los sistemas operativos
Luego al proceso P2 se le pueden conceder todos los recursos que necesita para completarse aunque los solicite todos a la vez. Supóngase que el proceso P2 se ha completado, el estado del sistema pasaría a ser S2:
Ahora la matriz N - A es:
N-A=
1 1 O
(
O O O
1
210
Como antes hay que comprobar si existe alguna fila i de N - A, sin considerar i la condición:
= 2, que cumpla
(Ni -A i ) ~ RD
La primera fila asociada al proceso PI si cumple la condición: (1
1
O)~(1
1
1)
La tercera fila asociada al proceso P3 no cumple la condición:
(2
1
O)~(l
1 1)
Luego al proceso PI se le pueden conceder todos los recursos que necesita para completarse aunque los solicite todos a la vez. Supóngase que el proceso PI se ha completado, el estado del sistema pasaría a ser S3:
La matriz N - A es:
N-A=(~ ~ ~l
Soluciones completas de los problemas
Se comprueba que la fila i
= 3 de N (2
453
A asociada al proceso 3 cumple la condición:
1
0)~(2
2 2)
Luego al proceso P3 se le pueden conceder todos los recursos que necesita para completarse aunque los solicite todos a la vez. En conclusión se ha demostrado que el estado S 1 es un estado seguro, ya que a partir de él es posible completar la ejecución de los tres procesos. b) De acuerdo con el algoritmo del banquero se simula que se concede la petición al proceso P4 Y se actualiza el estado del sistema. A este estado ficticio se le va a denotar como S':
A continuación hay que comprobar si el estado S' es seguro. Para ello, en primer lugar, hay que calcular N - A Y comprobar si existe alguna fila i de N - A que cumpla la siguiente condición: (Ni-Ai)~ RD
i= 1,2,3,4
La matriz N - A es:
N-A=[~ ~ ~l-[~ ~ ~l=[~ ~ ~l 310 210
100 100
210 110
La primera fila de N - A asociada al proceso Pl no cumple la condición:
(1
1
O)~(O
01)
La segunda fila de N - A asociada al proceso P2 no cumple la condición:
(1
O
1)~(0
01)
La tercera fila de N - A asociada al proceso P3 no cumple la condición:
(2
1
O)~(O
01)
La cuarta fila de N - A asociada al proceso P 4 no cumple la condición:
454
Fundamentos básicos de los sistemas operativos
(110)::;(0 01) Como ningún proceso cumple la condición el estado S' es un estado inseguro. Por lo tanto la petición del proceso P 4 se debe denegar y el proceso P 4 debe ser bloqueado hasta que se le pueda conceder su petición inicial de recursos.
Solución Problema 5.4 Para poder aplicar el algoritmo de Coffman, en primer lugar hay que calcular el vector de recursos disponibles RD. Del enunciado se deduce que el vector de recursos existentes RE es:
RE
= (2
3 4)
De la matriz A se puede deducir el vector de recursos asignados RA, sumando los elementos de una misma columna:
RA
= (2
2 1)
El vector RD se obtiene de la siguiente forma:
RD = RE - RA = (2 3 4) - (2 2
1) = (O
1 3)
Los pasos del algoritmo son los siguientes: 1) Se examina la matriz A y se comprueba si alguna de sus filas es igual a (O O O). Como no existe ninguna, no se marca ningún proceso como completado. 2) Se realiza la siguiente asignación:
x = RD = (O
1 3)
3) Para cada proceso Pi no marcado como completado, en este caso los tres procesos, se comprueba la siguiente condición:
M¡::;X
3.1) La primera fila de M asociada al proceso PI no cumple la condición: (121)::;(013) 3.2) La segunda fila de M asociada al proceso P2 no cumple la condición: (120)::;(013)
Soluciones completas de los problemas
455
3.3) La tercera fila de M asociada al proceso P3 si cumple la condición: (O
1
1)~(0
1 3)
4) Se marca el proceso P3 como completado, se supone que se ejecuta hasta su finalización y que luego se liberan sus recursos. Se realiza la siguiente actualización:
x = X + A3 = (O
1 3) + (1
O O) = (1
1 3)
5) Para cada proceso Pi no marcado, en este caso PI y P2, se comprueba la siguiente condición:
5.1) La primera fila de M asociada al proceso PI no cumple la condición: (1
2
1)~(1
13)
5.2) La segunda fila de M asociada al proceso P2 no cumple la condición: (1
2
0)~(1
13)
6) Como no existe ningún proceso que cumpla la condición el algoritmo finaliza. Se concluye que existe interbloqueo ya que los procesos PI y P2 no han sido marcados.
C.6.
Soluciones problemas capítulo 6
Solución Problema 6.1 En primer lugar hay que expresar la capacidad de la memoria principal CMP en palabras: C
MP
=
512 220 bytes 229 512MiB = = = 228 palabras 2 (bytes/palabra) 2 (bytes/palabra) 2
A continuación hay que expresar la capacidad de la memoria principal en unidades de asignación: 228 palabras CMP = 8 ( 1 b / . d . ., pa a ras urnda de aSlgnaclOn)
=2
25
. . ., urndades de aSlgnaclon
Cada unidad de asignación tiene asociado un bit en el mapa de bits para indicar si está libre o asignada. Luego el tamaño del mapa de bits 5MB es: 5MB = 225 bits = 222 bytes = 4 MiB
456
Fundamentos básicos de los sistemas operativos
El porcentaje P de memoria ocupado por el mapa de bits es: 4MiB
P
= 512MiB 100 = 0,78 %
. Solución Problema 6.2 a) Para determinar el espacio libre total de la memoria principal en el instante T, en primer lugar se pasan las direcciones físicas inicial y final de cada partición libre de hexadecimal a decimal: Partición #O: D1Ro = 343 16 = 00110100001 h Partición #1: D1Ro = E24 16 = 1110001001002 Partición #2: D1Ro = OF8 16 = 0000111110002 Partición #3: D1Ro = 53716 = 01010011011h
= 83510
DIRF
= 3CF16 = 00111100111 h = 975 10
= 362010
DIRF
= ED816 = 1110110110002 = 380010
= 24810
DIRF
= lA716 = 0001101001112 = 423 10
= 133510
DIRF
= 96F16 = 10010110111h = 241510
En segundo lugar se calcula el tamaño Si expresado en palabras de cada partición i libre: Si
= (DIRF -
D1Ro) + 1
Sustituyendo datos en la expresión anterior y operando se obtienen los siguientes resultados: (975 - 835) + 1 = 141 palabras
S2
= = =
S3
=
(2415 - 1335) + 1 = 1081 palabras
So SI
(3800 - 3620) + 1 = 181 palabras (423 - 248) + 1 = 176palabras
El tamaño del espacio libre total de memoria principal SLT se obtiene sumando los tamaños de las particiones libres: SLT
= So + SI + S2 + S3 = 141 + 181 + 176 + 1081 = 1579palabras
Puesto que la longitud de palabra es de 8 bits, el tamaño del espacio libre total en bits es: SLT
= 1579·8 = 12632 bits
b) Se necesita asignar espacio en memoria principal para un proceso de 175 bytes, es decir, 175 palabras, ya que una palabra ocupa 1 byte. El sistema operativo utiliza el algoritmo de asignación de memoria del primero en ajustarse. Luego cuando necesita asignar espacio examina la lista
Soluciones completas de los problemas
457
de particiones libres comenzando desde el principio en busca de la primera partición libre cuyo tamaño sea mayor o igual al tamaño requerido. En el apartado a) se obtuvo que el tamaño de las particiones libres en el instante T era el siguiente expresado en palabras: So = 141, SI = 181, S2 = 176 Y S3 = 1081. Se observa que la primera partición cuyo tamaño es mayor o igual a las 175 palabras requeridas es la partición #1 luego ésta es la que escoge el sistema operativo para asignarle espacio al proceso. c) El espacio que el sistema operativo asignará al proceso del apartado anterior será el comprendido entre la dirección inicial de la partición #1, es decir, DIRo = 362010 y DlRo + 174 = 379410. Se crea una nueva partición libre cuyas direcciones inicial y final son D1Ro = 379510 = ED316 Y DIRF = 380010 = ED8 16, respectivamente. Esta partición se añade al final de la lista. Luego el estado de la lista de particiones libres de memoria principal en TI después de asignar espacio para el proceso del apartado anterior será el que se muestra en la Figura C.38.
Partición #0
Partición #1
Partición #2
Partición #3
r-+
f---+ f---+ f---+ Cabecera de la lista DIRo=537 16 DIRo=ED3'6 DIRo=343'6 DIRo=OF8'6 de particiones DIRF=ED8' 6 DIRF=lA7 16 DIRF=96F'6 DIRF=3CF'6 libres ~ 1+~ ~ I
Figura C.38 - Estado en el instante TI de la lista de particiones libres de memoria del Problema 6.1
~
Solución Problema 6.3 a) Cuando se utiliza la técnica de paginación una dirección física se descompone en los campos número de marco de página de f bits y desplazamiento dentro del marco de d bits. Por su parte una dirección lógica se descompone en los campos número de página de p bits y desplazamiento dentro de la página de d bits. - Dirección Física: I
,
Para obtener el tamaño del campo número de marco de página se va a calcular en primer lugar el número de marcos NMP en que se descompone la memoria principal si se considera un tamaño de página Sp = 4 KiB: 28
NMP
CMP) = floor (256MiB) = floor ( s;4 KiB = floor (22 12 ) = 2 16 marcos
Conocido N MP el tamaño de este campo se obtiene resolviendo la siguiente desigualdad:
458
Fundamentos básicos de los sistemas operativos
llÚn {NMP
f
Luego como NMP = 2 16 entonces
f
~ 2f }
= 16 bits.
Para obtener el tamaño del campo desplazamiento primero hay que expresar el tamaño de una página en palabras: Sp
=
4 KiB 2 bytes/palabra
=
2 12 bytes 2 bytes/palabra
= 2 11 palabras
Conocido Sp el tamaño de este campo se obtiene resolviendo la siguiente desigualdad:
rnJn {Sp ~ 2d } Luego como Sp
= 2 11
entonces d
= 11 bits.
- Dirección Lógica: Para obtener el tamaño del campo número de página se va a calcular en primer lugar el número de páginas N p en que se descompone el espacio de direcciones lógicas del proceso A si se considera un tamaño de página Sp = 4 KiB :
Np
= ceil (~; ) = ceil (
3
~~~B ) = ceil(77 ,5) = 78 páginas
Conocido N p el tamaño de este campo se obtiene resolviendo la siguiente desigualdad:
Luego como 27 = 128 > 78 entonces p = 7. El tamaño del campo desplazamiento de una dirección lógica es igual al de una dirección física, en este caso, d = 11 bits. En la Figura C.39 se representa el formato de una dirección física y de una dirección lógica. bl) De acuerdo con el apartado anterior una dirección lógica DirL se descompone en los siguientes dos campos: DirL
= (01101002, 000000011Olz)
Para obtener la dirección física DirF a la que hace referencia DirL hay que pasar a decimal el campo número de página: i
= 01101002 = 52 10
Soluciones completas de los problemas
459
27 bits Dirección Física
N° de marco
Desplazamiento
16 bits
11 bits
18 bits Dirección Lógica
N° de página
Desplazamiento
7 bits
11 bits
Figura C.39 - Formato de una dirección física y de una dirección lógica del Problema 6.3
A continuación se consulta la tabla de páginas (Tabla 6.1) Y se obtiene el marco de página en la que está alojada dicha página. En este caso j = 2596. Pasando j a binario se obtiene: j
= 000010 1000 100 1002
Combinando el campo marco j con el campo desplazamiento se obtiene que la dirección física expresada en binario es: Dirp
= 000010 1000 1001000000000110 h
Finalmente pasando a decimal se obtiene: Dirp
= 531662110
b2) La dirección lógica se descompone en dos campos: DirL
= (10 100002, 0000000000 h)
Para obtener la dirección física Dirp a la que hace referencia DirL hay que pasar a decimal el campo número de página:
i = 10100002
= 8010
460
Fundamentos básicos de los sistemas operativos
Como el espacio de direcciones lógicas del proceso A consta de 78 páginas (i = 0, . .. , 77) Y el número de página al que hace referencia DirL es mayor que 77 se produce una excepción por error de direccionamiento que debe ser atendida por el sistema operativo.
Solución Problema 6.4 a) Cuando la traducción de direcciones se realiza con un registro base, el proceso de traducción requiere de un acceso a la memoria principal para acceder a la tabla de páginas del proceso y leer el marco j en el que encuentra la página i referenciada. Luego el tiempo promedio de traducción ttd de una dirección es ttd = tap o b) Cuando la traducción de direcciones se realiza usando un TLB de M entradas, cada entrada del TLB contiene una copia de una entrada de la tabla de páginas del proceso en ejecución. Cuando se produce una referencia a una dirección lógica, el TLB examina en paralelo el campo número de página de cada una de sus M entradas para ver si alguna coincide con el campo número de página i de la dirección lógica, en caso afirmativo se produce un acierto si no se produce un fallo. En caso de acierto se accede a la entrada correspondiente para leer el campo marco j y poder construir la dirección física. En caso de fallo hay que realizar un acceso a la memoria principal a la tabla de páginas del proceso y copiar la entrada i de la tabla en una entrada del TLB . La tasa de aciertos h de un TLB es el cociente entre el número de aciertos y el número total de accesos al TLB. El tiempo promedio de traducción ttd de una dirección es igual a la tasa de aciertos por el tiempo medio de gestión de un acierto tga más la tasa de fallos (1 - h) por el tiempo medio de gestión de un fallo tgf:
ttd
= h t ga + (1 -
h) tgf
Sustituyendo valores y operando se obtiene: ttd
= 0,9·0,3 tap + (1 -
0,9)·1,3 t ap
= 0,4 t ap
c) Cuando la traducción de direcciones se realiza usando un banco de registros, la traducción no requiere realizar ningún acceso a memoria principal ya que existe una copia de la tabla de páginas del proceso cargada en el banco de registros. Luego el tiempo promedio de traducción de una dirección coincide con el tiempo medio de acceso al banco de registros, es decir, ttd = 0,3 tap o
Solución Problema 6.5 a) Cuando se usa la técnica de segmentación la dirección lógica asociada a un determinado segmento se divide en dos campos (ver Figura 6.28): número de segmento de s bits y desplazamiento de d bits.
Soluciones completas de los problemas
461
Puesto que el proceso consta de 4 segmentos, el campo número de segmento tendrá un tamaño de s = 2 bits. Por otra parte el tamaño mínimo d del campo desplazamiento depende de la longitud Ss de cada segmento expresada en palabras y se determina resolviendo la siguiente desigualdad: d
mJn {Ss::; 2
}
El segmento O tiene una longitud de 1024 bytes = 512 palabras = 29 palabras, por lo tanto d = 9 bits. Luego una dirección lógica asociada al segmento O tiene un tamaño de s + d = 2 + 9 = 11 bits. El segmento 1 tiene una longitud de 3072 bytes = 1536 palabras < 2048 = 2 11 palabras, por lo tanto d = 11 bits. Luego una dirección lógica asociada al segmento 1 tiene un tamaño de s + d = 2 + 11 = 13 bits. El segmento 2 tiene una longitud de 4096 bytes = 2048 palabras = 2 11 palabras, por lo tanto d bits. Luego una dirección lógica asociada al segmento 2 tiene un tamaño de s + d = 2 + 11 bits.
= 11 = 13
El segmento 3 tiene una longitud de 512 bytes = 256 palabras = 2 8 palabras, por lo tanto d = 8 bits. Luego una dirección lógica asociada al segmento 2 tiene un tamaño de s + d = 2 + 8 = 10 bits. Comentario 1: Este apartado también se podría haber resuelto considerando que el tamaño del campo desplazamiento viene fijado por el segmento de longitud más grande (el segmento 2 con 4096 bytes = 2048 palabras), con lo que el campo desplazamiento máximo sería de 11 bits. En consecuencia el tamaño de todas las direcciones lógicas del proceso A será de 2 + 11 = 13 bits. Comentario 2: Este apartado también se podría haber resuelto considerando que desde el punto de vista del hardware el tamaño máximo que puede tener una dirección lógica vendrá dada por el tamaño del registro contador de programa del procesador. Supuesto que dicho registro tiene un tamaño de n bits, entonces el tamaño de campo número de segmento sigue siendo de 2 bits, mientras que el del campo desplazamiento sería de n - 2 bits. Por ejemplo, supuesto que no existe memoria virtual, el tamaño del registro contador de programa suele coincidir con el tamaño de una dirección física. Según el enunciado la capacidad de la memoria es de 128 MíB y el tamaño de una palabra es de 2 bytes. En consecuencia la memoria consta de (128.22°)/2 = 226 palabras. Es decir, una dirección física tiene un tamaño de n = 26 bits. Luego el tamaño de una dirección lógica se debe ajustar a 26 bits, con lo cual el campo desplazamiento de una dirección lógica asociada a un segmento del proceso A tendrá como máximo 24 bits.
b) Se tiene la siguiente dirección lógica expresada en binario: 011100000000 h De acuerdo con el apartado anterior, los dos bits más significativos de una dirección lógica indican el número de segmento, luego Oh = 110, es decir, hace referencia al segmento 1. El resto de bits
462
Fundamentos básicos de los sistemas operativos
110000000012 indican el desplazamiento. Pasándolo a decimal se obtiene un desplazamiento de 1537 palabras = 3074 bytes. En la tabla de segmentos del proceso A se observa que este desplazamiento (3074 bytes) es mayor que la longitud del segmento 1 (3072 bytes), luego se producirá un error de direccionamiento por violación del tamaño del segmento.
c. 7.
Soluciones problemas capítulo 7
Solución Problema 7.1 a) Cuando se utiliza la técnica de paginación una dirección física se descompone en los campos número de marco de página de f bits y desplazamiento dentro del marco de d bits. Por su parte una dirección virtual se descompone en número de página de p bits y desplazamiento dentro de la página de d bits. - Dirección física:
Del dato de la capacidad de la memoria principal C MP expresada en palabras se puede determinar el tamaño n en bits de una dirección física, para ello hay que resolver la siguiente desigualdad:
Del enunciado se sabe que CMP = 256 MiB = 228 bytes, dividiendo por la longitud de una palabra (16 bits = 2 bytes) se obtiene la capacidad expresada en palabras: C MP Luego n
=
228 bytes 2 (bytes/palabra)
= 227 palabras
= 27 bits.
Por otra parte del tamaño de una página Sp expresado en palabras se puede determinar el tamaño d en bits del campo desplazamiento tanto de una dirección física como de una dirección virtual, para ello hay que resolver la siguiente desigualdad:
Del enunciado se sabe que Sp = 4 KiB = 2 12 bytes, dividiendo por la longitud de una palabra se obtiene el tamaño de una página expresado en palabras:
Sp
=
2 12 bytes
2 (bytes/palabra)
= 2 11 palabras
Soluciones completas de los problemas
Luego d
463
= 11 bits.
El tamaño f del campo número de marco de página se puede obtener, por ejemplo, de la siguiente forma:
f =n -
d
= 27 -
11
= 16 bits
- Dirección virtual:
Del dato del tamaño CA del espacio de direcciones virtuales del proceso A expresado en palabras se puede determinar el tamaño m en bits de una dirección virtual, para ello hay que resolver la siguiente desigualdad:
Del enunciado se sabe que CA = 128 MiB = 227 bytes, dividiendo por la longitud de una palabra se obtiene el tamaño del espacio virtual del proceso A expresado en palabras: CA Luego m
=
227 bytes 2 (bytes/palabra)
= 226 palabras
= 26 bits.
El tamaño del campo desplazamiento de una dirección virtual tiene el mismo tamaño que el de una dirección física. Por su parte, el tamaño p del campo número de página se puede obtener, por ejemplo, de la siguiente forma: p = m- d
= 26 -
11
= 15 bits
En la Figura C.40 se representa el formato de una dirección física y de una dirección virtual. b) De acuerdo con el apartado anterior una dirección virtual Dirv se descompone en los siguientes dos campos: Dirv = (000001111110001, 11111001111) Para obtener la dirección física DirF a la que hace referencia Dirv hay que pasar a decimal el campo número de página:
i = 00000111111 000 12 = 100910 A continuación se consulta la tabla de páginas (Tabla 7.1) Y se comprueba el valor del bit de validez v. Como v = O significa que actualmente la página i = 1009 no está cargada en memoria principal por lo que se produce un fallo de página.
464
Fundamentos básicos de los sistemas operativos
..
n=27 bits Dirección Física
Desplazamiento
N° de marco
...
f=16 bits
d=ll bits
..
m=26 bits Dirección Virtual
..
N° de página
Desplazamiento
...
p=15 bits
d=ll bits
..
Figura C.40 - Formato de una dírección física y de una dirección virtual del Problema 7.1
c) En la Tabla 7.1 se observa que una entrada de la tabla de páginas contiene el campo marco de página y los bits r, m y v. El tamaño del campo marco de página, de acuerdo con el apartado (a), es de 16 bits. Luego el tamaño E de una entrada es: E = 15 + 1 + 1 + 1 = 18 bits. Por otra parte el número de páginas Np de que consta el proceso A se calcula de la siguiente forma: 27
N P = cel'l(CA) sp
= cel'1(128MiB) 4 KiB
= cel'1(22 12 )
/ . = 2 15 pagmas
Es decir, la tabla de páginas debe tener 2 15 entradas. Luego el tamaño de la tabla de páginas C TP del proceso A se obtiene de la siguiente forma: CTP
= E (bits/entrada) Np (entradas) = 18.2 15 = 589824 bits = 73728 bytes
El porcentaje P de memoria principal que ocupa esta tabla se calcula de la siguiente forma: P
= C TP 100 = 73728 bytes 100 = CMP
256 MiB
73728 bytes 100 256220 bytes
= O 0275 % '
Solución Problema 7.2 a) Una dirección virtual referencia a una determinada palabra dentro de una página i. Dada una dirección virtual se pueden producir dos casos: que la página a la que referencia se encuentre cargada en la memoria principal (se produce un acierto de página) o que no esté cargada en memoria principal (se produce un fallo de página).
Soluciones completas de los problemas
465
Si se desprecia el tiempo medio de acceso al banco de registros de la MMU para acceder a la tabla de páginas y determinar si la página está cargada en memoria y en que marco j, entonces el tiempo medio de atención de un acierto de página será igual al tiempo medio de acceso a memoria tam para leer la palabra referenciada. Por otra parte el tiempo medio de gestión de un fallo de página tgp será la suma de varias contribuciones, recuérdese que cuando se produce un fallo de página, entre otras acciones: hay que leer la página en memoria secundaria, copiarla en la memoria principal y posteriormente acceder a la palabra referenciada. Sea NR el número de direcciones virtuales referenciadas, NA el número de aciertos de página producidos y N F el número de fallos de página producidos, el tiempo total TR de despacho de las NR referencias a memoria se puede determinar como la suma del tiempo total T A de gestión de los NA aciertos más el tiempo total T F de gestión de los N F fallos: (1)
Por otra parte se cumple que:
TA
=
NAt p
(2)
TF
=
NFtgj
(3)
Sustituyendo (2) y (3) en (1) se obtiene:
(4) Dividiendo ambos miembros de (4) por NR se obtiene el tiempo medio de despacho de una referencia a memoria tR, también denominado tiempo de acceso efectivo a memoria principal: (5)
Por definición la tasa de fallos de página pes: (6)
Mientras que la tasa de aciertos (1 - p) es: (7)
Sustituyendo (6) y (7) en (5) se llega finalmente a la siguiente expresión para tR:
466
Fundamentos básicos de los sistemas operativos
tR = (1- p)tam + ptgf
b) Si p
(8)
= O sustituyendo valores en (8) y operando se obtiene: tR
= tam = 100ns
Si p = 0,001 sustituyendo valores en (8) y operando se obtiene: tR
= (1- 0,001) 100 10-9 + 0,001.2510- 3 = 2,510010- 5 s = 25,lJls
c) El factor de retardo R en el acceso a memoria asociada es: R
= tR(P)
(9)
tReO)
En este caso p se obtiene:
= 0,001, luego sustituyendo los resultados del apartado anterior en (9) y operando R
= tR(O,OOl) = 25,110- 6 = 251 tam
10010-9
Este factor indica que el tiempo de acceso efectivo a memoria principal debido a la existencia de fallos de página es 251 veces mayor que el tiempo medio de acceso a memoria si no existiesen fallos de página. d) Se desea que: tR < tam + 01 , tam
--t
~<11, tam
Sustituyendo (8) en la expresión anterior se obtiene: (1 - p) tam + P tgf -----....:0:....<1,1 tam
Despejando p, sustituyendo valores y operando se obtiene finalmente: am p< O,lt tgf - tam
--t
p< 410- 7
Soluciones completas de los problemas
467
Solución Problema 7.3 El tiempo medio de gestión de un fallo de página tgf depende de si la página ha sido modificada, lo cual ocurre el 50 % de las veces. Si la página se modifica el tiempo medio de gestión del fallo es de 25 ms, en caso contrario emplea 7 ms. Luego tgf se calcula de la siguiente forma: tgf = 0,5.710- 3 + 0,5.2510- 3 = 0,016 s
El tiempo medio de despacho de una referencia a memoria es: tR
= (1- p)tam + ptgf
Se desea que tR sea menor de 210 ns, es decir: (1 - p) tam + P tgf < 210 10-9
Despejando p se obtiene: 210 10-9 - tam p<----tgf - tam Sustituyendo valores y operando se obtiene finalmente que: P<
210 10-9 - 100 10-9 0,016 _ 100 10-9
~
P < 6,875010-
6
Solución Problema 7.4 La MMU dispone de un TLB en el cual se cargan un cierto número de entradas de la tabla de páginas del proceso en ejecución. Cuando se va a traducir una dirección virtual que referencia a una determinada página i se busca en el TLB la entrada i de la tabla de páginas. Si se encuentra se produce un acierto, en caso contrario se produce un fallo y hay que acceder a la memoria principal a leer dicha entrada de la tabla de páginas. Luego el tiempo medio de lectura ti de la entrada de la tabla de páginas asociada a la página referenciada es: ti
= htga + (1- h)tf
En la expresión anterior h es la tasa de aciertos del TLB, tga es el tiempo medio de gestión de un acierto en el TLB y tf es el tiempo medio de gestión de un fallo en el TLB. Del enunciado se sabe que h = 0,9 y tga = O. Además se puede considerar que tf = tam = 100 ns. Luego sustituyendo valores y operando se obtiene: ti = 0,9·0 + 0,1·100 10-9 = 10 10-9 = 10 ns
Si se considera ti, el tiempo medio de despacho de una referencia a memoria se calcula de la siguiente forma:
468
Fundamentos básicos de los sistemas operativos
tR
= ti + (1- p)tam + ptgf
Sustituyendo valores y operando se obtiene: tR
= 10 10-9 + 0,9·100 10-9 + 0, l· 25 10-3 = 0,0025 s = 2,5 ms
Solución Problema 7.5 a) El algoritmo LRU selecciona como página víctima aquella que lleva más tiempo sin ser referenciada, es decir, aquella con tus más grande. Se observa en la Tabla 7.2 que la página i = 3 es la que tiene el valor de tus más grande (390 ut), luego será la página victima seleccionada por el algoritmo LRU. b) El algoritmo PIFO selecciona como página víctima aquella que lleva más tiempo cargada en memoria, es decir, aquella con te más grande. Se observa en la Tabla 7.2 que la página i = 1 es la que tiene el valor de te más grande (250 ut), luego será la página victima seleccionada por el algoritmo PIFO. c) El algoritmo de reeemplazamiento de la segunda oportunidad es una variante del algoritmo PIFO que busca la página que lleva más tiempo cargada en memoria y no ha sido referenciada recientemente. Básicamente este algoritmo consulta el bit referenciada (r) de la página que se encuentra al principio de la cola PIFO. Si r = 0, entonces la página es seleccionada para ser reemplazada y el algoritmo finaliza. Por el contrario, si r = 1 entonces el algoritmo pone el bit a y coloca el número de la página al final de la cola, es decir, se le da una segunda oportunidad
°
En este caso, si se ordenan las páginas de mayor a menor tiempo de carga se obtiene la siguiente ordenación de la cola PIFO: i = 1 (r = 1), i = 2(r = O), i = O(r = 1) e i = 3 (r = 1). La página con el tiempo de carga más grande es i = 1. Como r dad, se pone su bit r = y se coloca al final de la cola PIFO.
°
= 1 se le da una segunda oportuni-
La segunda página con mayor tiempo de carga es la página i = 2. Como r victima seleccionada por el algoritmo de la segunda oportunidad.
=
°
será la página
Solución Problema 7.6 a) El número de páginas Np de un proceso X se calcula de la siguiente de la forma:
Np
= ceil ( ~: )
.La tabla de páginas de un proceso tiene una entrada por cada página. Luego el tamaño de la tabla de páginas CTP de un proceso es:
Soluciones completas de los problemas
469
C TP = E (bytes/entrada) Np (entradas) b) El espacio de memoria principal desperdiciado Cd por la paginación de un proceso es la suma del tamaño de su tabla de páginas y de la fragmentación interna promedio, que recuérdese es de media página: Sp Cd = CTP +"2 La expresión anterior se puede escribir equivalentemente de la siguiente forma: Sp . (Cx) Sp Cd = EN p +"2 = Ecell Sp +"2 Nótese que suponiendo que Cx y Sp son potencias de 2 entonces: . (Cx) Cx Np = cell S; = S; Luego Cx Sp Cd=E-+Sp 2 Derivando la expresión anterior con respecto a Sp se obtiene: -2 1 dC d = -ECxSp +dS p 2
El valor de Sp que minimiza Cd se obtiene resolviendo la siguiente ecuación: -ECxSp
-2
1 +-=0 2
Despejando Sp se obtiene finalmente que Sp = ~2ECx Tal y como se quería demostrar. c) Sustituyendo valores en la expresión del valor óptimo de Sp y operando se obtiene el siguiente resultado: Sp =
~2.8(bytes/entrada).220(entradas)
=
-fijA bytes = 2 12 bytes = 4KiB
470
C.S.
Fundamentos básicos de los sistemas operativos
Soluciones problemas capítulo S
Solución Problema 8.1 a) La capa de manejadores de las interrupciones. b) La capa de drivers de dispositivos. c) El subsistema de E/S. d) Esta función se ejecuta en modo usuario fuera del núcleo mediante la invocación por parte del proceso de alguna función de una librería de E/S.
Solución Problema 8.2 En el envío de un paquete de datos por parte de un proceso emisor ubicado en un computador 1 a otro proceso receptor ubicado en un computador 2 hay que considerar únicamente, de acuerdo con el enunciado, los siguientes pasos: 1) Copiar el paquete del espacio de usuario del proceso emisor a un buffer del núcleo en memoria
principal. Esta operación requiere un cierto tiempo T cp, que se calcula de la siguiente forma: Tcp = Sp (bytes) TB (s/byte) 2) Copiar el paquete del buffer del núcleo al adaptador de red. Esta operación requiere también un
tiempo Tcp. 3) Transmisión del paquete por la red. Esta operación requiere un tiempo T red que se calcula de la
siguiente forma: Tred
=
Sp (bytes) 8 (bits/byte) . V R (bItS/S)
8 Sp
= -S V R
4) Almacenar el paquete enviado por la red en el adaptador de red del computador 2. El paquete está disponible en el adaptador de red del computador receptor T D S después de haber llegado el último bit del paquete. 5) Tratamiento de la interrupción que envía el adaptador de red del computador 2 a la CPU. Esta operación requiere un tiempo TI. 6) Copiar el paquete del adaptador a un buffer del núcleo del sistema operativo. Esta operación requiere un tiempo Tcp. 7) Copiar el paquete del buffer del núcleo al espacio de usuario del proceso receptor. Esta operación requiere un tiempo Tcp.
Soluciones completas de los problemas
471
Luego el tiempo total T que transcurre desde que el emisor envía un paquete hasta que puede enviar el siguiente será la suma de las siete contribuciones anteriores: T
= Tcp + Tcp + Tred + To + TI + Tcp + Tcp
La expresión anterior se puede escribir equivalentemente de la siguiente forma: T
= 4Tcp + Tred +To +TI = 4S p TB + 8 -Sp
VR
+To +TI
= 4Sp ( TB 2 +-
) +To +TI
VR
Finalmente la velocidad de transmisión máxima V max se obtiene de la siguiente forma: V max
8Sp
=-
=
T
8Sp 4S p (TB+JJ+To+TI
. (bItS/S)
Solución Problema 8.3 Para resolver este problema simplemente hay que determinar en que cola j se almacena cada bloque NBD aplicando la operación módulo j = NBO %Nc con Nc = 4. El estado del caché de bloques de disco en el instante T se muestra en la Figura CAL
Solución Problema 8.4 a) La capacidad del disco Co se determina de la siguiente forma: Co
=
8 (superficies) 512 (pistas/superficie) 128 (sectores/pista) 256 (bytes/sector)
=
227 bytes
= 128 MiB
b) El número de sectores Ns de tamaño Ss KiB se determina de la siguiente forma:
Ns
= cell. (SBL) = cell. ( Ss
= 256 bytes que ocupará un bloque de tamaño SBL = 4
4(KiB/blo que)) 256 (bytes/sector)
12
= 2 8 (bytes/bloque) = 16 sectores 2 (bytes/sector)
c) En una operación de lectura el controlador del disco lee el contenido de toda una pista es decir 128 sectores. De acuerdo con el apartado anterior un bloque ocupa 16 sectores. Luego el número de bloques NBP que el controlador del disco lee en una operación de lectura se determina de la siguiente forma: .) NBP = fi oor ( 128 (sectores/Pista)) = 8 (bloques /pIsta 16 (sectores/bloque)
472
Fundamentos básicos de los sistemas operativos
---+
Cabecera de la 4
28
64
+-L -_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _~I
Cabecera de la cola de dispersión n° 1 [No bloque%4=1]
17
97
~--------------------------~I
Cabecera de la cola de dispersión n° 2 [No bloque%4=2]
50
10
L -_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _~I
Cabecera de la cola de dispersión n° 3 [No bloque%4=3]
35
99
L -_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _~I
i 5
i 98
i 3
i
Figura C.41 - Estado de la caché de buffers de bloques de disco del Problema 8.3 en el instante T
d) Para responder a este apartado en primer lugar hay que determinar el número total de bloques NTB que se pueden almacenar en el disco:
El número n de bits que se necesitan para establecer una dirección de bloque se obtiene resolviendo la siguiente desigualdad:
Soluciones completas de los problemas
Como NTB
473
= 2 15 entonces n = 15 bits.
e) En el disco se pueden almacenar NTB = 2 15 = 32768 bloques, cuyas direcciones irán desde DirB = hasta DirB = 32767. Dada una dirección DirB se desea conocer la tripleta (cilindro, cabeza, sector) = (e, h, s) asociada al primer sector del bloque DirB. Existen 512 cilindros, luego e = 0, 1,2, .. . ,511; 8 cabezas de lectura/escritura, luego h =0, 1, ... ,7; y 128 sectores por pista, luego s = 0, 1, .. . , 127.
°
Para realizar la traducción hay que calcular el número de bloques que caben en un cilindro NBC, el número de bloques lógicos que caben en una pista NBP y el número de sectores que ocupa un bloque Ns. Cada cilindro consta de 8 pistas, una por cabeza de lectura/escritura, luego la capacidad de un cilindro Cc es: Cc
= 8 (pistas) 128 (sectores/pista) 256 (bytes/sector) = 218 bytes
El número de bloques que caben en un cilindro NBC se determina de la siguiente forma: 18
18
NBC
Cc ) = ftoor ( 2 bytes) = ftoor ( 2 bytes ) = 64 bloques = ftoor ( -SBL 4 (KiB/bloque) 2 12 (bytes/bloque)
Por otra parte NBLP y Ns se determinaron en los apartados c) y b), respectivamente. Una vez determinados estos valores pueden calcularse las coordenadas e, h y s. En primer lugar, hay que calcular el número de sector, para ello se divide DirL entre NBc. Se obtiene un cociente e y un resto E: e
DirL) = ftoor ( -
E
= DirB %NBC
NBc
El cociente es el número entero de cilindros que hay por debajo de DirL y puesto que la numeración comienza en el cilindro 0, entonces e es el número de cilindro en el que se encuentra DirL. Por otra parte el resto E es el número de bloque dentro del cilindro. Puesto que cada cabeza lee una pista del cilindro, para averiguar a que cabeza pertenece este bloque se divide E entre el número de sectores que tiene cada pista: h
= ftoor(~) NBP
Del mismo modo que en el caso anterior el cociente h indica el número de cabeza, mientras que el resto E % NBP será el número de bloque dentro de esa cabeza.
474
Fundamentos básicos de los sistemas operativos
Finalmente para obtener la coordenada s basta con multiplicar dicho resto por N s para pasar de bloques a sectores: t) Sustituyendo en las expresiones obtenidas en el apartado anterior los valores DirB = 10002, NBC = 64 bloques/cilindro, NBP = 8 bloques/pista y Ns = 16 sectoresjbloque; y operando se obtienen los
siguientes resultados: e E h
s
(~~~) = floor (1O~402) = floor(156,28) = 156
= =
DirB % NBC
= =
floor (N: ) = floor ( 18) = floor(2,25) = 2 p 8 (E %NBP)Ns = (18 % 8) 16 = 2·16 = 32
floor
= 10002 % 64 = 18
Luego el primer sector del bloque lógico DirB = 10002 se encuentra en la tripleta (156, 2, 32).
Solución Problema 8.5 Se sabe por el enunciado que la frecuencia de la interrupción del reloj es de 50 Hz, es decir, de 50 tics/s. Luego un tic de reloj se produce cada Ttic = 1/50 = 0,02 s. Además el tiempo que requiere el tratamiento de esta interrupción es TI = 51ls = 510- 6 s. El porcentaje P de US? del procesador que requiere el tratamiento de una interrupción del reloj se determina de la siguiente forma:
P
TI
510- 6
= -100 = -00 100 = 0,0250% Ttic , 2
Solución Problema 8.6 a) El tamaño de una imagen de la pantalla Sp se determina de la siguiente forma: Sp
= 1360·768·32 = 33423360 bits = 4177920 bytes = 3,984MiB
b) El número de imágenes de pantalla Np que pueden almacenarse en la VRAM se calcula de la siguiente forma: N p = floor (
256MiB ) . 3,984MIB
. , = floor(64,257) = 641magenes
c) La velocidad de transferencia de datos VT de la VRAM se determina de la siguiente forma: VT = 3,984 (MiB/imagen) 75 (imágenes/s) = 298,828 MiB/s
Soluciones completas de los problemas
C.9.
475
Soluciones problemas capítulo 9
Solución Problema 9.1 a) Puesto que la entrada " .. " hace referencia al directorio padre, el nombre de ruta absoluta pedido es: /paco_m/fotos/sol.gif b) Cada directorio presente en un nombre de ruta absoluta requiere dos lecturas en disco: una lectura para leer y copiar en memoria principal su nodo-i, que entre otras informaciones contiene la dirección del bloque del disco donde se almacena la lista de entradas del directorio. Otra lectura para leer y copiar en memoria dicho bloque. El primer componente de la ruta es el directorio raíz" /". Se sabe por el enunciado que su nodo-i NI ya está en memoria. Luego hay que realizar un acceso a disco para copiar en memoria el bloque B 1 que contiene la lista de entradas del directorio raíz. El segundo componente de la ruta es el directorio paco _m. Del bloque B 1 se obtiene el número de nodo-i N2 asociado este directorio. Hay que realizar un acceso a disco para copiar en memoria el nodo-i N2. De N2 se obtiene la dirección B2 del bloque que contiene la lista de entradas de este directorio. Hay que realizar un acceso a disco para copiar en memoria B2. El tercer componente de la ruta es el directorio cartas. Del bloque B2 se obtiene el número de nodo-i N3 asociado este directorio. Hay que realizar un acceso a disco para copiar en memoria el nodo-i N3. De N3 se obtiene la dirección B3 del bloque que contiene la lista de entradas de este directorio. Hay que realizar un acceso a disco para copiar en memoria B3. El cuarto componente de la ruta es el archivo carta. txt. Del bloque B3 se obtiene el número de nodo-i N4 asociado a este archivo. Se debe realizar un acceso a disco para copiar en memoria el nodo-i N4. Luego se han realizado un total de 6 accesos a disco para buscar y copiar en memoria el nodo-i asociado al archivo cuyo nombre de ruta absoluto es /paco _ m/ cartas / carta. txt .
Solución Problema 9.2 Si la lista de bloques libres se implementa como un mapa de bits entonces cada bloque físico tendrá asociado un bit. Luego como hay NB bloques el mapa de bits tendrá un tamaño de NB bits. Por otra parte, puesto que un bloque tiene un tamaño de SB bits entonces el número de bloques de disco NMB que se necesitan para almacenar el mapa de bits se determina de la siguiente forma:
NMB
= ceil(~:)
Por su parte si la lista de bloques libres se implementa como una lista enlazada, en primer lugar hay que calcular el número de direcciones ND de bloques físicos que se pueden almacenar en un bloque:
476
Fundamentos básicos de los sistemas operativos
No
= fioor(S;)
De las No direcciones que caben en un bloque hay que reservar una dirección para almacenar la dirección del siguiente bloque de la lista enlazada. Luego el número de direcciones efectivas NOE de bloques libres que se pueden almacenar en un bloque físico es: NOE
= No-l
Como existen F bloques libres, la lista de bloques libres tiene que almacenar F direcciones de bloques libres. El número M de bloques de disco que se necesitan para almacenar F direcciones se determina de la siguiente forma: M
= ceil(~) NOE
La condición que se debe cumplir para que la lista de bloques libres implementada como una lista enlazada ocupe menos bloques de disco que si se fuera implementada como un mapa de bits es la siguiente:
M < NMB
~ ceil( fioor (~B) 1< ceil(NB) d - 1 SB
Si F, d, SB y NB son potencias de dos entonces la expresión anterior se puede expresar de la siguiente IGffi\'O.·.
F NB ---<§.Il. -1 SB d
Solución Problema 9.3 En el sistema de archivos FAT-12 se utilizan 12 bits para especificar la dirección de un cluster. Luego el espacio posible de direcciones consta de 2 12 = 4096 direcciones. Sin embargo, no todas las direcciones se encuentran disponibles para especificar los siguientes clusters donde se alojan los datos de un archivo. De acuerdo con el enunciado, siete direcciones (FFO- FF6) están reservadas para clusters utilizados por estructuras del sistema de archivos, una dirección (FF7) está reservada para especificar que un cluster está defectuoso, una dirección (000) está reservada para especificar que un cluster está libre y 8 direcciones (FF8-FFF) están reservadas para especificar el final de un archivo o directorio. Luego hay un total de 17 direcciones reservadas, 10 que dejaría un total de 4096 - 17 = 4079 direcciones disponibles para especificar los siguientes clusters donde se alojan los datos de un archivo. Por lo tanto, un archivo como máximo puede ocupar 4080 clusters, el cluster del primer bloque, que se direcciona en la entrada del directorio asociada al archivo, y 4079 en la FAT. Como cada bloque ocupa 2 KiB, el tamaño máximo que puede tener un archivo es:
Soluciones completas de los problemas
4080·2KiB
477
= 8160KiB = 7,97MiB
Solución Problema 9.4 a) Sumando el tamaño de los campos en que se estructura una entrada de un directorio se obtiene que una entrada ocupa 32 bytes. El número de entradas de directorio ND que caben en un cluster de 2 KiB se calcula de la siguiente forma: ND = fi oor (
2(KiB/cluster)) 32 (bytes/entrada)
11
= 25
(bytes/cluster) 2 (bytes/entrada)
= 64(entradas / c1uster)
b) El número de segundos que tiene un día se calcula de la siguiente forma: 24 (horas/dia) 60 (minutos/hora) 60 (segundos/minuto)
= 86400 segundos
En el enunciado se indica que el campo hora de una entrada de un directorio tiene un tamaño de 2 bytes = 16 bits, con los cuales se pueden codificar 2 16 = 65536 segundos. La precisión se puede determinar de la siguiente forma:
ceil
(!~~~~) = ceil(l,32) = 2 segundos
Solución Problema 9.5 a) El número máximo de archivos que pueden existir en una partición de disco vendrá dado por el número total de nodos-i, ya que cada archivo tiene asignado un nodo-i. Como la entrada de un directorio contiene un campo de 2 bytes = 16 bits para especificar el número de nodo-i, el número de nodos-i que pueden existir es 2 16 - 1 = 65535, ya que el O no es número de nodo-i válido. Luego en la partición pueden existir como máximo 65535 archivos. b) De acuerdo con el enunciado un nodo-i de este sistema de archivos contiene entre otras informaciones 11 punteros: • 9 punteros directos a bloques de datos, que apuntarán a los bloques de datos n° O al n° 8 del archivo. • 1 puntero a un bloque de indirección simple cuyo contenido son punteros a bloques de datos. Un bloque tiene una capacidad de Ss = 1 KiB = 2 10 bytes y un puntero a un bloque de disco ocupa Sp = 3 bytes. El número de punteros Np que pueden almacenarse en un bloque se calcula de la siguente forma:
478
Fundamentos básicos de los sistemas operativos
Np
= f1.oor(~:) = f1.oor(2~O) = f1.oor(341,33) = 341 punteros
En consecuencia el bloque de indirección simple apuntará a 341 bloques de datos, del n° 9 al n° 349. • 1 puntero a un bloque de indirección doble cuyo contenido son punteros a bloques de indirección simple. Como el número de punteros que puede contener un bloque son Np = 341 , el bloque de indirección doble apuntará a Np2 = 341 2 = 116281 bloques de datos, del n° 350 al n° 116630. c) Supuesto que el nodo-i del archivo ya se encuentra en memoria principal, para leer un bloque referenciado con un puntero directo se requiere una lectura a disco. Para leer un bloque referenciado con un puntero indirecto simple se requieren dos lecturas a disco. Para leer un bloque referenciado con un puntero indirecto doble se requieren tres lecturas a disco. i) De acuerdo con el apartado anterior al bloque de datos n° 325 se accede a través del puntero al bloque de indirección simple, luego se requerirán dos lecturas a disco. ii) Al bloque de datos nO 605 se accede a través del puntero al bloque de indirección doble, luego se requerirán tres lecturas a disco.
•
Bibliografía [Bach, 1986] J. M. Bach. The Design ofthe Unix Operating System, Prentice-Hall, 1986. [Belady et al., 1969] L. A. Belady, R. A. Nelson y G. S. Shedler, "An Anomaly in Space-Time Characteristic of Certain Programs Running in a Paging Machine", Communications of the Associationfor Computing Machinery, vo1.12, numo 6, pp. 349-353, 1969. [Bell y La Padula, 1973] D. Bell y L. La Padula, "Secure Computer Systems: Mathematical Foundations and Model", Technical Report MTR 2547 v2, Mitre Corp, 1973. [Carr y Hennessey, 1981] W. R. Carr y J. L. Hennessey, "WS-Clock - A Simple and Effective AIgorithm for Virtual Memory Management", Proceedings ofthe Eight Symposium on Operating Systems Principies, pp. 87-95, 1981. [Casillas e Iglesias, 2008] A. Casillas y L. Iglesias, Sistemas Operativos Ejercicios Resueltos, Pearson Prentice Hall, 2008. [Coffman et al., 1971] E. Coffman, M. Elphick y A. Shoshani, "System Deadlocks", Computing Surveys, junio 1971. [Denning, 1968] P. J. Denning, "The Working Set Model for Program Behaviour", Communications ofthe Associationfor Computing Machinery, vol. 11 , pp. 323-333, 1968. [Denning, 1980] P. J. Denning, "Working Set Past and Present", IEEE Transactions on Software Engineering, vol. SE-6, pp. 64-84, 1980. [Dijkstra, 1965] E. Dijkstra, "Co-operating Sequential Processes", Programming Languages, Academic Press, 1965. [Dormido y Canto, 2010] S. Dormido y M. A. Canto, Ingeniería de Computadores 1, Sanz y Torres, 2010. [Gottfried, 2005] B. S. Gottfried, Programacion en C (2 a Edición), McGraw-Hill, 2005. [Harrison et al., 1976] M. A. Harrison, W. L. Ruzzo y J. D. Ullman, "Protection in Operating Systems", Communications of the Association for Computing Machinery, vo1.19, pp. 461-471 , 1976. 479
480
Fundamentos básicos de los sistemas operativos
[Hoare, 1974] C. A. R. Hoare, "Monitors, an Operating System Structuring Concept", Communications ofthe Associationfor Computing Machinery, vo1.17, pp. 549-557, 1974. [Holt, 1972] R. Holt "Sorne Deadlock Properties of Computer Systems", Computing Surveys, septiembre 1972. [Kernighan y Ritchie, 1991] B. W. Kernighan y D. Ritchie, El Lenguaje de Programación C Prentice Hall, 1991. [Lamport y RedeU, 1980] L. Lamport y D. Redell, "Experience with Processes and Monitors in Mesa", Communications ofthe Associationfor Computing Machinery, febrero 1980. [Milenkovic, 1994] M. Milenkovic, Sistemas Operativos. Conceptos y Diseño (2 a Edición), McGraw Hill, 1994. [Nutt,2006] G. Nutt, Sistemas Operativos (6 a Edición), Pearson-Addison Wesley, 2006. [Peterson, 1981] G. Peterson, "Myths About the Mutual Exc1usion Problem", Information Processing Letters, 1981. [Saltzer y Schroeder, 1975] J. H. Saltzer y M. D. Schroeder, "The Protection of Information in Computer Systems", Proceedings ofIEEE, vo1.63, pp. 1278-1308, 1975. [Silberschatz et. al, 2002] A. Silberschatz, P. B. Galvin y G. Gagne, Sistemas Operativos (6a Edición), Limusa Wiley, 2002. [Stallings, 2005] W. Stallings, Sistemas Operativos: Aspectos Internos y Principios de Diseño (5 a Edición), Pearson Educacion, 2005. [Stallings, 2006] W. Stallings, Organización y Arquitectura de Computadores (r Edición), Prentice Hall, 2006. [Tanenbaum, 2005] A. S. Tanenbaum, Structured Computer Organization (5th Edition), Prentice Hall,2005. [Tanenbaum,2006] A. S. Tanenbaum, Operating Systems Design and Implementation (3rd Edition), Prentice Hall, 2006. [Tanenbaum, 2009] A. S. Tanenbaum, Sistemas Operativos Modernos (3 a Edición), PearsonPrentice Hall, 2009.
~
Indice alfabético Acceso aleatorio, 342 directo, 342 secuencial, 342 Adaptador gráfico, 329 Agrupamientos, 360 Alarmas, 319 Algoritmo de asignación equitativa, 290 de asignación proporcional, 290 de Coffman, 181 de Dekker, 126 de Peterson, 126 de planificación basada en múltiples colas de prioridad, 101 basada en prioridades, 99 de primero el proceso de tiempo límite más cercano, 106 de tumo rotatorio, 95 de reemplazamiento óptimo, 274 de la segunda oportunidad, 280 FIFO,279 LRU, 275 mediante envejecimiento, 277 del banquero, 179 del mejor ajuste, 213 del peor ajuste, 213 del primer ajuste, 213 del reloj, 282 del siguiente ajuste, 213 FCFS, 89
LOOK,325 PFF, 290 SJF,91,99 SPN, 91 SRT,94 SSTF,325 WSClock, 285 de pila, 274 Algoritmos de planificación, 89 Android, 39 Anomalía de Belady, 273 Antivirus, 393 API Win32, 44 Aplicaciones de tiempo real, 38 de tiempo real estrictas, 38 de tiempo real suaves, 38 Área de desbordamiento, 412 de intercambio, 195 Archivo ASCII,339 binario, 339 informático, 339 regular, 339 Asignación continua, 357 de memoria principal, 289 enlazada, 359 indexada, 363 Atributos de un archivo, 341 Base de computador confiable, 401
481
482
Fundamentos básicos de los sistemas operativos
Biblioteca de hilos, 71, 75 BIOS, 17, 198 Bloque de arranque, 355 de control del hilo, 71 de control del proceso, 60 de indirección doble, 363 de indirección simple, 363 indirección triple, 363 físico, 342 Bloqueo de las interrupciones, 131 mutuo, 123, 168 Bomba lógica, 392 BSD, 32 Buffer, 306, 310, 315 Buffering, 306, 315 Buffering de páginas, 296 Bus, 8 Bus caché,8 de memoria, 8 del sistema, 8 local, 8 Buzón, 152 Caballo de Troya, 392 Cabecera de un sector, 323 Cabeza de lectura/escritura, 322 Caché de buffers de bloques de disco, 317, 379 de directorios, 373 Cambio de contexto, 64 de proceso, 64 Campos de dirección, 9 Canal de E/S , 16 Capacidad, 399 Carga de trabajo, 107 Cargador, 12,29 Cargador
de arranque, 17 de arranque secundario, 18 Cerrojo, 124 Cerrojo con vuelta, 124 Chorus,40 Ciclo de CPU, 4 de instrucción, 10 Cilindro, 322 Cita, 154 Código binario, 2 de operación, 9 máquina, 2 reentrante, 239 Cola de entrada, 82 de mensajes, 152 del dispositivo, 82 FIFO, 89 Colas de prioridad, 101 de procesos, 82 hash,317 Colisión, 412 Compactación de memoria, 207 Compilador, 11 Componentes del nombre de la ruta, 349 Computador, 2 Comunicación cliente/servidor, 48 directa, 151 indirecta, 152 Condición de carrera, 119 Confiabilidad, 328 Conjunto de marcos candidatos, 273 de trabajo de un proceso, 270 Conmutador de contexto, 84 Consistencia del sistema, 374
Índice alfabético
Contador de referencias, 351 Contexto de un proceso, 65 Contraseña, 390 Contraseñas de un solo uso, 391 Control de acceso discrecional, 389 de acceso obligatorio, 389 Controlador de DMA, 16 gráfico, 329 de E/S, 6 Cooperación directa, 119 Cooperación indirecta, 119 Copia completa, 378 de seguridad física, 378 de seguridad lógica, 377 diferencial, 378 incremental, 378 al escribir, 378 Copias de seguridad, 377 CP/M,32 CPU,2 CRC, 327 Creación de procesos, 62 CreateProcess, 63 CTSS,31 Cuanto, 88, 95, 98 Denegación de asignación de recursos, 179 de la iniciación de un proceso, 180 Descriptor del archivo, 344 Despachador, 84 Detección y recuperación de interbloqueos, 181 Diagrama de Gantt, 90 de Kiviatt - Kent, 78 de transición de estados, 58 Diario, 377 Dirección física, 4
Direccionamiento de bloques lógicos, 324 Direcciones absolutas, 13 físicas, 13 lógicas, 13 virtuales, 13, 258 Directorio, 339, 345, 369 Directorio actual, 349 de archivos maestro, 346 de spooling, 318 de trabajo del usuario, 349 padre, 349 raíz, 346 Discos duros, 321 Dispositivo modo bloque, 305 modo carácter, 305 Dispositivos de E/S, 6 dedicados, 309 Distribuidor, 84 DMA, 16 DMA por ráfagas, 16 por robo de ciclos, 16 transparente, 16 Dominio de protección, 396 Driver de dispositivo, 306, 311 E/S controlada por interrupciones, 14 controlada por programa, 14 en bruto, 324 ECC, 323 Edad de la página, 286 Editor de enlaces, 12 Eficacia, 87 Ejecución en primer plano, 54 en segundo plano, 54
483
484
Fundamentos básicos de los sistemas operativos
Encadenamiento, 412 Encolador, 84 Enlace, 350 Enlaces duros, 351 simbólicos, 352 Enlazador, 12 Ensamblador, 11 Envejecimiento de contraseñas, 390 de procesos, 10 1 Espacio de direcciones de usuario, 55 de direcciones lógicas, 55 de usuario, 195 del núcleo, 195 Espera activa, 14, 124 cíclica, 124 Estado inseguro, 175 seguro, 175 Estados de un proceso, 57 Estrategia de reemplazamiento de páginas global, 273 de páginas local, 273 Estructura de árbol de directorios, 348 de directorios de dos niveles, 346 de gráfica acíclica, 350 de un único nivel, 346 en capas, 46 en módulos, 46 extensible, 47 interna de un archivo, 341 monolítica, 45 Evitación o predicción de interbloqueos, 174 Excepciones, 15 Exclusión mutua, 118, 123
Execve, 63 Exit,63 ExitProcess, 63 Ext4,377 Extensión del nombre, 340 Extensiones del núcleo, 47 Factor de entrelazado, 323 Fallo de página, 259, 268 de protección, 238 Fase de búsqueda, 10 de ejecución, 11 de interrupción, 15 FAT, 355, 361 FMS, 30 Fork,63 Formateo de alto nivel, 324 de bajo nivel, 323 Formateo lógico, 324 Fragmentación externa, 207, 357 interna, 202, 358 Frecuencia de fallos de página, 290 de la interrupción del reloj, 318 del reloj, 318 del reloj del procesador, 4 Función ceil,409 de resolución de colisiones, 412 fioor, 409 hash,411 módulo, 408 Grado de multiprogramación, 35, 292 Grafos de asignación de recursos, 169 GUI,33 Gusano informático, 394
Índice alfabético
HFS +,377 Hilo,67 Hilo de control, 67 Hilos de usuario, 70, 75 del núcleo, 72, 75 Hueco,207 mSYS,30 IDE,8 Identificador de archivo abierto, 344 de usuario, 60 del proceso, 60 Imagen de disco, 378 del proceso, 55 Inanición de un proceso, 124 Init,64 Instantánea, 379 Instrucción, 9 Instrucciones atómicas, 129 Intérpretes de comandos, 26 Interbloqueo, 123, 168 Intercambiador, 85, 196 Intercambio, 195 Interfaz de usuario gráfica, 33 Interrupción, 14 Interrupciones hardware, 14 Inversión de prioridades, 101 ISA,8 JCL,30 Journal, 377 Journaling, 377 Kill,64 Latencia de despacho, 84 rotacional, 325 Lectura por adelantado de bloques, 379
Lenguaje de control de trabajos, 30 Limpieza por adelantado, 292 por demanda, 292 Linux, 33,34,39,40 Lista de alarmas, 319 de bloques libres, 355, 365 de capacidades, 399 de control de acceso, 398 de marcos libres, 224, 260, 296 de nodos índice, 355 enlazada de bloques de disco, 367 Llamadas al sistema, 27, 41 LSI,32 Mac OS, 32, 34, 39 Mach,40 Macintosh, 33 Macrocomputadores, 29 Mainframes, 29 Manejador de la interrupción, 14,306,313 Mapa de bits, 366 de disco, 266 Mapas de teclas, 329 Marco bloqueado, 267 Marcos de página, 215 Máscara de modo, 397 Matriz de acceso, 395, 397 de protección, 397 MBR,17 Mecanismos de protección, 394 Memoria caché,8 caché de primer nivel, 9 caché de segundo nivel, 9 caché software de páginas, 296 compartida, 118 de vídeo, 329
485
486
Fundamentos básicos de los sistemas operativos
principal, 4, 6, 9 secundaria, 9 virtual, 258 Memorias CMOS, 6, 17 EEPROM, 6 flash RAM, 6 Mensaje, 151 Microcomputadores, 32 Micronúcleo, 47 Microprocesador, 2, 32 Minichips, 4 Minicomputadores, 30 Minix, 33 MMU, 258, 268 Modelado analítico mediante sistemas de colas, 107 determinista, 107 Modelo de proceso multihilo, 67 de seguridad multinivel, 401 de disparo único, 318 Modo de onda cuadrada, 318 núcleo, 10, 40 usuario, 10, 40 Módulo de carga, 12 objeto, 12 Monitor, 118, 145 Monitor de referencia, 401 del sistema operativo, 197 residente, 30 Monousuario, 34 Montículo, 371 Montaje de un sistema de archivos, 356 Motif, 33 MS-DOS , 32, 34, 45 Multiacceso, 37
MULTICS,31 Multiprocesamiento simétrico, 40 Multiprogramación, 31 , 35 Multitarea, 37 Multiusuario, 34 Mutex, 133 Nivel de ejecución del procesador, 15 de prioridad de interrupción, 15 Niveles de planificación, 82 Nodo índice, 351 , 355 Nombre de ruta, 347 de ruta absoluto, 349 de ruta relativo, 349 Nombre de un archivo, 340 usuario, 390 Novell Netware, 40 Núcleo de un sistema operativo, 27, 45 extensible, 47 no expropiable, 84 Núcleos, 4 Número de bloque, 342 de nodo-i, 363 de página, 217 del marco de página, 215 del vector de interrupción, 313 mágico, 12, 339 OSj390, 39
Página víctima, 272 Páginas, 215 Páginas de códigos, 329 físicas , 215 lógicas, 215 Píxel, 329
Índice alfabético
Paginación, 215 Paginación por adelantado, 294 por demanda, 259 simple, 224, 239 Palabra, 4 Palm OS , 39 Pantalla, 329 Partición, 207, 324 Partición activa, 17, 355 Particionamiento del disco, 324 dinámico, 207 fijo, 199 Paso de mensajes, 118, 151 Periféricos, 6 Personal Netware, 40 Pila de interrupciones, 61 Pilas del sistema operativo, 61 Pistas, 321 Planificación a corto plazo, 82 a largo plazo, 82 a medio plazo, 82 de hilos, 107 de la E/S, 83 de procesos, 82 expropiativa, 88 no expropiativa, 88 Planificador, 81 , 82, 84 Planificador a corto plazo, 84 a largo plazo, 85 a medio plazo, 85 de admisión, 85 de memoria, 85 de trabajos, 85 del procesador, 84, 87 Plazo, 106 Plazo de finalización, 88
Política de limpieza, 292 POSIX, 44 POST, 17 Preámbulo de un sector, 323 Predictor promedio exponencial, 93 Prevención de interbloqueos, 172 Principio de localidad de referencias, 269 de proximidad, 269 del mínimo privilegio, 389 Prioridad de ejecución, 99 Procesador, 2, 4 Procesador de E/S, 16 Procesamiento por lotes, 30 serie, 29 Proceso, 54, 67 Proceso hijo, 63 ligero, 67 limitado por CPU, 86 limitado por E/S , 86 padre, 63 Procesos cooperantes, 119 de usuario, 57 del sistema operativo, 57 demonio, 57 independientes, 119 Productividad, 87 Programa espíá, 394 Propiedad de seguridad simple, 401 Pthreads, 71 Puerta secreta, 392 Puerto, 153 Puertos de E/S, 7 Puntero de lectura/escritura, 342 . de pila, 3 Punto de montaje, 356
487
488
Fundamentos básicos de los sistemas operativos
Puntos de control, 185 QNX, 38, 39 Ráfaga de CPU, 85 RAID,328 RAM,6 Ratón, 330 Realimentación, 103 Recurso crítico, 118 Reemplazamiento de páginas, 272 Región de código, 55 de datos inicializados, 55 de datos no inicializados, 55 de pila, 55 Regiones, 55 Registro base, 199, 204 contador de programa, 3 de arranque maestro, 17, 324 de estado del procesador, 3 de instrucción, 3 límite, 199, 204 por diario, 377 puntero de pila, 55 Reinicio de instrucciones, 262 Reloj programable, 318 Rendimiento, 87 Repertorio de instrucciones, 9 Resolución de pantalla, 329 Retardo rotacional, 325 Reto dinámico, 391 Rodaja de tiempo, 95 ROM,6 SCSI, 7,8 Sección crítica, 118, 121 Sector de arranque, 18 Sectores, 321 Segmentación con paginación, 246
simple, 240, 245 Segmentos, 240 Seguridad multinivel, 401 Semáforo binario, 133 con contador, 133 general, 133 Semáforos, 118, 131, 134 Servicios, 57 Sesgo de cilindro, 323 SETGID,397 SETUID,397 Signal,132 Simulación, 107 Sistema cilindro-cabeza-sector, 323 de archivos, 354 de archivos principal, 356 informático, 27 Sistema operativo, 26 Sistema operativo con multiprocesamiento, 37 monoprogramado, 34 multiprogramado, 34 Sistemas batch,37 confiables, 401 débilmente acoplados, 40 de tiempo real estrictos, 106 fuertemente acoplados, 40 interactivos, 38 monoprogramados, 197 multiprocesador, 40 Sistemas operativos de red, 40 de tiempo compartido, 38 de tiempo real, 38 distribuidos, 40 híbridos, 38 integrados, 39
Índice alfabético
para computadores de mano, 39 para computadores personales, 39 para macrocomputadores, 39 para servidores de red, 39 paralelos, 40 por lotes, 37 Snapshot, 379 Sobrecarga, 65 Sobrepaginación, 272, 292 Software malicioso, 392 Solaris, 33, 378 Spool,318 Spooling,306,318 Sprite,40 Subsistema de E/S, 306, 309 de gestión de archivos, 338 Superbloque, 355 Superposición, 202 Symbian,39 System V, 32 Tabla de asignación de archivos, 355 de descripción de particiones, 199 de hilos, 71 de marcos de página, 224, 260 de páginas invertida, 236 de páginas paginada, 233 de páginas primaria, 234 de páginas secundaria, 234 de particiones, 17, 324 de procesos, 60 de segmentos, 243 de vectores de interrupción, 313 hash, 373, 411 Tablas de archivos, 61 de E/S, 61 de memoria, 61 de páginas, 223, 260
Tasa de aciertos de una memoria caché, 22 Teclado, 329 Técnicas biométricas, 391 Teoría de colas, 107 Terminación de procesos, 63 Terminal serie, 31 TerminateProcess, 64 THE,46 Tic,318 Tic de reloj, 318 Tiempo compartido, 31 de último uso, 286 de búsqueda, 325 de conmutación, 65 de disparo, 320 de entrega, 87 de espera, 87, 91 de estancia, 87 de posicionamiento, 325 de respuesta, 87 de retomo, 87, 91 límite, 106 real, 318, 319 virtual, 270 TLB, 227,230 Trampas, 14, 41 Trasiego, 272 Traspaso o herencia de prioridad, 101 Traza de ejecución, 67 Troyano, 392 Unidad central de procesamiento, 2 de gestión de memoria, 258 direccionable de memoria, 4 Unidades de almacenamiento de la información, 407 de tiempo, 408 lógicas, 356 UNIX, 32, 34, 39, 40, 44, 45
489
490
Fundamentos básicos de los sistemas operativos
USB,8 Utilización del procesador, 87 Variables de condición, 146 Vector de interrupción, 313 Ventana de tiempo virtual, 272 Verificador de consistencia, 374 Virus informático, 393 VRAM,329 VxWorks, 38, 39 Wait, 132 Windows, 33, 34, 39, 44 Windows CE,39 NT,48 Server, 34, 39, 40 X Windows, 33 ZFS, 378 Zona de código, 12 de datos, 12 de localidad, 269
ISBN 978-84-92948-47-5
9 788492 948475