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.
Índice
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.

Inconvenientes de este sistema
- Se desaprovecha la memoria principal
- Se desaprovecha el procesador
- Se desaprovechan los periféricos
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.

Ventajas
- Se aprovecha mejor la memoria y la CPU en todo momento
- No queda paralizada la CPU durante procesos de E/S que no requieren de su uso
- Se puede trabajar con múltiples periféricos a la vez
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.

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:
- Nonato: para procesos que no están aún en la lista de trabajos.
- Preparados o listos: para los que han entrado en la Memoria Principal MP o RAM.
- Activos: para los que una vez están en el planificador pasan a estar activos durante el quantum y preparados cuando esperan de nuevo.
- Bloqueados: para ejecuciones que están a la espera de un proceso E/S.
- Concluido: para procesos que han terminado satisfactoriamente, se han cancelado o sufren un error.
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.

Modos de procesamiento
Multiprogramación de procesos
Existen diferentes modos de multiprogramación de procesos como:
- Sistemas multiusuario
- Procesamiento por lotes o cola/serie
- Sistemas de tiempo compartido o interactivos
- Sistemas en tiempo real
- Sistemas de proceso de transacciones
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.


Planificadores
Los planificadores permiten gestionar las cargas de los procesadores y los hay de 3 tipos:
- A largo plazo también llamado planificador de trabajo
- Medio plazo o intercambiador
- Corto plazo o distribuidor
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:
- FCFS (First Come First Serviced): Esto da relevancia al orden de llegada, el primero en llegar es el primero en procesarse
- SPN (Shortest Process Next): Y selecciona el proceso con el menor tiempo de ejecución estimado con el objetivo de minimizar el tiempo promedio de espera en cola.
- RR (Round-Robin): El Round-Robin o turno rotatorio sirve a sistemas de tiempo compartido y de un intervalo de tiempo fijo o quantum a cada proceso, garantizando una distribución equitativa del tiempo de CPU entre todos.
- PS (Priority Scheduling): El PS o Derecho Preferente, asigna a la CPU según una prioridad predefinida. El planificador entonces siempre elige el proceso con mayor prioridad que esté disponible en la cola de listos.
- SRTF (Shortest Remaining Time First): Da priopridad al que menor tiempo restante de ejecución tiene.