El concepto de sistema operativo es uno de los más importantes en informática. Nos pasamos el día utilizando sistemas operativos, ya sea en nuestro ordenador, móvil, televisión o incluso nuestra tarjeta de crédito. Por eso, en este artículo queremos dar un repaso al concepto de sistema operativo y explicar algunos de los fundamentos básicos sobre los que se construyen. Será un artículo denso, pero a la vez va a ser imposible tocar muchos temas que también son muy importantes. Esperamos que, al menos, nuestra selección os resulte didáctica.
Índice de contenidos
En este artículo, usaremos como bibliografía el libro Sistemas operativos modernos de Andrew S. Tanenbaum, uno de los autores de referencia a nivel mundial en esta materia, y creador del sistema operativo Unix-like Minix. Ten en cuenta que lo abordaremos de una manera básica, así que para un conocimiento muy profundo sobre este tema lo mejor que puedes hacer es leer el libro 😉
Qué es un sistema operativo, teoría básica de su funcionamiento
Lo primero que debemos hacer es acotar qué es exactamente un sistema operativo o SO. Se trata de una capa de software capaz de administrar todos los componentes del ordenador y utilizarlos de forma óptima, para permitir la ejecución de programas de usuario.
Estos programas de usuario no tendrán que interactuar directamente con todos los componentes, sino que lo hacen con el sistema operativo. Así, disponemos de una capa de abstracción que facilita enormemente la programación y la compatibilidad con diversos equipos. ¿Te imaginas que todos los programas tuviesen que ser programados específicamente para cada ordenador? Sería absolutamente inviable. Es por ello por lo que la capa de abstracción que proporciona es absolutamente imprescindible hoy en día, en cualquier dispositivo que imaginemos.
Seguramente estés familiarizado con varios sistemas operativos: en tu ordenador Windows, Linux o macOS, y en tu móvil Android o iOS. La idea que tenemos todos de un sistema operativo es lo que vemos arriba: una interfaz gráfica sobre la que ejecutamos programas y realizamos todo tipo de tareas sobre nuestro PC.
Sin embargo, en realidad la interfaz gráfica de usuario (GUI) no es realmente parte del sistema operativo, sino que deberíamos considerarla un programa de usuario como otro cualquiera.
Es obvio que en la práctica sí que es parte del sistema operativo como “producto”. Es decir, claro que la interfaz gráfica forma parte del sistema operativo Windows en su conjunto, pero si hablamos estrictamente en criterios técnicos no lo es.
Capas de un ordenador: modo usuario y modo kernel
Si dividimos un ordenador en 4 capas con distinta abstracción, en el más alto nivel estarían los programas de usuario, es decir, aquellas aplicaciones que utilizamos a diario en nuestro ordenador. Luego estaría la interfaz gráfica de usuario del sistema operativo, es decir, esa parte visible de la que hablábamos antes, luego el núcleo o kernel del sistema operativo, y finalmente el hardware.
Esto también nos lleva a una distinción software/hardware, y dentro del software hay dos modos de operación distintos, el Modo usuario y el Modo kernel. El funcionamiento de estos modos no se ajusta al 100% a lo que vemos en la imagen de arriba, pero hay que entender que es una aproximación orientativa.
Tanto en Windows como en otros sistemas operativos, estos modos tienen que ver con cómo están operando el procesador y el sistema operativo, y qué tipo de tarea se va a realizar:
- Cuando se inicia una aplicación en modo de usuario, Windows crea un proceso para esa aplicación, con un espacio de memoria virtual. Dentro de este contexto, cada aplicación funciona de manera aislada, no pudiendo manipular datos pertenecientes a otra. Es, además, un modo restringido, pues no permite el acceso a porciones reservadas de la memoria, correspondientes a datos críticos del sistema.
- En el modo kernel, se cuenta con un único espacio de memoria virtual con datos críticos del sistema, en el cual trabaja el propio núcleo del sistema operativo y distintos controladores.
La clave aquí está en la comunicación entre modo de usuario y modo kernel. Las aplicaciones en modo usuario hacen llamadas del sistema que provocan el cambio al modo kernel para operaciones como administración de ficheros o comunicación entre procesos.
Te recomendamos la lectura de nuestro artículo sobre mejor sistema operativo pc.
Algunas de las abstracciones y conceptos de un sistema operativo
Antes hemos mencionado conceptos como el proceso o el espacio de memoria virtual. Estos forman parte de algunas de las abstracciones que ofrece el sistema operativo. Básicamente, con un nivel de abstracción alto permitimos a los programadores crear aplicaciones de usuario sin pensar en ciertos detalles técnicos que varían según el ordenador o que dificultan enormemente el desarrollo.
Esto es algo que ya indicamos antes en el artículo, pero ahora vamos a ver cuáles son exactamente algunas de las abstracciones proporcionadas por el sistema operativo. Lo haremos de una forma simplificada para que sea fácil de entender, recuerda que tienes el libro de Tanenbaum para una explicación a fondo.
Procesos e hilos
Cada programa de usuario que ejecutamos funciona dentro de lo que se denomina proceso. Un proceso es un nivel de abstracción que proporciona al programa una “CPU virtual”. A ojos del programa, tiene todo el procesador a su disposición, por lo que no tiene que “pelearse” con otros programas para ejecutarse (cada núcleo de la CPU solo puede hacer una cosa a la vez).
Las aplicaciones se ejecutan como si tuviesen toda la CPU a su disposición, mientras que el sistema operativo y el procesador se encargan de planificar los procesos y decidir cuál se ejecuta en cada momento, “sin que las aplicaciones lo sepan”.
Además, un proceso proporciona un espacio de memoria virtual propio (de lo que hablaremos a continuación), por lo que tampoco tendrá que pelear por tener direcciones de memoria libres.
Cada proceso de un sistema operativo puede encontrarse en uno de los siguientes estados:
- En ejecución. Está usando la CPU en ese instante.
- Se puede ejecutar, pero está detenido temporalmente hasta que se planifique su ejecución de nuevo.
- Ha cedido la CPU a otros procesos voluntariamente porque está esperando a que ocurra un evento externo.
En la imagen de arriba, vemos las posibles transiciones de estado que puede tener un proceso (desde el estado en el que está, ¿A dónde puede ir?). En realidad es un poco más complejo, dependiendo de cómo se planifican los procesos, pero ponemos una simplificación, ya que no vamos a abordar las distintas formas de planificar los procesos en este artículo.
¿Y qué es un hilo? Los hilos son una especie de división de los procesos en varios “casi-procesos” que se ejecutan independientemente, pero comparten el espacio de memoria y otras variables con su proceso padre. De esta forma, se consigue un paralelismo en las acciones que si no sería imposible.
Por ejemplo, Tanenbaum nos explica la necesidad de los hilos con un procesador de palabras, como son Word o Writer. En su concepción más básica, nos harían falta estos tres hilos:
- Un hilo interactúa con el usuario, escuchando lo que escribe en el teclado constantemente, y sus acciones en el programa.
- Otro hilo hace los cálculos necesarios para dar formato a lo que se ve por pantalla, según lo que se escriba, la navegación en las páginas, etc.
- El tercer hilo guarda el archivo periódicamente.
Si no tuviésemos esa división en hilos, solo se podría ejecutar una de las tres tareas que señalamos en cada momento. Durante el autoguardado o el formato del texto, no podríamos escribir nada, y si escribimos no se podrían ver los cambios por pantalla al mismo tiempo. No podríamos conseguirlo tampoco con tres procesos distintos, porque los tres tendrían que compartir el mismo espacio de memoria (para tener acceso al documento).
Administración de memoria, memoria virtual y espacios de direcciones
Vamos con otra abstracción fundamental, que cambió la concepción de lo que es un sistema operativo cuando apareció por primera vez hace ya más de 6 décadas. Todo se basa en la administración de la memoria RAM, donde se ejecutan todos nuestros programas. Hay que poner solución a dos problemas:
- Cómo manejar todo el espacio de memoria de forma eficiente y sin que los programas usen espacios de memoria ya ocupados.
- Cómo lidiar con la relativamente baja capacidad de la memoria RAM.
La solución a este problema es la abstracción de memoria, que ahora explicaremos. Al principio, los PC no tenían ningún tipo de abstracción: se daban unas direcciones de memoria fijas para el sistema operativo, y otras para un único programa de usuario, no se podían ejecutar más a la vez.
Pero luego llegó la abstracción del espacio de direcciones. Esto se suma a la “CPU virtual” abstracta de los procesos: básicamente le damos a cada proceso un espacio de direcciones para él solo, en el que no tiene que preocuparse de competir con nadie ya que todo eso lo gestionará el sistema operativo.
Con esto solucionamos el primer problema. Para solucionar el segundo, se proponen dos modelos, como son el intercambio (swap) y la memoria virtual. Con ellos, conseguimos que se use más memoria de la que realmente hay, a base de almacenar temporalmente en el disco duro (como memoria secundaria) aquellos programas que no estamos utilizando en un instante concreto. El primer ordenador con memoria virtual llegó en los 60.
Sistema de archivos
¿Cómo somos capaces de almacenar y organizar toda la información con la que trabajamos diariamente en nuestro ordenador? Con la administración de memoria que acabamos de explicar, solo podemos almacenar una cantidad muy pequeña, y se pierde tan pronto se apaga el ordenador. Para conseguir un almacenamiento persistente dentro de nuestro sistema operativo, hacemos uso de los sistemas de archivos.
Un archivo es una unidad lógica mediante la cual podemos almacenar cierta información en el disco y leerla después, y el sistema de archivos es el mecanismo del sistema operativo que trata con ellos. Siempre que se crea un archivo se le proporciona un nombre, y además normalmente cuenta con una extensión, que se separa del nombre con un punto y que ayuda al sistema operativo a entender con qué programa debe abrir el archivo. Por ejemplo, «archivo.png» nos indica que es una imagen bajo el estándar PNG.
Internamente, un archivo suele entenderse como una secuencia de bytes, al menos en Windows y sistemas Unix, de forma que su contenido es irrelevante: lo va a almacenar igual.
A efectos de organización, un archivo también tiene asociados varios atributos o banderas que nos permiten conocer, entre otras cosas:
- Los permisos de acceso al archivo por parte de terceros.
- Cuándo ha sido creado y modificado, y por quién.
- Qué tamaño tiene el archivo.
- A quién pertenece el archivo.
- etc.
También hemos de organizar los archivos, y para ello disfrutamos de los directorios o carpetas (que podemos llegar a considerar un tipo de archivo). Tanto en sistemas Unix como en Windows, se hace uso de un sistema de directorios jerárquico, por el cual contamos con una carpeta raíz la cual puede contener varios directorios, cada uno de ellos varios subdirectorios, etc, formando una jerarquía que podemos representar fácilmente en forma de árbol, como vemos en la imagen de arriba.
Hay múltiples formas de implementar sistemas de archivos. El ejemplo que vamos a dar es el de los i-nodos, que es el que se usa (por ejemplo) en el sistema ext4, muy usado en Linux. En él, el archivo consiste en un llamado nodo-i, una estructura de datos que consta de los atributos de archivo y un puntero (una «dirección») a cada bloque de disco. Así, para acceder a los datos del archivo solo tenemos que ir recorriendo las direcciones almacenadas en el i-nodo.
Un bloque de disco es la unidad mínima en la que se dividen los discos duros. Suele ser de 4KB. Por eso hay una diferencia entre el tamaño «real» de un archivo y el «tamaño en disco».
Sobre los sistemas de archivos y los bloques de disco podríamos hablar muchísimo. Nos falta, por ejemplo, todo lo que se refiere a la optimización de los sistemas de archivos. La división en bloques tiene sentido: es mejor ir trayendo bloques enteros de datos del disco que buscarlos byte a byte. Pero debemos hacerlo siempre de forma óptima y sin desperdiciar espacio.
Entrada/salida
Una de las funciones más importantes de un sistema operativo es gestionar toda la entrada/salida, es decir, la comunicación con todos los dispositivos periféricos que necesitan introducir datos en nuestro ordenador, y también recibirlos. Estamos hablando de pantallas, teclados, ratones, y un largo etcétera, sin ellos el sistema operativo es simple y llanamente inútil.
El sistema operativo tiene dos tareas a este respecto. Por una parte, ser capaz de conectarse a estos dispositivos. Por otra, proporcionar una interfaz de comunicación sencilla entre ellos. Este segundo punto servirá para que los programas puedan comunicarse con los periféricos de manera sencilla, y hacerlo siempre de la misma forma.
Hay varios métodos de comunicación de la E/S dentro de un sistema operativo, pero dos de los más importantes (y antagonistas) son las interrupciones y el polling:
- Interrupciones. Cuando un dispositivo de E/S necesita a la CPU, le «informa» al momento de que esto ocurra para «interrumpir» su tarea actual y servir las necesidades del dispositivo.
- Polling o sondeo. En el caso del sondeo, la CPU comprueba a intervalos regulares el estado del dispositivo de E/S para saber si tiene que servirlo o no.
A priori puede parecer que solo las interrupciones tienen sentido, pues se supone que no se desperdicia tiempo de CPU inútilmente. Sin embargo, el polling también tiene sus ventajas y se usa, por ejemplo, con los ratones.
Interbloqueos, nuestros enemigos
Vamos a introducir de forma muy breve un concepto que no tiene que ver ya con abstracciones del sistema operativo, sino que hablamos de un problema común que los sistemas deben ser capaces de resolver.
Se produce un interbloqueo entre un conjunto de procesos si están bloqueando simultáneamente el mismo recurso del sistema, de forma que ninguno puede acceder a él, llevando a una espera circular, es decir, una espera infinita del sistema operativo de la que es necesario salir.
Los interbloqueos se pueden dar por pura casualidad, muchas veces es difícil esperarlo de forma intuitiva, pero si no tratamos el problema en el diseño del sistema operativo tendremos muchísimos problemas en la práctica. Los interbloqueos se deben prevenir mediante los mecanismos adecuados de sincronización de procesos, también deben poder ser detectados, que tampoco es algo inmediato de hacer, y sobre todo deben poder solucionarse. La solución suele ser, simplemente, matar uno de los procesos en conflicto.
Una ejemplificación de los interbloqueos se puede dar con el problema de la cena de los filósofos, y uno de sus casos particulares. Pensemos en 5 filósofos sentados en una mesa redonda, que se pasan la vida cenando (accediendo a un recurso) y pensando (haciendo un trabajo de cómputo). Para cenar disponen de un tenedor a la izquierda de su plato, y necesitan dos (digamos que son palillos chinos). Además, si cogen un tenedor a un lado y del otro lado está ocupado esperarán a que se libere.
El interbloqueo se daría si todos los filósofos eligen al mismo tiempo el tenedor de su derecha, pues se quedarían esperando eternamente a que alguien liberase el tenedor de la izquierda, algo que no va a ocurrir, y morirían de hambre. Es improbable, pero puede ocurrir.
Sistemas operativos, ejemplos más comunes y clasificación
¿Qué tipos de sistemas operativos hay? Podemos hacer una gran cantidad de divisiones distintas, según varios criterios. Si nos fijamos en la clasificación de Tanenbaum, vemos que hace la siguiente:
- Sistemas operativos de mainframe. Un mainframe (unidad central) es un ordenador de gran tamaño utilizado por grandes organizaciones para procesar miles de millones de cálculos simples en tiempo real, con la entrada/salida de millones de datos constantemente. Por ejemplo, lo que usaría un banco para procesar pagos de sus clientes. No es lo mismo que un superordenador. Un ejemplo de SO para mainframe sería IBM z/OS.
- Sistemas operativos de servidores. Con un uso muy similar a los mainframes, predominantemente en centros de datos, pero a un nivel más bajo y más similar a los ordenadores personales. Deben tener grandes capacidades de comunicación a través de la red y funcionar como sistemas distribuidos. Por ejemplo Windows Server o cualquier distribución Linux.
- Sistemas operativos de multiprocesadores. Cualquier SO actual entra dentro de esta categoría. Son sistemas capaces de funcionar con varios procesadores (o varios núcleos de un procesador), y optimizados para ello.
- Sistemas operativos de ordenadores personales (PC). Pensados para proporcionar una buena funcionalidad a un solo usuario a la vez. Aquí tenemos a sistemas como Windows o macOS.
- Sistemas operativos de ordenadores de bolsillo. Ya podemos «renombrarlos» a SO para móviles, tablets, etc, y tienen grandes similitudes con los SO de PC. Ejemplos como iOS o Android.
- Sistemas operativos integrados (embedded). Se trata de sistemas muy pequeños que funcionan sobre «ordenadores» sobre los que el usuario no tiene el control, pues puede ejecutar un único software en ellos. Por ejemplo, un cajero, un dispositivo de IoT (internet de las cosas), etc.
- Sistemas operativos de nodos sensores. Es otro tipo de sistemas pequeñísimos que funcionan conjuntamente con un sensor.
- Sistemas operativos en tiempo real. Se trata de sistemas donde el tiempo es lo más importante, y tienen que planificar las acciones a realizar con una gran precisión temporal, como ocurre en una fábrica.
- Sistemas operativos de tarjetas inteligentes. Nuestras tarjetas incorporan normalmente un software extremadamente ligero para hacer su función, normalmente solo para ejecutar código Java Card.
Todavía a día de hoy, esta es una clasificación que tiene bastante sentido, tal y como hemos visto en los ejemplos que hemos dado. Quizás, la separación más fácil e intuitiva sería pensar en los sistemas de ordenadores personales, dispositivos móviles, servidores y embebidos/IoT.
Te recomendamos la lectura de nuestra guía sobre qué es el software y qué es el hardware.
Hasta aquí nuestro pequeño repaso sobre un concepto tan importante como el de sistema operativo. Esperamos que la selección de información que hemos hecho te haya resultado de utilidad, y recuerda que el conocimiento más profundo provendrá de la revisión de libros como el Tanenbaum que te proponemos.