4. Componentes del sistema
Cuáles son los componentes de sistema operativo moderno: gestión de procesos, memoria, E/S, almacenamiento, archivos, red, y protección y seguridad.
Crear software complejo, como es el caso de un sistema operativo, no es sencillo. Por ello resulta más práctico dividirlo en piezas más pequeñas especializadas en aspectos concretos de su funcionamiento. El estudio de esta organización interna requiere analizar tres aspectos:
-
Los componentes del sistema operativo y sus interrelaciones.
-
Los servicios que el sistema operativo proporciona a través del funcionamiento coordinado de dichos componentes.
-
La interfaz de programación que el sistema operativo ofrece a los programadores como forma de acceso a dichos servicios.
Los dos últimos aspectos los veremos en los capítulos siguientes, mientras que en este nos centraremos en los componentes. Sin embargo, debemos tener en cuenta que cada sistema operativo tiene diferentes componentes y utiliza nombres distintos. Lo que veremos en este capítulo es un esquema breve de los más comunes en la mayoría de sistemas operativos actuales.
Gestión de procesos
Sección titulada «Gestión de procesos»La gestión de los procesos es un elemento central de todo sistema operativo:
-
El proceso es la unidad de trabajo en cualquier sistema operativo moderno. Es quien realiza las tareas que interesan a los usuarios. Por eso, es a cada proceso al que se le asigna el tiempo de CPU y el resto de recursos del sistema, como por ejemplo: memoria, archivos o dispositivos de E/S abiertos.
-
Un proceso es un programa en ejecución. Un programa se convierte en proceso cuando las instrucciones del programa son cargadas en la memoria desde el archivo del ejecutable y se le asignan recursos para su ejecución.
Por tanto, los procesos son entidades activas que necesitan recursos —CPU, memoria, archivos, dispositivos E/S—. Algunos de esos recursos se asignan durante su creación, mientras que otros son solicitados por el proceso durante su ejecución —por ejemplo la memoria, de la que todo proceso necesita cierta cantidad para comenzar, pero que luego puede pedir más dinámicamente durante su ejecución—. Cuando el proceso termina el sistema operativo reclama de estos recursos aquellos que sean reutilizables para otros procesos.
Mientras que un programa no es un proceso, sino una entidad pasiva. Es el contenido de un archivo en disco con las instrucciones que algún día una CPU ejecutará. Un programa no puede hacer ningún tipo de trabajo a menos que sus instrucciones sean ejecutadas por una CPU, pero si eso ocurre, ya no sería un programa sino un proceso.
Aunque varios procesos estén asociados al mismo programa no pueden ser considerados el mismo proceso. La CPU ejecuta las instrucciones de cada proceso una detrás de otra, de manera que para conocer la siguiente instrucción a ejecutar cada proceso tiene un contador de programa que se lo indica a la CPU, así como valores en los registros de la CPU que dependen de la historia pasada del proceso. Aunque varios procesos ejecuten el mismo programa, la secuencia de instrucciones ejecutadas y el estado del proceso en cada momento seguramente sean diferentes. Por lo tanto, no son el mismo proceso.
Responsabilidades de la gestión de procesos
Sección titulada «Responsabilidades de la gestión de procesos»El componente de gestión de procesos es el responsable de las siguientes actividades:
- Crear y terminar procesos.
- Suspender y reanudar los procesos.
- Proporcionar mecanismos para la sincronización de procesos.
- Proporcionar mecanismos para la comunicación entre procesos.
- Proporcionar mecanismos para el tratamiento de interbloqueos.
Gestión de la memoria principal
Sección titulada «Gestión de la memoria principal»La memoria principal es un recurso fundamental para las operaciones de cualquier sistema operativo moderno. Esto es así porque generalmente es el único almacenamiento al que la CPU tiene acceso directo. Para que un programa pueda ser ejecutado debe ser copiado a la memoria principal. Y para que un proceso tenga acceso a datos almacenados en cualquier otro dispositivo de almacenamiento, primero deben ser copiados a la memoria principal.
Para mejorar el aprovechamiento de la CPU y la respuesta al usuario es necesario tener en la memoria varios programas al mismo tiempo. Puesto que dichos programas deben compartir la memoria durante su ejecución, automáticamente existe la necesidad de que el sistema operativo disponga de un componente de gestión de la memoria principal.
Responsabilidad de la gestión de la memoria
Sección titulada «Responsabilidad de la gestión de la memoria»El componente de gestión de la memoria debe asumir las siguientes responsabilidades:
- Controlar qué partes de la memoria están actualmente en uso y cuáles no.
- Decidir que procesos —o partes de procesos— añadir o extraer de la memoria cuando hay o falta espacio en la misma.
- Asignar y liberar espacio de la memoria principal según sea necesario.
- Gestionar el mapeo de archivos del almacenamiento secundario en la memoria.
Sistema de E/S
Sección titulada «Sistema de E/S»El sistema de E/S hace de interfaz con el hardware, oculta las peculiaridades del hardware al resto del sistema. Para eso, suele contar, al menos, con los siguientes componentes:
-
Un componente de gestión de memoria especializado en E/S, con soporte para servicios de buffering, caching y spooling. Estos servicios son utilizados por el resto del sistema de E/S.
-
Una interfaz genérica de acceso a los dispositivos. Cada dispositivo es diferente, pero los procesos y el resto de componentes del sistema no deben tener necesidad de conocer sus particularidades a la hora de acceder a ellos. Es decir, para acceder a cualquier disco duro el sistema debe ofrecer una misma interfaz, independiente de su marca y modelo. Y lo mismo ocurre con las tarjetas de sonido o con los dispositivos de entrada, como teclados y ratones. Así los programadores pueden acceder a cualquier dispositivo abstrayendo de las particularidades concretas del hardware instalado en cada ordenador.
-
Controladores de dispositivo, que generalmente son desarrollados por los fabricantes de los dispositivos y son el componente que realmente conoce las peculiaridades específicas del dispositivo. Las peticiones que hacen los procesos a la interfaz de E/S genérica la traslada el sistema a los controladores de dispositivo para que estos las conviertan en acciones concretas sobre el hardware del dispositivo.
Buffering
Sección titulada «Buffering»El buffering o uso de memoria intermedia es una estrategia en la que se almacenan los datos de manera temporal en una zona de la memoria, llamada búfer.
Consiste en que el controlador indica a un dispositivo que escriba los bloques de datos solicitados en un búfer. Cuando la escritura del búfer se ha completado, se transfiere su contenido al proceso que hizo la solicitud para que procese los datos. Mientras lo hace, el controlador indica al dispositivo que copie nuevos datos en el búfer.
Por ejemplo, al grabar sonido del dispositivo de sonido del sistema no se entregan las muestras una a una al proceso. En su lugar se graban varios miles de muestras que se escriben en un búfer. Cuando el búfer está lleno, se transfieren todas las muestras al proceso de una sola vez y se siguen grabando muestras en el búfer.
Lo mismo ocurre al reproducir sonido. El proceso no entrega las muestras de sonido de una en una al dispositivo, sino que empaqueta varios miles que se copian al búfer de una sola vez. Entonces el controlador indica al dispositivo que lea las muestras desde ese búfer según lo vaya necesitando.
Caching
Sección titulada «Caching»En el caching el sistema mantiene en la memoria principal una copia de datos leídos o escritos recientemente en los dispositivos de E/S del sistema —por ejemplo, en los discos duros o en las memorias USB—. Esto mejora la eficiencia del sistema si accede con frecuencia a los mismos datos, puesto que el acceso a la memoria principal es más rápido que el acceso a los dispositivos de E/S. La memoria principal es de tamaño limitado, por lo que solo se mantiene copia de los datos utilizados con mayor frecuencia.
Spooling
Sección titulada «Spooling»El spooling se utiliza en dispositivos que no admiten el acceso simultáneo de varias aplicaciones a la vez, como es el caso de impresoras y unidades de cinta.
Cuando varias aplicaciones intentan enviar un trabajo a una impresora, el sistema operativo lo intercepta para copiar los datos enviados a un archivo independiente. Cuando una aplicación termina de enviar el trabajo, el archivo correspondiente se mete en una cola de donde son extraídos los trabajos para su impresión de uno en uno. Así no hay acceso simultáneo al dispositivo por parte de varios procesos, mientras que estos pueden entregar el trabajo y continuar con su trabajo sin esperar a que la impresora esté disponible.
Ejemplo Interfaz de acceso a dispositivos en sistemas UNIX
Sección titulada « Interfaz de acceso a dispositivos en sistemas UNIX»La interfaz de E/S de los sistemas tipo UNIX es un ejemplo muy característico de interfaz genérica de acceso a los dispositivos, porque en estos sistemas todos los dispositivos de E/S se tratan como archivos, lo que simplifica la programación y el uso de estos. Así no hace falta diseñar y aprender una interfaz diferente para cada tipo de dispositivo.
Por ejemplo, no hace falta que el sistema ofrezca funciones para leer y escribir bloques en dispositivos de almacenamiento. Ni para leer la geometría del dispositivo o para configurar modos de transferencia. Tampoco son necesarias funciones específicas para grabar y reproducir sonidos, para configurar la tarjeta de sonido o para leer y establecer los valores de volumen del mezclador. Por el contrario, todas las operaciones sobre los dispositivos de E/S se ofrecen a través de una interfaz bien conocida por los desarrolladores, que es la misma que se utiliza para gestionar archivos convencionales: open(), read(), write(), close() o mmap().
Por ejemplo, /dev/urandom es un dispositivo que se utiliza para obtener una secuencia de bytes aleatorios.
Para usarlo, solo tenemos que abrirlo y leer de él la cantidad de bytes que necesitemos:
int fd = open( "/dev/urandom", O_RDONLY );if (fd >= 0) { char random_data[64];
ssize_t bytes_read = read( fd, random_data, sizeof(random_data) );
// Usar los bytes aleatorios en random_data...
close(fd);}Lamentablemente, algunos dispositivos tienen funciones de control que no se trasladan bien a esta interfaz basada en archivos. Por ejemplo, si tenemos un lector de DVD o de Blu-ray, la operación read() nos permite leer el contenido del disco en crudo —es decir, bloque a bloque, ignorando el sistema de archivos— pero ¿qué operación deberíamos hacer si queremos ejectarlo? ¿cómo podemos saber si hay un disco en el lector antes de intentar hacer cualquier otra operación?
Para resolver este tipo de situaciones, los sistemas tipo UNIX incorporan la llamada al sistema ioctl(), que permite enviar comandos u obtener parámetros específicos del dispositivo. Esta llamada acepta los siguientes argumentos:
int ioctl( int fd, int op, ...);fdes el descriptor de archivo obtenido al abrir el dispositivo con open().opes el código de petición al dispositivo. Depende del dispositivo y del sistema operativo, por lo que para conocer los códigos que se soportan es necesario leer la documentación del controlador.- Un tercer argumento opcional que depende del código de petición. En general, suele ser un puntero a una estructura de datos que contiene los parámetros necesarios para la petición. En caso de que la petición sea para obtener información del dispositivo, suele ser un puntero a una estructura donde se almacenará la información solicitada.
Por ejemplo, así podríamos eyectar el primer lector de CD/DVD-ROM o Blu-ray en Linux:
#include <linux/cdrom.h>
// ...
int fd = open( "/dev/sr0", O_RDONLY | O_NONBLOCK );if (fd >= 0){ ioctl ( fd, CDROMEJECT ); close ( fd );}- Este archivo contiene los códigos IOCTL conocidos por los controladores de dispositivo del tipo lectores de CD-ROM.
- Como en el ejemplo anterior con
/dev/urandom, es necesario abrir el dispositivo para obtener un descriptor de archivo. - En la llamada al sistema ioctl() se indica el código de la petición para eyectar la bandeja.
Finalmente, es importante notar que, por lo general, en estos sistemas los dispositivos de E/S se encuentran en el directorio /dev.
Sin embargo, no es el único lugar donde pueden encontrarse archivos especiales, ya que suelen haber otros directorios, como /proc o /sys, que también contienen archivos que representan dispositivos de E/S y otros recursos del sistema.
Gestión del almacenamiento secundario
Sección titulada «Gestión del almacenamiento secundario»Dentro de los dispositivos de E/S, los dedicados al almacenamiento secundario —como discos duros, memorias USB o lectores de DVD-ROM— merecen un tratamiento especial.
Los programas que se desean ejecutar deben estar en la memoria principal —o almacenamiento primario— pero esta es demasiado pequeña para alojar todos los datos y todos los programas del sistema. Además, incluso aunque pudiera ser así, los datos almacenados en la memoria principal se perderían en caso de que ocurriera un fallo de alimentación. Por eso los ordenadores disponen de un almacenamiento secundario para guardar datos de forma masiva y permanente.
El gestor del almacenamiento secundario utiliza el sistema de E/S para acceder a los dispositivos y ofrecer al sistema servicios más complejos.
Responsabilidades de la gestión del almacenamiento secundario
Sección titulada «Responsabilidades de la gestión del almacenamiento secundario»El gestor del almacenamiento secundario es el responsable de:
- Gestionar el espacio libre en discos duros y resto de dispositivos de almacenamiento secundario.
- Asignar el espacio de almacenamiento.
- Planificar el acceso a los dispositivos, de tal forma que se ordenen las operaciones de forma eficiente.
Sistemas de archivos
Sección titulada «Sistemas de archivos»Los ordenadores pueden almacenar información en diferentes tipos de medios físicos —por ejemplo en discos duros magnéticos, CD/DVD-ROM, memorias USB o SSD— cada uno de los cuales tiene características propias. El acceso a cada tipo de medio es controlado por un dispositivo —por ejemplo el controlador de disco o la unidad de DVD-ROM— que también tiene características propias. El sistema de E/S y la gestión del almacenamiento secundario simplifican el acceso a estos dispositivos, pero no lo suficiente como para que sea cómodo usarlos constantemente en cualquier programa.
Para simplificar aún más el acceso al almacenamiento, el sistema operativo proporciona una visión lógica uniforme de todos los sistemas de almacenamiento a través del concepto de archivo. Los archivos —o ficheros— son colecciones de datos relacionados, identificados por un nombre, que es tratada por el sistema operativo como la unidad de información en el almacenamiento secundario. El sistema abstrae las propiedades físicas de los distintos dispositivos de almacenamiento y ofrece el archivo como la unidad de almacenamiento lógico con la que trabajan los procesos para guardar y recuperar datos.
Esto quiere decir que, por lo general, para el sistema operativo un archivo no es más que una colección de bytes y lo que ofrece son servicios para leer, escribir, identificar y manipular dicha colección. La organización y formato utilizados para guardar la información —como, por ejemplo, el detalle de cómo se codifica en un archivo una imagen al guardarla en formato JPEG— y lo que se hace con dicha información, es algo que generalmente solo incumbe a las aplicaciones, no al sistema operativo.
Los archivos normalmente se organizan en directorios para facilitar su uso y organización.
Responsabilidades del sistema de archivos
Sección titulada «Responsabilidades del sistema de archivos»El sistema de archivos utiliza al gestor del almacenamiento secundario y al sistema de E/S y es responsable de las siguientes actividades:
- Crear y borrar archivos.
- Crear y borrar directorios para organizar los archivos.
- Soportar operaciones básicas para la manipulación de archivos y directorios: lectura y escritura de datos, cambio de nombre, cambio de permisos, etc.
- Proporcionar el soporte para que los archivos puedan ser proyectados por el gestor de memoria en la memoria principal.
- Hacer copias de seguridad de los archivos en sistemas de almacenamiento estables y seguros.
Gestión de red
Sección titulada «Gestión de red»El componente de red se responsabiliza de la comunicación con otros sistemas interconectados mediante una red de ordenadores —por ejemplo, en Internet o en la red de área local de una oficina—.
Protección y seguridad
Sección titulada «Protección y seguridad»Protección es cualquier mecanismo para controlar el acceso de los procesos y usuarios a los recursos definidos por el sistema.
- Son mecanismos necesarios cuando un sistema informático tiene múltiples usuarios y permite la ejecución concurrente de varios procesos, pues así solo pueden utilizar los recursos aquellos procesos que hayan obtenido la autorización del sistema operativo.
- Permite mejorar la fiabilidad, al permitir detectar los elementos del sistema que no operan correctamente. Un recurso desprotegido no puede defenderse contra el uso —o mal uso— de un usuario no autorizado o incompetente.
Ejemplos típicos de mecanismos de protección son el hardware de direccionamiento de memoria, que se utiliza para que los procesos se ejecuten en su propio espacio de direcciones, y el temporizador, que garantiza que ningún proceso toma el control de la CPU por tiempo indefinido. Además, los registros de los dispositivos de E/S suelen estar protegidos del acceso directo de los usuarios, lo que protege la integridad de los dispositivos. Mientras que en algunos sistemas se pueden establecer permisos sobre los archivos para garantizar que solo los procesos con la debida autorización tengan acceso.
Por otro lado, la seguridad es un conjunto de mecanismos que protegen al sistema contra ataques maliciosos.
Un sistema puede tener una protección adecuada, pero al mismo tiempo estar expuesto a fallos y permitir accesos inapropiados. Por eso es necesario disponer de mecanismos de seguridad que se encarguen de defender el sistema frente a ataques internos y externos.
Eso incluye a virus y gusanos, ataques de denegación de, robo de identidad y uso no autorizado del sistema, entre muchos otros tipos de ataque.
Referencias de las API
Sección titulada «Referencias de las API»POSIX
Realiza operaciones de control sobre dispositivos.
int ioctl(int fd, unsigned long request, ...);Proyecta un archivo o dispositivo en la memoria del proceso.
void* mmap(void* addr, size_t length, int prot, int flags, int fd, off_t offset);Abre o crea un archivo y devuelve un descriptor de archivo.
int open(const char* pathname, int flags);int open(const char* pathname, int flags, mode_t mode);Lee datos de un descriptor de archivo.
ssize_t read(int fd, void* buf, size_t count);