Dispositivos de Entrada/Salida (E/S)

  • Tres categorías:
    • Legibles por **humanos**.
    • Legibles por **máquinas**.
    • **Dispositivos de comunicación**.

Diferencias Clave

  • **Velocidad de datos**.
  • **Aplicaciones**.
  • **Complejidad de control**.
  • **Unidad de transferencia**.
  • **Representación de los datos**.
  • **Condiciones de error**.

Técnicas para la Realización de E/S

E/S Programada

  • El proceso **espera** a que la operación de E/S **finalice** antes de continuar.

E/S Dirigida por Interrupciones

  • Se emite una orden de E/S al **módulo de E/S**.
  • El **procesador** continúa con la ejecución de otras instrucciones.
  • El módulo de E/S envía una **interrupción** al procesador cuando completa su tarea.

Acceso Directo a Memoria (DMA)

  • El **módulo DMA** controla el intercambio de datos entre la **memoria principal** y un módulo de E/S.
  • El procesador envía una **petición de transferencia** de un bloque de datos al módulo DMA y es **interrumpido** solo cuando el bloque completo ha sido transferido.

Evolución de las Funciones de E/S

Etapa 1: Control Directo del Procesador

  • El **procesador** controla directamente los **dispositivos periféricos**.

Etapa 2: Introducción del Controlador de E/S

  • Se añade un **controlador** o **módulo de E/S**.

El procesador sigue utilizando **E/S programada**.

El procesador ya no necesita manejar los detalles específicos de los dispositivos externos.

Etapa 3: E/S con Interrupciones

  • Uso del módulo de E/S con **interrupciones**.

El procesador no tiene que esperar a que la operación de E/S se complete para seguir ejecutando instrucciones.

Etapa 4: Acceso Directo a Memoria (DMA)

  • Implementación del **Acceso Directo a Memoria (DMA)**.

Los **bloques de datos** se mueven a la memoria principal sin la intervención directa del procesador.

El procesador interviene solo al **inicio** y al **final** de la transferencia.

Etapa 5: Módulo de E/S como Procesador Especializado

  • El módulo de E/S evoluciona hasta convertirse en un **procesador separado** con un conjunto de instrucciones especializadas para E/S.

Etapa 6: Módulo de E/S con Memoria Local

  • El módulo de E/S posee su propia **memoria local**.

Acceso Directo a Memoria (DMA) en Detalle

  • El módulo DMA es capaz de tomar el control para transferir datos desde y hacia la memoria principal a través del **bus del sistema**.
  • El módulo DMA debe usar el bus solamente cuando el procesador no lo necesite, o bien…
  • …también puede obligar al procesador a suspender temporalmente su operación, fenómeno conocido como **robo de ciclos**.
  • Cuando el procesador desea escribir o leer un bloque de datos, envía una orden al módulo DMA con la siguiente información:
    • La **dirección del dispositivo de E/S** involucrado (a través de la línea de datos).
    • La **ubicación de inicio** de la lectura o escritura en la memoria (a través de la línea de datos, almacenada en el registro de dirección del módulo DMA).
    • El **número de palabras** a leer o escribir (almacenado en el registro de contador de datos).
  • De esta manera, el procesador **delega** la operación de E/S al módulo DMA. Cuando este finaliza la transferencia de datos, envía una **señal de interrupción** al procesador. Así, el procesador solo está involucrado al inicio y al final de la transferencia.
  • Cuando ocurre un **robo de ciclo**, el procesador se suspende justo antes de que necesite usar el bus.
  • Entonces, el DMA transfiere los datos y devuelve el control al procesador.
  • Esto no es una interrupción; simplemente el procesador espera un ciclo de bus.
  • El efecto final es que el procesador ejecuta sus tareas más lentamente.

Objetivos del Diseño del Servicio de E/S

Eficiencia

  • Evitar el **cuello de botella** que constituyen las operaciones de E/S.

Los dispositivos de E/S son extremadamente lentos en comparación con la **memoria principal**.

Multiprogramación

Permite que procesos esperen operaciones de E/S mientras otro proceso se ejecuta, mejorando la utilización de la CPU.

Intercambio (Swapping)

Es una operación de E/S por sí misma.

  • Crear esquemas que mejoren el **desempeño** de las operaciones de E/S.

