Pero entonces, ¿qué demonios es un sistema operativo?

Llevo un tiempo devanándome los sesos para explicar, con un ejemplo lo suficientemente sencillo, qué es un sistema operativo.

Si eres parte de una vasta mayoría de la población mundial, un sistema operativo es mucho menos de lo que te crees. Mira este programa, escrito en lenguaje C:

#include <sys/types.h>
#include <unistd.h>

#include <stdio.h>

int main ()
{
        printf("PID: %d\n",
                getpid()
        );
        return 0;
}

No hace falta que entiendas el código, símplemente quiero llamar la atención sobre la línea que dice getpid(). Ése un ejemplo del tipo que estaba buscando.

La definición esencial de un sistema operativo es bastante sencilla de escribir:

Un sistema operativo es un programa que toma el control de los recursos físicos del ordenador, y los gestiona para el resto de los programas.

Pero es bastante difícil de entender realmente. El tema es el siguiente: de acuerdo a esa definición, no hemos aclarado nada. Un programa. Uno, 1. ¿Un programa?, ¿qué programa?, ¿cuál de todos los programas que se ejecutan solos, al encender un ordenador?

Todos estamos acostumbrados a pensar en un sistema operativo como lo que se nos pone delante después de encender el ordenador, pero antes de ejecutar una aplicación útil, como un procesador de textos tal que LibreOffice Writer, Apple Pages o Microsoft Word.

Sin embargo, todos sabemos que, sin hacer nada, el ordenador está absolutamente lleno de programas en ejecución, con nombres que nadie entiende y, esperamos, algún propósito. Por poner una imagen en tu mente, por si acaso nunca lo has visto, esto es el administrador de tareas de un ordenador con Windows 10 recién encendido:

El gestor de tareas de Windows 10

Eso es mucho más que “un programa”, como decía la definición de arriba: son muchos programas. ¿Cuál de esos programas es nuestro sistema operativo?

Dejando Windows aparte, lo cierto es que el sistema operativo es un animal esquivo. Si usamos nuestro buscador favorito, o vamos a la bilbioteca, o abrimos un libro especializado y leemos algo al respecto, encontraremos muchas voces que relegan al interfaz de usuario al que estamos acostumbrados a algo que no es “el sistema operativo”. Todos esos botones, menús, accesos directos, cuadros de diálogo, paneles de control e incluso agresiones violentas como el reloj o ese widget del tiempo... todo eso son programas externos, que acceden a los recursos del ordenador a través del sistema operativo. Todo eso son programas independientes que pueden ser reemplazados, modificados, actualizados y mejorados, sin cambiar el sistema operativo.

Entonces: ¿qué demonios es el sistema operativo?

El sistema operativo es como una mano invisible que mueve los hilos y que, salvo unos pocos (los programadores de sistemas), ningún ser humano usa directamente, en realidad. Es código en ejecución que ofrece sus funciones, únicamente, a través de una serie muy limitada de elementos que actúan como interfaz. Quienes usan el sistema operativo son los demás programas a través de una combinación de:

Ejemplos de llamadas al sistema pueden ser: solicitar memoria para poder trabajar, localizar información en el disco, dibujar gráficos, enviar caracteres a la pantalla, abrir y cerrar una conexión de red. Cualquier acceso a los recursos físicos de un ordenador que puedas imaginar está gobernado por el sistema operativo, y es ofrecido a los programas a través de llamadas al sistema.

Todo esto es súper abstracto y, no nos engañemos, es un pegote de argot que ralla el extremo doloroso en el especto de lo pedante. De ahí que quisiese encontar un ejemplo lo suficientemente bueno.

Vamos, por fin, al ejemplo de marras. El programa del principio del artículo hace uso de una de esas llamadas al sistema: getpid(). Esta función, que se encuentra en la librería unistd.h, devuelve el identificador del proceso que ha sido asignado al proceso en curso. El identificador de proceso, o PID (Process IDentifier, en inglés), es un número que identifica de forma única a cada uno de los programas que se encuentran ejecutándose en el ordenador en un determinado momento. Ese número es asignado a los programas por el sistema operativo, cuando los carga en memoria para poder cederles tiempo de uso del procesador, y en general acceso a todas las demás capacidades de la máquina. Gracias a ese número, el sistema operativo puede controlar la ejecución de nuestro programa haciendo cosas útiles como darle más o menos prioridad, pararlo, reanudarlo, o incluso matarlo cuando no responde.

getpid() forma parte de una familia muy popular de sistemas operativos, UNIX, y todos los sistemas compatibles con varias de sus especificaciones (POSIX). getpid() es una representante de una serie de mecanismos fundamentales para el control de procesos en ejecución: qué se está ejecutando en cada momento. Crucial para mantener los recursos del ordenador bajo control.

El resultado de ejecutar nuestro programa, que he llamado get_pid, no es más que la impresión de una frase que nos dice cuál es el identificador del proceso, y nada más:

$ ./get_pid 
PID: 61203
$ ./get_pid 
PID: 62550

La explicación concreta de qué hace cada sentencia del programa y su estructura podría formar parte de una serie de artículos centrados en el lenguaje C, pero más importante dentro de este ejemplo es el hecho de que cada vez que ejecutamos el programa, el resultado es distinto. Esto ocurre porque cada ejecución del programa (de un mismo programa) es un proceso diferente, una instancia distinta y, por lo tanto, tiene un PID distinto. Como programa, y como resultado, puede parecer decepcionante, pero representa uno de los pilares fundamentales de los sistemas operativos modernos, y es un embajador excepcional de lo que son, ni más ni menos: mecanismos de control de recursos que se acceden a través de librerías especializadas, y poco más.

Así pues, y a no ser que seas programador de sistemas: de todo lo que estás viendo frente a ti, en tu teléfono o en tu ordenador; de todo lo que has estado usando todos estos años, moviendo el ratón, haciendo click en elementos gráficos, introduciendo órdenes en un terminal de texto, aceptando actualizaciones interminables, dejándote engañar con cosas como que “el nuevo sistema operativo trae novedades en la aplicación de correo electrónico”,... de todo eso, getpid() es probablemente lo que más te ha acercado al concepto fundamental de sistema operativo.

#SistemaOperativo #C

👉 Sigue a micromáquina en @gabriel@micromaquina.com 👉 Sigue a Gabriel Viso en @gabriel@fedi.gvisoc.com