Procesos concurrentes.
Los
procesos son concurrentes si existen simultáneamente. Los procesos
concurrentes pueden funcionar en forma totalmente independiente unos de
otros, o pueden ser asíncronos, lo cual significa que en ocasiones
requiere cierta sincronización y cooperación.
Las siguientes definiciones son esenciales para comprender los conceptos de concurrencia y secuencialidad.
* Actividad.
. Procesos: Es un programa en ejecución.
. Tarea: Son las distintas partes de un proceso que se ejecutan simultáneamente.
* Sistemas:
. Multiprogramación: Admiten varias actividades que comparten el procesador, pero sólo
una puede estar ejecutándose en un momento dado.
. Multiproceso: Las actividades se ejecutan en sus propios procesadores, conectados
a través de una red de comunicaciones.
* Paralelismo:
Es
la ejecución de diversas actividades simultáneamente en varios
procesadores. Si sólo existe un procesador gestionando
multiprogramación, se puede decir que existe pseudo-paralelismo. Se
trata de un concepto físico producido por la existencia de varios
procesadores.
* Concurrencia:
Es
la existencia de varias actividades ejecutándose simultáneamente, y
necesitan sincronizarse para actuar conjuntamente. Se trata, en este
caso, de un concepto lógico, ya que sólo hace referencia a las
actividades, sin importar el número de procesadores presentes.
Para
que dos actividades, sean concurrentes, es necesario que tengan
relación entre sí, como puede ser la cooperación en un trabajo
determinado o el uso de información compartida.
En
un sistema monoprocesador, la existencia de multiprogramación es
condición necesaria, pero no suficiente para que exista concurrencia, ya
que los procesos pueden ejecutarse independientemente. Por ejemplo, un
editor y un compilador pueden estar ejecutándose simultáneamente en una
computadora sin que exista concurrencia entre ellos. Por otro lado si un
programa se está ejecutando y se encuentra grabando datos en un
archivo, y otro programa también en ejecución está leyendo datos de ese
mismo archivo, sí existe concurrencia entre ellos, pues el
funcionamiento de uno interfiere en el funcionamiento de otro.
Si
un sistema es multiprocesador, también pueden presentarse situaciones
de concurrencia siempre y cuando las actividades necesiten actuar entre
sí, bien por utilizar información común, o por cualquier otra causa.
Los
procesos del sistema pueden ejecutarse concurrentemente, puede haber
múltiples tareas en el CPU con varios procesos. Existen varias razones
para permitir la ejecución concurrente:
* Compartir recursos físicos.
Ya
que los recursos del hardware de la computadora son limitados, nos
podemos ver obligados a compartirlos en un entorno multiusuario.
* Compartir recursos lógicos.
Puesto que varios usuarios
pueden interesarse en el mismo elemento de información (por ejemplo un
archivo compartido), debemos proporcionar un entorno que permita el
acceso concurrente a estos tipos de recursos.
* Acelerar los cálculos.
Si
queremos que una tarea se ejecute con mayor rapidez, debemos dividirla
en subtareas, cada una de las cuales se ejecutara, en paralelo con las
demás.
* Modularidad.
Podremos construir el sistema en forma modular, dividiendo las funciones del sistema en procesos separados.
* Comodidad.
Un usuario puede tener que ejecutar varias tareas a la vez, por ejemplo puede editar, imprimir y compilar en paralelo.
La
ejecución concurrente que requiere la cooperación entre procesos
necesita un mecanismo para la sincronización y comunicación de procesos,
exclusión mutua y sincronización.
Problemas de ConcurrenciaEn los sistemas de tiempo compartido (aquellos con varios usuarios, procesos, tareas, trabajos que reparten el uso de CPU entre estos) se presentan muchos problemas debido a que los procesos compiten por los recursos del sistema. Imagine que un proceso está escribiendo en la unidad de cinta y se le termina su turno de ejecución e inmediatamente después el proceso elegido para ejecutarse comienza a escribir sobre la misma cinta. El resultado es una cinta cuyo contenido es un desastre de datos mezclados. Así como la cinta, existen una multitud de recursos cuyo acceso debe der controlado para evitar los problemas de la concurrencia.
El sistema operativo debe ofrecer mecanismos para sincronizar la ejecución de procesos: semáforos, envío de mensajes, 'pipes', etc. Los semáforos son rutinas de software (que en su nivel más interno se auxilian del hardware) para lograr exclusión mutua en el uso de recursos. Para entender este y otros mecanismos es importante entender los problemas generales de concurrencia, los cuales se describen enseguida.
· Condiciones
de Carrera o Competencia: La condición de carrera (race condition)
ocurre cuando dos o más procesos accesan un recurso compartido sin
control, de manera que el resultado combinado de este acceso depende del
orden de llegada. Suponga, por ejemplo, que dos clientes de un banco
realizan cada uno una operación en cajeros diferentes al mismo tiempo.
· El
usuario A quiere hacer un depósito. El B un retiro. El usuario A
comienza la transacción y lee su saldo que es 1000. En ese momento
pierde su turno de ejecución (y su saldo queda como 1000) y el usuario B
inicia el retiro: lee el saldo que es 1000, retira 200 y almacena el
nuevo saldo que es 800 y termina. El turno de ejecución regresa al
usuario A el cual hace su depósito de 100, quedando saldo = saldo + 100 =
1000 + 100 = 1100. Como se ve, el retiro se perdió y eso le encanta al
usuario A y B, pero al banquero no le convino esta transacción. El error
pudo ser al revés, quedando el saldo final en 800.
· Postergación
o Aplazamiento Indefinido(a): Esto se mencionó en el apartado anterior y
consiste en el hecho de que uno o varios procesos nunca reciban el
suficiente tiempo de ejecución para terminar su tarea. Por ejemplo, que
un proceso ocupe un recurso y lo marque como 'ocupado' y que termine sin
marcarlo como 'desocupado'. Si algún otro proceso pide ese recurso, lo
verá 'ocupado' y esperará indefinidamente a que se 'desocupe'.
· Condición
de Espera Circular: Esto ocurre cuando dos o más procesos forman una
cadena de espera que los involucra a todos. Por ejemplo, suponga que el
proceso A tiene asignado el recurso 'cinta' y el proceso B tiene
asignado el recurso 'disco'. En ese momento al proceso A se le ocurre
pedir el recurso 'disco' y al proceso B el recurso 'cinta'. Ahi se forma
una espera circular entre esos dos procesos que se puede evitar
quitándole a la fuerza un recurso a cualquiera de los dos procesos.
· Condición
de No Apropiación: Esta condición no resulta precisamente de la
concurrencia, pero juega un papel importante en este ambiente. Esta
condición especifica que si un proceso tiene asignado un recurso, dicho
recurso no puede arrebatársele por ningún motivo, y estará disponible
hasta que el proceso lo 'suelte' por su voluntad.
· Condición
de Espera Ocupada: Esta condición consiste en que un proceso pide un
recurso que ya está asignado a otro proceso y la condición de no
apropiación se debe cumplir. Entonces el proceso estará gastando el
resto de su time slice checando si el recurso fue liberado. Es decir,
desperdicia su tiempo de ejecución en esperar. La solución más común a
este problema consiste en que el sistema operativo se dé cuenta de esta
situación y mande a una cola de espera al proceso, otorgándole
inmediatamente el turno de ejecución a otro proceso.
· Condición
de Exclusión Mutua: Cuando un proceso usa un recurso del sistema
realiza una serie de operaciones sobre el recurso y después lo deja de
usar. A la sección de código que usa ese recurso se le llama 'región
crítica'. La condición de exclusión mutua establece que solamente se
permite a un proceso estar dentro de la misma región crítica. Esto es,
que en cualquier momento solamente un proceso puede usar un recurso a la
vez. Para lograr la exclusión mutua se ideo también el concepto de
'región crítica'. Para logar la exclusión mutua generalmente se usan
algunas técnicas para lograr entrar a la región crítica: semáforos,
monitores, el algoritmo de Dekker y Peterson, los 'candados'. Para ver
una descripción de estos algoritmos consulte
· Condición
de Ocupar y Esperar un Recurso: Consiste en que un proceso pide un
recurso y se le asigna. Antes de soltarlo, pide otro recurso que otro
proceso ya tiene asignado.
Los
problemas descritos son todos importantes para el sistema operativo, ya
que debe ser capaz de prevenir o corregirlos. Tal vez el problema más
serio que se puede presentar en un ambiente de concurrencia es el
'abrazo mortal', también llamado 'trabazón' y en inglés deadlock. El
deadlock es una condición que ningún sistema o conjunto de procesos
quisiera exhibir, ya que consiste en que se presentan al mismo tiempo
cuatro condiciones necesarias: La condición de no apropiación, la
condición de espera circular, la condición de exclusión mutua y la
condición de ocupar y esperar un recurso. Ante esto, si el deadlock
involucra a todos los procesos del sistema, el sistema ya no podrá hacer
algo productivo. Si el deadlock involucra algunos procesos, éstos
quedarán congelados para siempre.
No hay comentarios:
Publicar un comentario