Generalidad

  • Gestionar todos los dispositivos de manera **uniforme**.
  • Emplear un enfoque **jerárquico y modular** para el diseño de las funciones de E/S.
  • Ocultando los detalles específicos, de forma que los procesos y los niveles superiores del sistema contemplen a los dispositivos en términos de funciones generales: **lectura**, **escritura**, **apertura** y **cierre**.

Almacenamiento Intermedio (Buffering) de E/S

Realizar las transferencias de entrada por adelantado a las peticiones y las transferencias de salida un tiempo después de hacer la petición se conoce como **almacenamiento intermedio** o **buffering**.

Razones para el Almacenamiento Intermedio

  • Los procesos deben esperar a que termine la operación de E/S antes de seguir su ejecución.
  • Algunas páginas relacionadas con la operación de E/S deben permanecer en **memoria principal**.

Dispositivos Orientados a Bloques

  • Almacenan la información en **bloques**, realizando la transferencia de un bloque a la vez. Ejemplos: **discos** y **cintas**.

Dispositivos Orientados a Flujo

  • Transfieren los datos como una serie de **bytes**. Ejemplos: **impresoras**, **puertos de comunicación**, **ratones**, etc.

Memoria Intermedia Sencilla (Single Buffering)

Para Dispositivos Orientados a Bloques

  • Las transferencias de entrada se realizan en el **espacio del sistema**.
  • Cuando se ha completado la transferencia, el bloque es movido al **espacio de usuario** y se solicita otro bloque inmediatamente (**lectura por adelantado**).
  • El proceso de usuario puede procesar un bloque mientras se está leyendo el siguiente.
  • El sistema operativo podrá expulsar al proceso porque la operación de entrada tiene lugar en el espacio del sistema.
  • El sistema operativo debe guardar constancia de las asignaciones de **memoria intermedia**.

Memoria Intermedia Sencilla para Flujo

Para Dispositivos Orientados a Flujo

  • La operación se realiza **línea a línea**.
  • La entrada de usuario se realiza por líneas, marcadas con un **retorno de carro** al final de las mismas.
  • La salida es similar, también línea a línea.
  • Se emplea la memoria intermedia para guardar una sola línea.
  • El proceso de usuario quedará suspendido hasta que llegue la línea completa.
  • Para la salida, se coloca una línea en la memoria intermedia y el proceso continúa en ejecución.

Memoria Intermedia Doble (Double Buffering)

  • Existe una mejora significativa al incluir **doble almacenamiento intermedio**.
  • Un proceso puede transferir datos desde o hacia una memoria intermedia, mientras el sistema operativo vacía o rellena el otro, permitiendo la **concurrencia**.

Memoria Intermedia Circular (Circular Buffering)

  • Cuando se emplean más de dos memorias intermedias, se le conoce como **memoria intermedia circular**.
  • Cada memoria individual es una **unidad** en el *buffer* circular.
  • Es útil cuando los procesos tienen distintas operaciones de E/S rápidas.
  • Se utiliza el esquema **productor-consumidor** con memoria limitada.

Utilidad y Limitaciones del Almacenamiento Intermedio

Utilidad

  • Soluciona la alta demanda de operaciones de E/S.
  • En un entorno **multiprogramado**, donde hay tanto operaciones de E/S como peticiones de procesamiento, el almacenamiento intermedio es una herramienta que puede incrementar la **eficiencia** del sistema operativo.

Limitaciones

  • No existe un tamaño de memoria intermedia que pueda mantener el ritmo de operaciones de E/S indefinidamente.

Planificación de Discos

Parámetros de Rendimiento del Disco

Para leer o escribir, la **cabeza del disco** debe posicionarse en la pista deseada, al inicio del sector pertinente.

  • **Tiempo de búsqueda (Seek Time)**: Es el tiempo que se tarda en ubicar la cabeza en la pista adecuada.
  • **Retardo de giro o Latencia de giro (Rotational Latency)**: El tiempo que tarda el inicio del sector en llegar a la cabeza de lectura/escritura.

Parámetros de Rendimiento Adicionales

  • **Tiempo de acceso (Access Time)**: Es la suma del tiempo de búsqueda y el retardo de giro.

Es el tiempo total que se tarda en llegar a la posición de lectura o escritura deseada.

  • Una vez que la cabeza está ubicada, se puede llevar a cabo la operación de lectura o escritura a medida que el sector se mueve bajo la cabeza; esta es la parte de **transferencia real de datos**.

Políticas de Planificación del Disco

