Logo Studenta

Silberschatz 10a castellano cap1

¡Este material tiene más páginas!

Vista previa del material en texto

Libro: Silberschatz y otros Edición 10ª (2018) en Inglés
https://drive.google.com/open?id=1hbjwCM1KCPXn2SuEWSNMS98ECCad5235
Prefacio
Los sistemas operativos son una parte esencial de cualquier sistema informático. Del mismo modo, un curso sobre sistemas operativos es una parte esencial de cualquier educación en informática.
Este campo está experimentando un cambio rápido, ya que las computadoras ahora prevalecen en prácticamente todos los ámbitos de la vida cotidiana, desde dispositivos integrados en automóviles a través de las herramientas de planificación más sofisticadas para gobiernos y empresas multinacionales. Sin embargo, los conceptos fundamentales permanecen bastante claros, y es en estos que basamos este libro.
Escribimos este libro como texto para un curso introductorio en sistemas operativos, en el nivel de pregrado junior o senior o en el graduado de nivel de primer año. Esperamos que los practicantes también lo encuentren útil. Proporciona una clara descripción de los conceptos que subyacen a los sistemas operativos. Como requisitos previos, suponemos que el lector está familiarizado con las estructuras de datos básicas, la organización de computadora y un lenguaje de alto nivel, como C o Java. Los temas de hardware necesarios para comprender los sistemas operativos se tratan en el Capítulo 1. En ese capítulo, también incluimos una descripción general de las estructuras de datos fundamentales, que prevalecen en la mayoría de los sistemas operativos. Para ejemplos de código, usamos predominantemente C, así como una cantidad significativa de Java, pero el lector aún puede comprender los algoritmos sin un conocimiento profundo de estos lenguajes. 
Los conceptos se presentan utilizando descripciones intuitivas. Importantes resultados teóricos están cubiertos, pero las pruebas formales se omiten en gran medida. Las notas bibliográficas al final de cada capítulo contienen sugerencias para trabajos de investigación en los que los resultados se presentaron y demostraron por primera vez, así como referencias a material reciente para leer más. En lugar de pruebas, se utilizan figuras y ejemplos para sugerir por qué deberíamos esperar que el resultado en cuestión sea verdadero. 
Los conceptos y algoritmos fundamentales cubiertos en el libro son a menudo basados en los utilizados en sistemas operativos comerciales y de código abierto. Nuestro objetivo es presentar estos conceptos y algoritmos en un entorno general que no está vinculado a un sistema operativo en particular. Sin embargo, presentamos un gran número de ejemplos que pertenecen a los más populares y más innovadores sistemas operativos, incluidos Linux, Microsoft Windows, Apple macOS (el nombre original, OS X, se cambió en 2016 para que coincida con el esquema de nombres de otros Productos de Apple) y Solaris. También incluimos ejemplos de Android e iOS, actualmente los dos sistemas operativos móviles dominantes.
La organización del texto refleja nuestros muchos años de cursos de enseñanza en sistemas operativos. También se tuvo en cuenta la retroalimentación proporcionada por los revisores del texto, junto con los numerosos comentarios y sugerencias recibimos de lectores de nuestras ediciones anteriores y de nuestros ex alumnos. Esta décima edición también refleja la mayoría de las pautas del plan de estudios en el área de sistemas operativos en Computer Science Curricula 2013, el máximo de directrices curriculares recientes para programas de licenciatura en ciencia informática publicada por la IEEE Computing Society y la Association de Machinery for Computing (ACM).
¿Qué hay de nuevo en esta edición?
Para la Décima Edición, nos enfocamos en revisiones y mejoras dirigidas a reducir los costos para los estudiantes, involucrarlos mejor en el proceso de aprendizaje, y brindando mayor apoyo a los instructores. Según la firma de investigación de mercado más confiable de la industria editorial, Outsell, 2015 representó un punto de inflexión en el uso del texto: por primera vez, la preferencia de los alumnos por los materiales de aprendizaje digital fue mayor que la impresa, y el aumento de la preferencia por lo digital se ha acelerado desde entonces. Si bien la impresión sigue siendo importante para muchos estudiantes como herramienta pedagógica, la Décima Edición se entrega en formas que enfatizan el apoyo al aprendizaje con materiales digitales. Todos los formularios que estamos proporcionando reducen drásticamente el costo a estudiantes en comparación con la Novena Edición. Estas formas son:
Texto electrónico independiente ahora con mejoras significativas. El formato de texto electrónico para la Décima Edición agrega ejercicios con soluciones en los extremos de secciones principaes, ocultar / revelar definiciones para términos clave y una serie de figuras animadas. También incluye "Ejercicios de práctica" adicionales con soluciones para cada capítulo, ejercicios adicionales, problemas de programación y proyectos, "Además Lectura ", un glosario completo y cuatro apéndices de sistemas operativos ya existentes.
Texto electrónico con paquete complementario de impresión. Por un costo adicional nominal, el e-text también está disponible con un complemento de impresión abreviado que incluye una copia de hojas sueltas del texto del capítulo principal, "Ejercicios de práctica" al final del capítulo (soluciones disponibles en línea) y secciones de "Lecturas adicionales". Los Instructores también puede solicitar acompañantes de impresión encuadernados para el paquete incluido, contactando a su representante de cuenta de Wiley. 
Aunque alentamos a todos los instructores y estudiantes a aprovechar de las ventajas de costo, contenido y aprendizaje de la edición de texto electrónico, es posible que los instructores trabajen con su administrador de cuentas de Wiley para crear una edición impresa personal
Para explorar más estas opciones o para discutir otras opciones, comuníquese con su Gerente de cuenta de Wiley (http://www.wiley.com/go/whosmyrep) o visite la página de información del producto para este texto en wiley.com
Material del libro
El libro consta de 21 capítulos y 4 apéndices. Cada capítulo y apéndice contiene el texto, así como las siguientes mejoras:
· Un conjunto de ejercicios de práctica, que incluyen soluciones
· Un conjunto de ejercicios regulares.
· Un conjunto de problemas de programación.
· Un conjunto de proyectos de programación.
· Una sección de lectura adicional
· Definiciones emergentes de términos importantes (azules)
· Un glosario de términos importantes.
· Animaciones que describen conceptos clave específicos.
Una copia dura del texto está disponible en librerías y en línea. Esa versión tiene los mismos capítulos de texto que la versión electrónica. Sin embargo, no incluye los apéndices, los ejercicios regulares, las soluciones a los ejercicios de práctica, los problemas de programación, los proyectos de programación y algunos de los otros mejoras encontradas en este libro electrónico ePub.
Contenido de este libro
El texto está organizado en diez partes principales. 
Visión general. Los capítulos 1 y 2 explican qué son los sistemas operativos, qué lo hacen, y cómo están diseñados y construidos. Estos capítulos discuten cuáles son las características comunes de un sistema operativo y qué sistema operativo lo hace para el usuario. Incluimos cobertura de ambos tradicionales Sistemas operativos para PC y servidores y sistemas operativos para dispositivos móviles. La presentación es motivadora y explicativa por naturaleza. Nosotros hemos evitado una discusión sobre cómo se hacen las cosas internamente en estos capítulos. Por lo tanto, son adecuados para lectores individuales o para estudiantes en clases de nivel inferior que quieren aprender qué es un sistema operativo sin entrar en los detalles de los algoritmos internos.
Gestión de proceso. Los capítulos 3 a 5 describen el concepto de proceso y concurrencia como el corazón de los sistemas operativos modernos. Un proceso es La unidad de trabajo en un sistema. Tal sistema consisteen una colección de procesos de ejecución simultánea, algunos ejecutan código del sistema operativo y otros que ejecutan código de usuario. Estos capítulos cubren los métodos para la planificación y comunicación entre procesos. También se incluye una detallada discusión de hilos, así como un examen de temas relacionados con sistemas multinúcleo y programación paralela.
Sincronización de procesos. Los capítulos 6 a 8 cubren métodos para administrar la sincronización e interbloqueo de procesos. Porque hemos aumentado la cobertura de sincronización de procesos, hemos dividido el capítulo 5 anterior (Sincronización de procesos) en dos capítulos separados: Capítulo 6, Sincronización Herramientas y Capítulo 7, Ejemplos de sincronización.
Gestión de la memoria. Los capítulos 9 y 10 tratan de la gestión de memoria principal durante la ejecución de un proceso. Para mejorar tanto elutilización de la CPU y la velocidad de su respuesta a sus usuarios, la computadora debe mantener varios procesos en la memoria. Hay muchos diferentes esquemas de administración de memoria, que reflejan varios enfoques de la gestión de memoria, y la efectividad de un algoritmo particular depende de la situación.
Administración de almacenamiento. Los capítulos 11 y 12 describen cómo el almacenamiento masivo y las E/S se manejan en un sistema informático moderno. Los dispositivos de E/S que se conectan a una computadora varían ampliamente, y el sistema operativo necesita proporcionar una amplia gama de funcionalidades para aplicaciones que les permiten controlar todos los aspectos de estos dispositivos. Discutimos las E/S del sistema en profundidad, incluidas el diseño de las E/S del sistema, interfaces y estructuras y funciones internas del sistema. En muchos sentidos, los dispositivos de E / S son los componentes principales más lentos de la computadora. Debido a que representan un cuello de botella de rendimiento, también examinamos problemas de rendimiento asociados con dispositivos de E/S.
Sistemas de archivos. Los capítulos 13 a 15 analizan cómo se manejan los sistemas de archivos en un sistema informático moderno Los sistemas de archivos proporcionan el mecanismo para el almacenamiento en línea y acceso a datos y programas. Describimos los cásicos algoritmos internos y estructuras de gestión de almacenamiento y proporcionan una comprensión práctica y firme de los algoritmos utilizados: sus propiedades, ventajas y desventajas.
Seguridad y protección. Los capítulos 16 y 17 analizan los mecanismos necesarios para la seguridad y protección de sistemas informáticos. Los procesos en un sistema operativo deben estar protegidos de las actividades de los demás. Para proporcionar dicha protección, debemos asegurarnos de que solo los procesos que tengan la autorización del sistema operativo puedan operar con los archivos, memoria, CPU y otros recursos del sistema. La protección es un mecanismo para controlar el acceso de programas, procesos o usuarios a los recursos del sistema informático. Este mecanismo debe proporcionar un medio de especificar los controles que se impondrán, así como un medio de ejecución. La seguridad protege la integridad de la información almacenada en el sistema (tanto datos como código), así como los recursos físicos del sistema, desde el acceso no autorizado, destrucción o alteración maliciosa e introducción accidental de inconsistencia.
Temas avanzados. Los capítulos 18 y 19 tratan sobre máquinas virtuales y redes / sistemas distribuidos. El Capítulo 18 proporciona una visión general de máquinas virtuales y su relación con el funcionamiento de sistemas contemporáneos. Se incluye una descripción general de las técnicas del hardware y el software, que hacen posible la virtualización. El Capítulo 19 proporciona una descripción general de las redes de computadoras y sistemas distribuidos, con un enfoque en Internet y TCP / IP.
Estudios de caso. Los capítulos 20 y 21 presentan estudios de caso detallados de dos sistemas operativos reales: Linux y Windows 10.
Apéndices. El apéndice A analiza varios sistemas operativos influyentes antiguos que ya no están en uso. Apéndices B a D cubren en gran detalla tres sistemas operativos más antiguos: Windows 7, BSD y Mach
Entornos de programación
El texto proporciona varios programas de ejemplo escritos en C y Java. Estos programas están diseñados para ejecutarse en los siguientes entornos de programación:
• POSIX. POSIX (que significa interfaz de sistema operativo portátil) representa un conjunto de estándares implementados principalmente para operaciones basadas en sistemas UNIX. Aunque los sistemas Windows también pueden ejecutar ciertos programas POSIX, nuestra cobertura de POSIX se centra en los sistemas Linux y UNIX que cumplen con POSIX en el estándar básico POSIX (POSIX.1); Linux y macOS son ejemplos de sistemas compatibles con POSIX. POSIX también define varias extensiones a los estándares, incluidas las extensiones en tiempo real (POSIX.1b) y una extensión para una biblioteca de subprocesos (POSIX.1c, más conocido como Pthreads). Ofrecemos varios ejemplos de programación escritos en C ilustrando la API base POSIX, así como Pthreads y las extensiones para programación en tiempo real. Estos programas de ejemplo se probaron en Linux 4.4 y sistemas macOS 10.11 que usan el compilador gcc.
• Java. Java es un lenguaje de programación ampliamente utilizado con una API rica y Soporte de lenguaje incorporado para programación concurrente y paralela. Los programas de Java se ejecutan en cualquier sistema operativo que admita una máquina virtual Java (o JVM). Ilustramos varios conceptos de sistemas operativos y redes con programas Java probados con la Versión 1.8 del Kit de desarrollo de Java (JDK)
• Sistemas de Windows. El entorno de programación principal para los sistemas Windows es la API de Windows, que proporciona un conjunto completo de funciones para gestionar procesos, hilos, memoria y dispositivos periféricos. Proporcionamos un número modesto de programas en C que ilustran el uso de esta API. Los programas se probaron en un sistema con Windows 10. Hemos elegido estos tres entornos de programación porque creemos que representan mejor los dos sistemas operativos más populares modelos (Linux / UNIX y Windows) junto con el ampliamente utilizado el ambiente de Java. La mayoría de los ejemplos de programación están escritos en C, y esperamos que los lectores se sientan cómodos con este lenguaje. Lectores familiarizados tanto con el lenguaje C y Java deberían comprender fácilmente la mayoría de los programas proporcionados en este texto. 
En algunos casos, como la creación de hilos, ilustramos un concepto específico utilizando los tres entornos de programación, lo que permite al lector contrastar las tres bibliotecas diferentes, ya que abordan la misma tarea. En otras situaciones podemos usar solo una de las API para demostrar un concepto. Por ejemplo, ilustramos la memoria compartida usando solo la API POSIX; programación de socket en TCP/IP se resalta utilizando la API de Java.
Máquina virtual de Linux
Para ayudar a los estudiantes a comprender mejor el sistema Linux, ofrecemos una máquina virtual Linux que ejecuta la distribución de Ubuntu con este texto. La máquina virtual, que está disponible para descargar desde el sitio web de texto (http://www.os-book.com), también proporciona entornos de desarrollo que incluyen los compiladores gcc y Java. La mayoría de las tareas de programación en el libro se puede completar con esta máquina virtual, con la excepción de las asignaciones que requieren la API de Windows. La máquina virtual se puede instalar y ejecutar en cualquier sistema operativo host que pueda ejecutar la virtualización del software VirtualBox, que actualmente incluye Windows 10 Linux y macOS.
La décima edición
Mientras escribíamos esta Décima Edición de Conceptos del Sistema Operativo, nos guiamos por el crecimiento sostenido en cuatro áreas fundamentales que afectan los sistemas operativos:
1. Sistemas operativos móviles
2. Sistemas multinúcleo
3. Virtualización4. Almacenamiento secundario de memoria no volátil
Para enfatizar estos temas, hemos integrado cobertura relevante a lo largo de esta nueva edición. Por ejemplo, hemos aumentado considerablemente nuestra cobertura de Sistemas operativos móviles Android e iOS, así como nuestra cobertura de Arquitectura ARMv8 que domina los dispositivos móviles. También hemos aumentado nuestra cobertura de sistemas multinúcleo, incluida una mayor cobertura de API que brindan soporte para la concurrencia y el paralelismo. Dispositivos de memoria no volátiles como los SSD ahora se tratan como iguales a las unidades de disco duro en los capítulos que discutir E/S, almacenamiento masivo y sistemas de archivos. 
Varios de nuestros lectores han expresado su apoyo a un aumento en cobertura Java, y hemos proporcionado ejemplos Java adicionales a lo largo de esta edición.
Además, hemos reescrito el material en casi todos los capítulos al traer material antiguo actualizado y eliminación de material que ya no es interesante o relevante. Hemos reordenado muchos capítulos y, en algunos casos, se movió secciones de un capítulo a otro. También hemos revisado mucho el estado del arte, creando varias figuras nuevas y modificando muchas figuras existentes.
Cambios principales
La actualización de la Décima Edición abarca mucho más material que las anteriores actualizaciones, tanto en contenido como en nuevo material de apoyo. Luego, nosotros proporcionamos un breve resumen de los principales cambios de contenido en cada capítulo:
• Capítulo 1: Introducción incluye cobertura actualizada de sistemas multinúcleo, así como una nueva cobertura de sistemas NUMA y clústeres de Hadoop. El antiguo material se ha actualizado y se ha agregado una nueva motivación para estudio de sistemas operativos.
• El Capítulo 2: Estructuras del sistema operativo proporciona una discusión significativamente revisada del diseño e implementación de sistemas operativos. Nosotros hemos actualizado nuestro tratamiento de Android e iOS y hemos revisado nuestra cobertura del proceso de arranque del sistema con un enfoque en GRUB para sistemas Linux. Se incluye una nueva cobertura del subsistema de Windows para Linux también. Hemos agregado nuevas secciones sobre enlazadores y cargadores, y ahora discutimos por qué las aplicaciones a menudo son específicas del sistema operativo. Finalmente nosotros hemos agregado una discusión sobre el conjunto de herramientas de depuración de BCC.
• Capítulo 3: Procesos simplifica la discusión de la planificación para que ahora incluye solo problemas de planificación de CPU. Nueva cobertura describe el diseño de memoria de un programa en C, la jerarquía de procesos de Android, los paso de mensajes de Mach, y RPC de Android. También hemos reemplazado la cobertura del proceso de inicio tradicional de UNIX / Linux con cobertura de systemd.
• Capítulo 4: Hilos y concurrencia (en ediciones anteriores sólo tuvo hilos) aumenta la cobertura de soporte para programación concurrente y paralela en la API y nivel de biblioteca. Hemos revisado la sección sobre hilos de Java para que ahora incluya las futuras actualizaciones y la cobertura del gran despachador central de Apple para que ahora incluya a Swift. Nuevas secciones discuten el paralelismo de forkjoin usando el framework fork-join de Java, así como los hilos de Intel construyen los bloques.
• Capítulo 5: Planificación de CPU (anteriormente Capítulo 6) revisa la cobertura de Planificación de cola multinivel y procesamiento multinúcleo. Hemos integrado cobertura de problemas de planificación conscientes de NUMA en todo momento, incluido cómo esta planificación afecta el equilibrio de carga. También discutimos modificaciones relacionadas al planificador Linux CFS. Nueva cobertura combina discusiones de round-robin y planificación prioritaria, multiprocesamiento heterogéneo y Planificación de Windows 10.
• Capítulo 6: Herramientas de sincronización (anteriormente parte del Capítulo 5, Sincronización de Procesos) se centra en varias herramientas para sincronizar procesos. Nueva cobertura significativa discute temas arquitectónicos como la instrucción reordenamiento y retrasos en las escrituras a los buffers. El capítulo también presenta lock-free algoritmos que usan instrucciones de comparar y cambiar (CAS). No específico se presentan las API; más bien, el capítulo proporciona una introducción a las condiciones de carrera y herramientas generales que se pueden utilizar para evitar carreras de datos. Los detalles incluyen una nueva cobertura de modelos de memoria, barreras de memoria y cuestiones de detección de vida.
• Capítulo 7: Ejemplos de sincronización (anteriormente parte del Capítulo 5, Sincronización de procesos) presenta problemas de sincronización clásicos y discute soporte API específico para diseñar soluciones que resuelvan estos problemas. El capítulo incluye una nueva cobertura de semáforos POSIX (con y sin nombre), así como variables de condición. Una nueva sección sobre la sincronización de Java también se incluye.
• Capítulo 8: Dead lock (anteriormente Capítulo 7) proporciona actualizaciones menores, incluyendo una nueva sección sobre livelock y una discusión sobre deadlock como ejemplo de un peligro de vida de los procesos. El capítulo incluye una nueva cobertura de Linux lockdep y las herramientas de detección de dead lock BCC, así como la cobertura de detección de interbloqueo Java utilizando volcados de memoria de hilos.
• Capítulo 9: Memoria principal (anteriormente Capítulo 8) incluye varias revisiones que actualizan el capítulo con respecto a la gestión de memoria en sistemas informáticos modernos. Hemos agregado una nueva cobertura de Arquitectura ARMv8 de 64 bits, actualizada la cobertura de las bibliotecas de enlaces dinámicos y cambió la cobertura de intercambio para que ahora se centre en el intercambio de páginas en lugar de procesos. También hemos eliminado la cobertura de la segmentación.
• Capítulo 10: Memoria virtual (anteriormente Capítulo 9) contiene varias revisiones, incluyendo cobertura actualizada de asignación de memoria en NUMAsystems y asignación global utilizando una lista de marcos libres. Nueva cobertura incluye memoria comprimida, fallas de página mayores/menores y administración de memoria en Linux y Windows 10.
• Capítulo 11: Estructura de almacenamiento masivo (anteriormente Capítulo 10) agrega cobertura de dispositivos de memoria no volátiles, como discos flash y de estado sólido. La planificación del disco duro se simplifica para mostrar solo los algoritmos utilizados actualmente. También se incluye una nueva sección sobre almacenamiento en la nube, RAID actualizado cobertura y una nueva discusión sobre el almacenamiento de objetos.
• El Capítulo 12, E/S (anteriormente Capítulo 13) actualiza la cobertura de tecnologías y valores de rendimiento, amplía la cobertura de E/S síncrona / asíncrona y de bloqueo / no bloqueo, y agrega una sección sobre E / S vectorizada. También amplía la cobertura de la administración de energía para sistemas operativos móviles.
• Capítulo 13: La interfaz del sistema de archivos (anteriormente Capítulo 11) ha sido actualizado con información sobre las tecnologías actuales. En particular, se ha mejorado la cobertura de las estructuras de directorios y la cobertura de la protección ha sido actualizada. La sección de archivos mapeados en memoria ha sido expandida, y se agregó un ejemplo de API de Windows a la discusión de memoria compartida. El orden de los temas se reconstruye en el Capítulo 13 y 14)
• Capítulo 14: Implementación del sistema de archivos (anteriormente Capítulo 12) está actualizado con cobertura de tecnologías actuales. El capítulo ahora incluye discusiones sobre TRIM y el sistema de archivos de Apple. además, se ha actualizado la discusión sobre el rendimiento y la cobertura del diario ha sido ampliado
• Capítulo 15: El sistema interno de archivos es nuevo y contiene información actualizada de los capítulos anteriores 11 y 12.
• Capítulo 16: Seguridad (anteriormente Capítulo 15) ahora precede al capítulode protección. Incluye términos revisados ​​y actualizados para la seguridad actual (amenazas y soluciones), incluidos ransomware y herramientas de acceso remoto. Se enfatiza el principio del menor privilegio. Cobertura de vulnerabilidades de inyección de código y los ataques han sido revisados ​​y ahora incluyen ejemplos de código. La discusión sobre las tecnologías de cifrado se ha actualizado para centrarse en tecnologías utilizadas actualmente. Cobertura de autenticación (por contraseñas y otros métodos) se ha actualizado y ampliado con sugerencias útiles. Las adiciones incluyen una discusión sobre la aleatorización del diseño del espacio de direcciones y un nuevo resumen de las defensas de seguridad. El ejemplo de Windows 7 ha sido actualizado a Windows 10.
• Capítulo 17: Protección (anteriormente Capítulo 14) contiene cambios importantes. La discusión sobre los anillos y capas de protección se ha actualizado y ahora se refiere al modelo Bell – LaPadula y explora el modelo ARM de Trust-Zonas y llamadas de monitor seguro. Cobertura del principio de necesidad de saber se ha ampliado, al igual que la cobertura del control de acceso obligatorio. Subsecciones en capacidades de Linux, derechos de Darwin, protección de integridad de seguridad, se agregaron filtrado de llamadas al sistema, sandboxing y firma de código. También se ha agregado la cobertura de la aplicación basada en tiempo de ejecución en Java, incluyendo la técnica de inspección de la pila.
• Capítulo 18: Máquinas virtuales (anteriormente Capítulo 16) incluye agregado de detalles sobre tecnologías de asistencia de hardware. También se ha ampliado el tema de contención de aplicaciones, que ahora incluye contenedores, zonas, acopladores, y Kubernetes. Una nueva sección discute la investigación de virtualización en curso, incluidos unikernels, sistemas operativos de biblioteca, hipervisores de partición, e hipervisores de separación.
• Capítulo 19, Redes y sistemas distribuidos (anteriormente Capítulo 17) se ha actualizado sustancialmente y ahora combina la cobertura de redes de computadoras y sistemas distribuidos. El material ha sido revisado para traer actualizado con respecto a las redes informáticas contemporáneas y sistemas distribuidos. El modelo TCP / IP recibe énfasis adicional y una discusión de almacenamiento en la nube ha sido añadido. La sección sobre topologías de red ha sido removida. Se ha ampliado la cobertura de la resolución de nombres y un ejemplo de Java agregado. El capítulo también incluye nueva cobertura de distribución de sistemas de archivos, incluido MapReduce en la parte superior del sistema de archivos de Google, Hadoop, GPFS y Lustre.
• Capítulo 20: El sistema Linux (anteriormente Capítulo 18) ha sido actualizado para cubrir el kernel de Linux 4.i.
• Capítulo 21: El sistema Windows 10 es un nuevo capítulo que cubre las partes internas de Windows 10.
• Apéndice A: Sistemas operativos influyentes se han actualizado para incluir material de capítulos que ya no están cubiertos en el texto. 
Sitio web de apoyo 
Cuando visite el sitio web que respalda este texto en http://www.os-book.com, puedes descargar los siguientes recursos:
• máquina virtual Linux
• Código fuente C y Java
• El conjunto completo de figuras e ilustraciones.
• Estudios de casos de FreeBSD, Mach y Windows 7
• Errata
• Bibliografía
Notas para los instructores
En el sitio web de este texto, proporcionamos varios programas de muestra que sugieren varios enfoques para usar el texto en cursos introductorios y avanzados. Como regla general, alentamos a los instructores a progresar secuencialmente a través de los capítulos, ya que esta estrategia proporciona el estudio más completo de sistemas operativos. Sin embargo, al utilizar los programas de muestra, un instructor puede seleccionar un diferente orden de capítulos (o subsecciones de capítulos). En esta edición, hemos agregado muchos ejercicios escritos nuevos y problemas de programación y proyectos. La mayoría de las nuevas tareas de programación implican procesos, subprocesos, planificación de procesos, sincronización de procesos y gestión de la memoria. Algunos implican agregar módulos de kernel al sistema Linux, que requiere el uso de la máquina virtual Linux que acompaña este texto u otra distribución de Linux adecuada. 
Hay soluciones disponibles para ejercicios de programación escritos y tareas a los instructores que han adoptado este texto para su clase de sistema operativo. Para obtener estos suplementos restringidos, comuníquese con su representante de ventas de John Wiley & hijos. Puede encontrar a su representante de Wiley yendo a http://www.wiley.com/college y haciendo clic en "¿Quién es mi representante?"
Notas para estudiantes
Le recomendamos que aproveche los ejercicios de práctica que aparecen en el fin de cada capítulo. También lo alentamos a leer la guía de estudio, que fue preparado por uno de nuestros alumnos. Finalmente, para estudiantes que no están familiarizados con los sistemas UNIX y Linux, le recomendamos que descargue e Instale la máquina virtual Linux que incluimos en el sitio web de soporte. Esto no solo le proporcionará una nueva experiencia informática, sino también el código abierto natural de Linux y le permitirá examinar fácilmente los detalles internos de este sistema operativo popular. Le deseamos la mejor de las suertes en su estudio de ¡sistemas operativos!
Contactando con nosotros
Nos hemos esforzado por eliminar errores tipográficos, errores y similares del texto. Pero, al igual que en las nuevas versiones de software, es casi seguro que permanecen los errores. Una errata actualizada se puede acceder a la lista desde el sitio web del libro. Le agradeceríamos que lo hiciera y notifíquenos cualquier error u omisión en el libro que no esté en la lista actualde erratas Estaremos encantados de recibir sugerencias sobre mejoras en el libro. También agradecemos cualquier contribución al sitio web del libro que pueda ser útil a otros lectores, como ejercicios de programación, sugerencias de proyectos, en línea, laboratorios y tutoriales, y consejos de enseñanza. El correo electrónico debe estar dirigido a os-bookauthors @cs.yale.edu.
Expresiones de gratitud: Agradecimientos
Muchas personas nos han ayudado con esta Décima Edición, así como con las nueve ediciones anteriores de las cuales se deriva.
Parte uno
Visión general
Un sistema operativo actúa como intermediario entre el usuario de una computadora y el hardware de la computadora. El propósito de un sistema operativo es proporcionar un entorno en el que un usuario pueda ejecutar programas de una Manera conveniente y eficiente.
Un sistema operativo es un software que administra el hardware de la computadora. El hardware debe proporcionar mecanismos apropiados para garantizar el correcto funcionamiento del sistema informático y para evitar que los programas interfieran con el correcto funcionamiento del sistema. Internamente, los sistemas operativos varían mucho en su composición, ya que están organizados a lo largo de muchas líneas diferentes. El diseño de un nuevo sistema operativo es una tarea importante, y es importante que los objetivos del sistema sean bien definidos antes de que comience el diseño. Debido a que un sistema operativo es grande y complejo, debe crearse pieza por pieza. Cada una de estas piezas debe estar bien delineada como porción del sistema, con entradas, salidas y funciones cuidadosamente definidas 
Capítulo 1
Introducción
Un sistema operativo es un software que administra el hardware de una computadora. Eso También proporciona una base para los programas de aplicación y actúa como intermediario entre el usuario de la computadora y el hardware de la computadora. Un aspecto asombroso de los sistemas operativos es cómo varían en la realización de estas tareas en una amplia variedad de entornos informáticos. Los sistemas operativos están en todas partes, desde automóviles y electrodomésticos que incluyen dispositivos de "Internet de las cosas", para teléfonos Smart,computadoras personales, computadoras empresariales y entornos de computación en la nube. Para explorar el papel de un sistema operativo en una informática de entorno moderno, es importante primero entender la organización y la arquitectura de hardware de la computadora. Esto incluye la CPU, la memoria y los dispositivos de E/S, así como el almacenamiento. Una responsabilidad fundamental de un sistema operativo es asignar estos recursos a los programas. Debido a que un sistema operativo es grande y complejo, debe crearse pieza por pieza. Cada una de estas piezas debe ser una parte bien delineada del sistema, con entradas, salidas y funciones cuidadosamente definidas. En este capítulo, ofrecemos una visión general de los principales componentes de un sistema informático contemporáneo, así como las funciones proporcionadas por el sistema operativo. Además, cubrimos varios temas para ayudar a preparar el escenario para el resto del texto: estructuras de datos utilizadas en sistemas operativos, entornos informáticos y sistemas operativos de código abierto y gratuitos.
OBJETIVOS DEL CAPÍTULO
• Describir la organización general de un sistema informático y el papel de las interrupciones
• Describir los componentes en un sistema informático multiprocesador moderno.
• Ilustrar la transición del modo de usuario al modo kernel.
• Discuta cómo se utilizan los sistemas operativos en diversos entornos informáticos.
• Proporcionar ejemplos de sistemas operativos gratuitos y de código abierto.
1.1 Qué hacen los sistemas operativos
Comenzamos nuestra discusión observando el papel del sistema operativo en el sistema informático general Un sistema de computadora se puede dividir aproximadamente en cuatro componentes: el hardware, el sistema operativo, los programas de aplicación y un usuario (Figura 1.1). 
El hardware: la unidad central de procesamiento (CPU), la memoria y los dispositivos de entrada/salida (E/S): proporcionan los recursos informáticos básicos para el sistema. 
Los programas de aplicación: como procesadores de texto, hojas de cálculo, compiladores y navegadores web: definen las formas en que estos recursos se utilizan para resolver los problemas informáticos de los usuarios. 
El sistema operativo: controla el hardware y coordina su uso entre los diversos programas de aplicación para los diversos usuarios.
También podemos ver un sistema informático que consta de hardware, software y datos. El sistema operativo proporciona los medios para el uso adecuado de estos recursos en la operación del sistema informático. Un sistema operativo es similar a un gobierno. Como un gobierno, no realiza ninguna función útil por sí mismo. Simplemente proporciona un entorno dentro del cual otros programas pueden hacer un trabajo útil.
Para comprender mejor el papel del sistema operativo, exploramos a continuación sistemas operativos desde dos puntos de vista: el del usuario y el del sistema.
1.1.1 Vista del usuario
La vista del usuario de la computadora varía según la interfaz que se utiliza. Muchos usuarios de computadoras se sientan con una computadora portátil o frente a una PC que consiste en un monitor, teclado y mouse. Tal sistema está diseñado para que un usuario monopolice sus recursos. El objetivo es maximizar el trabajo (o juego) que el usuario está realizando. En este caso, el sistema operativo está diseñado principalmente para facilitar el uso, con cierta atención costará en rendimiento y seguridad y pero no por la utilización de recursos: cómo diversos recursos de hardware y software son compartidas.
Cada vez más, muchos usuarios interactúan con dispositivos móviles como teléfonos inteligentes y tabletas: dispositivos que reemplazan los sistemas de computadoras de escritorio y portátiles para algunos usuarios Estos dispositivos suelen estar conectados a redes a través de Tecnologías celulares u otras tecnologías inalámbricas. La interfaz de usuario para computadoras móviles generalmente presenta una pantalla táctil, donde el usuario interactúa con el sistema al presionar y deslizar los dedos por la pantalla en lugar de usar un dispositivo físico como el teclado y ratón. Muchos dispositivos móviles también permiten a los usuarios interactuar a través de una interfaz de reconocimiento de voz, como la Siri de Apple.
Algunas computadoras tienen poca o ninguna vista del usuario. Por ejemplo, computadoras integradas en dispositivos domésticos y automóviles pueden tener teclados numéricos y pueden enciende o apaga las luces indicadoras para mostrar el estado, pero ellas y sus sistemas operativos y las aplicaciones están diseñadas principalmente para ejecutarse sin intervención del usuario.
1.1.2 Vista del sistema
Desde el punto de vista de la computadora, el sistema operativo es el programa más íntimamente involucrado con el hardware. En este contexto, podemos ver una operación del sistema como un asignador de recursos. Un sistema informático tiene muchos recursos que pueden ser necesario para resolver un problema: tiempo de CPU, espacio de memoria, espacio de almacenamiento, dispositivos de E/S, etc. El sistema operativo actúa como el administrador de estos recursos. Ante numerosas y posiblemente conflictivas solicitudes de recursos, el sistema operativo debe decidir cómo asignarlos a programas específicos y usuarios para que pueda operar el sistema informático de manera eficiente y justa.
Una visión ligeramente diferente de un sistema operativo enfatiza la necesidad de controlar los diversos dispositivos de E/S y programas de usuario. Un sistema operativo es un programa de control. Un programa de control gestiona la ejecución de programas de usuario. para evitar errores y el uso indebido de la computadora. Está especialmente preocupado con la operación y control de dispositivos de E / S.
1.1.3 Definición de sistemas operativos
A estas alturas, probablemente pueda ver que el término sistema operativo abarca muchos Roles y funciones. Ese es el caso, al menos en parte, debido a la miríada de diseños y usos de computadoras. Las computadoras están presentes en tostadoras, automóviles, naves, naves espaciales, hogares y negocios. Son la base de las máquinas de juego, sintonizadores de TV por cable y sistemas de control industrial. 
Para explicar esta diversidad, podemos pasar a la historia de las computadoras. A pesar de que Las computadoras tienen una historia relativamente corta, han evolucionado rápidamente. Informática comenzó como un experimento para determinar qué se podía hacer y rápidamente se trasladó a sistemas de propósito fijo para usos militares, como descifrar códigos y trazado de trayectoria y usos gubernamentales, como el cálculo del censo. Aquellas primeras computadoras evolucionaron en mainframes multifunción de uso general, y fue entonces cuando nacieron los sistemas operativos. En la década de 1960, la Ley de Moore predijo que el número de transistores en un circuito integrado se duplicaría cada 18 meses, y esa predicción se ha cumplido. Computadoras ganadas en funcionalidad y se redujo de tamaño, lo que lleva a una gran cantidad de usos y una gran cantidad de variedad de sistemas operativos (Consulte el Apéndice A para obtener más detalles sobre el historial de sistemas operativos). 
¿Cómo, entonces, podemos definir qué es un sistema operativo? En general, tenemos no hay una definición completamente adecuada de un sistema operativo. Sistemas operativos existen porque ofrecen una forma razonable de resolver el problema de crear Un sistema informático utilizable. El objetivo fundamental de los sistemas informáticos es ejecutar programas y facilitar la resolución de problemas del usuario. El hardware de un Computador se construye hacia este objetivo. Ya que el hardware desnudo solo no es particularmente fácil de usar, se desarrollan programas de aplicación. Estos programas requieren ciertas operaciones comunes, como las que controlan los dispositivos de E/S. Las funciones comunes de control y asignación de recursos son luego reunidas en una sola pieza de software: el sistema operativo. 
Además,no tenemos una definición universalmente aceptada de lo que es parte de un sistema operativo. Un punto de vista simple es que incluye todo lo que un vendedor se envía cuando solicita "el sistema operativo". Las características incluidas, sin embargo, varían mucho entre sistemas. Algunos sistemas ocupan menos de un megabyte de espacio y falta incluso un editor de pantalla completa, mientras que otros requieren gigabytes de espacio y se basan completamente en sistemas gráficos de ventanas. Una definición más común, y la que usualmente seguimos, es que el sistema operativo es el único programa que se ejecuta en todo momento en la computadora, generalmente llamado núcleo (KERNEL). Junto con el núcleo, hay otros dos tipos de programas: programas del sistema, que están asociados con el sistema operativo pero no necesariamente parte del kernel y programas de aplicación, que incluyen todos los programas no asociado con la operación del sistema. 
La cuestión de lo que constituye un sistema operativo se hizo cada vez más importante a medida que las computadoras personales se generalizaron y los sistemas operativos se hizo cada vez más sofisticado. En 1998, el Departamento de Estados Unidos de Justicia presentó una demanda contra Microsoft, en esencia alegando que Microsoft incluyó demasiada funcionalidad en sus sistemas operativos y, por lo tanto, impidió la aplicación vendedores de la competencia. (Por ejemplo, un navegador web era una parte integral de los sistemas operativos de Microsoft.) Como resultado, Microsoft fue declarado culpable de usar su monopolio del sistema operativo para limitar la competencia.
Hoy, sin embargo, si miramos los sistemas operativos para dispositivos móviles, nosotros vemos una vez más, que la cantidad de características que constituyen el sistema operativo se está incrementando. Los sistemas operativos móviles a menudo incluyen no solo un núcleo, sino también un middleware, un conjunto de marcos de software que proporcionan servicios a desarrolladores de aplicaciones. Por ejemplo, las características destacadas de los sistemas operativos móviles (iOS de Apple y Android de Google), que cotienen un núcleo central junto con middleware que admite bases de datos, multimedia y gráficos (por nombrar solo algunos).
¿POR QUÉ ESTUDIAR LOS SISTEMAS OPERATIVOS?
Aunque hay muchos profesionales de la informática, solo un pequeño porcentaje de ellos estarán involucrados en la creación o modificación de una Sistema Operativo. ¿Por qué, entonces, estudiar los sistemas operativos y cómo funcionan? Simplemente porque, como casi todo el código se ejecuta sobre un sistema operativo, el conocimiento de cómo funcionan los sistemas operativos es crucial para un correcto, eficiente, efectiva programación segura. Comprender los fundamentos de los sistemas operativos, cómo manejan el hardware de la computadora y lo que proporcionan a las aplicaciones es no solo esencial para quienes los programan sino que también es muy útil para quienes escriben programas sobre ellos y los usan.
En resumen, para nuestros propósitos, el sistema operativo incluye el funcionamiento siempre del kernel, marcos de middleware que facilitan el desarrollo de aplicaciones y proporcionan funciones y programas del sistema que ayudan a administrar el sistema, mientras se está ejecutando. La mayor parte de este texto se refiere al núcleo de sistemas operativos de propósito general, pero otros componentes se discuten según sea necesario para explicar completamente el diseño y la operación del sistema operativo.
1.2 Organización del sistema informático
Un moderno sistema informático de uso general consta de una o más CPU y una serie de placas controladoras de dispositivos conectados a través de un bus común que proporciona acceso entre componentes y memoria compartida (Figura 1.2). Cada controlador de dispositivo está a cargo de un tipo específico de dispositivo (por ejemplo, una unidad de disco, un dispositivo de audio o pantalla de gráficos). Dependiendo del controlador, más de un dispositivo puede estar conectado. Por ejemplo, un puerto USB del sistema puede conectarse a un Hub USB, al que se pueden conectar varios dispositivos. Un controlador de dispositivo mantiene un poco de almacenamiento en búfer local y un conjunto de registros de propósito especial. El controlador de dispositivo es responsable de mover los datos entre los dispositivos periféricos que controla y su almacenamiento de búfer local.
Por lo general, los sistemas operativos tienen un manejador de dispositivo (driver) para cada controlador de dispositivo. Este manejador de dispositivo entiende al controlador del dispositivo y proporciona al resto del sistema operativo una interfaz uniforme con el dispositivo. La CPU y los controladores de dispositivo pueden ejecutarse en paralelo, compitiendo por ciclos de memoria. Para asegurarse el acceso ordenado a la memoria compartida, un controlador de memoria sincroniza el acceso a la memoria.
En las siguientes subsecciones, describimos algunos conceptos básicos de cómo dicho sistema opera, enfocándose en tres aspectos clave del sistema. Comenzamos con interrupciones, que alertan a la CPU de eventos que requieren su atención. Luego discutimos la estructura de almacenamiento y la estructura de E/S.
1.2.1 Interrupciones
Considere una operación de computadora típica: un programa que realiza E/S. Para comenzar una operación de E/S, el manejador del dispositivo carga los registros apropiados en el controlador del dispositivo. El controlador del dispositivo, a su vez, examina el contenido de estos registros para determinar qué acción tomar (como "leer un carácter del teclado"). El controlador comienza la transferencia de datos desde el dispositivo a su buffer local. Una vez que se completa la transferencia de datos, el controlador del dispositivo informa al manejador de dispositivo que ha terminado su operación. El manejador del dispositivo luego da control a otras partes del sistema operativo, posiblemente devolviendo los datos o un puntero a los datos si la operación fue una lectura. Para otras operaciones, el manejador del dispositivo devuelve información de estado como "escritura completada con éxito" o "Dispositivo ocupado". Pero, ¿cómo informa el controlador al manejador del dispositivo que ha terminado su operación? Esto se logra a través de una interrupción.
1.2.1.1 Descripción general
El hardware puede activar una interrupción en cualquier momento enviando una señal a la CPU, generalmente a través del bus del sistema. (Puede haber muchos buses dentro un sistema informático, pero el bus del sistema es la ruta de comunicación principal entre los componentes principales.) Las interrupciones se usan también para muchos otros propósitos y son una parte clave de cómo interactúan los sistemas operativos y el hardware.
Cuando se interrumpe la CPU, deja de ejecutar lo que está haciendo e inmediatamente transfiere la ejecución a una ubicación fija. La ubicación fija generalmente contiene la dirección de inicio donde se encuentra la rutina de servicio para la interrupción. Se ejecuta la rutina de servicio de interrupción; al finalizar, la CPU reanuda la computación interrumpida Una línea de tiempo de esta operación se muestra en la Figura 1.3.
Las interrupciones son una parte importante de la arquitectura de una computadora. Cada diseño de computadora tiene su propio mecanismo de interrupción, pero varias funciones son comunes. La interrupción debe transferir el control a la rutina de servicio de interrupción apropiada. El método directo para gestionar esta transferencia sería invocar una rutina genérica para examinar la información de interrupción. La rutina, a su vez, llamaría al manejador específico de interrupción. Sin embargo, las interrupciones deben manejarse rápidamente, ya que ocurren con mucha frecuencia. Una Tabla de punteros para interrumpir las rutinas. puede usarse en su lugar para proporcionar la velocidad necesaria. La rutina de interrupción se llama indirectamente a través de la tabla, sin necesidadde una rutina intermedia. En general, la tabla de punteros se almacena en poca memoria (los primeros cien más o menos ubicaciones). Estas ubicaciones contienen las direcciones de las rutinas de servicio de interrupción para los distintos dispositivos Esta matriz, o vector de interrupción, de direcciones es entonces indexado por un número único, dado con la solicitud de interrupción, para proporcionar la dirección de la rutina de servicio de interrupción para el dispositivo de interrupción. Los sistemas operativos tan diferentes como Windows y UNIX despachan interrupciones de esta manera. La arquitectura de interrupción también debe guardar la información de estado de cualquier programa que fue interrumpido, para que pueda restaurar esta información después de completar la rutina de interrupción. Si la rutina de interrupción necesita modificar el estado del procesador, por ejemplo, al modificar los valores de registro, debe guardarse explícitamente el estado actual y luego restaurar ese estado antes de regresar. Después de que la interrupción es atendida, la dirección de retorno guardada se carga en el contador del programa y la computación interrumpida se reanuda como si la interrupción no hubiera ocurrido.
1.2.1.2 Implementación
El mecanismo básico de interrupción funciona de la siguiente manera. El hardware de la CPU tiene un cable llamado la línea de solicitud de interrupción (IRQ) que la CPU detecta después de ejecutar cada instrucción. Cuando la CPU detecta que un controlador ha activado una señal la línea de solicitud de interrupción, lee el número de interrupción y salta a la rutina de manejo de interrupciones utilizando ese número de interrupción como un índice en el vector de interrupción. Luego comienza la ejecución en la dirección asociada con ese índice El manejador de interrupciones guarda cualquier estado que vaya a cambiar durante su funcionamiento, determina la causa de la interrupción, realiza lo necesario procesamiento, realiza una restauración de estado y ejecuta una instrucción de retorno de interrupción para devolver la CPU al estado de ejecución antes de la interrupción. Nosotros decimos que el controlador del dispositivo genera una interrupción al colocar una señal en la línea de solicitud de interrupción, la CPU detecta la interrupción y la envía al manejador de interrupciones, y el manejador borra la interrupción cuando le da atención al dispositivo. La Figura 1.4 muestra el ciclo de E/S por interrupción. 
El mecanismo básico de interrupción que se acaba de describir permite que la CPU responda a un evento asincrónico, como cuando un controlador de dispositivo está listo para el servicio. En un sistema operativo moderno, sin embargo, necesitamos interrupciones con características más sofisticadas.
1. Necesitamos la capacidad de diferir el manejo de interrupciones durante el procesamiento crítico.
2. Necesitamos una forma eficiente de enviar al manejador de interrupciones adecuado para un dispositivo.
3. Necesitamos interrupciones multinivel, para que el sistema operativo pueda distinguir entre interrupciones de alta y baja prioridad y puede responder con el grado apropiado de urgencia.
En el hardware de la computadora moderna, estas tres características son proporcionadas por la CPU y el hardware del controlador de interrupción. 
La mayoría de las CPU tienen dos líneas de solicitud de interrupción. Una que es interrupción no enmascarable, que está reservada para eventos como errores de memoria irrecuperables. La segunda línea de interrupción es enmascarable: la CPU puede apagarla antes de la ejecución de secuencias de instrucciones críticas (que no deben ser interrumpidas). Los controladores de dispositivos utilizan la interrupción enmascarable para solicitar servicio. Recuerde que el propósito de un mecanismo de interrupción vectorial es reducir la necesidad de un único manejador de interrupciones para buscar todas las fuentes posibles de interrupciones para determinar cuál necesita servicio. En la práctica, sin embargo, las computadoras tienen más dispositivos (y, por lo tanto, manejadores de interrupciones) de los que tienen elementos de dirección en el vector de interrupción. Una forma común de resolver este problema es usar encadenamiento de interrupciones, en el que cada elemento en el vector de interrupción apunta a la cabeza de una lista de manejadores de interrupciones. Cuando se genera una interrupción, los manejadores en la lista correspondiente se llaman una por una, hasta que se encuentre uno que pueda servir la solicitud. Esta estructura es un compromiso entre los gastos generales de un enorme tabla de interrupciones y la ineficacia de enviar a un único manejador de interrupciones.
La Figura 1.5 ilustra el diseño del vector de interrupción para procesadores Intel. Los eventos del 0 al 31, que no se pueden enmascarar, se utilizan para señalar varias condiciones de error Los eventos del 32 al 255, que se pueden enmascarar, se utilizan para propósitos tales como interrupciones generadas por el dispositivo. El mecanismo de interrupción también implementa un sistema de prioridad de interrupción. Estos niveles permiten a la CPU diferir el manejo de interrupciones de baja prioridad todas las interrupciones sin enmascarar y hace posible una alta prioridad
de interrupción para evitar la ejecución de una interrupción de baja prioridad. En resumen, las interrupciones se utilizan en todos los sistemas operativos modernos para manejar eventos asincrónicos (y para otros fines discutiremos a lo largo del texto). Los controladores de dispositivos y las fallas de hardware generan interrupciones. Para permitir el trabajo más urgente que se debe hacer primero, las computadoras modernas utilizan un sistema de interrupción por prioridades. Debido a que las interrupciones se usan mucho y es un tiempo sensible de procesamiento, se requiere un manejo eficiente de interrupciones para un buen rendimiento del sistema.
1.2.2 Estructura de almacenamiento
La CPU solo puede cargar instrucciones desde la memoria, por lo que cualquier programa debe primero cargarse en la memoria para ejecutar. Las computadoras de propósito general ejecutan muchos de programas desde la memoria modificable, llamada memoria principal (también llamada memoria de acceso aleatorio o RAM). La memoria principal comúnmente se implementa con una tecnología de semiconductores llamada memoria dinámica de acceso aleatorio (DRAM). 
Las computadoras también usan otras formas de memoria. Por ejemplo, el primer programa ejecutar en el encendido de la computadora es un programa de arranque, que luego carga El sistema operativo. Como la RAM es volátil, pierde su contenido cuando se enciende, está desactivado o se pierde de otro modo; no podemos confiar en que mantenga el programa de arranque. En cambio, para este y otros propósitos, la computadora usa memoria de solo lectura programable borrable por electricidad (EEPROM) y otras formas de firmware: almacenamiento que se escribe con poca frecuencia y no es volátil. 
DEFINICIONES Y NOTACIÓN de ALMACENAMIENTO
La unidad básica de almacenamiento de la computadora es el bit. Un bit puede contener uno de dos valores, 0 y 1. El resto del almacenamiento en una computadora se basa en colecciones de bits. Dados suficientes bits, es sorprendente cuántas cosas puede representar una computadora: números, letras, imágenes, películas, sonidos, documentos y programas, por nombrar unos pocos. Un byte es de 8 bits, y en la mayoría de las computadoras es el grupo conveniente más pequeño de trozo de almacenamiento. Por ejemplo, la mayoría de las computadoras no tienen instrucciones para mover un bit pero tienen una para mover un byte. Un término menos común es palabra, que es la unidad de datos nativa de una arquitectura de computadora determinada. Se hace una palabra de uno o más bytes. Por ejemplo, una computadora que tiene registros de 64 bits y el direccionamiento de memoria de 64 bits generalmente tiene palabras de 64 bits (8 bytes). Un ordenador ejecuta muchas operaciones en su tamaño depalabra nativo en lugar de un byte a la vez. 
El almacenamiento de la computadora, junto con la mayoría del rendimiento de la computadora, es generalmente medido y manipulado en bytes y colecciones de bytes. Un kilobyte o KB, es 1.024 bytes; un megabyte, o MB, es 1,0242 bytes; un gigabyte, o GB, es 1.0243 bytes; un terabyte, o TB, es 1,0244 bytes; y un petabyte, o PB, es 1,0245 bytes Los fabricantes de computadoras a menudo completan estos números y dicen que un megabyte es 1 millón de bytes y un gigabyte es 1 billón de bytes. Las medidas en Redes son una excepción a esta regla general; se dan en bits (porque las redes mueven los datos bit a bit).
Una EEPROM se puede cambiar pero no con frecuencia. Además, es de baja velocidad, por lo que contiene principalmente programas estáticos y datos que no se usan con frecuencia. Por ejemplo, el iPhone usa EEPROM para almacenar números de serie e información de hardware sobre el dispositivo.
Todas las formas de memoria proporcionan una matriz de bytes. Cada byte tiene su propia dirección. La interacción se logra a través de una secuencia de instrucciones de carga o almacenamiento a direcciones de memoria específicas. La instrucción de carga (load) mueve un byte o una palabra desde la memoria principal a un registro interno dentro de la CPU, mientras que la instrucción de almacenamiento (store) mueve el contenido de un registro a la memoria principal. Aparte de lo explícito de carga y almacenamiento, la CPU carga automáticamente las instrucciones de la memoria principal para ejecución desde la ubicación almacenada en el contador del programa. Un ciclo típico de instrucción-ejecución, tal como se ejecuta en un sistema con una arquitectura de Von Neumann, primero obtiene una instrucción de la memoria y almacena esa instrucción en el registro de instrucciones. La instrucción luego se decodifica y puede hacer que los operandos se extraigan de la memoria y se almacenen en algunos registros internos. Después de que se hayan ejecutado las instrucciones sobre los operandos, el resultado puede almacenarse nuevamente en la memoria. Observe que la unidad de memoria solo ve un flujo de direcciones de memoria. No sabe cómo se generan (por el contador de instrucciones, indexación, indirección, dirección efectiva u otro modo de direccionamiento) o para qué sirven (instrucciones o datos). En consecuencia, podemos ignorar cómo un programa genera una dirección de memoria. Solo nos interesa la secuencia de direcciones de memoria generadas por el programa en ejecución. 
Idealmente, queremos que los programas y los datos residan permanentemente en la memoria principal. Esta disposición generalmente no es posible en la mayoría de los sistemas por dos razones:
1. La memoria principal suele ser demasiado pequeña para almacenar todos los programas y datos necesarios permanentemente.
2. La memoria principal, como se mencionó, es volátil: pierde su contenido cuando se apaga o se pierde de otra manera.
Por lo tanto, la mayoría de los sistemas informáticos proporcionan almacenamiento secundario como una extensión de la memoria principal. El requisito principal para el almacenamiento secundario es que sea capaz de mantener grandes cantidades de datos de forma permanente. 
Los dispositivos de almacenamiento secundario más comunes son las unidades de disco duro (HDD) y dispositivos de memoria no volátil (NVM), que proporcionan almacenamiento para ambos: programas y datos. La mayoría de los programas (sistema y aplicación) se almacenan en almacenamiento secundario hasta que se cargan en la memoria. Muchos programas luego usan almacenamiento secundario como origen y destino de su procesamiento. El almacenamiento secundario también es mucho más lento que la memoria principal. Por lo tanto, lo apropiado de la gestión del almacenamiento secundario es de importancia central para un sistema informático, como discutimos en el Capítulo 11.
En un sentido más amplio, sin embargo, la estructura de almacenamiento que hemos descrito —Consistente en registros, memoria principal y almacenamiento secundario — es solo uno de muchos posibles diseños de sistemas de almacenamiento. Otros componentes posibles incluyen memoria caché, CD-ROM o blu-ray, cintas magnéticas, etc. Los que son lo suficientemente lentos y lo suficientemente grande como para que se usen solo para fines especiales —Para almacenar copias de seguridad del material almacenado en otros dispositivos, por ejemplo— se llaman almacenamiento terciario. Cada sistema de almacenamiento proporciona las funciones básicas para almacenar un dato y mantener ese dato hasta que se recupere más adelante. Las principales diferencias entre los diversos sistemas de almacenamiento radican en la velocidad, el tamaño y la volatilidad. 
La amplia variedad de sistemas de almacenamiento se puede organizar en una jerarquía (Figura 1.6) según capacidad de almacenamiento y tiempo de acceso. 
Como regla general, hay una compensación entre tamaño y velocidad, con una memoria más pequeña y más rápida más cercana a la CPU. Como se muestra en la figura, además de diferir en velocidad y capacidad, varios sistemas de almacenamiento son volátiles o no volátiles. Almacenamiento volátil, como el mencionado anteriormente, pierde su contenido cuando se corta la alimentación del dispositivo, por lo tanto, los datos deben escribirse en un almacenamiento no volátil para su custodia. Los cuatro niveles superiores de memoria en la figura se construyen usando semiconductores memoria, que consiste en circuitos electrónicos basados ​​en semiconductores. Los dispositivos NVM, en el cuarto nivel, tienen algunas variantes, pero en general son más rápidos. que los discos duros La forma más común de dispositivo NVM es la memoria flash, que es popular en dispositivos móviles como teléfonos inteligentes y tabletas. Cada vez más, la memoria flash se está utilizando para el almacenamiento a largo plazo en computadoras portátiles, computadoras de escritorio y servidores también. 
Dado que el almacenamiento juega un papel importante en la estructura del sistema operativo, nosotros nos referiremos a él con frecuencia en el texto. En general, usaremos lo siguiente terminología:
• El almacenamiento volátil se denominará simplemente memoria. Si necesitamos enfatizar un tipo particular de dispositivo de almacenamiento (por ejemplo, un registro), lo haremos explícitamente
• El almacenamiento no volátil retiene su contenido cuando se pierde energía. Será referido como NVS. La gran mayoría de las veces que nos referimos a NVS, lo hacemos por el almacenamiento secundario. Este tipo de almacenamiento se puede clasificar en dos tipos distintos:
◦ Mecánico. Algunos ejemplos de tales sistemas de almacenamiento son discos duros, discos ópticos, almacenamiento holográfico y cinta magnética. Si necesitamos enfatizar un tipo particular de dispositivo de almacenamiento mecánico (por ejemplo, magnético, cinta), lo haremos explícitamente.
◦ Eléctrico. Algunos ejemplos de tales sistemas de almacenamiento son la memoria flash, FRAM, NRAM y SSD. El almacenamiento eléctrico se denominará NVM. Si debemos enfatizar un tipo particular de dispositivo de almacenamiento eléctrico (para ejemplo, SSD), lo haremos explícitamente.
El almacenamiento mecánico es generalmente más grande y menos costoso por byte que el Almacenamiento eléctrico. Por el contrario, el almacenamiento eléctrico suele ser costoso, más pequeño, y más rápido que el almacenamiento mecánico.
El diseño de un sistema de almacenamiento completo debe equilibrar todos los factores discutidos: debe usar solo la memoria costosa que sea necesaria mientras que proporciona el mayor almacenamiento económico y no volátil posible. Los cachés pueden instalarse para mejorar el rendimiento donde haya una gran disparidad en el tiempo de acceso o La tasa de transferencia existe entre dos componentes.
1.2.3 Estructura de E/S
Una gran parte del código del sistema operativo está dedicado a la administración de E/S, tanto debido a su importancia para la fiabilidad y elrendimiento de un sistema y debido a la naturaleza variable de los dispositivos.
Recuerde desde el principio de esta sección que una computadora de uso general consta de múltiples dispositivos, todos los cuales intercambian datos a través de una vía común (el bus)
La forma de E/S manejada por interrupción descrita en la Sección 1.2.1 está bien para mover pequeñas cantidades de datos pero puede producir una sobrecarga elevada cuando se usa para movimiento de datos a granel como E/S NVS. Para resolver este problema, Se utiliza el acceso (DMA) a memoria directa. Después de configurar buffers, punteros y contadores para Dispositivo de E/S, el controlador del dispositivo transfiere un bloque completo de datos directamente a o desde el dispositivo y la memoria principal, sin intervención de la CPU. Solamente se genera una interrupción por bloque, para indicarle al controlador del dispositivo que la operación se ha completado, en lugar de la única interrupción por byte generado para baja velocidad dispositivos. Mientras el controlador del dispositivo realiza estas operaciones, la CPU está disponible para realizar otro trabajo.
Algunos sistemas de alta gama utilizan conmutadores en lugar de arquitectura de bus. En estos sistemas, múltiples componentes pueden comunicarse con otros componentes al mismo tiempo, en lugar de competir por ciclos en un bus compartido. En este caso, DMA es incluso más efectivo. La figura 1.7 muestra la interacción de todos los componentes de una computadora.
1.3 Arquitectura del sistema informático
En la Sección 1.2, presentamos la estructura general de un sistema informático típico. Un sistema informático puede organizarse de diferentes maneras, que podemos clasificar aproximadamente de acuerdo con el número de procesadores generales usados.
1.3.1 Sistemas de procesador único
Hace muchos años, la mayoría de los sistemas informáticos usaban un único procesador que contenía una CPU con un solo núcleo de procesamiento. El núcleo es el componente que ejecuta instrucciones y posee registros para almacenar datos localmente. La única CPU principal con su núcleo es capaz de ejecutar un conjunto de instrucciones de uso general, que incluye instrucciones de los procesos. Estos sistemas tienen otros procesadores de propósitos especiales también. Pueden venir en forma de procesadores específicos del dispositivo, como Controladores de disco, teclado y gráficos.
Todos estos procesadores de propósito especial ejecutan un conjunto de instrucciones limitado y no ejecuta procesos. A veces, son administrados por el sistema operativo, donde el sistema operativo les envía información sobre su próxima tarea y supervisa su estado. Por ejemplo, un microprocesador controlador de disco recibe una secuencia de solicitudes del núcleo principal de la CPU e implementa su propio Algoritmo de planificación de la cola de disco. Esta disposición alivia la CPU principal de la sobrecarga de la planificación del disco. Las PC contienen un microprocesador en el teclado para convertir las pulsaciones de teclas en códigos que se enviarán a la CPU. En otros sistemas o circunstancias, los procesadores especiales son componentes de bajo nivel integrados en el hardware. El sistema operativo no puede comunicarse con estos procesadores; hacen su trabajo de manera autónoma. El uso de microprocesadores especiales es común y no convierte un sistema de procesador único en un multiprocesador. Si solo hay una CPU de propósito general con un solo núcleo de procesamiento, entonces El sistema es un sistema de un solo procesador. De acuerdo con esta definición, sin embargo, Muy pocos sistemas informáticos contemporáneos son sistemas de un solo procesador.
1.3.2 Sistemas multiprocesador
En computadoras modernas, desde dispositivos móviles hasta servidores, los sistemas multiprocesador ahora dominan el panorama de la informática. Tradicionalmente, tales sistemas tienen dos (o más) procesadores, cada uno con una CPU de un solo núcleo. Los procesadores comparten el bus de la computadora y, a veces, el reloj, la memoria y los dispositivos periféricos. La ventaja principal de los sistemas multiprocesador es que se aumenta el rendimiento. Es decir, al aumentar el número de procesadores, esperamos obtener más trabajo realizado en menos tiempo. La relación de aceleración con N procesadores no es N, es menor que N. Cuando múltiples procesadores cooperan en una tarea, se incurre en una sobrecarga para mantener todas las piezas funcionando correctamente. Esta sobrecarga, más la disputa por los recursos compartidos, reduce la ganancia esperada de procesadores adicionales. Los sistemas multiprocesadores más comunes usan multiprocesamiento simétrico (SMP), en el que cada procesador de CPU realiza todas las tareas, incluidas las funciones del sistema operativo y procesos del usuario. La figura 1.8 ilustra una Arquitectura SMP típica con dos procesadores, cada uno con su propia CPU. 
Tenga en cuenta que cada procesador de la CPU tiene su propio conjunto de registros, así como una cache privada (o local). Sin embargo, todos los procesadores comparten memoria física a través del bus del sistema. 
El beneficio de este modelo es que muchos procesos pueden ejecutarse simultáneamente —N procesos pueden ejecutarse si hay N CPUs — sin causar deterioro del rendimiento significativamente. Sin embargo, dado que las CPU están separadas, una puede estar inactiva mientras otro está sobrecargada, lo que resulta en ineficiencias. Estas ineficiencias pueden evitarse si los procesadores comparten ciertas estructuras de datos. Un sistema multiprocesador de esta forma permitirá procesos y recursos, tales como la memoria, sean compartidas dinámicamente entre los diversos procesadores y puede reducir la variación de carga de trabajo entre los procesadores. Tal sistema debe ser diseñado cuidadosamente, como veremos en el Capítulo 5 y el Capítulo 6.
La definición de multiprocesador ha evolucionado con el tiempo y ahora incluye sistemas multinúcleo, en los que múltiples núcleos informáticos residen en un solo chip. Los sistemas multinúcleo pueden ser más eficientes que los chips múltiples con núcleos únicos porque la comunicación en chip es más rápida que la comunicación entre chips.
Además, un chip con múltiples núcleos usa significativamente menos energía que múltiples chips de un solo núcleo, lo cual es un problema importante para dispositivos móviles, así como computadoras portátiles
En la Figura 1.9, mostramos un diseño de doble núcleo con dos núcleos en el mismo chip del procesador. En este diseño, cada núcleo tiene su propio conjunto de registros, así como su propio caché local, a menudo conocido como caché de nivel 1 o L1. Observe también que un nivel 2 (L2), el caché es local para el chip pero es compartido por los dos núcleos de procesamiento. La mayoría de las arquitecturas adopta este enfoque, combinando cachés locales y compartidos, donde local, son los cachés de nivel inferior y son generalmente más pequeños y más rápidos que las cachés compartidas de nivel superior. Aparte de consideraciones arquitectónicas, como caché, memoria y contienda de bus, un procesador multinúcleo con N núcleos aparecen para el sistema operativo como N CPUs estándar.
DEFINICIONES DE COMPONENTES DEL SISTEMA INFORMÁTICO
• CPU: el hardware que ejecuta las instrucciones.
• Procesador: chip físico que contiene una o más CPU.
• Core: la unidad de cálculo básica de la CPU.
• Multinúcleo: incluye múltiples núcleos informáticos en la misma CPU.
• Multiprocesador: incluye múltiples procesadores.
Aunque prácticamente todos los sistemas ahora son multinúcleo, utilizamos el término general CPU cuando se refiere a una sola unidad computacional de un sistema informático y núcleo o core y multinúcleo o multi-core cuando se refiere específicamente a uno o más núcleos en una CPU.
TARJETA MADRE DE PC (Motherboard)
Considere la placa base de la PC de escritorio con un zócalo de procesador que se muestra a continuación:
Esta placa es una computadora plena, una vez que se llenan sus ranuras.Consiste en un zócalo del procesador que contiene una CPU, zócalos DRAM, ranuras de bus PCIe y conectores de E/S de varios tipos. Incluso el sistema de propósito general de menor costo, tiene una CPU que contiene múltiples núcleos. Algunas placas base contienen múltiples zócalos de procesador. Las computadoras más avanzadas permiten más de una placa de sistema, creando sistemas NUMA. servidor. En la agrupación simétrica, dos o más hosts ejecutan aplicaciones
Esta característica ejerce presión sobre los diseñadores de sistema operativo, y programadores de aplicaciones, para hacer un uso eficiente de estos núcleos de procesamiento, un problema que abordamos en el Capítulo 4. Prácticamente todos los sistemas operativos modernos, incluidos Windows, macOS y Linux, así como Android e iOS sistemas móviles: admiten sistemas SMP multinúcleo. Agregar CPU adicionales a un sistema multiprocesador aumentará el poder de la computación; sin embargo, como se sugirió anteriormente, el concepto no escala muy bien, y una vez que agregamos demasiadas CPU, la contención por el bus del sistema se convierte en un cuello de botella y el rendimiento comienzan a degradarse. Un enfoque alternativo es en lugar de proporcionar a cada CPU (o grupo de CPU) su propia memoria local al que se accede a través de un pequeño y rápido bus local, las CPU están conectadas por una interconexión del sistema, para que todas las CPU compartan un espacio de direcciones físicas. Esto se ilustra en el enfoque, conocido como acceso no uniforme a la memoria o NUMA en la figura 1.10. La ventaja es que, cuando una CPU accede a su memoria local, no solo es rápido, sino que tampoco existe contención sobre la interconexión del sistema. Por lo tanto, los sistemas NUMA pueden escalar de manera más efectiva a medida que se agregan más procesadores.
El inconveniente potencial con un sistema NUMA es una mayor latencia cuando una CPU debe acceder a la memoria remota a través de la interconexión del sistema, creando una posible penalización de rendimiento. En otras palabras, por ejemplo, CPU0 no puede acceder a la memoria local de CPU3, tan rápido como puede acceder a su propia memoria local, disminuyendo la velocidad de acceso. Los sistemas operativos pueden minimizar esta penalización NUMA a través de planificación cuidadosa de la CPU y gestión de la memoria, como se discute en la Sección 5.5.2 y la Sección 10.5.4. Porque los sistemas NUMA pueden escalar para acomodar una gran número de procesadores, se están volviendo cada vez más populares en los servidores a medida que así como en los sistemas informáticos de alto rendimiento.
Finalmente, los servidores Blade son sistemas en los que múltiples placas de procesador, placas de E/S y placas de red se colocan en el mismo chasis. La diferencia entre estos y los sistemas multiprocesadores tradicionales es que cada placa madre de procesador blade, “bootea” o arranca de forma independiente y ejecuta su propio sistema operativo. Algunos placas de servidor Blade también son multiprocesador, lo que esfuma (diluye) las líneas entre los tipos de computadoras. En esencia, estos servidores consisten en múltiples sistemas multiprocesador independientes
1.3.3 Sistemas agrupados (Clusters)
Otro tipo de sistema multiprocesador es un sistema agrupado, que reúne múltiples CPU. Los sistemas agrupados difieren de los sistemas multiprocesador descritos en la Sección 1.3.2 en que están compuestos de dos o más sistemas individuales, o nodos, unidos entre sí; cada nodo es típicamente un sistema multinúcleo. Tales sistemas se consideran débilmente acoplados. Debemos tener en cuenta que la definición de agrupamiento no es concreta; muchos sistemas comerciales y de código abierto luchan para definir qué es un sistema agrupado y por qué una forma es mejor que otra. La definición generalmente aceptada es que un sistema agrupado (cluster), las computadoras comparten almacenamiento y están estrechamente vinculadas a través de una red LAN de área local (como se describe en el Capítulo 19) o una interconexión más rápida, como InfiniBand. 
La agrupación en clúster se usa generalmente para proporcionar un servicio de alta disponibilidad, es decir, un servicio que continuará incluso si uno o más sistemas en el clúster fallan. En general, obtenemos una alta disponibilidad al agregar un nivel de redundancia en sistema. Se ejecuta una capa de software de clúster en los nodos del clúster. Cada nodo puede supervisar uno o más de los otros (a través de la red). Si la máquina monitoreada falla, la máquina de monitoreo puede tomar posesión de su almacenamiento y reiniciar las aplicaciones que se estaban ejecutando en la máquina fallida. Los usuarios y clientes de las aplicaciones solo ven una breve interrupción del servicio. 
La alta disponibilidad proporciona una mayor fiabilidad, que es crucial en muchas aplicaciones. La capacidad de continuar brindando un servicio proporcional al nivel de hardware sobreviviente se llama degradación elegante. Algunos sistemas van más allá degradación elegante y se llaman tolerantes a fallas, porque pueden sufrir una falla de cualquier componente individual y aún continúa la operación. Tolerancia a fallos requiere un mecanismo para permitir que la falla sea detectada, diagnosticada y, si posible, corregida.
La agrupación se puede estructurar de forma asimétrica o simétrica. En agrupación asimétrica, una máquina está en modo de espera activa mientras la otra está ejecutando las aplicaciones. La máquina host de reserva activa no hace más que monitorear el servidor activo. Si ese servidor falla, el host de reserva activa se convierte en servidor activo. En los clusters simétricos, dos o más servidores ejecutan aplicaciones y se monitorean el uno al otro. Esta estructura es obviamente más eficiente, ya que usa todo el hardware disponible. Sin embargo, requiere que más de una aplicación esté disponible para ejecutarse.
Dado que un clúster consta de varios sistemas informáticos conectados a través de una red, los clústeres también se pueden usar para proporcionar entornos informáticos de alto rendimiento. Tales sistemas pueden suministrar una potencia computacional significativamente mayor que los sistemas de un solo procesador o incluso SMP porque pueden ejecutar una aplicación simultáneamente en todas las computadoras del clúster. La aplicación debe haber sido escrito específicamente para aprovechar el clúster, sin embargo. Esto implica una técnica conocida como paralelización, que divide un programa en componentes que se ejecutan en paralelo en núcleos individuales en una computadora o computadoras en grupo Por lo general, estas aplicaciones están diseñadas para que una vez cada nodo de computación en el clúster resuelva una parte del problema, los resultados de todos los nodos se combinan en una solución final.
Otras formas de agrupaciones incluyen agrupaciones paralelas y agrupaciones sobre una red de área amplia (WAN) (como se describe en el Capítulo 19). Los grupos paralelos permiten múltiples hosts para acceder a los mismos datos en el almacenamiento compartido. Porque la mayoría de los sistemas operativos carecen de soporte para el acceso simultáneo a datos por múltiples hosts, los clústeres paralelos generalmente requieren el uso de versiones especiales de software y lanzamientos especiales de aplicaciones. Por ejemplo, Oracle Real Application Cluster es una versión de la base de datos de Oracle diseñada para ejecutarse en paralelo (en un cluster). Cada máquina ejecuta Oracle, y una capa de software rastrea el acceso a disco compartido. Cada máquina tiene acceso completo a todos los datos en la base de datos. Para proveer este acceso compartido, el sistema también debe suministrar control de acceso y bloqueo y asegurarse de que no ocurran operaciones en conflicto. Esta función, comúnmente conocida como administrador de bloqueo distribuido (DLM), se incluye en algunas tecnologías de clúster. 
La tecnología de clúster está cambiando rápidamente. Algunos productos de clúster son compatibles

Continuar navegando

Materiales relacionados