Conceptos Básicos de Sistemas Operativos

En este apartado se presentan una serie de conceptos generales sobre sistemas operativos. No se pretende realizar una presentación exhaustiva de los mismos, puesto que este tipo de información se puede encontrar en cualquier libro general de la materia. El objetivo es recordar algunos conceptos básicos que permitan abordar los distintos problemas planteados a lo largo del libro.

En primer lugar, se definen las funciones del sistema operativo para, a continuación, pasar a describir los componentes básicos del mismo, así como los diversos tipos de organización que presenta. Por último, se explica cómo se produce la activación del sistema operativo y, concretamente, cómo se lleva a cabo una llamada al sistema.

1.1.1 Funciones del Sistema Operativo

Un sistema operativo (SO) es un programa que tiene encomendadas una serie de funciones diferentes cuyo objetivo es simplificar el manejo y la utilización de la computadora, haciéndola segura y eficiente. Las funciones clásicas del sistema operativo se pueden agrupar en las tres categorías siguientes:

  • Gestión de los recursos de la computadora.
  • Ejecución de servicios para los programas.
  • Ejecución de los mandatos de los usuarios.

Con respecto a su faceta de gestor de recursos, hay que tener en cuenta que en una computadora actual suelen coexistir varios programas, del mismo o de varios usuarios, ejecutándose simultáneamente. Estos programas compiten por los recursos de la computadora, siendo el sistema operativo el encargado de arbitrar su asignación y uso. Como complemento a la gestión de recursos, el sistema operativo ha de garantizar la protección de unos programas frente a otros y ha de suministrar información sobre el uso que se hace de los recursos.

Por lo que se refiere al sistema operativo como máquina extendida, este ofrece a los programas un conjunto de servicios o llamadas al sistema que pueden solicitar cuando lo necesiten. Los servicios se pueden agrupar en las cuatro clases siguientes: ejecución de programas, operaciones de E/S, operaciones sobre archivos y detección y tratamiento de errores.

Por último, el sistema operativo también es un elemento que proporciona la interfaz de usuario del sistema. El módulo del sistema operativo que permite que los usuarios dialoguen de forma interactiva con el sistema es el intérprete de mandatos o shell.

1.1.2 Componentes del Sistema Operativo

Como se muestra en la figura 1.1, se suele considerar que un sistema operativo está formado por tres capas: el núcleo (kernel), los servicios y el intérprete de mandatos o shell.

El núcleo es la parte del sistema operativo que interacciona directamente con el hardware de la máquina. Las funciones del núcleo se centran en la gestión de recursos, como es el procesador, tratamiento de interrupciones y las funciones básicas de manipulación de memoria.

Figura 1.1. Componentes del sistema operativo.

Los servicios se suelen agrupar según su funcionalidad en varios componentes, cada uno de los cuales se ocupa de las siguientes funciones:

  • Gestión de procesos: encargada de la creación, planificación y destrucción de procesos.
  • Gestión de memoria: componente encargado de saber qué partes de memoria están libres y cuáles ocupadas, así como de la asignación y liberación de memoria según la necesiten los procesos.
  • Gestión de las E/S: se ocupa de facilitar el manejo de los dispositivos periféricos.
  • Gestión de archivos y directorios: se encarga de ofrecer mecanismos para que los procesos puedan comunicarse y sincronizarse.
  • Seguridad y protección: este componente debe encargarse de garantizar la identidad de los usuarios y de definir lo que puede hacer cada uno de ellos con los recursos del sistema.

Por lo que se refiere a la interfaz de usuario, el sistema operativo puede incluir varios intérpretes de mandatos, unos textuales y otros gráficos.

1.1.3 Estructura del Sistema Operativo

Un sistema operativo es un programa grande y complejo que está compuesto por una serie de componentes con funciones bien definidas. Cada sistema operativo estructura estos componentes de distinta forma:

  • Sistemas Operativos monolíticos: Un sistema de este tipo no tiene una estructura clara y bien definida. Todos sus componentes se encuentran integrados en un único programa que ejecuta un único espacio de direcciones. Todas las funciones se ejecutan en modo núcleo.
  • Sistemas por capas: Se organiza como una jerarquía de capas, donde cada una ofrece una interfaz clara a la capa superior y utiliza los servicios de la capa inferior. Su principal ventaja es la modularidad y la ocultación de información.
  • Modelo Cliente-Servidor: Consiste en implementar la mayor parte de los servicios en modo usuario. La parte mínima que se ejecuta en modo núcleo se denomina micronúcleo y a los procesos que ejecutan el resto de las funciones se les denomina servidores. Ofrece gran flexibilidad, aunque presenta una mayor sobrecarga en comparación con los sistemas monolíticos.

