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 Concurrencia En
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