Sistemas Operativos
Para una persona que utiliza un computador, puede parecer que solo ella lo está controlando. Después de todo, el equipo obedece los comandos del teclado y del mouse, y ejecuta los programas deseados. Sin embargo, dentro de la máquina están ocurriendo muchos fenómenos, controlados silenciosamente por el sistema operativo (OS). El OS es el primer programa que se carga en la memoria RAM de un PC, después de que se ejecutan las rutinas de encendido de la BIOS.
Los sistemas operativos más comunes son:
- Windows de Microsoft en los PCs.
- Mac OS de Apple en los computadores MacIntosh.
- Unix, o su variante gratuita Linux, en servidores corporativos.
- Versiones reducidas de Windows y Linux en teléfonos celulares modernos y en otros sistemas embebidos sofisticados.
Existen muchos otros sistemas operativos, orientados a aplicaciones más específicas, tales como mainframes, robots industriales, sistemas de control en tiempo real, etc.
No todos los computadores tienen sistemas operativos. Por ejemplo, el microcomputador que controla un horno de microondas no necesita un sistema operativo. Solo tiene que ejecutar una tarea bien definida y controlar un hardware que nunca se modifica. Para ese computador, un sistema operativo sería una complejidad innecesaria.
Propósito de un Sistema Operativo
Un OS se puede definir como un programa que actúa como una interfaz entre el usuario de un computador y el hardware del mismo, ofreciendo el entorno necesario para que el usuario pueda ejecutar programas.
El propósito de un OS es organizar y controlar el hardware y el software de tal forma que el dispositivo en el cual se ejecuta se comporte de forma flexible y predecible.
Funciones de un Sistema Operativo
En esencia, un OS realiza dos funciones:
- Gestiona los recursos de hardware y de software del sistema. En un PC, estos recursos incluyen al procesador, la memoria, el espacio de almacenamiento en disco, las puertas, la conexión con el teclado, el mouse, la impresora, etc. Esta tarea es muy importante, ya que los programas en ejecución compiten por el uso de estos recursos para sus propósitos particulares. En este aspecto, el OS desempeña el rol de un proveedor de recursos que intenta proporcionarle a todos los programas los medios que requieren de la forma más eficiente posible.
- Provee una interfaz consistente para que los programas se comuniquen con el hardware, sin que deban conocer todos los detalles del mismo, ni tener en consideración posibles modificaciones de dispositivos o periféricos, cambios en la cantidad de memoria RAM, o de otros recursos. La interfaz de programación de aplicaciones, denominada Application Program Interface o API, le permite a los desarrolladores de software escribir programas en un computador confiando en que el programa se ejecutará correctamente en otros computadores con hardware diferente, bastando para ello que dichos computadores estén ejecutando el mismo OS.
Tipos de Sistemas Operativos
- Sistemas operativos de tiempo real (RTOS): se usan en sistemas que controlan máquinas, instrumentos y sistemas industriales. Un RTOS típicamente tiene pocas capacidades para interactuar con un usuario, ya que el sistema se comporta esencialmente como una «caja negra». Un requerimiento muy importante de un RTOS es el de asegurar que cada operación se ejecute siempre en la misma cantidad de tiempo. En una máquina compleja, que una pieza de la máquina se mueva antes de lo esperado (porque los recursos del sistema están disponibles) puede ser tan perjudicial como que no se mueva a tiempo (porque el sistema está sobrecargado).
- Monousuario, monotarea: es un OS diseñado para manejar el computador de tal forma que solo un usuario puede realizar una tarea a la vez. Un ejemplo clásico de un sistema de este tipo es DOS, el primer sistema operativo de los PC, utilizado actualmente en algunos sistemas embebidos.
- Monousuario, multitarea: solo un usuario utiliza el sistema a la vez, pero puede realizar muchas tareas simultáneamente. Algunos ejemplos son Windows y Mac OS.
- Multiusuario, multitarea: muchos usuarios pueden utilizar el computador simultáneamente. Corresponde al caso clásico de los sistemas de tiempo compartido, en computadores mainframe. Algunos ejemplos son Unix y VMS. El OS distribuye los recursos de la máquina entre los usuarios y sus procesos, y debe asegurarse de que un eventual problema con un usuario no afecte al resto.
Gestión del Procesador
La gestión del procesador se puede resumir en dos funciones:
- Asegurarse de que cada proceso y cada aplicación reciba suficiente tiempo de la CPU para funcionar correctamente.
- Usar tantos ciclos del procesador como sea posible para desempeñar tareas útiles.
– Las unidades básicas de software con las que el OS interactúa para dirigir el trabajo realizado por la CPU son los procesos.
– Se podría pensar que proceso es sinónimo de aplicación, pero no es así. Una aplicación típica, tal como Word, Excel o Firefox es un proceso, pero la aplicación puede poner en marcha otros procesos, ya sea para establecer comunicación con otros computadores o para otros fines. Existen además numerosos procesos que se ejecutan sin evidencia directa de que están activos. Por ejemplo, Windows y UNIX activan docenas de procesos en el background (transfondo) para manejar la red, la memoria, las unidades de disco, etc.
– Un proceso es entonces un programa que realiza una cierta acción y que puede ser controlado por el usuario, por otras aplicaciones, o por el OS. Los elementos de software que el OS asigna a la CPU para ser ejecutados son los procesos, no las aplicaciones.
– El trabajo de un OS monotarea es relativamente sencillo. El OS le permite a la aplicación correr en la CPU, suspendiendo su ejecución solo lo suficiente para atender las interrupciones del sistema, o las generadas por los comandos del usuario.
– En el caso de los OS multitarea, el trabajo es bastante más complejo. El OS debe gestionar la ejecución de las aplicaciones de tal forma de aparentar que todas se están ejecutando en paralelo, a pesar de que la CPU solo puede ejecutar un programa a la vez. Las CPU multi-núcleo actuales pueden realizar más tareas en paralelo, pero cada núcleo solo puede correr un programa a la vez.
– Para crear la ilusión de paralelismo, la CPU debe conmutar entre los distintos procesos centenares o miles de veces por segundo.
– Cada proceso ocupa una cierta cantidad de memoria RAM y elementos de la CPU, tales como registros, stacks (pilas) y queues (colas). Un stack es un conjunto de registros usados para almacenamiento temporal de información, con una estructura análoga a una pila de revistas, de tal forma que el primer elemento que se lee es el último que se almacenó. Un queue es un conjunto de datos organizados de tal forma que el primero que se lee es el que se almacenó primero, en forma análoga a una cola de personas esperando a ser atendidas.
– Si dos procesos corren en forma «simultánea», el OS le asigna un cierto número de ciclos de la CPU al primer proceso. Después de ese número de ciclos, el OS realiza una copia de todos los registros, stacks y queues usados por el proceso y toma nota del punto en el cual el proceso detuvo su ejecución. Luego carga todos los registros, stacks y queues usados por el segundo proceso y le permite correr durante un cierto número de ciclos de CPU. Una vez cumplidos estos ciclos, respalda los registros, stacks y queues usados por el segundo proceso y carga los del primero.
Gestión de la Memoria y el Almacenamiento
La gestión de la memoria se puede resumir en dos tareas básicas:
- Cada proceso debe tener suficiente memoria para poder ser ejecutado, no debe invadir el espacio de memoria dedicado a otros procesos, y su espacio no debe ser invadido por otros procesos.
- Los diferentes tipos de memoria en el sistema (cache L1, cache L2, DRAM, disco) deben ser usados apropiadamente, para que cada proceso pueda correr de la forma más eficiente y rápida posible.
La primera tarea requiere que el sistema operativo defina límites en la memoria para los diferentes tipos de software que se ejecutan en el sistema.
Por ejemplo, supongamos un sistema imaginario con 1 MB (1000 kB) de RAM. Durante el proceso de arranque, el OS debiera reservar espacio para sí mismo desde el tope de la memoria disponible hacia abajo (300 kB). A continuación, el OS debiera colocar en la parte baja de la memoria el código de los drivers requeridos para controlar el hardware del computador (200 kB). Por lo tanto, quedan 500 kB disponibles para ejecutar aplicaciones.
– Cuando los procesos comienzan a cargarse en la memoria, lo hacen en bloques de un tamaño determinado por el OS. Por ejemplo, el tamaño de los bloques podría ser 2 kB. Los bloques se van asignando a los procesos, cuidando que la información de cada uno no sea sobreescrita por los otros.
– Si la memoria libre se agota, algunos OS recurren al espacio libre en disco, aprovechando que la información almacenada en memoria por una aplicación no se utiliza todo el tiempo. (El procesador solo puede acceder a la memoria una localización a la vez, así que la gran mayoría de la RAM está inactiva en un momento dado). Dado que el espacio en disco es mucho menos costoso que el mismo espacio en la RAM, trasladar información de RAM a disco puede expandir significativamente la memoria sin costo adicional. A esta técnica se le denomina manejo de memoria virtual.
– Como la velocidad de grabación y lectura de un disco duro es mucho menor que la de la memoria RAM, un PC moderno con una CPU lenta y bastante memoria RAM puede ser más rápido que otro con una CPU rápida y poca memoria RAM.
– El OS debe balancear los requerimientos de los procesos con la disponibilidad de los distintos tipos de memoria (caché, RAM, disco), trasladando los bloques de datos para optimizar el rendimiento del sistema.
– En lo referente al almacenamiento, el OS se encarga de gestionar el espacio disponible en los discos asignando espacio a los archivos y manteniendo el control de su ubicación, utilizando estructuras tales como las particiones, la FAT, los directorios, etc., las cuales se describieron en un tópico anterior.
Gestión de Dispositivos
La interfaz entre el OS y la mayoría de los dispositivos que componen el hardware del PC es un tipo especial de proceso denominado driver. La función de los drivers es actuar como traductores entre las señales eléctricas asociadas a los dispositivos y las instrucciones contenidas en las aplicaciones y en el OS.
Por ejemplo, el driver de un disco duro recibe datos que para el OS forman parte de un archivo, y los traduce a una serie de bits que luego almacena en los platos del disco.
El OS normalmente asigna una alta prioridad de ejecución a los drivers, para que los recursos de hardware puedan ser liberados y reasignados tan pronto como sea posible.
Los drivers están separados del OS, para poder añadir nuevas funciones al hardware sin necesidad de modificar, recompilar y redistribuir el OS. Además, los drivers son normalmente creados por los fabricantes de los dispositivos, ya que son quienes mejor conocen sus características.
Uno de los problemas asociados a la gestión de dispositivos consiste en evitar la pérdida de datos entrantes dirigidos a un cierto proceso cuando la CPU está ocupada ejecutando otros procesos. Para lograr dicho objetivo, el OS implementa buffers o queues, en los cuales almacena temporalmente la información entrante. Cuando el proceso hacia el cual van dirigidos los datos toma el control de la CPU, el OS le transfiere los datos almacenados en el buffer correspondiente. De esta forma, los dispositivos pueden enviar datos a gran velocidad hacia un cierto proceso aunque dicho proceso no se esté ejecutando en el instante en que llegan los datos.
Interfaz de Aplicaciones
La interfaz de aplicaciones (Application Program Interface) o API del OS, le permite a los programadores de programas de aplicación (tales como Word, Excel, Firefox, etc.) usar funciones del computador y del OS sin necesidad de conocer los detalles de cómo se implementan dichas funciones.
Por ejemplo, si un programador desea crear un archivo para grabar información en disco, podría ejecutar una (hipotética) función de la API con la siguiente instrucción: MakeFile [1, %Name]
La función anterior le pide al OS crear un nuevo archivo con acceso aleatorio (indicado por el «1», la otra posibilidad habría sido «0» para acceso secuencial) con el nombre especificado por el usuario (contenido en el parámetro %Name).
El OS envía una petición al driver del disco para conocer la ubicación del primer cluster libre disponible. Con este dato, el OS agrega información al directorio y a la FAT del disco para registrar el nombre del archivo, el tipo de archivo, la fecha y hora de creación, etc.
Dentro del disco, los comandos del sistema operativo se traducen en órdenes de grabar en ciertos cilindros, pistas y sectores, detalles que maneja el firmware controlador del disco.
Como el programador ha usado la API del OS para crear el archivo, no necesita conocer ni manejar los detalles técnicos mencionados, ni las diferencias entre ellos para cada fabricante y modelo de disco duro posible. El OS, en conjunto con el driver y el controlador del disco, se encarga de todos los detalles. El programador solo usa la API, y confía en que el OS se encargará del resto.
Las API de los OS proporcionan cientos de funciones útiles a los programadores.
Interfaz de Usuario
La interfaz de usuario (user interface) o UI del OS es un programa (o un conjunto de programas) que le permite al usuario dar comandos y recibir respuestas del OS.
Las primeras interfaces de usuario funcionaban en modo texto, es decir, el usuario debía digitar los comandos (con los parámetros correspondientes) en la «línea de comando».
Uno de los ejemplos de este tipo de UI (que se utilizó masivamente hasta mediados de los 90) es el programa «Command.com» de DOS.
Otro caso similar corresponde al del sistema operativo multiusuario y multitarea Unix, creado a principios de los años 70, a partir del cual surgió (2 décadas después) Linux.
La interfaz de usuario de Unix proporcionaba una gran cantidad de comandos, cada uno con decenas de opciones.
En la figura derecha se muestra un ejemplo del contenido de un directorio, visualizado con el comando «ls» (list). Las letras «r», «w» y «x» indican los permisos de lectura, escritura y ejecución para distintos usuarios del sistema. Las interfaces de línea de comando resultaban muy complicadas para los usuarios ocasionales de los computadores, ya que debían recordar la sintaxis de muchos comandos, o consultar constantemente los manuales.
A comienzos de los 80, investigadores de XEROX desarrollaron la interfaz gráfica, o GUI, (Graphical User Interface), pero su importancia no fue reconocida por los ejecutivos de la empresa, y la idea fue cedida a la empresa Apple, la cual la incorporó en su computador MacIntosh en 1984. La primera versión de esta GUI se muestra en la figura derecha.
Posteriormente, Microsoft incorporó la idea a la primera versión de su sistema operativo Windows.
Las interfaces gráficas exigen un desempeño bastante superior del computador al de las interfaces de línea de comando.
Inicialmente, las interfaces gráficas eran lentas y limitadas, pero a medida que la velocidad de los PC y su capacidad gráfica fue aumentando, se hicieron cada vez más poderosas y ágiles, hasta alcanzar el grado de sofisticación que se observa en las últimas versiones de Windows, Mac OS y Linux.