1.1.4 Activación del Sistema Operativo

El sistema operativo es un servidor que está a la espera de que se le encargue trabajo. El trabajo del sistema operativo puede provenir de las siguientes fuentes:

  • Llamadas al sistema emitidas por los programas.
  • Interrupciones producidas por los periféricos.
  • Condiciones de excepción o error del hardware.

Cuando un proceso en ejecución desea un servicio del sistema operativo, debe utilizar una instrucción TRAP, que genera la pertinente interrupción. En los demás casos, será una interrupción interna (excepción) o externa (E/S) la que reclame la atención del sistema.

En lenguajes de alto nivel como C, la solicitud de un servicio se hace mediante una llamada a una función (por ejemplo, fork()). Estas funciones de biblioteca se componen de:

  1. Una parte inicial que prepara los parámetros.
  2. La instrucción TRAP que realiza el paso al modo núcleo.
  3. Una parte final que recoge los resultados para devolverlos al programa.

La figura 1.2 muestra los pasos involucrados en una llamada al sistema operativo.

Figura 1.2. Pasos de la llamada al sistema operativo.

1.2 Ejercicios Resueltos

Ejercicio 1.1

¿Cuáles son las principales funciones de un sistema operativo?

Solución

El sistema operativo facilita el uso de la computadora mediante tres funciones principales:

  • Gestión de los recursos del sistema: Administra el hardware (procesador, memoria, periféricos), asegura la protección entre programas y lleva la contabilidad del consumo de recursos.
  • Ejecución de servicios para programas: Proporciona una capa de abstracción para lanzar programas, gestionar E/S, manipular archivos y tratar errores de hardware.
  • Ejecución de mandatos de los usuarios: A través de shells (textuales o gráficas), permite la interacción directa con el sistema.

Ejercicio 1.2

¿Qué diferencia existe entre un mandato y una llamada al sistema?

Solución

Una llamada al sistema es un servicio que el SO ofrece a un programa (interfaz de programación), mientras que un mandato es un programa de usuario que utiliza esas llamadas para dar servicios de alto nivel solicitados interactivamente a través de una shell.

Ejercicio 1.3

¿Qué tipo de diseño tiene el sistema operativo LINUX?

  • De máquinas virtuales.
  • Monolítico.
  • Jerárquico (por capas).
  • Cliente-Servidor.
Solución

El sistema operativo LINUX tiene un diseño monolítico. Todo su núcleo está generado como un único proceso y dentro del mismo se puede acceder a cualquier parte mediante una llamada a función, sin una estructura de capas estrictamente definida en su ejecución interna.

Figura 1.4. Estructura de un sistema operativo monolítico.

Ejercicio 1.4

¿Qué caracteriza más a un Sistema Operativo?

  • El intérprete de mandatos.
  • Las llamadas al sistema.
  • Los mandatos.
  • Sus bibliotecas de programación.
Solución

La respuesta correcta es la B. Lo que más caracteriza a un SO son sus llamadas al sistema, ya que proporcionan la visión externa y funcional del mismo. Los mandatos e intérpretes son programas que se apoyan en estas llamadas.

Ejercicio 1.5

¿Cuál de las siguientes técnicas hardware tiene mayor influencia en la construcción de un sistema operativo?

  • Microprogramación del procesador.
  • Caché de la memoria principal.
  • DMA.
  • RISC.
Solución

La respuesta correcta es DMA (c). El Acceso Directo a Memoria permite que los periféricos transfieran datos a la memoria principal sin intervención constante de la CPU, facilitando enormemente la multiprogramación y el aprovechamiento del procesador.

Ejercicio 1.6

Definir los términos visión externa e interna de un SO. ¿Cuál de las dos determina mejor un SO concreto? ¿Por qué?

Solución

La visión interna es la estructura (monolítica, capas, etc.), mientras que la visión externa es el conjunto de servicios e interfaz ofrecida al usuario. La visión interna determina mejor al SO porque define cómo gestiona realmente los procesos, la memoria y los recursos. Por ejemplo, UNIX y Windows se diferencian principalmente por su arquitectura interna.

Ejercicio 1.7

¿El intérprete de mandatos de UNIX es interno o externo? Razone su respuesta con un ejemplo.

Solución