La razón principal de la diferencia en rendimiento de los discos se encuentra en el **tiempo de búsqueda**.

Si las solicitudes de acceso a un sector requieren selecciones de pista aleatorias, el rendimiento del sistema de E/S será pobre.

La **planificación aleatoria** es útil como medida comparativa para evaluar otras técnicas.

Primero en Entrar, Primero en Salir (FIFO)

  • Es la planificación más sencilla.
  • Los elementos se procesan de la cola en un orden secuencial.
  • Si hay pocos procesos que requieren acceso y muchas de las peticiones son a sectores agrupados de un archivo, se puede esperar un buen rendimiento.
  • Esta técnica se parece a la planificación aleatoria si hay muchos procesos compitiendo por el disco.

Prioridad

  • Este enfoque no persigue la optimización del uso del disco, sino cumplir con otros objetivos del sistema operativo, como la **respuesta rápida** a ciertos procesos.
  • Los trabajos por lotes que sean cortos y los trabajos interactivos reciben con frecuencia una **prioridad más alta** que trabajos mayores que realizan largas operaciones.
  • Los trabajos mayores pueden experimentar una espera excesiva (**inanición**).
  • Este tipo de política tiende a ser poco favorable para sistemas de bases de datos, donde la equidad y el rendimiento general son cruciales.

Último en Entrar, Primero en Salir (LIFO)

  • En los sistemas de procesamiento de transacciones, conceder el dispositivo al último usuario puede acarrear pocos o nulos movimientos del brazo al recorrer un fichero secuencial.
  • Si el disco está ocupado con una carga de trabajo larga, existe la posibilidad de **inanición** para otras peticiones.

Primero el Más Corto (Shortest Seek Time First – SSTF)

  • Elige la solicitud de E/S a disco que requiera el **menor movimiento posible del brazo** del disco desde su posición actual.
  • Siempre se elige procurando el **mínimo tiempo de búsqueda**.
  • Se puede usar un algoritmo aleatorio de desempate para resolver los casos de igualdad de distancias.

SCAN (Algoritmo del Ascensor)

  • Con las políticas anteriores, pueden llegar siempre nuevas peticiones que se elegirán antes que una petición existente, lo que puede causar inanición. Una alternativa simple que previene este tipo de inanición es la técnica **SCAN**.
  • El brazo solo se mueve en un sentido, resolviendo todas las peticiones pendientes en su ruta, hasta que alcanza la última pista o hasta que no haya más peticiones en esa dirección.
  • Una vez que llega al final, invierte la dirección del rastreo.

C-SCAN (Circular SCAN)

  • Restringe el rastreo a una sola dirección.
  • Cuando se ha visitado la última pista en un sentido, el brazo vuelve al extremo opuesto del disco sin atender peticiones y comienza a recorrerlo nuevamente en la misma dirección.

SCAN de N Pasos y FSCAN

  • La cola de peticiones del disco puede dividirse en segmentos, procesándose un segmento por completo cada vez.
  • La política del **SCAN de N pasos** divide la cola de peticiones del disco en subcolas de longitud N.
  • Las subcolas se procesan una a una mediante un algoritmo SCAN.
  • Mientras se procesa una cola, se añadirán nuevas peticiones a las otras. Si hay menos de N peticiones disponibles al final del rastreo, entonces todas serán procesadas en el siguiente recorrido.
  • La política **FSCAN** emplea dos subcolas.
  • Cuando comienza un rastreo, todas las peticiones están en una de las colas y la otra permanece vacía.
  • Todas las peticiones nuevas se colocan en la cola que inicialmente estaba vacía. De este modo, el servicio de nuevas peticiones se retrasará hasta que se hayan procesado las viejas.

RAID: Vector Redundante de Discos Independientes

La búsqueda de un mejor rendimiento y fiabilidad en el almacenamiento en disco condujo al desarrollo de **vectores de discos** que operan independientemente y en paralelo.

Con múltiples discos, las distintas solicitudes se pueden gestionar en paralelo, siempre y cuando los datos residan en discos separados.

Se puede añadir **redundancia** para mejorar la fiabilidad.

La industria ha acordado un esquema estándar para el diseño de sistemas de almacenamiento sobre múltiples discos, conocido como **RAID** (Redundant Array of Independent Disks).

