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