Los intérpretes de mandatos en UNIX son externos y se denominan shells. Sin embargo, algunos mandatos específicos se implementan como internos por eficiencia o necesidad técnica. En contraste, en MS-DOS el intérprete suele ser interno.

Figura 1.5. API del sistema operativo e intérprete de mandatos.

Ejercicio 1.8

¿Cuántas instrucciones de la siguiente lista deben ejecutarse exclusivamente en modo núcleo?

  • Inhibir todas las interrupciones.
  • Escribir en los registros de control de un controlador de DMA.
  • Leer el estado de un controlador de periférico.
  • Escribir en el reloj de la computadora.
  • Provocar un trap o interrupción software.
  • Escribir en los registros de la MMU.
Solución

Cinco de ellas deben ejecutarse en modo núcleo (inhibir interrupciones, escribir en DMA, leer estado de periférico, escribir en el reloj y escribir en la MMU) para garantizar la seguridad y el control del sistema. Provocar un trap se ejecuta en modo usuario para solicitar el paso al modo núcleo.

Ejercicio 1.9

¿Cuál de las siguientes combinaciones no es factible?

  • Spooling en un sistema monousuario.
  • Procesamiento por lotes con multiprogramación.
  • Tiempo compartido sin multiprogramación.
  • Multiprogramación en un sistema monousuario.
Solución

La respuesta correcta es la C. Un sistema de tiempo compartido requiere necesariamente multiprogramación para poder repartir el tiempo de CPU entre los distintos usuarios y procesos activos.

Ejercicio 1.10

¿Cuál de los siguientes mecanismos hardware no es un requisito para construir un SO multiprogramado con protección entre usuarios?

  • Memoria virtual.
  • Protección de memoria.
  • Instrucciones de E/S en modo núcleo.
  • Dos modos de operación: núcleo y usuario.
Solución

La respuesta es Memoria virtual. Aunque es muy útil, no es estrictamente necesaria para la multiprogramación básica, mientras que la protección de memoria y los modos de operación son imprescindibles para la seguridad entre usuarios.

Ejercicio 1.11

¿Dónde es más compleja una llamada al sistema, en un sistema operativo monolítico o en uno por capas? ¿Cuál es más difícil de modificar?

Solución

Es más compleja en un sistema por capas debido a que la solicitud debe atravesar múltiples interfaces. Sin embargo, el sistema monolítico es mucho más difícil de modificar, ya que cualquier cambio en su código global puede afectar a múltiples funciones interconectadas sin una estructura clara.

Ejercicio 1.12

¿Cómo se solicita una llamada al SO?

Solución

Se solicita mediante un mecanismo de interrupciones. El proceso utiliza una instrucción TRAP que activa una rutina de tratamiento en el SO, la cual consulta una tabla interna para ejecutar el servicio correspondiente.

Figura 1.6. Realización de una llamada al sistema.

Ejercicio 1.14

¿Qué es falso acerca de una llamada al sistema?

  • Se implementa con un trap.
  • Su interfaz se ofrece como una rutina de biblioteca.
  • Produce un cambio a modo supervisor.
  • Produce siempre un cambio de contexto.
Solución

La respuesta D es falsa. Una llamada al sistema no siempre produce un cambio de contexto; solo ocurre si la llamada es bloqueante o si el planificador decide otorgar el turno a otro proceso.

Ejercicio 1.15

¿Qué contiene una entrada de la tabla de vectores de interrupción?

Solución

Contiene la dirección de la rutina de tratamiento de esa interrupción (Respuesta B). La posición en la tabla se corresponde con el número de la interrupción detectada.

Ejercicio 1.17

¿Qué es mejor para un sistema con varios terminales?

Solución

Un sistema multiusuario (D). Estos sistemas están diseñados específicamente para gestionar múltiples terminales mediante planificadores de tiempo compartido (rodajas de tiempo) y gestión eficiente de interrupciones.

Ejercicio 1.18

¿Qué código se ejecuta con las interrupciones inhibidas?

Solución

Solo ciertas partes críticas del sistema operativo (C), como el tratamiento inicial de una interrupción o el cambio de contexto, para evitar inconsistencias en el estado del sistema.

Ejercicio 1.25

¿Qué ventajas tiene escribir un SO utilizando un lenguaje de alto nivel?

Solución

La principal ventaja es la portabilidad, permitiendo que el SO se ejecute en diferentes arquitecturas con cambios mínimos. También facilita el mantenimiento, la depuración y la creación de nuevos módulos de forma eficiente.