Concurrencia y Distribución

Inicialmente los ordenadores iban de programa en programas, funcionaban por lotes o batch. Esto es porque eran sistemas monoprogramados. Para varias tareas al mismo tiempo surgió el concepto de multiprogramación, que viene de realizar múltiples tareas al mismo tiempo y es a lo que llamamos Programación Concurrente.

Ejemplo de uso de recursos en sistemas monoprogramados

El propio SO es de por si un proceso que debe darse y puede tener lapsos largos de tiempo sin uso de la CPU, como cuando realiza lectura del disco o durante la impresión. En este ejemplo vemos como la CPU no se está utilizando durante parte del tiempo, desaprovechando sus recursos. Esto ocurre con los llamados SO no apropiativos.

Ejemplo visual del funcionamiento de los cambios de contexto en un formato monohilo
Inconvenientes de este sistema

Programación concurrente

Para simular la realización de múltiples tareas al mismo tiempo en los procesadores de un solo núcleo e hilo se ideó un sistema que funciona a través de límites de tiempo de ejecución llamados Quantum. Los Sistemas Operativos son los que indican ese tiempo máximo a cada proceso para estar dentro de la ejecución en la CPU y si se agota el quantum, el SO cambia un proceso por otro para que siga avanzando.

El cambio entre procesos (o llegada al límite del quantum) se le denomina cambio de contexto. No es algo que produzca una mayor velocidad en el procesamiento de los programas, pero permite lidiar con varios procesos al mismo tiempo.

Cambio de contexto

Es muy importante que el quantum esté equilibrado, si es demasiado grande el usuario no tendrá la sensación de trabajar con varios procesos concurrentes, pero si es demasiado pequeño puede haber demasiados cambios de contexto e impedir que se avance en los procesos.

Programación paralela

Cuando hay varios núcleos, podemos hacer procesos con una simultaneidad real, de esta manera los procesos avanzan de forma paralela, esto es lo que da nombre a la programación paralela. Esta sólo funciona cuando se trabaja con ordenadores que tienen varios núcleos en la CPU, ya que se ejecutan a la vez de forma real, al contrario de lo que sucede en la programación concurrente.

Las labores de programación en estos sistemas son más complejos, ya que hay recursos que siguen siendo compartidos como la memoria. Por su parte, mejora el rendimiento de varios procesos o de uno solo que esté particionado. Se puede particionar manualmente o automáticamente a través del compilador o de la máquina virtual.

Ojo, cuando se están usando varios ordenadores en red para compartir procesos no hablamos de programación paralela, sino de computación distribuida. Esto se realiza con Sistemas Operativos distribuidos y suelen usarse para cálculos aritméticos pesados que permitan luego unificar sus resultados. Existen desde hace años varios proyectos en investigación que usan de la potencia desaprovechada de dispositivos personales cuando no están en uso de los usuarios que se apunten de forma voluntaria como World Community Grid.

Multiprogramación clásica

En este caso hablamos de cuando la SO carga en la memoria todos los programas en cola que puedan caber en esta, se controla a través de un planificador de trabajos a corto plazo que es el que asigna los procesos que entran en la CPU.

De esta manera mientras se hace una lectura en disco, otros procesos siguen avanzando e incluso pueden darse procesos paralelos en sistemas de Entrada/Salida (E/S), evitando aún más las esperas en su uso.

ejemplo de multiprogramación clásica
Ejemplo de multiprogramación clásica

Ventajas

Este sistema permite simular ante el usuario que se está ejecutando código de forma simultánea, ya que otro proceso se ejecuta mientras uno queda bloqueado a la espera de las ejecuciones E/S correspondientes.

SO de tiempo compartido

Es el que funciona con los quantums que hemos nombrado anteriormente, es decir los que marcan tiempos máximos de ejecución a los procesos para simular simultaneidad. Estos Sistemas lanzan estrategias aproviativas, es decir, puede echar el proceso que ocupa la CPU para poner otro. Poco a poco, con tiempos de milisegundos, se van realizando diferentes partes de los procesos. De esta forma se alternan los avances de los procesos y si uno se bloquea por depender de periféricos, se bloquea del todo, mientras siguen otros procesos.

ejemplo SO de tiempo compartido
Ejemplo SO de tiempo compartido

Bloque de control de proceso (BCP)

El Bloque de Control de Proceso o BCP mantiene los identificadores de los procesos y usuarios, copia los contenidos de la CPU y el estado/privilegio de cada proceso. De esta forma cada vez que un proceso vuelve a la CPU se puede restaurar su ejecución desde el punto en el que quedó durante el último quantum. El BCP por tanto garantiza el correcto funcionamiento de los sistemas multiproceso.

Estados de un proceso

Los estados de un proceso son los siguientes:

El planificador de trabajos es un programa propio del SO que se encarga de gestionar la cola de procesos.

Hebra o Thread

El concepto de hebra, hilo o Thread fue introducido por el SO Linux. Su funcionamiento es que los procesos o programas se descomponen en diferentes tareas o hebras (procesos ligeros) diferentes e independientes que pueden separarse y ejecutarse de forma concurrente en el tiempo, es decir en paralelo.

Ejemplo con navegador

En un navegador se trabaja mucho con los sistemas de hilos ya que cada una de las pestañas abiertas es un thread o hilo.

Intercambio memoria principal/disco o swapping

El Swapping es un sistema que hace que si un proceso no cabe en la memoria principal o RAM se pase al disco con el proceso de roll-out. Es una forma de evitar bloqueos superiores para el resto de ejecuciones o el propio Sistema Operativo. Una vez tenga la RAM espacio suficiente, ese proceso se devuelve a la misma y puede trabajar de la forma habitual. Cuando un proceso está en el disco y no en la RAM se lo considera suspendido.

Diagrama de procesos y ejecuciones

Modos de procesamiento

Multiprogramación de procesos

Existen diferentes modos de multiprogramación de procesos como:

Los sistemas de tiempo real son poco habituales y solo se usan para cuando el tiempo de respuesta es vital y debe ser menor a un tiempo predeterminado. Por ejemplo lanzar un Air-Bag en caso de accidente.

Los sistemas de procesos de transacciones realizan conjuntos de operaciones como una unidad atómica, de esta forma si hay un error en una de las operaciones se vuelve al estado anterior realizando un rollback.

Sistema de multiprocesamiento

Esto son sistemas de dos o más núcleos que trabajan en paralelo y existen diferentes formas de abordarlos. En el caso de algunas versiones de SO con base Unix se hacen multiprocesos asimétricos con un procesador encargado de controlar al resto. En la mayoría de sistemas se opta por dar el mismo valor a todos los procesadores.

multiproceso asimetrico
multiproceso simetrico

Planificadores

Los planificadores permiten gestionar las cargas de los procesadores y los hay de 3 tipos:

Puntos de decisión de la planificación

Son los momentos en los que el SO decide sobre la planificación de un proceso, cambiando entre los estados que hemos comentado anteriormente: en espera, concluido, etc.

Algoritmos de planificación de la CPU

Estos algoritmos son diferentes formas de abordar la planificación de los procesos: