Unix Programacion Practica
March 1, 2017 | Author: rtangelesp | Category: N/A
Short Description
Download Unix Programacion Practica...
Description
UNIX' PROGRAMACIÓN PRÁCTICA Guía para la Concurrencia, la Comunicación y los Multihilos RPC y el modelo cliente-servidor Señales de tiempo real POSIX Multihilos de control POSIX y sincroniz,
pH
H
I'KKMIIT. HAI.I.
A Simón & Schuster Company
Kay A. Robbins Steven Robbins
POKTIFIGI* WHVt* MD QAIOURA t»tl PM(I
BIBLIOTECA
COMPRA
UNIX PROGRAMACION PRACTICA
UNIX PROGRAMACION PRÁCTICA — .
PRIMERA EDICION
. .
-
Kay A. Robbins y Steven Robbins The Univesity of Texas at San Antonio
TRADUCCIÓN: Roberto Escalona García M. en C , UNAM, México REVISIÓN TÉCNICA: Gabriel Guerrero Doctor en Informática Universidad de París V I
P R E N T I C E - H A L L HISPANOAMERICANA, S.A. MÉXICO • NUEVA Y O R K • BOGOTÁ • LONDRES • S Y D N E Y PARÍS • MUNICH • TORONTO • NUEVA DELHI • TOKIO SINGAPUR • RÍO D E JANEIRO • ZURICH
—
-
EDICIÓN E N E S P A Ñ O L : DIRECTOR G E N E R A L : G E R E N T E DIVISION C O L L E G E : GERENTE EDITORIAL C O L L E G E : GERENTE DE EDICIONES: G E R E N T E D E PRODUCCIÓN : G E R E N T E D E TRADUCCIÓN : DIRECTOR DE EDICIONES: S U P E R V I S O R A D E TRADUCCIÓN : SUPERVISORA D E PRODUCCIÓN:
MOISÉS PÉREZ Z A V A L A JOSÉ T O M A S PÉREZ B O N I L L A LUIS G E R A R D O C E D E Ñ O P L A S C E N C I A J U A N A N T O N I O RODRÍGUEZ M O R E N O JULIÁN E S C A M I L L A L I Q U I D A N O JORGE B O N I L L A T A L A V E R A ALBERTO SIERRA O C H O A ROCÍO C A B A N A S CHÁVEZ O L G A ADRIANA SÁNCHEZ N A V A R R E T E
EDICIÓN EN INGLÉS: Editorial/production supervisión: Jane Bonnell Cover design director: Jerry Votta Cover design: Lundgren Graphics, Ltd. Manufacturing manager: Alexis R. Heydt Acquisitions editor: Gregory G. Doench Editorial assistant: Meg Cowen
ROBBINS: UNIX PROGRAMACIÓN
PRACTICA, la. ed.
Traducido del inglés de la obra: P R A C T I C A L UNIX P R O G R A M M I N G A Guide to Currency, Communication, and Multithreading All rights reserved. Authorized translation from English language edition published by Prcntice-Hall, Inc. A Simón & Schuster Company. Todos los derechos reservados. Traducción autorizada de la edición en inglés publicada por Prentice-Hall, Inc. A Simón & Schuster Company. All rights reserved. No part of this book may be reproduced or transmitted in any form or by any means, electronic or mechanical, including photocopying, recording or by any information storage and retrieval system, without permission in writing from the publisher. Prohibida la reproducción total o parcial de esta obra, por cualquier medio o método sin autorización por escrito del editor. Derechos reservados © 1997 respecto a la primera edición en español publicada por: P R E N T I C E - H A L L HISPANOAMERICANA, S.A. Enrique Jacob 20, Col. E l Conde 53500 Naucalpan de Juárez, Edo. de México
• !f UtOGKUlCAINGRMtX. SA I* CU.
ISBN 968-880-959-4 Miembro de la Cámara Nacional de la Industria Editorial, Reg. Núm. 1524. Original English Language Edition Published by Prentice-Hall, Inc. A Simón & Schuster Company Copyright © M C M X C V I All rights reserved ISBN 0-13-443706-3 IMPRESO E N MÉXICO/ PRINTED IN M E X I C O
ammuo.w
MXE0.PÍ. CJ-.0M13
A nuestros estudiantes
Contenido I
Fundamentos 1
¿Qué es la concurrencia? 1.1 Multiprogramación y multitarea 1.2 Concurrencia a nivel de aplicaciones 1.3 Estándares UNIX 1.4 Programación en UNIX 1.5 Cómo hacer que las funciones sean seguras 1.6 Ejercicio: arreglos de argumento 1.7 Lecturas adicionales
2
Programas y procesos 2.1 Estructura de un programa ejecutable 2.2 Objetos estáticos 2.3 El proceso ID 2.4 Estado de un proceso 2.5 Creación de procesos y el f ork de UNIX 2.6 Llamada wait al sistema 2.7 Llamada exec al sistema 2.8 Procesos en plano secundario y demonios 2.9 Ambiente de los procesos 2.10 Terminación de procesos en UNIX 2.11 Secciones críticas 2.12 Ejercicio: cadenas de procesos 2.13 Ejercicio: abanicos de procesos 2.14 Ejercicio: b i f f sencillo 2.15 Ejercicio: News b i f f 2.16 Lecturas adicionales
3
Archivos 3.1 3.2 3.3 3.4 3.5 3.6 3.7
vi
Directorios y rutas de acceso Representación de archivos en UNIX Representación de archivos con identificadores Filtros y redireccionamiento Entubamiento (Pipes) Lectura y escritura de archivos E/S sin bloqueo
v i i
Contenido 3.8 3.9 3.10 3.11 3.12 3.13 3.14 3.15 4
II
La llamada s e l o c t . FIFO Archivos especiales—el dispositivo Audio Ejercicio: recorrido de directorios Ejercicio: sistema de archivo proc Ejercicio: Audio Ejercicio: control de la terminal Lecturas adicionales
Proyecto: Anillo de procesos 4.1 Formación del anillo 4.2 Comunicación simple 4.3 Exclusión mutua con fichas (tokens) 4.4 Exclusión mutua por votación 4.5 Elección del líder en un anillo anónimo 4.6 Anillo de fichas (toke ring) para comunicación 4.7 Procesador con estructura de entubamiento 4.8 Algoritmos de anillo paralelos 4.9 Anillo flexible 4.10 Lecturas adicionales
Eventos asincronos
117 119 122 128 130 133 136 137 139 140 149 150 152 153 155 157 159 164 165
167
5
Señales 5.1 Envío de señales 5.2 Máscara de señal y conjunto de señales 5.3 Atrapar e ignorar señales: s i g a c t i o n 5.4 Espera de señales: pause y sigsuspend 5.5 Ejemplo: b i f f 5.6 Llamadas al sistema y señales 5.7 siglongjmp y s i g s e t jmp 5.8 Señales de tiempo real 5.9 E/S asincrona 5.10 Ejercicio: vaciado de estadísticas 5.11 Ejercicio: proc Filesystem I I 5.12 Ejercicio: Operación en línea de un dispositivo lento 5.13 Lecturas adicionales
169 170 175 150 182 185 188 191 193 197 201 202 202 204
6
Proyecto: Temporizadores 6.1 Tiempo en UNIX 6.2 Temporizadores de intervalo 6.3 Panorama del proyecto 6.4 Temporizadores sencillos
205 206 210 217 219
viii
Contenido 6.5 6.6 6.7 6.8 6.9 6.10 7
III
Configuración de uno de cinco temporizadores Temporizadores múltiples Implantación robusta de varios temporizadores mycron, pequeño servicio tipo Cron pequeño Implantación de temporizadores POSIX Lecturas adicionales
Proyecto: Desarrollo de intérpretes de comando 7.1 Un intérprete de comandos sencillo 7.2 Redirección 7.3 Entubamientos 7.4 Señales 7.5 Grupos de proceso, sesiones y terminales controladoras 7.6 Control de procesos de fondo en ush 7.7 Control de trabajo 7.8 Control de trabajo para ush 7.9 Lecturas adicionales
Concurrencia
223 233 240 241 242 250
*
253 255 259 262 266 270 274 279 281 285
287
8
Secciones críticas y semáforos 8.1 Operaciones atómicas 8.2 Semáforos 8.3 Semáforos en POSIX 8.4 Semáforos en System V (Spec 1170) 8.5 Semáforos y señales 8.6 Ejercicio: Semáforos no nombrados POSIX 8.7 Ejercicio: Semáforos nombrados POSIX 8.8 Ejercicio: Manejador de licencias 8.9 Ejercicio: Memoria compartida en System V 8.10 Ejercicio: Colas de mensajes del System V 8.11 Lecturas adicionales
289 291 296 304 310 323 324 325 326 328 332 332
9
Hilos POSIX 9.1 Un problema motivador: Vigilancia de descriptores de archivo 9.2 Hilos POSIX 9.3 Gestión de hilos básica 9.4 Usuario de hilos versus hilos de núcleos (¡cernel) 9.5 Atributos de los hilos 9.6 Ejercicio: Copiado de archivos en paralelo 9.7 Lecturas adicionales
333 335 347 348 356 359 362 364
I X
Contenido
IV
10
Sincronización de hilos 10.1 Mutex 10.2 Semáforos 10.3 Variables de condición 10.4 Manejo de señales e hilos 10.5 Ejercicio: Servidor de impresión con hilos 10.6 Lecturas adicionales
365 367 373 378 385 395 400
11
Proyecto: La máquina virtual no muy paralela 11.1 La máquina virtual no muy paralela 11.2 Panorama general del proyecto NTPVM 11.3 E/S y prueba del despachador 11.4 Una sola tarea sin entradas 11.5 Tareas secuenciales 11.6 Tareas concurrentes 11.7 Difusión y barreras 11.8 Terminación y señales 11.9 Lecturas adicionales
401 403 405 410 418 420 425 426 427 427
Comunicación
429
12
Comunicación cliente-servidor 12.1 Estrategias cliente-servidor 12.2 La interfaz universal de comunicaciones de Internet (UICI) 12.3 Comunicación en red 12.4 Implementación de UICI con sockets 12.5 Interfaz de la capa de transporte (TLI) 12.6 STREAMS 12.7 Implementación de UICI con STREAMS 12.8 UICI segura con respecto de los hilos 12.9 Ejercicio: Transmisión de audio 12.10 Ejercicio: Servidor de ping 12.11 Lecturas adicionales
431 432 437 445 447 453 460 465 469 473 474 476
13
Proyecto: Radio por Internet 13.1 Panorama general del multiplexor 13.2 Comunicación unidireccional 13.3 Comunicación bidireccional 13.4 El buffer de transmisión 13.5 Multiplexión del buffer de transmisión 13.6 Receptores de red 13.7 Sintonización y desintonización 13.8 Difusor de red 13.9 Manejo de señales 13.10 Lecturas adicionales
477 478 479 481 483 486 487 488 489 489 490
,
Contenido
x
14
Llamadas a procedimientos remotos 14.1 Funcionamiento básico 14.2 Conversión de una llamada local sencilla en una RPC 14.3 Un servicio remoto de números pseudoaleatorios mejorado 14.4 Estado del servidor y solicitudes equipotentes 14.5 Servicio de archivos equipotente remoto 14.6 Vinculación y asignación de nombres a servicios 14.7 Fracasos 14.8 NFS —Sistema de archivos de red 14.9 Hilos y llamadas a procedimientos remotos 14.10 Ejercicio: Servidor de archivos sin estados 14.11 Lecturas adicionales
491 492 497 508 515 519 523 525 526 531 536 538
15
Proyecto: Espacio de tupias 15.1 Linda 15.2 Richard, un Linda simplificado 15.3 Un espacio de tupias Richard sencillo 15.4 Pizarrones: Una aplicación de espacio de tupias 15.5 Tupias activas en Richard 15.6 Espacios de tupias como tupias en Richard 15.7 Un servidor multihilo para Richard 15.8 Lecturas adicionales
539 541 544 547 555 564 569 573 576
Apéndice A
Fundamentos de UNIX A.l Cómo obtener ayuda A.2 Compilación A.3 Archivos Makefile A.4 Archivos de encabezado A.5 Enlace y bibliotecas A.6 Ayudas para depuración A.7 Ambiente del usuario A. 8 Lecturas adicionales
577 577 585 587 590 591 593 596 598
Apéndice B
Implementación de U I C I B. l Prototipos de UICI B.2 Implementación con sockets B.3 Implementación T L I B.4 Implementación con
599 599 600 609 614
B.5
flujos
Implementación de UICI segura respecto de los hilos
621
Bibliografía
633
índice
641
Prefacio Los sistemas de cómputo están evolucionando con rapidez de las computadoras grandes, a las que se tiene acceso mediante terminales, hacia redes de estaciones de trabajo con varios procesadores. Ideas tales como la concurrencia, la comunicación y el uso de multihilos de control (multithreading) han trascendido la comunidad de investigación y se han extendido hacia el mundo comercial. El programador de aplicaciones debe comprender estos conceptos, y el presente libro está diseñado para hacerlos accesibles en todos sus detalles. El libro utiliza un enfoque "manos a la obra" en un sentido no tradicional. En el enfoque tradicional, los programadores implementan o modifican un sistema operativo existente para añadirle funcionalidad. Este enfoque brinda una comprensión profunda del diseño básico de sistemas operativos, pero es difícil que los programadores profesionales lo sigan de manera independiente. Cuando es utilizado en una universidad promedio, los profesores invierten un tiempo considerable de clase en cubrir detalles de la implantación, lo que deja poco tiempo para abarcar una gran variedad de temas. Por otra parte, el enfoque tradicional usualmente no proporciona experiencia de programación práctica con construcciones avanzadas de sincronización y comunicación. Una alternativa es la presentación teórica. Si bien este tipo de cursos abarca mucho más material, no proporciona al lector una comprensión profunda de los conceptos en la práctica. Programación práctica en UNIX : Una Guía de la concurrencia, la comunicación y el uso de multihilos de control llena el hueco entre los enfoques práctico y teórico al estudio de sistemas operativos al tratar la programación bajo UNIX estándar. El programador profesional puede emplear el libro de manera independiente o como complemento de un libro de referencia, tal como el Advanced Programming in the UNIX Environment [86] de Stevens, con lo que obtendrá un mejor conocimiento de los sistemas operativos y de la programación de sistemas. Los estudiantes pueden usar del libro como complemento de un texto tradicional, como el Operating Systems Concepts [80] de Silbershatz y Galvin o el Sistemas Operativos Modernos [92] de Tanenbaum, para aprender sistemas operativos con un enfoque práctico. Los ejercicios y proyectos hacen que este libro sea único. De hecho, el libro se inició como un proyecto de cuaderno de ejercicios. Después del desarrollo preliminar, resultó evidente que el material necesario para realizar los proyectos se encontraba disperso en muchos lugares, a menudo en libros de referencia que proporcionaban muchos detalles pero un panorama conceptual reducido. Desde entonces, el libro ha evolucionado como una referencia autocontenida que descansa sobre los últimos estándares UNIX. El libro está organizado en cuatro partes, las cuales contienen capítulos de tema y capítulos de proyecto. Un capítulo de tema cubre material específico y contiene muchos ejemplos y ejercicios breves de la forma "intente esto" o "qué pasa si." Los capítulos de tema terminan con una o más secciones de ejercicios. El libro proporciona ejercicios de programación para muchos conceptos fundamentales en administración de procesos, concurrencia y comunicación. Estos ejercicios satisfacen la misma necesidad que los experimentos de laboratorio en un curso tradicional de ciencias. Para comprender los conceptos es necesario utilizarlos ampliaxi
Prefacio
xii
mente. Los ejercicios están especificados por un desarrollo por pasos y muchos pueden implantarse en menos de 100 líneas de código. Los capítulos de proyecto integran material de varios capítulos de tema mediante el desarrollo de una aplicación extensa. Los proyectos trabajan en dos niveles. Además de ilustrar las ideas de programación, los proyectos conducen a la comprensión de un tema avanzado relacionado con una aplicación. El diseño de éstos se hace por etapas, y muchas ejecuciones completas tienen varios cientos de líneas. Dado que no es necesario escribir una cantidad grande de código, el programador puede concentrarse en la comprensión de los conceptos más que en la depuración de código. Para simplificar la programación, los autores tienen bibliotecas disponibles para comunicación por redes. La siguiente tabla presenta un resumen de la organización del libro, 15 capítulos agrupados en cuatro partes. Los nueve capítulos de tema no dependen de los seis capítulos de proyecto, y el lector puede omitir éstos al hacer una primera lectura del libro. Parte I Fundamentos
II Eventos asincronos
III Concurrencia
IV Comunicación
Tema del capítulo
#
Concurrencia Proceso Archivos
1 2 3
Señales
Semáforos Hilos POSIX Sincronía de hilos
Proyecto del capítulo
#
El anillo de fichas
4
Temporizadores Capas cracking
6 7
Máquina virtual
11
Radio por Internet
13
Espacio de tupias
15
5
8 9 10
Cliente-servidor
12
RPC
14
Existen muchas formas de leer el libro. Los tres capítulos de tema de la parte I son un requisito previo para el resto del libro. Los lectores pueden estudiar las partes I I a la IV en cualquier orden después de leer los capítulos de tema de la parte I . La excepción es el estudio, al final de los últimos capítulos, sobre las interacciones (esto es, la forma en que los hilos de control interactúan con las señales). Los autores suponen que los lectores de este libro son buenos programadores en C, aunque no necesariamente programadores en C de UNIX. El lector debe estar familiarizado con la
Prefacio
xiii
programación en C y las estructuras de datos básicas. El apéndice A cubre los aspectos esenciales del desarrollo de programas para lectores que no tienen experiencia en UNIX. Es probable que los programadores de UNIX conozcan ya buena parte del material presentado en los capítulos 2 y 3, pero la cobertura es bastante detallada y muchos de los proyectos finales dependen en buena medida de este material. El lector no debe dar por sentado que la lectura de un capítulo es suficiente para comprender los conceptos, a menos que desarrolle con éxito algunos programas que hagan uso de éstos. Para un programador profesional, los ejercicios que se encuentran al final de los capítulos de tema proporcionan una introducción práctica mínima al material. En general, el profesor que haga uso de este libro para un curso de sistemas operativos puede seleccionar varios ejercicios más uno de los proyectos grandes para ejecutarlos durante el semestre. Cada proyecto tiene muchas variaciones, así que puede emplearse en varios semestres. El libro incluye una sinopsis de muchas funciones estándares. Los estándares importantes que especifican la función aparecen en la esquina inferior derecha del cuadro de sinopsis. En general, ISO C es un subconjunto de POSIX. 1 y Spec 1170. En algunos casos, la lista de archivos de encabezado requerida difiere entre estándares, donde algunos archivos de encabezado son opcionales para algunos estándares. En estos casos, el cuadro de sinopsis contiene una lista con todos los archivos de encabezado importantes. Un libro como este nunca termina, pero teníamos que detenernos. Agradeceremos los comentarios y sugerencias de los lectores, los cuales pueden enviarlos por (correo electrónico) a pup@vip. es . u t s a . edu. Puede obtenerse información sobre el libro en WWW h t t p : / / v i p . es . u t s a . edu/pup. Todo el código incluido en el libro puede obtenerse de WWW o por ftp anónimo a v i p . es . u t s a . edu, en el directorio pub/pup.
Agradecimientos Nuestro reconocimiento más sincero es para Neal Wagner —amigo, colega y policía de la voz pasiva. Neal es el responsable, más que cualquier otro, de la escritura de este libro. Después de todo, argumentaba, si ya tienen los proyectos, ¿cuánto trabajo más representa escribir un l i bro? Después de esto, él nos proporcionó mucha ayuda —lectura y crítica una y otra vez de las versiones previas del material, lo que mejoró considerablemente el libro. Nuestro segundo reconocimiento es para la audiencia de los más de doce cursos sobre sistemas operativos que impartimos entre 1988 y 1995, que es el periodo durante el cual se desarrolló este material. Agradecemos a los estudiantes de estos cursos por sufrir las versiones previas del libro durante el desarrollo de éste y por poner a prueba los proyectos a medida que iban surgiendo. Los errores en sus programas, sus comentarios, las quejas y sugerencias mejoraron mucho el libro y nos proporcionaron una idea más acabada de la forma en que se relacionan los temas. También damos las gracias a muchas otras personas que leyeron el libro e hicieron sugerencias o correcciones para mejorarlo, o que nos ayudaron de otras maneras. Dennis Cadena leyó la versión preliminar e hizo muchas sugerencias. Otras personas que nos hicieron comentarios o ayudaron en otras formas son Jeff Adamek, Laura Connor, Sandy Dykes, Richard Hatch, Philip Helsel, Robert Hiromoto, Clint Jeffery, George Leach, C. Ed Nicol, Richard Rybacki, Robert Shenk, Devang Shah, Dennis Wenzel y Andrea Whitlock.
xiv
Prefacio
También damos las gracias a Greg Doench, nuestro editor en Prentice Hall, y a Meg Cowen, su asistente, por orientarnos en todo el proceso. Ellos nos ayudaron a mejorar el libro haciendo sugerencias y brindándonos su amable apoyo sin presionarnos. También queremos dar las gracias a Jane Bonnell, nuestro editor de producción, por toda la ayuda que nos brindó para publicar el libro. Fue un placer trabajar con estos profesionales. Muchos revisores anónimos hicieron sugerencias excelentes que nos ayudaron mucho en la revisión final del libro. La formación del libro se hizo utilizando IATgX2f:, y deseamos expresar nuestro aprecio a sus productores por proporcionar este software sin costo alguno. Gracias especialmente a nuestras esposas e hijos por la paciencia que tuvieron mientras preparábamos este libro. Finalmente, queremos hacer un reconocimiento a la National Science Foundation por proporcionarnos apoyo a través del financiamiento NSF-ILI USE-0950497 para construir un laboratorio de modo que tuviéramos la oportunidad de desarrollar el currículo original en el que se basa este libro.
Parte I
Fundamentos
Capítulo 1
¿Qué es la concurrencia? La concurrencia se refiere al hecho de compartir recursos en el mismo marco de tiempo. Esto por lo común significa que varios procesos comparten la misma CPU (esto es, son ejecutados concurrentemente) o la memoria o un dispositivo de E/S. El manejo incorrecto de la concurrencia puede dar como resultado programas que fallan sin razón aparente, incluso con la misma entrada para la que parecía que trabajaban perfectamente. Los sistemas operativos administran los recursos compartidos, y en el pasado los programadores podían permitir que el sistema manejara todos los aspectos de la concurrencia. En el caso de los programas complejos desarrollados en la actualidad, los cuales necesitan ejecutarse con eficiencia en las computadoras modernas, ya no es así. Las máquinas de escritorio con varios procesadores y los sistemas distribuidos son ejemplos de arquitecturas en las que el control de la concurrencia adquiere un significado nuevo e importante para los diseñadores de sistemas. Este capítulo presenta el tema de la concurrencia y proporciona lineamientos para la programación en sistemas UNIX en un ambiente concurrente.
La potencia de cómputo ha aumentado de manera geométrica durante casi 50 años [60] en muchas áreas, incluyendo la velocidad de cómputo, la capacidad de memoria y de almacenamiento masivo, la complejidad de los circuitos, la confiabilidad del hardware y el ancho de banda E/S. Este crecimiento continuó en la década pasada, junto con entubamientos (pipelines), instrucciones de ejecución traslapada en una sola CPU, la colocación de varias CPU en un escritorio, y la explosión en la conectividad de redes. El aumento tan marcado en la comunicación y la potencia de cómputo ha iniciado cambios fundamentales en el software comercial. Las bases de datos grandes así como otras aplicaciones, que antes se ejecutaban en una máquina central conectada con varias terminales, ahora están distribuidas sobre máquinas más pequeñas y de menor precio. Las terminales han abierto camino a las estaciones de trabajo de escritorio, con interfaces de usuario de gráficas y capaci3
4
Capítulo 1. ¿Qué es la concurrencia?
dades para multimedia. En el otro extremo del espectro, las aplicaciones de cómputo personal han evolucionado hacia el uso de comunicaciones por redes. Una hoja de cálculo ya no es un programa aislado que sólo apoya a un usuario debido a que una actualización de la hoja de cálculo puede provocar la actualización automática de otras aplicaciones ligadas con ella, por ejemplo, gráficas de datos o la realización de las proyecciones de ventas. Aplicaciones tales como la edición cooperativa, las conferencias, y los pizarrones blancos, facilitan el trabajo y la interacción entre grupos. Las tendencias de cómputo van hacia la compleja compartición de datos, la interacción en tiempo real de las aplicaciones, las interfaces de usuario inteligentes, y los flujos de datos complejos que incluyen audio y video, además de texto. Todos estos desarrollos dependen de la comunicación y la concurrencia. La comunicación es el transporte de información de una entidad a otra. La concurrencia es la compartición de recursos en el mismo marco de tiempo. Cuando dos programas se ejecutan en el mismo sistema de modo que la ejecución de éstos está entrelazada en el tiempo, entonces ellos comparten un recurso del procesador. Los programas también pueden compartir datos, código y dispositivos. Las entidades concurrentes pueden ser hilos de control (threads) de ejecución dentro de programas o dentro de otros objetos abstractos. La concurrencia también puede presentarse en un sistema con una sola CPU. De hecho, uno de los trabajos más importantes de un sistema operativo moderno es administrar las operaciones concurrentes de un sistema de cómputo. Tratar con la concurrencia no es fácil: los programas concurrentes no siempre se comportan como se espera, y los errores comunes en estos programas no siempre aparecen de manera regular. (El problema puede aparecer sólo una vez en un conjunto de un millón de ejecuciones.) No hay ningún sustituto a la experiencia práctica con estos conceptos. Este capítulo describe ejemplos de concurrencia, comenzando con la más simple de las situaciones en las que puede ocurrir. El resto del libro amplía estas ideas y proporciona ejemplos específicos.
1.1 Muí ti programación y multi tarea Los sistemas operativos administran los recursos del sistema —procesadores, memoria y dispositivos de E/S, incluyendo teclados, monitores, impresoras, ratones, disquetes, cintas, unidades de CD-ROM, e interfaces de red. La manera tan complicada en la que al parecer trabajan los sistemas operativos es una consecuencia de las características de los dispositivos periféricos, en particular de la velocidad relativa de éstos con respecto de la CPU o el procesador. La tabla 1.1 proporciona velocidades típicas, en nanosegundos, para el procesador, la memoria y los dispositivos periféricos. La tercera columna indica las mismas velocidades pero escaladas por un factor de 100 millones, lo que brinda tiempos en términos de los seres humanos. El tiempo escalado de una operación por segundo es, a grandes rasgos, la rapidez de las viejas calculadoras mecánicas de hace cincuenta años. Las velocidades citadas se encuentran en constante cambio, pero la tendencia es que las que corresponden al procesador aumenten de manera exponencial, provocando con ello un hueco cada vez mayor en el desempeño entre los procesadores y los periféricos. Las unidades de disco han mejorado en lo que respecta a la velocidad de acceso, pero la naturaleza mecánica de éstas limita su desempeño y los tiempos de acceso no mejoran exponencial mente.
View more...
Comments