Este libro busca brindar a estudiantes y docentes de las carreras de ingeniería en computación, informática, Ciencias de la Computación y similares un material completo, general y autocontenido sobre la materia de sistemas operativos. No se asume conocimiento previo sobre la temática, aunque se utilizarán conceptos de estructuras de datos y algoritmos básicos.
Actualmente hay vasta bibliografía sobre sistemas operativos, sin embargo la gran mayoría está escrita en inglés, y cuando están disponibles en castellano, su traducción deja mucho que desear, llevando a conceptos confusos y difíciles de comprender. La intención de los autores es que el presente texto provea un material redactado originalmente en castellano, revisado por docentes latinoamericanos utilizando la terminología más adecuada para los alumnos de la región y eliminando muchos de los errores de traducción.
Generalmente el material de cursos de sistemas operativos está compuesto por partes de distintos libros, artículos de investigación, recursos en línea, software, ejercitación, etc. Por ello, el alumno debe recurrir a distintas fuentes durante el curso. El presente libro pretende ser de utilidad tanto para alumnos como para docentes como una única publicación autocontenida. Cabe remarcar también que el material bibliográfico generalmente está protegido por derecho de autor, es costoso y en muchos casos de difícil acceso (sobre todo las publicaciones en inglés).
Los contenidos de la bibliografía clásica de sistemas operativos están basadas en re-ediciones y compendio de libros de hace varias décadas que incluyen temas obsoletos o desactualizados. Hay también desarrollos y tendencias nuevas en el área que aún no han sido integradas en la bibliografía clásica, y mucho menos a las traducciones. También se quiere revisar y actualizar los conceptos clásicos de sistemas operativos inlcuyendo material de publicación reciente.
Este libro se desarrolló dentro del marco del Proyecto LATIn \parencite{ProyectoLatin}, enfocado a la creación de libros de texto con un esquema de licenciamiento libre, derivados de la creación y colaboración de grupos de trabajo multinacionales, para la región latinoamericana.
Este libro está apuntado tanto a estudiantes de carreras de informática, computación e ingenierías como a los aficionados de la computadora interesados en conocer un poco más de lo que realmente ocurre dentro de un sistema de cómputo y el papel que cumple el sistema operativo.
Al finalizar el libro se espera que el lector haya adquirido conocimientos y habilidades como:
- Administrar, diseñar y desarrollar un sistema operativo.
- Conociendo el funcionamiento general de los sistemas operativos, poder sacar mejor provecho de la computadora
- Conocer y saber aprovechar no sólo los sistemas, sino las metodologías y principales formas de interacción del software libre
Se asume también que el lector está familiarizado con algún lenguaje de programación de alto nivel, y –al menos en un nivel básico– con C. Aunque los ejemplos de código están dados en diversos lenguajes de programación (Bash, Perl, c, PascalFC, Python, Ruby, Ensamblador, entre otros), éstos son tan sencillos que pueden ser fácilmente escritos en el lenguaje de elección del lector sin mayor esfuerzo.
Resultará muy conveniente tener acceso a una computadora con sistema operativo Linux (gnu) u otro Unix libre.
El texto comprende los siguientes capítulos:
- 1. Punto de partida.
- Para comenzar a hablar de sistemas
operativos, es necesario, en primer término, enmarcar qué es un
sistema operativo y cuáles son sus funciones principales. También
es importante detallar algunos puntos que, contrario a la
percepción común, no pueden considerarse parte de sus
funciones.
Este tema se presenta apoyado en la evolución histórica del cómputo, haciendo énfasis en por qué este proceso evolutivo en particular desembocó en los sistemas operativos que se tienen hoy en día.
- 2. Relación con el hardware.
- Partiendo de que una de las
principales tareas del sistema operativo es presentar una
abstracción regular del hardware a los procesos que se
ejecuten, resulta importante presentar cómo éste está
estructurado, y cómo el sistema operativo puede comunicarse con
él.
Este capítulo aborda la jerarquía de almacenamiento, el mecanismo de interrupciones y excepciones y el papel que desempeñan para las llamadas al sistema, las características base de diversos tipos de dispositivo del sistema, el concepto de canales (o buses) de comunicación, el mecanismo de acceso directo a memoria, y una introducción a un tema que puede ser visto como eje conductor a lo largo de todo el libro: La importancia y complejidad de la concurrencia, y su relación con el paralelismo y multiprocesamiento.
- 3. Administración de procesos.
- La entidad principal con la que
interactúa un sistema operativo (ya sea para brindarle servicios o
para imponerle restricciones) es el proceso. Este capítulo inicia
presentando los diferentes estados de los procesos y la relación
entre éstos y sus hermanos menores (los hilos), y los
principales modelos empleados para el multiprocesamiento.
Todos los sistemas operativos modernos tienen que enfrentar a la concurrencia: la incertidumbre del ordenamiento en el tiempo entre eventos relativos a los diferentes procesos e hilos. La parte medular de este capítulo presenta a las primitivas de sincronización: mutexes, semáforos y monitores. Para ilustrarlas, se emplean los patrones y problemas clásicos que se han seguido a lo largo de su desarrollo histórico.
Pero las primitivas pueden solamente utilizarse entre procesos que cooperan deliberadamente entre sí. Un sistema operativo debe instrumentar protección y separación, incluso entre procesos que compiten o que sencillamente no saben el uno acerca del otro. Por ello, la última sección de este capítulo aborda los diferentes mecanismos que hay para evitar las situaciones de bloqueo mutuo.
- 4. Planificación de procesos.
- Para que varios procesos coexistan
en un sistema de cómputo, el primer recurso que el sistema
operativo debe multiplexar o repartir entre todos ellos es el tiempo de
cómputo: el uso del procesador. Este capítulo presenta los
diferentes niveles de planificador que forman parte de un
sistema operativo, y analiza al planificador a corto plazo
(también conocido como despachador). Se presentan los
principales algoritmos, y se ilustra cómo los sistemas operativos
modernos van empleando técnicas mixtas de varios de ellos.
Por último, se abordan tres temas brevemente: los diferentes modelos de planificación de hilos y su relación con los procesos, las particularidades de la planificación en un entorno con multiprocesadores reales, y las necesidades de planificación de tiempo real.
- 5. Administración de memoria.
- Los programas sólo se vuelven
procesos cuando se les asigna memoria y tiempo de cómputo: cuando dejan de ser el
resultado de una compilación guardada estáticamente para
convertirse en una entidad dinámica. Este capítulo presenta, en
primer lugar, la visión desde dentro de la memoria por parte de
cada uno de los procesos: el espacio de direccionamiento y el
acomodo clásico de las regiones de un proceso en la memoria que
le es asignada.
Para que los distintos procesos compartan la memoria del sistema, vemos que a lo largo de la historia se han presentado diferentes esquemas. Se explican someramente los esquemas de partición contigua fija y variable, para profundizar posteriormente en los que ofrecen mayor flexibilidad al sistema operativo y se mantienen en uso al día de hoy: la segmentación y la paginación. De esta última, se continúa para presentar la abstracción que ha liberado a los sistemas operativos para sobrecomprometer la memoria de forma eficiente y prácticamente transparente: la memoria virtual.
Al manejar la memoria de un proceso surgen puntos importantes a tomar en cuenta en lo relativo a la seguridad en cómputo; la parte final de este capítulo presenta la vulnerabilidad conocida como desbordamiento de buffer (buffer overflow), y algunas estrategias de mitigación que se han implementado con el paso de los años para mitigar su peligrosidad.
- 6. Organización de archivos.
- De cara al usuario, probablemente la
principal abstracción llevada a cabo por el sistema operativo es la
organización de la información sobre un medio persistente. Hoy en
día, la norma es que esta organización se realice en archivos
estructurados sobre una estructura jerárquica llamada
directorio. Este capítulo se centra en explicar esta
abstracción, sin entrar aún en detalles respecto a cómo se llega
a un respaldo físico de la misma.
Estos conceptos parecen tan omnipresentes y universales que podría pensarse que no requieren mayor análisis. Sin embargo, resulta importante abordar las diferencias semánticas derivadas del desarrollo histórico de distintos sistemas. En este capítulo se presentan varios conceptos cuya instrumentación en un medio que asegure la persistencia se describirá en el siguiente capítulo.
Por último, se incluye un breve repaso de distintos tipos de sistemas de archivos en red, enfatizando nuevamente en los cambios semánticos derivados de la distinta historia de cada instrumentación.
- 7. Sistemas de archivos.
- Este capítulo presenta la contraparte
obligada del anterior: ¿cómo se estructuran los dispositivos de
almacenamiento a largo plazo, a los cuales se hace referencia
genéricamente como discos, cómo se van plasmando las
estructuras mediante las cuales el usuario organiza la
información en bloques dentro de un dispositivo, qué problemas
pueden derivar del uso de estos sistemas de archivos, y qué
métodos para evitarlos o resolverlos se han implementado?
Este capítulo basa sus ejemplos en un sistema de archivos bastante viejo y simple, pero aún en muy amplio uso en el cómputo moderno: la familia fat.
Los siguientes temas resultan muy importantes para la comprensión y para el desarrollo futuro de la materia, pero dado que son empleados por el sistema operativo (y no necesariamente son parte integral del mismo), se presentan como apéndices
- A. Software libre y licenciamiento.
- Estudiar sistemas operativos
cruza necesariamente la temática del software libre. Uno de los
principios fundamentales del desarrollo histórico es la libertad
de aprender, esto es, todo software que se diga libre debe
permitir a sus usuarios comprender sus estructuras básicas, la
relación entre ellas, y la lógica general de su programación.
Hoy en día hay una gran cantidad de sistemas operativos libres, tanto de propósito general como enfocados a un nicho. El movimiento ideológico del software libre, contrario a cualquier pronóstico que pudiera haberse hecho al iniciarse en 1984, claramente ha cambiado el desarrollo del cómputo. Todos los sistemas operativos que pueden ser estudiados de primera mano, constatando la instrumentación de sus principios son necesariamente (aunque con una definición ligeramente laxa) software libre.
Hacia el año 2000 se fue haciendo claro que estas ideas no pueden aplicarse únicamente al software. Poco a poco fue definiéndose una noción mucho más amplia, la de los bienes culturales libres. El presente libro busca brindar una contribución a esta última categoría.
El primer apéndice aborda brevemente estos temas, así como los principales modelos de licenciamiento libre utilizados.
- B. Virtualización.
- La virtualización es una herramienta muy útil,
y está cada vez más al alcance de todos, para el aprendizaje de los
sistemas operativos. Hay una gran cantidad de recursos para
comprender desde los primeros momentos del arranque de la
computadora. Empleando imágenes de máquinas virtuales, pueden
comprenderse y desmenuzarse los distintos elementos del sistema
operativo, e incluso observar el resultado de realizar
modificaciones sobre un sistema operativo real. Es, por tanto,
una herramienta muy importante para acompañar al aprendizaje de
esta materia.
La virtualización es también una tecnología que permea cada vez más aspectos del uso profesional del cómputo, y comprenderlo ayudará al lector a elegir las herramientas específicas a emplear.
Pero hablar de la virtualización como un todo ignoraría aspectos fundamentales de la riqueza que presenta este campo. Al igual que con los conceptos presentados a lo largo del libro, la virtualización es presentada a partir de su perspectiva histórica, y detallando hacia las distintas modalidades que se han desarrollado con el paso del tiempo.
- C. El medio físico y el almacenamiento.
- En el capítulo \ref{FS} se
presenta cómo se concretiza la abstracción de archivos y
directorios para plasmarlo en un gran arreglo lineal de datos, en
una entidad aún abstracta a la cual se sigue haciendo referencia
con el nombre genérico de disco. Este apéndice se ocupa de los
detalles físicos del acomodo de la información en su medio.
Pero un disco va mucho más allá de un dispositivo que simplemente vuelca dicho arreglo a un medio persistente. En primer término, los discos magnéticos rotativos (el medio dominante de almacenamiento) presentan peculiaridades que los sistemas operativos tuvieron que saber resolver. El desarrollo de la tecnología, sin embargo, fue arrebatando estas áreas del ámbito del sistema operativo, entregándolas a la optimización realizada dentro del hardware controlador.
Por otro lado, la tecnología de almacenamiento en estado sólido ha llegado a niveles de madurez que en determinados mercados ya la colocan claramente por encima de los discos magnéticos. Esto implica cambios importantes para el modo en que el sistema operativo debe estructurar y modificar la información.
Por último, un volumen ya no necesariamente se refiere a un único medio físico. Este apéndice aborda tanto a raid, el primer mecanismo que se popularizó para agregar varias unidades para mejorar, tanto la capacidad máxima y la confiabilidad de un volumen, como al manejo avanzado de volúmenes, en que el sistema operativo incorpora la lógica de raid con la del manejo de sistemas de archivos para lograr mucho mayor flexibilidad.
Este libro fue desarrollado como parte del Proyecto LATIn \parencite{ProyectoLatin}, que busca la creación de libros de texto libres para nivel universitario, y enfocado a Latinoamérica.
Cualquier parte de este libro puede ser reproducido y utilizado para todo fin, bajo los términos de la licencia Creative Commons-Atribución-CompartirIgual (CC-BY-SA) versión 4.0 \parencite{CCBYSA}.
Este modelo de licenciamiento se presenta y explica en la sección \ref{SL_CC}.