Tema 18. Sistemas operativos: Gestión de entradas/salidas
1. Índice
2. Vinculación curricular
- SMR / Sistemas operativos monopuesto → administra el sistema operativo, instala controladores y gestiona periféricos locales para el mantenimiento del equipo.
- ASIR / Implantación de sistemas operativos → configura la gestión de dispositivos y sistemas de almacenamiento, sirve para asegurar el rendimiento en la administración de servidores.
- ASIR / Planificación y administración de redes → gestiona el rendimiento de los cuellos de botella en tarjetas de red, optimiza la conectividad en entornos empresariales.
3. Introducción
El diseño inicial de los ordenadores delegaba el control de periféricos en el procesador principal. Esta arquitectura obligaba a la unidad central a comprobar el estado del dispositivo repetidamente antes de realizar una transferencia. El método generaba bloqueos constantes y la pérdida de ciclos de cálculo. La gestión de entradas y salidas resuelve la gran diferencia de velocidad de operación entre la memoria principal y los dispositivos externos electromecánicos.
El tiempo de espera de un disco magnético supera en varios órdenes de magnitud a la velocidad de la memoria electrónica. El sistema operativo organiza esta complejidad técnica empleando una estructuración por capas. Este modelo jerárquico aísla a las aplicaciones de las particularidades del hardware. La capa superior ofrece a los programas una interfaz de programación uniforme para interactuar con la información sin depender de la tecnología física de soporte.
En el nivel inferior se sitúan los controladores de dispositivos, que traducen las peticiones genéricas del sistema a los comandos eléctricos que cada periférico comprende. Un editor de texto guarda un documento utilizando la misma instrucción estandarizada en cualquier equipo. El controlador de la unidad asume la responsabilidad de adaptar la escritura de los datos si el destino final es un disco duro tradicional o una memoria flash USB.
La ingeniería de software implementó el mecanismo de spooling en los primeros sistemas de procesamiento por lotes. Este modelo de gestión de trabajos utiliza el almacenamiento secundario como área de retención intermedia. Su diseño nació para evitar que una impresora lenta monopolizara la salida de los programas operativos. El sistema vuelca los datos en disco a alta velocidad y alimenta al periférico de impresión de forma asíncrona.
En la formación profesional, comprender la arquitectura de entradas y salidas permite al alumno diagnosticar problemas de rendimiento en un servidor de producción.
Un servicio de bases de datos degrada su velocidad si los tiempos de escritura exceden los límites tolerables. El futuro administrador evalúa este flujo de datos para seleccionar políticas de planificación de discos, como el algoritmo del ascensor, que reordenan las peticiones encoladas y reducen el movimiento del cabezal de lectura.
4. Desarrollo
4.1. Arquitectura y clasificación de dispositivos
4.1.1. Controladoras de dispositivo e interfaces físicas
Los sistemas informáticos interaccionan con el exterior mediante una gran variedad de periféricos. Un periférico es un aparato físico independiente que requiere un componente intermedio para traducir las señales y coordinar la transmisión de datos. Este componente intermedio separa la mecánica del dispositivo de la lógica de comunicación con el sistema central.
Las controladoras de dispositivo son la circuitería electrónica que actúa como interfaz física entre el bus del sistema y el aparato periférico. Su función consiste en recibir comandos de alto nivel procedentes del procesador y convertirlos en secuencias de señales eléctricas que el dispositivo físico puede interpretar. Esta separación exime al procesador de gestionar los detalles electromecánicos específicos de cada aparato.
Para establecer la comunicación, la controladora utiliza un conjunto de ubicaciones de memoria interna denominadas registros. El registro de estado proporciona información sobre la situación del periférico, indicando si está ocupado, si ha terminado una tarea o si ha detectado un error. El procesador lee este registro para tomar decisiones sobre el flujo de datos.
El registro de control permite al procesador configurar el dispositivo y enviarle comandos específicos, como iniciar una lectura o expulsar un disco. Los registros de datos operan como almacenes temporales. El registro de entrada retiene los datos que el dispositivo envía hacia el procesador, y el registro de salida guarda los datos que el procesador envía hacia el dispositivo.
El procesador accede a estos registros mediante dos técnicas principales. En la entrada/salida mapeada en memoria, los registros ocupan un espacio de direcciones compartido con la memoria principal. En la entrada/salida aislada, los registros utilizan un espacio de direcciones separado que requiere instrucciones de máquina específicas para su acceso.
4.1.2. Dispositivos de bloque y almacenamiento
Los dispositivos de bloque almacenan información en fragmentos de tamaño fijo con direcciones independientes. El tamaño de estos bloques viene determinado por la estructura física o lógica del dispositivo, oscilando comúnmente entre 512 bytes y varios kilobytes. Ejemplos representativos de esta categoría son los discos duros magnéticos, las unidades de estado sólido y las unidades ópticas.
La propiedad que define a estos dispositivos es que el sistema operativo lee o escribe cada bloque de forma independiente del resto. El software puede solicitar el bloque 45, luego el bloque 12 y después el bloque 89, sin restricciones de secuencia. Esta capacidad permite el soporte de sistemas de archivos estructurados y bases de datos.
Para aislar la geometría física del disco, las controladoras modernas emplean el direccionamiento lógico de bloques o LBA (Logical Block Addressing). El sistema LBA numera todos los bloques del dispositivo de forma secuencial desde el número cero hasta el último bloque disponible. La controladora recibe el índice LBA y lo traduce internamente a la ubicación física de los cilindros, cabezales y sectores.
El rendimiento de un dispositivo de bloque depende del tamaño del bloque transferido y de la tasa de transferencia de la interfaz. Podemos calcular el tiempo de transferencia de un bloque en segundos mediante la siguiente relación matemática:
Donde representa el tamaño del bloque en bits y define la velocidad de transferencia del enlace en bits por segundo. Un tamaño de bloque mayor reduce el número de operaciones de entrada/salida necesarias para leer un archivo, pero aumenta la fragmentación interna si los archivos son pequeños.
4.1.3. Dispositivos de flujo de caracteres
Los dispositivos de flujo de caracteres envían y reciben flujos de bytes sin estructura de bloque ni direccionamiento. El sistema operativo transfiere un carácter detrás de otro, formando una secuencia lineal ininterrumpida. No admiten operaciones de búsqueda (seek) ni permiten saltar a posiciones arbitrarias del flujo.
Ejemplos de esta categoría incluyen teclados, ratones, puertos serie e impresoras. En un teclado, el usuario genera un flujo de eventos de pulsación que el sistema procesa en el orden exacto de llegada. En una impresora, el sistema operativo envía un flujo continuo de códigos de caracteres y comandos de formato que el aparato imprime secuencialmente.
El núcleo del sistema operativo gestiona estos periféricos mediante colas de caracteres. Una cola de caracteres aplica un modelo de productor-consumidor donde el dispositivo escribe caracteres que el proceso lee, o viceversa. A diferencia de las cachés de los dispositivos de bloque, los caracteres de una cola se destruyen en el momento de su lectura y no pueden reutilizarse.
El sistema operativo puede aplicar una disciplina de línea al flujo de caracteres antes de entregarlo a la aplicación. En el modo procesado o cooked, el sistema interpreta caracteres especiales, como los retrocesos de carro o las secuencias de borrado. En el modo raw, el sistema entrega los datos binarios en bruto, dejando la interpretación bajo la responsabilidad de la aplicación.
| Característica | Dispositivos de bloque | Dispositivos de carácter |
|---|---|---|
| Unidad de transferencia | Bloques de tamaño fijo | Flujo continuo de bytes |
| Direccionamiento | Aleatorio (mediante índices) | Inexistente (secuencial) |
| Almacenamiento temporal | Caché de búferes en memoria | Colas FIFO de caracteres |
| Ejemplos comunes | Discos magnéticos, unidades ópticas | Teclados, ratones, puertos serie |
4.1.4. Dispositivos de red e interfaces de comunicación
Los dispositivos de red requieren un tratamiento distinto, ya que no encajan en el modelo tradicional de bloques ni en el de flujo continuo de caracteres. Transmiten información formateada en paquetes a través de enlaces de comunicaciones, con latencias variables y eventos de llegada impredecibles. Las características asíncronas de la comunicación de paquetes dificultan su integración bajo las mismas rutinas de entrada/salida.
Para solucionar esta disparidad, los sistemas operativos requieren interfaces específicas como los sockets. Un socket define un punto final de comunicación que encapsula los detalles de los protocolos de red subyacentes. El programador emplea la interfaz de sockets para solicitar la transmisión de datos sin manipular directamente los registros de la tarjeta de red.
El direccionamiento en los dispositivos de red opera a múltiples niveles. A nivel físico, la tarjeta de interfaz de red utiliza una dirección de control de acceso al medio o MAC. A nivel lógico, la pila de protocolos del sistema operativo emplea direcciones IP para enrutar los paquetes y números de puerto para entregar la información a la aplicación correcta.
El sistema operativo realiza procesos de multiplexación y demultiplexación. Al recibir un paquete de red, el sistema examina la cabecera del protocolo, identifica el puerto de destino y deposita los datos en la cola de recepción del socket correspondiente. Esto permite que múltiples aplicaciones compartan la misma interfaz física de red simultáneamente.
4.1.5. Modelos de transferencia y acceso directo a memoria
La comunicación entre el procesador y los registros de la controladora define el modelo de transferencia. En la entrada/salida programada (PIO), el procesador ejecuta un bucle de comprobación constante (polling) para determinar el estado del dispositivo. El procesador copia directamente cada byte o palabra desde la controladora hacia la memoria principal, invirtiendo ciclos de reloj en la tarea.
Para reducir esta carga de procesamiento, los sistemas implementan la entrada/salida por interrupciones. El procesador envía el comando a la controladora y cambia de contexto para ejecutar otro proceso. Cuando el dispositivo finaliza la operación, emite una interrupción hardware que obliga al procesador a retomar la tarea de entrada/salida. Aunque mejora la concurrencia, el procesador sigue asumiendo el coste de mover los datos a la memoria.
La solución a las transferencias de alto volumen recae en el acceso directo a memoria o DMA. El sistema incorpora un procesador especializado llamado controlador DMA. El procesador principal delega la transferencia indicando la dirección de origen, la dirección de destino y el tamaño total del bloque de datos en bytes.
El controlador DMA toma el control del bus de memoria y transfiere la información sin intervención del procesador principal. Utiliza una técnica conocida como robo de ciclo, donde suspende brevemente el acceso del procesador al bus para transferir una palabra de datos. Al concluir el bloque completo, el controlador DMA genera una única interrupción.
El impacto del acceso directo a memoria sobre el rendimiento general del sistema resulta matemáticamente demostrable. Si definimos como el tiempo de CPU consumido por la entrada/salida programada y como el tiempo consumido al configurar la transferencia DMA, el tiempo de procesamiento ahorrado se expresa con la siguiente fórmula:
En esta ecuación, define el número total de bytes del bloque y indica el tiempo que invierte el procesador en copiar un solo byte. Mientras mayor sea el volumen del bloque transferido, mayor cantidad de ciclos de reloj quedan liberados para la ejecución de procesos de usuario.
4.2. Técnicas de control de transferencias
La transferencia de datos entre los periféricos y la memoria principal requiere mecanismos de sincronización. Los periféricos operan a velocidades distintas a las del procesador, lo que obliga a implementar métodos para coordinar el flujo de información sin detener el progreso del sistema.
4.2.1. Entrada/salida programada (polling)
La entrada/salida programada, también conocida como polling, delega en el procesador el control absoluto de la operación. El procesador ejecuta las instrucciones de entrada y salida, comprobando el estado del dispositivo, enviando órdenes y transfiriendo los datos.
Durante esta técnica, el procesador lee el registro de estado del módulo de entrada/salida. Si el dispositivo no está preparado, el procesador ejecuta un bucle continuo comprobando el estado del dispositivo hasta que la operación termina. Este comportamiento ocupa tiempo de proceso en una espera ociosa.
La espera ociosa consume ciclos de reloj que el procesador podría utilizar para otras tareas. El rendimiento general del sistema decrece cuando los dispositivos presentan altas latencias. Podemos modelar el tiempo total de la operación como la suma del tiempo de espera y el tiempo de transferencia de cada palabra:
En esta fórmula, representa el número de palabras transmitidas. Si es grande, la tasa de transferencia efectiva disminuye drásticamente. El procesador actúa como intermediario forzoso, leyendo el dato del dispositivo hacia un registro interno y escribiéndolo posteriormente en la memoria.
4.2.2. Entrada/salida dirigida por interrupciones
La entrada/salida dirigida por interrupciones surge para evitar la espera ociosa del procesador. En este modelo, el procesador emite una orden de lectura o escritura al dispositivo y continúa la ejecución de otros procesos.
Cuando el dispositivo está listo para intercambiar datos, envía una señal física a la CPU a través de una línea de control. Esta señal se denomina interrupción y notifica al procesador que el periférico requiere atención. El procesador evalúa la presencia de interrupciones al final de cada ciclo de instrucción.
Al detectar la señal, el procesador detiene el programa en curso y realiza un cambio de contexto. Este cambio consiste en guardar el contador de programa y los registros de estado en la pila del sistema. El hardware carga en el contador de programa la dirección de la rutina de servicio de interrupción (ISR).
La ISR lee el dato del módulo de entrada/salida y lo almacena en memoria. Una vez que la transferencia de la palabra finaliza, la rutina restaura el contexto del programa original. El procesador retoma la ejecución del programa de usuario en el punto exacto donde lo pausó.
Este mecanismo mejora la utilización del procesador. El procesador invierte tiempo únicamente en el inicio de la operación y en el procesamiento de la rutina de servicio. Sin embargo, para transferencias de gran volumen, la interrupción por cada palabra transmitida acumula una penalización temporal medible.
4.2.3. Acceso directo a memoria (DMA)
El acceso directo a memoria (DMA) elimina la intervención del procesador en la transferencia de datos entre el dispositivo y la memoria principal. Emplea un procesador especializado llamado controlador DMA, que asume el control del bus del sistema.
Para iniciar la operación, la CPU programa los registros del controlador DMA. La CPU envía la dirección del dispositivo, la posición de memoria de inicio, el tamaño del bloque a transferir y el tipo de operación. Una vez configurado, el procesador reanuda la ejecución de otras tareas sin intervenir en el movimiento de la información.
El controlador DMA transfiere bloques de datos directamente entre el dispositivo y la memoria. Emite órdenes de lectura y escritura a la memoria principal de forma autónoma. El controlador incrementa sus punteros de dirección y decrementa el contador de palabras transferidas tras cada ciclo.
Cuando el contador de bloque llega a cero, el controlador DMA envía una única señal de interrupción al procesador. El procesador participa solo al comienzo de la transferencia global y al finalizar todo el bloque, reduciendo la penalización temporal.
| Característica | Polling | Interrupciones | DMA |
|---|---|---|---|
| Iniciación | CPU | CPU | CPU |
| Transferencia | CPU | CPU | Controlador DMA |
| Uso de CPU | Alto (espera activa) | Medio (cambios de contexto) | Bajo (configuración inicial) |
| Aviso de fin | Lectura de estado | Señal hardware por palabra | Señal hardware por bloque |
El uso del DMA optimiza los sistemas que manejan discos magnéticos, redes y dispositivos de almacenamiento de estado sólido. La tasa de transferencia queda limitada por la velocidad de la memoria principal y el ancho de banda del bus, no por la capacidad del procesador.
4.2.4. Transferencia por robo de ciclo y modos de operación DMA
Para que el controlador DMA lea o escriba en la memoria principal, necesita el control del bus del sistema. Dado que el procesador también usa este bus para captar instrucciones y datos, se produce una contención. El controlador DMA solicita el control del bus al procesador mediante una señal de petición.
El método más común para ceder este control se llama robo de ciclo. El controlador DMA pausa la actividad de la CPU durante los ciclos de reloj exactos en que necesita escribir o leer del bus del sistema. El procesador desactiva sus señales de salida hacia el bus para permitir que el controlador DMA conduzca las líneas de datos y direcciones.
El robo de ciclo frena temporalmente la ejecución del procesador. La CPU no realiza un cambio de contexto ni ejecuta código alternativo; simplemente espera un ciclo de bus. Puesto que las operaciones de entrada/salida no suelen requerir ciclos continuos ininterrumpidos, el impacto en la ejecución de la CPU resulta casi imperceptible frente a la ganancia en la transferencia del bloque.
Los controladores DMA ofrecen otros modos de operación. En el modo ráfaga (burst mode), el controlador retiene el control del bus hasta transferir el bloque completo de datos. Impide que el procesador acceda a la memoria durante toda la operación, lo que acelera la entrada/salida a costa de detener el procesamiento. En el modo transparente, el DMA monitorea el procesador y realiza transferencias únicamente cuando la CPU decodifica instrucciones internamente y no necesita el bus externo.
4.2.5. Evolución hacia los canales y procesadores de entrada/salida
A medida que los sistemas informáticos aumentan su complejidad, la arquitectura de entrada y salida evoluciona para independizar estas tareas del procesador central. El controlador DMA representa una fase intermedia en esta progresión hacia la autonomía total.
El siguiente paso evolutivo integra un canal de entrada/salida. Un canal es un procesador de propósito específico con un repertorio de instrucciones propio, orientado exclusivamente a operaciones de dispositivos periféricos. La CPU no programa directamente registros físicos; instruye al canal para que ejecute un programa residente en la memoria principal.
El canal lee las instrucciones de memoria, coordina las secuencias de órdenes hacia el dispositivo y controla el flujo de los datos mediante acceso directo a memoria. Al terminar la ejecución de su programa, el canal notifica al procesador central mediante una interrupción.
El grado de autonomía culmina con la arquitectura de procesadores de entrada/salida. Estos módulos disponen de memoria local, registros propios y capacidad de cómputo independiente. Pueden administrar grandes conjuntos de dispositivos de comunicación o almacenamiento interactuando de forma mínima con el sistema central. En este modelo, el sistema principal envía mensajes de alto nivel y el procesador de entrada/salida gestiona toda la actividad en segundo plano.
4.3. Organización y capas del software de entradas/salidas
4.3.1. Arquitectura jerárquica del software de entradas y salidas
El diseño del software encargado de las entradas y salidas se estructura mediante una arquitectura de capas superpuestas. Cada capa realiza un conjunto de funciones bien definidas y ofrece una interfaz estándar a la capa superior. El objetivo de este diseño consiste en ocultar las particularidades del hardware a los programas. Las aplicaciones operan con dispositivos abstractos sin necesitar conocer los detalles electromecánicos de los componentes físicos subyacentes.
La información fluye a través de estas capas de abstracción desde las aplicaciones de usuario hasta el hardware físico, y viceversa. La modularidad permite sustituir, actualizar o reprogramar el código de una capa específica sin afectar al resto del sistema operativo. El sistema divide las responsabilidades en cuatro niveles principales de software que organizan el tráfico de la información.
El nivel superior atiende directamente las peticiones del usuario humano o de los programas de escritorio. Conforme la solicitud desciende por la jerarquía, el sistema operativo añade detalles técnicos y traduce los nombres simbólicos a direcciones físicas. El nivel más bajo opera enviando impulsos eléctricos y leyendo señales de estado directamente desde los registros del silicio de la máquina.
4.3.2. Manejadores de interrupciones
Las operaciones de hardware suceden de forma asíncrona respecto a la ejecución de los programas secuenciales. Cuando un dispositivo finaliza una tarea de lectura o escritura, genera una señal eléctrica para avisar al procesador principal. El hardware transfiere el control a unas rutinas de bajo nivel llamadas manejadores de interrupciones. Estos manejadores constituyen la capa de software en contacto directo con las señales físicas emitidas por los buses del sistema.
El objetivo del manejador consiste en atender el aviso del hardware y desbloquear el proceso que originó la petición. Para lograrlo, la rutina salva el estado del proceso en curso almacenando sus registros, el contador de programa y la palabra de estado en la pila del núcleo. El estado del proceso interrumpido queda congelado de forma temporal en las estructuras de memoria del sistema operativo.
A continuación, el manejador consulta un vector de interrupciones para determinar el origen del aviso y ejecuta la subrutina específica para dicho dispositivo. Podemos modelar el tiempo total de procesamiento de una interrupción como la suma del tiempo de cambio de contexto y el tiempo de ejecución de la rutina específica de servicio.
Donde representa el tiempo necesario para guardar los registros y el tiempo para recuperar el estado original del procesador. La rutina específica verifica el estado del hardware y desbloquea el controlador de dispositivo que esperaba la finalización de la operación. Finalmente, el manejador recupera la información de estado guardada y el procesador retoma el programa original en el punto exacto en que fue detenido.
4.3.3. Controladores de dispositivos
Cada componente de hardware posee características eléctricas, velocidades de transferencia y conjuntos de instrucciones únicas. Para interactuar de manera ordenada con ellos, el sistema operativo utiliza los controladores de dispositivos o drivers. Un controlador es un código específico provisto por el fabricante del hardware que conoce la electrónica interna del periférico. Este software acepta peticiones genéricas de las capas superiores y las traduce a comandos físicos concretos.
Los controladores operan normalmente dentro del espacio de direcciones del núcleo, el área de memoria con privilegios de ejecución absolutos. El controlador verifica los parámetros lógicos de la petición y comprueba el registro de estado del equipo físico. Si el hardware opera en otra solicitud previa, el controlador añade el nuevo trabajo a una cola de peticiones internas y espera su turno de procesamiento.
Cuando el dispositivo queda libre, el controlador emite una secuencia de comandos hacia los registros de control del hardware. Si el dispositivo utiliza el acceso directo a memoria (DMA), el controlador programa los registros del circuito DMA con la dirección RAM de origen y el tamaño del bloque. El controlador suspende entonces su actividad de procesamiento para no consumir ciclos de CPU y delega la transferencia al controlador DMA.
El hardware DMA transfiere los datos físicamente y levanta una señal de interrupción al finalizar. El manejador de interrupciones despierta al controlador de dispositivo correspondiente. El controlador comprueba los bits de estado del dispositivo físico para verificar si los datos se transmitieron sin alteraciones o si ocurrieron colisiones. Posteriormente, el controlador transfiere los datos limpios a las capas superiores del sistema.
4.3.4. Software del sistema operativo independiente del dispositivo
Por encima de los controladores específicos existe una capa de software que proporciona funciones comunes para administrar todas las familias de periféricos. El software independiente del dispositivo agrupa tareas de entrada y salida que no dependen de la electrónica física de cada máquina. Esta abstracción general facilita la programación de utilidades de sistema y proporciona un comportamiento uniforme.
Una función de esta capa consiste en proporcionar una nomenclatura unificada. El sistema operativo relaciona los identificadores simbólicos de los programas con los dispositivos físicos subyacentes. El software mapea el nombre lógico suministrado por el usuario hacia el identificador principal y secundario del controlador requerido. Esta asignación de nombres permite aplicar reglas de control de acceso para proteger a los periféricos de un uso no autorizado.
Otra tarea del software independiente del dispositivo es la asignación de recursos físicos. El sistema gestiona el uso exclusivo de dispositivos que no admiten acceso simultáneo, como las unidades de respaldo magnético. La capa recibe las peticiones de asignación, bloquea a los procesos si el recurso se encuentra ocupado y lo libera ordenadamente cuando finaliza la operación mecánica.
| Función operativa | Descripción de la actividad en el software independiente del dispositivo |
|---|---|
| Nomenclatura | Mapeo de nombres de archivo simbólicos a los controladores de hardware correspondientes. |
| Protección | Verificación de listas de control de acceso antes de otorgar uso sobre el dispositivo físico. |
| Tamaño de bloque | Agrupación de sectores de disco variables en bloques lógicos de tamaño uniforme. |
| Uso de búferes | Almacenamiento intermedio de la información para compensar velocidades de transferencia. |
| Reporte de errores | Tratamiento unificado de fallos mecánicos y notificación estructurada a los programas. |
La administración de búferes consume gran parte de la memoria en este nivel. Leer información directamente hacia el programa de usuario ocasiona problemas de segmentación de memoria. El sistema operativo utiliza el espacio del núcleo para retener temporalmente los datos. Con esquemas de doble búfer o búfer circular, el sistema vuelca los datos en un segundo bloque mientras el proceso consume la información previamente almacenada en el primero.
El reporte y manejo de errores se unifica desde esta capa. Cuando el hardware falla de manera irrecuperable, el controlador de dispositivo identifica el problema electromecánico. El software independiente recibe esta alerta detallada y estandariza el código de fallo en variables predefinidas. El sistema retorna este código de error universal a la aplicación para que inicie su rutina de tratamiento de excepciones.
4.3.5. Software de entrada y salida en el espacio de usuario
La capa superior del diseño está formada por el software que opera fuera del núcleo del sistema, en el espacio de usuario. Este nivel se ubica en el área de memoria sin privilegios especiales de ejecución de máquina. El software en el espacio de usuario está compuesto por las bibliotecas dinámicas y las rutinas de llamadas al sistema operativo. Las aplicaciones interaccionan con la entrada y salida utilizando estos módulos estándar.
Las bibliotecas proporcionan funciones convenientes de lectura o escritura de datos formateados. Al emplear estas funciones, el programa invoca internamente una llamada al sistema, que ocasiona un salto controlado de protección hacia el código del núcleo. La biblioteca empaqueta los parámetros proporcionados por la aplicación y efectúa la transición en el procesador.
/* Envío de un flujo de información desde el espacio de usuario */ #include <unistd.h> int main() { char bloque_datos[] = "Salida de información estándar"; /* La rutina write efectúa la llamada al sistema de forma segura */ write(1, bloque_datos, sizeof(bloque_datos)); return 0; }
El software en el espacio de usuario implementa las abstracciones de alto nivel que simplifican el diseño de aplicaciones. Los programadores manejan entidades conceptuales conocidas como archivos y tuberías.
Un archivo representa una colección estructurada de datos almacenados, con independencia del cilindro magnético en el que reside. Las tuberías facilitan canales de comunicación unidireccionales entre procesos de memoria distintos, enmascarando las transferencias bajo un formato unificado de lectura de bytes.
El sistema de spooling emplea un proceso demonio y un directorio temporal de acopio. Cuando varios programas demandan un dispositivo físico no compartible, evitan comunicarse de manera directa con su controlador.
Los programas depositan sus resultados en el directorio temporal y el proceso demonio se encarga de enviarlos de forma individualizada y secuencial hacia el periférico físico. El mecanismo impide la corrupción visual de los documentos ocasionada por una escritura intercalada y concurrente.
4.4. Servicios del subsistema de entradas/salidas del núcleo
4.4.1. Planificación de peticiones físicas
La planificación consiste en el reordenamiento de las peticiones en cola para optimizar el acceso físico al dispositivo. El sistema operativo recibe solicitudes asíncronas de lectura y escritura procedentes de los distintos procesos en ejecución. El núcleo almacena estas peticiones en una estructura de datos asociada al controlador del hardware correspondiente.
En los dispositivos de almacenamiento magnético, el tiempo de respuesta varía según la posición de las partes mecánicas. El modelo matemático del tiempo de acceso integra tres variables de latencia:
El parámetro que permite mayor optimización por software es el tiempo de búsqueda en línea recta (). El algoritmo SSTF (Shortest Seek Time First) elige siempre la petición más cercana a la posición actual del brazo lector. El sistema reduce los tiempos de desplazamiento promedio, pero genera inanición en los extremos del disco si recibe solicitudes continuas en los sectores centrales.
El algoritmo SCAN desplaza el brazo del disco en un único sentido hasta alcanzar el extremo del plato. El sistema atiende todas las peticiones que encuentra en su trayectoria antes de invertir la dirección del movimiento. El algoritmo C-SCAN (Circular SCAN) realiza el barrido en una sola dirección y retorna al inicio del disco sin atender peticiones. El núcleo homogeneiza los tiempos de espera mediante este retorno rápido, evitando la discriminación de los cilindros externos.
Sistemas operativos modernos implementan planificadores avanzados que separan las operaciones. El núcleo mantiene colas independientes para lectura y escritura, asignando tiempos máximos de espera para evitar la inanición total de cualquier proceso asíncrono.
4.4.2. Uso de memorias intermedias o buffering
El buffering es el almacenamiento temporal de datos en la memoria principal para compensar las diferencias de velocidad de transferencia entre el origen y el destino. El sistema reserva una zona de memoria rápida, denominada búfer, que actúa como espacio de acoplamiento.
El núcleo emplea esta técnica para adaptar diferentes tamaños de transferencia. El subsistema de red fragmenta mensajes grandes en paquetes pequeños para su transmisión. En el extremo receptor, el sistema operativo acumula los paquetes entrantes en un búfer de reensamblaje antes de entregar el mensaje completo a la aplicación.
En el modelo de búfer simple, el sistema operativo asigna un bloque de memoria en el espacio del núcleo. El dispositivo hardware transfiere los datos a este bloque mediante acceso directo a memoria. El núcleo interrumpe el proceso de usuario, copia los datos al espacio de la aplicación y reanuda la ejecución.
El modelo de búfer doble emplea dos áreas de memoria independientes. El dispositivo llena el primer búfer de forma autónoma. El sistema copia o procesa el contenido de este primer bloque mientras el dispositivo comienza a llenar el segundo búfer simultáneamente.
El búfer circular encadena múltiples áreas de memoria intermedia. El sistema utiliza esta estructura de datos en dispositivos que manejan flujos continuos y de alto volumen, como las interfaces de red o de audio. El productor y el consumidor avanzan de forma asíncrona sobre las distintas posiciones del anillo de memoria.
[!TIP]
🧩 Analogía: Podemos comparar el buffering con el uso de un cubo de agua para llenar una piscina desde un grifo de goteo lento. El cubo (búfer) acumula el agua lentamente y, una vez lleno, se vierte de golpe en la piscina (memoria de la aplicación). El sistema desacopla la velocidad del grifo de la velocidad de vaciado del cubo.
4.4.3. Implementación de la caché de entrada/salida
La caché almacena copias de los datos más referenciados en una memoria electrónica rápida para eludir el acceso a un soporte físico más lento. El subsistema de entrada/salida implementa la caché de bloques para retener los sectores del disco accedidos recientemente.
Cuando un proceso ejecuta una operación de lectura, el núcleo verifica primero la presencia de los datos en la caché. Si ocurre un acierto, el sistema satisface la petición copiando los datos desde la memoria RAM. El sistema evita la interacción directa con el controlador del disco y acorta los tiempos de respuesta.
El núcleo aplica el principio de localidad espacial mediante técnicas de lectura adelantada. El planificador solicita al disco la transferencia de bloques adicionales contiguos al bloque solicitado originalmente. El sistema asume que la aplicación requerirá acceder a esos datos adyacentes a corto plazo.
Para las operaciones de salida, el sistema emplea la escritura diferida. El núcleo actualiza el contenido del bloque en la memoria caché y lo marca con un indicador de estado modificado. Periódicamente, un subproceso del sistema operativo vuelca estos bloques alterados al almacenamiento persistente en una única operación agrupada.
El sistema debe limitar el consumo de memoria principal. El núcleo implementa algoritmos de reemplazo como LRU (Least Recently Used). El algoritmo descarta el bloque que lleva más tiempo sin recibir accesos cuando necesita alojar nuevos datos procedentes del dispositivo físico.
| Característica | Buffering | Caching |
|---|---|---|
| Propósito | Compensar diferencias de velocidad y tamaño. | Reducir el tiempo de acceso a datos frecuentes. |
| Contenido | Contiene la única copia del dato en tránsito. | Contiene una copia de un dato alojado en el disco. |
| Reutilización | El sistema descarta el dato tras entregarlo. | El sistema conserva el dato para futuras lecturas. |
4.4.4. Técnica de spooling para dispositivos
El spooling es la creación de colas de salida en almacenamiento secundario para multiplexar el uso de dispositivos de acceso exclusivo. El acrónimo deriva del término inglés Simultaneous Peripheral Operations On-Line.
Los periféricos físicos como impresoras o grabadoras de cinta magnética imponen restricciones de concurrencia. El hardware no puede intercalar flujos de datos procedentes de múltiples procesos sin corromper el resultado final. El sistema operativo debe gestionar el acceso secuencial de manera transparente para el usuario.
El núcleo intercepta todas las peticiones dirigidas al dispositivo exclusivo. El sistema escribe el flujo de salida de cada aplicación en un archivo temporal independiente alojado en un directorio de spooling en el disco duro. El proceso de la aplicación finaliza su operación de entrada/salida rápidamente y continúa su ejecución matemática.
Un proceso especializado del sistema, denominado demonio (daemon), gestiona la comunicación directa con el hardware físico. El demonio monitoriza el directorio de spooling, extrae los archivos temporales de forma ordenada y los transmite al dispositivo periférico uno por uno.
El sistema provee interfaces de administración para la cola de spooling. El administrador del equipo puede visualizar los trabajos pendientes, pausar su ejecución o eliminar archivos temporales antes de que el demonio inicie su transferencia al dispositivo final.
4.4.5. Gestión de errores y protección de hardware
La gestión de errores comprende la aplicación de rutinas de recuperación ante fallos de lectura o escritura originados en el hardware físico. El sistema operativo encapsula estas deficiencias para presentar un comportamiento uniforme y predecible a las aplicaciones de nivel de usuario.
El núcleo clasifica los eventos anómalos según su naturaleza técnica. Los errores transitorios incluyen colisiones en la red de comunicaciones o faltas de sincronización en buses de datos. El controlador del dispositivo reacciona ejecutando algoritmos de reintento automático o ajustando las tasas de transmisión sin alertar al software superior.
Los errores permanentes derivan de daños físicos irreparables, como el desgaste magnético de un sector en el disco. El controlador notifica el evento al núcleo. El sistema operativo aísla el bloque dañado, cancela la transferencia y devuelve un código de excepción al proceso solicitante para que este decida la acción pertinente.
El sistema establece barreras de protección para evitar manipulaciones no autorizadas del hardware. Las arquitecturas de procesador proporcionan múltiples modos de operación para asegurar el control de privilegios. El núcleo del sistema operativo se ejecuta en modo supervisor, obteniendo autorización para modificar los registros de las controladoras.
El procesador clasifica las operaciones de entrada/salida como instrucciones privilegiadas. Las aplicaciones comunes operan en el modo usuario y carecen de autorización electrónica para dirigir señales a los puertos físicos de los dispositivos de entrada/salida.
[!WARNING]
❌ Error Común: Intentar evadir el núcleo escribiendo directamente en la dirección de memoria de un dispositivo (I/O mapeada en memoria) desde un programa de usuario. El procesador interceptará la acción, generará una excepción por violación de segmento de memoria y el sistema operativo finalizará la aplicación de forma abrupta (segmentation fault).
Para interactuar con el entorno exterior, la aplicación ejecuta una llamada al sistema. El procesador interrumpe el flujo normal, eleva el nivel de privilegio de forma controlada y cede la ejecución a una subrutina validada dentro del núcleo. El sistema operativo audita los permisos del proceso, interactúa con el hardware y devuelve los datos resultantes al espacio de usuario.
4.5. Implementación en sistemas operativos modernos
4.5.1. Arquitectura de entrada y salida en Linux
Los sistemas operativos actuales diseñan sus subsistemas para abstraer la complejidad del hardware subyacente. Linux adopta una filosofía organizativa donde representa cada componente físico como un archivo especial de dispositivo. Estos elementos residen habitualmente en el directorio /dev y funcionan como interfaces estándar de comunicación para las aplicaciones.
Los procesos interactúan con la electrónica subyacente leyendo o escribiendo en estos elementos mediante llamadas al sistema tradicionales. El sistema de archivos virtual (VFS) actúa como intermediario para proporcionar esta visión unificada de los recursos físicos. El kernel redirige estas operaciones hacia el módulo de software correspondiente basándose en identificadores numéricos únicos.
El número mayor identifica a la familia del módulo de control responsable de gestionar el dispositivo. El número menor especifica la unidad física exacta o la partición dentro de esa misma familia de componentes. El kernel mantiene tablas internas de dispersión que asocian estos identificadores numéricos con las operaciones específicas de lectura o escritura.
En los sistemas Linux contemporáneos, el demonio udev gestiona dinámicamente el contenido del árbol de dispositivos. Este proceso de usuario monitoriza los eventos generados por el sistema a través del sistema de archivos sysfs. El servicio crea o elimina los nodos de dispositivo en tiempo real según la conexión o desconexión física de los componentes eléctricos.
| Categoría | Tipo de transferencia | Ejemplo de elemento |
|---|---|---|
| Dispositivos de caracteres | Flujo de bytes secuencial sin formato estructurado | /dev/ttyS0 |
| Unidades de almacenamiento | Transferencia de datos aleatoria con tamaño fijo | /dev/sda1 |
| Dispositivos de red | Paquetes mediante interfaces estructuradas por sockets | eth0 (No aparece en /dev) |
| Pseudo-dispositivos | Generación o descarte lógico de datos informáticos | /dev/zero |
4.5.2. Planificadores de entrada y salida en Linux
El kernel implementa diferentes planificadores de E/S para organizar y optimizar las peticiones dirigidas al almacenamiento secundario. El planificador ascensor (Linus Elevator) agrupa las operaciones pendientes y las ordena según su ubicación geométrica. El algoritmo fusiona peticiones adyacentes para procesarlas en un solo viaje del cabezal electromecánico.
Para evitar la inanición de operaciones ubicadas en zonas alejadas, el sistema proporciona el planificador deadline. Este mecanismo asigna un tiempo de expiración riguroso a cada petición entrante. El planificador gestiona colas ordenadas por sector espacial y colas independientes ordenadas por fecha de vencimiento temporal.
El kernel prioriza sistemáticamente las lecturas frente a las escrituras para no detener la ejecución de los programas. El sistema asigna tiempos de expiración predeterminados de 500 milisegundos para leer datos y 5 segundos para volcar información. El sistema evalúa la caducidad mediante la siguiente relación temporal:
Donde marca el instante de caducidad, el tiempo de registro y la tolerancia máxima admitida. Cuando una petición supera este instante límite, el planificador abandona el orden espacial temporalmente y procesa la petición caducada de inmediato.
Otro algoritmo avanzado es el Completely Fair Queuing (CFQ), que actúa como el organizador por defecto en sistemas de escritorio. Este modelo genera una estructura de peticiones independiente para cada proceso activo del sistema. El algoritmo reparte el ancho de banda del hardware equitativamente entre los distintos procesos solicitantes.
El organizador CFQ extrae un número fijo de peticiones de cada lista utilizando una política de turno rotatorio. El algoritmo penaliza a los procesos que consumen excesivo tiempo de la unidad, reduciendo su ventana temporal de acceso. El ecosistema también soporta el planificador anticipatorio, que detiene brevemente la actividad de la unidad tras una lectura para procesar posibles operaciones adyacentes inmediatas.
4.5.3. Arquitectura del subsistema de entrada y salida en Windows
La familia de sistemas Windows estructura su interacción con el hardware mediante un modelo basado en capas modulares y fuertemente tipadas. El gestor de E/S centraliza todas las interacciones y actúa como intermediario primario entre las aplicaciones y el espacio del sistema. Este módulo exporta una interfaz abstracta y uniforme que enmascara las propiedades de cada tecnología.
El gestor recibe las llamadas del subsistema Win32 y construye las estructuras de datos nativas para comenzar la transferencia. El sistema asume que toda interacción con el hardware ocurre de forma asíncrona por defecto. La ejecución síncrona tradicional opera simplemente como una capa de compatibilidad superpuesta sobre este motor asíncrono subyacente.
El diseño integra estrechamente el administrador de energía y el administrador de recursos de configuración para responder a los cambios dinámicos. Estas entidades descubren la conexión de nuevos componentes electrónicos y cargan los módulos de software requeridos al vuelo. El registro de Windows conserva el estado de configuración para restaurarlo en posteriores inicios.
4.5.4. Jerarquía de controladores y paquetes de petición en Windows
El sistema Windows transporta la información entre los diferentes módulos internos mediante los paquetes de petición de E/S (IRP). Un IRP representa una estructura dinámica de memoria que encapsula todos los parámetros necesarios para ejecutar una tarea. El gestor asigna el paquete, introduce los parámetros del proceso solicitante y lo transmite a la interfaz superior de la jerarquía.
Las peticiones transitan a través de una pila de dispositivos, que conforma un conjunto ordenado de módulos de software vinculados. El IRP desciende por la jerarquía saltando de un estrato a otro hasta alcanzar el componente físico. El paquete contiene una matriz de ubicaciones de pila, donde cada nivel documenta y altera su estado operativo individual.
Cada ubicación en la matriz utiliza una estructura IO_STACK_LOCATION que especifica la función mayor y menor de la petición en curso. El entorno Windows divide la lógica de control en diferentes niveles de abstracción para agilizar el desarrollo de software. Los controladores de clase integran el comportamiento general aplicable a toda una familia de hardware, como pantallas o teclados.
Los minipuertos operan en el segmento inferior de la jerarquía y alojan el código particular de cada fabricante comercial. El minipuerto interactúa directamente con el adaptador físico y traduce los comandos estandarizados a señales eléctricas reales. El software de clase invoca funciones expuestas por el minipuerto para rematar el trabajo detallado.
El entorno admite instalar módulos de filtro en cualquier estrato de la jerarquía para interceptar o alterar la transferencia de datos. El sistema utiliza estos filtros para implementar el cifrado criptográfico sobre la marcha o el análisis antimalware. El paquete IRP asciende de vuelta por la misma jerarquía cuando la unidad física finaliza y notifica el éxito de la operación.
4.5.5. Interfaces de programación para operaciones asíncronas
Los sistemas operativos contemporáneos procesan flujos masivos de datos utilizando operaciones de E/S asíncrona. Las aplicaciones inician la transferencia de información y el sistema les restituye el control del procesador de forma instantánea. El hilo de ejecución continúa computando otras tareas lógicas mientras la unidad física despacha el traslado de los datos.
El kernel Linux brinda la interfaz de llamadas AIO (Asynchronous Input/Output) nativa para aplicaciones de alta disponibilidad. Los programas utilizan rutinas como io_submit para despachar un bloque de múltiples transferencias al kernel simultáneamente. El kernel encauza estas transferencias en segundo plano sin suspender la ejecución del programa solicitante.
El sistema Linux deposita los estados de finalización en una región de memoria compartida denominada anillo AIO. El proceso inspecciona directamente este anillo para comprobar qué transferencias concluyeron favorablemente. Este método erradica la penalización de realizar llamadas adicionales al sistema para verificar el progreso de las peticiones en vuelo.
El entorno Windows soporta la concurrencia masiva empleando los puertos de finalización de E/S (IOCP). Un IOCP vincula una cola de mensajes interna del sistema con múltiples manejadores de archivos o tuberías de red. El programa enlaza los descriptores al puerto y emite las lecturas asíncronas suministrando un área de memoria reservada.
Cuando el módulo de control finaliza de copiar los datos en el área de memoria, el sistema inserta un paquete de finalización en el puerto IOCP. Un grupo de hilos pre-instanciado aguarda pasivamente las notificaciones entrantes en dicho puerto. El organizador del sistema despierta a un único hilo de la reserva para procesar el paquete recibido.
La arquitectura de transferencias asíncronas maximiza la escalabilidad en servicios web o motores de bases de datos. El mecanismo previene la saturación generada por los cambios de contexto que ocurrirían al mantener un hilo inactivo por cada cliente. Los recursos lógicos del procesador se emplean exclusivamente en procesar eventos consolidados.
5. Conclusiones
La gestión de entradas y salidas estructura el sistema operativo mediante un diseño de múltiples capas (niveles de abstracción de software). Esta organización aísla la lógica física del hardware frente a las aplicaciones de usuario, los programas que ejecutan las tareas finales.
Al separar el código en módulos independientes, los desarrolladores modifican los controladores de dispositivo (programas que traducen instrucciones genéricas a comandos específicos del hardware) sin alterar los niveles superiores. Esto estandariza la comunicación con componentes muy diversos.
El rendimiento general del equipo mejora cuando el sistema emplea el acceso directo a memoria (DMA), una técnica que permite que un controlador especializado transfiera bloques de datos hacia la memoria principal sin solicitar la intervención constante del procesador.
Al utilizar el DMA, el sistema operativo reduce la carga de la unidad central frente a periféricos que operan a menores velocidades. El procesador atiende la ejecución de otros procesos simultáneos mientras la transferencia transcurre en segundo plano.
La adopción de las unidades de estado sólido (SSD), dispositivos que utilizan circuitos de memoria flash y carecen de componentes mecánicos, modifica el diseño tradicional del almacenamiento. Su arquitectura elimina el tiempo de búsqueda (el lapso empleado en mover el brazo mecánico hacia la pista) y el retardo rotacional (la espera hasta que el sector llega al cabezal). En un disco magnético, el tiempo de acceso sigue la expresión matemática .
Con la memoria flash y el protocolo NVMe (un estándar de comunicación para acceder a almacenamiento no volátil a través del bus PCIe), los tiempos y se anulan. Esta disminución de latencia desplaza el límite de rendimiento físico hacia las colas de peticiones (estructuras de datos donde el software ordena las operaciones pendientes). Los sistemas operativos rediseñan sus algoritmos de planificación de disco para sostener el ritmo de los nuevos dispositivos.
La virtualización de hardware integra estándares como SR-IOV (Single Root I/O Virtualization), una especificación que divide un dispositivo PCIe físico en múltiples interfaces independientes.
Esta técnica asigna las funciones físicas (capacidades completas del hardware) de las tarjetas directamente a las máquinas virtuales (entornos de ejecución simulados por software). El mecanismo elude el procesamiento de los datos por el hipervisor (el software gestor de los entornos virtuales), suprimiendo la latencia de la capa intermedia.
El estudio de la gestión de dispositivos forma parte de los currículos de informática en la Formación Profesional. El alumnado asimila cómo el software del sistema se adapta a las nuevas arquitecturas de memoria y virtualización de hardware. Las tareas prácticas aplican estos conceptos en la configuración de servidores, donde el almacenamiento de estado sólido y las redes virtualizadas definen la infraestructura técnica en los centros de datos.
6. Bibliografía
- Stallings, W., & Peña Sánchez, J. M. (2018). Sistemas operativos: aspectos internos y principios de diseño. Pearson. — Expone los detalles del DMA y la jerarquía de buffers.
- Silberschatz, A., Galvin, P. B., & Gagne, G. (2018). Operating system concepts. Wiley. — Proporciona el marco teórico del subsistema de entradas y salidas del núcleo.
- Tanenbaum, A. S., & Bos, H. (2015). Modern operating systems. Pearson. — Explica la evolución histórica de la E/S y el diseño de los drivers.
- Bovet, D. P., & Cesati, M. (2005). Understanding the Linux kernel. O'Reilly. — Detalla las estructuras de bloques de E/S y el funcionamiento en sistemas Unix.
- Allievi, A., & Ionescu, A. (2017). Windows internals. Microsoft Press. — Describe el recorrido de los paquetes de E/S (IRP) en arquitecturas Windows.
- Ministerio de Educación y Formación Profesional. (2023). Real Decreto 659/2023, por el que se desarrolla la ordenación del Sistema de Formación Profesional. BOE. — Establece el marco normativo actual de la docencia en la formación profesional.