Características Comunes de RAID

  • El esquema de RAID consta de siete niveles, los cuales comparten tres características comunes:
    • RAID es un conjunto de **unidades de disco físico** vistas por el sistema operativo como una **sola unidad lógica**.
    • Los datos están **distribuidos** a través de las unidades físicas del vector (striping).
    • La capacidad del disco redundante se utiliza para almacenar la **paridad**, que garantiza la recuperabilidad de datos en caso de fallo de discos.

RAID 0: Striping sin Redundancia

  • Nivel **RAID 0**:
    • No incluye **redundancia**.
    • Se usa en supercomputadoras donde la **capacidad** y el **rendimiento** son más importantes que la fiabilidad.
    • Los datos de usuario y del sistema están distribuidos a lo largo de todo el vector de discos, viéndose como un solo disco lógico.
    • Este disco lógico está dividido en **bandas** (o *stripes*), las cuales son bloques físicos.
    • Las bandas se asignan mediante un **turno rotatorio**.

RAID 1: Mirroring (Duplicación)

  • La **redundancia** se consigue **duplicando los datos** (mirroring).
  • Cada banda lógica corresponde con dos discos físicos.
  • Una solicitud de lectura la puede atender cualquiera de los dos discos, eligiendo el que tenga menor tiempo de acceso.
  • Una solicitud de escritura se tiene que realizar en ambos discos, lo cual se puede hacer en paralelo.
  • La **recuperación de fallo** es sencilla.
  • La principal desventaja es el **costo**, ya que requiere el doble de espacio en el disco lógico.
  • Debería limitarse para el almacenamiento de archivos altamente críticos.
  • Ofrece mayor rendimiento que RAID 0 cuando hay trabajo intensivo en lecturas, siempre y cuando se divida el trabajo entre ambos discos.

RAID 2: Código Hamming para Corrección de Errores

  • Utiliza la técnica de **acceso en paralelo**, es decir, todos los discos participan en la ejecución de cada solicitud de E/S.
  • Las bandas son muy pequeñas, a veces de un solo byte.
  • Utiliza el **código de Hamming** para la detección y corrección de errores.
  • Si existe un error en un solo bit, se puede reconocer y corregir de manera instantánea.
  • Para escribir, se tiene que acceder a todos los discos de datos y de paridad.
  • RAID 2 sería una selección eficiente en un entorno donde se produjeran muchos errores de discos.

RAID 3: Paridad Dedicada con Acceso en Paralelo

  • Requiere un solo **disco redundante** para la paridad.
  • Acceso en paralelo con datos distribuidos en pequeñas bandas.
  • Se calcula un solo bit de **paridad** para el conjunto de bits de la misma posición en todos los discos de datos.
  • En el caso de fallo de disco, se accede a la unidad de paridad y se reconstruyen los datos de los dispositivos restantes.
  • Se manejan tasas de transferencia altas; sin embargo, solo se atiende a una solicitud de E/S a la vez, por lo que el rendimiento disminuye para el manejo de transacciones.

RAID 4: Paridad Dedicada con Acceso Independiente

  • Técnica de **acceso independiente**, lo que permite satisfacer diferentes solicitudes en paralelo.
  • Utiliza bandas relativamente grandes.
  • Se calcula la paridad bit a bit y se almacena en la banda correspondiente del disco de paridad.
  • Para calcular la nueva paridad, se requieren los datos anteriores, por lo que una actualización requiere de **dos lecturas y dos escrituras**.

RAID 6: Doble Paridad

  • Realiza **dos cálculos distintos de paridad**, los cuales se almacenan en bloques independientes en discos distintos.
  • Permite la **regeneración de datos** incluso si fallan dos discos simultáneamente.

Caché de Disco

  • Es una **memoria intermedia** situada en la memoria principal para almacenar sectores de disco.
  • Cuando se hace una solicitud para un sector específico, primero se comprueba en la caché.
  • Si no está, se lee el sector solicitado del disco y se coloca en la caché.
  • Cuando una solicitud se satisface con la caché, puede hacerse la transferencia hacia el espacio de usuario o simplemente se direcciona a través de punteros.
  • Cuando la caché de disco está llena y se necesita espacio, es necesario realizar un **reemplazo** de bloques.
  • Es posible utilizar el algoritmo del **menos usado frecuentemente (LFU)**.
  • La implementación se haría asociando un **contador** a cada bloque; con cada referencia, se incrementa el contador. Cuando es tiempo de reemplazar, el bloque que tenga el menor valor en el contador será reemplazado.