ogr
amaci
nConcur
rent
eyTi
empoReal
T
ercer
aEdi
ci
n
Pr
ogramaci
n
Concur
rent
ey
TiempoReal
Tercera Edicin
Creative Commons License: Usted es libre de copiar, distribuir y comunicar pblicamente la obra, bajo
las condiciones siguientes: 1. Reconocimiento. Debe reconocer los crditos de la obra de la manera
especicada por el autor o el licenciador. 2. No comercial. No puede utilizar esta obra para nes
comerciales. 3. Sin obras derivadas. No se puede alterar, transformar o generar una obra derivada a
partir de esta obra. Ms informacin en: http://creativecommons.org/licenses/by-nc-nd/3.0/
Autores
Developer.
3. Paso de Mensajes 73
3.1. Conceptos Bsicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
3.1.1. El concepto de buzn o cola de mensajes . . . . . . . . . . . . . 75
3.1.2. Aspectos de diseo en sistemas de mensajes . . . . . . . . . . . . 75
3.1.3. El problema de la seccin crtica . . . . . . . . . . . . . . . . . . 78
3.2. Implementacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
3.2.1. El problema del bloqueo . . . . . . . . . . . . . . . . . . . . . . 85
3.3. Problemas Clsicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
3.3.1. El buffer limitado . . . . . . . . . . . . . . . . . . . . . . . . . . 88
3.3.2. Los filsofos comensales . . . . . . . . . . . . . . . . . . . . . . 88
3.3.3. Los fumadores de cigarrillos . . . . . . . . . . . . . . . . . . . . 90
3.3.4. Simulacin de un sistema de codificacin . . . . . . . . . . . . . 92
pila
instr_1
instr_2 carga del ejecutable
instr_3 en memoria
memoria
instr_i
datos
instr_n
texto
programa proceso
admitido
nuevo interrupcin terminado
salida
preparado en ejecucin
espera E/S
terminacin E/S en espera
1 #include <sys/types.h>
2 #include <unistd.h>
3
4 pid_t getpid (void); // ID proceso.
5 pid_t getppid (void); // ID proceso padre.
6
7 uid_t getuid (void); // ID usuario.
8 uid_t geteuid (void); // ID usuario efectivo.
proceso_A
fork()
proceso_A proceso_B
(cont.) (hijo)
hereda_de
1 #include <sys/types.h>
2 #include <unistd.h>
3
4 pid_t fork (void);
El listado de cdigo 1.3 muestra un ejemplo muy bsico de utilizacin de fork() para
la creacin de un nuevo proceso. No olvide que el proceso hijo recibe una copia exacta
del espacio de direcciones del proceso padre.
1.1. Concepto de Proceso [5]
1 2 3 4
1 #include <sys/types.h>
2 #include <unistd.h>
3 #include <stdlib.h>
4 #include <stdio.h>
5
6 int main (void) {
7 int *valor = malloc(sizeof(int));
8 *valor = 0;
9 fork();
10 *valor = 13;
11 printf(" %ld: %d\n", (long)getpid(), *valor);
12
13 free(valor);
14 return 0;
15 }
13243: 13
13244: 13
Despus de la ejecucin de fork(), existen dos procesos y cada uno de ellos mantiene
una copia de la variable valor. Antes de su ejecucin, solamente exista un proceso y una
nica copia de dicha variable. Note que no es posible distinguir entre el proceso padre y
el hijo, ya que no se control el valor devuelto por fork().
Tpicamente ser necesario crear un nmero arbitrario de procesos, por lo que el uso
de fork() estar ligado al de algn tipo de estructura de control, como por ejemplo un bucle
for. Por ejemplo, el siguiente listado de cdigo genera una cadena de procesos, tal y como
se refleja de manera grfica en la figura 1.4. Para ello, es necesario asegurarse de que el
proceso generado por una llamada a fork(), es decir, el proceso hijo, sea el responsable de
crear un nuevo proceso.
Anteriormente se coment que era necesario utilizar el valor devuelto por fork() para
poder asignar un cdigo distinto al proceso padre y al hijo, respectivamente, despus de
realizar dicha llamada. El uso de fork() por s solo es muy poco flexible y generara una
gran cantidad de cdigo duplicado y de estructuras if-then-else para distinguir entre el
proceso padre y el hijo.
1 El valor de los ID de los procesos puede variar de una ejecucin a otra.
[6] Captulo 1 :: Conceptos Bsicos
Idealmente, sera necesario algn tipo de mecanismo que posibilitara asignar un nuevo
mdulo ejecutable a un proceso despus de su creacin. Este mecanismo es precisamente
el esquema en el que se basa la familia exec de llamadas al sistema. Para ello, la forma de
combinar fork() y alguna primitiva de la familia exec se basa en permitir que el proceso
hijo ejecute exec para el nuevo cdigo, mientras que el padre contina con su flujo de
ejecucin normal. La figura 1.5 muestra de manera grfica dicho esquema.
1 #include <sys/types.h>
2 #include <unistd.h>
3 #include <stdio.h>
4
5 int main (void) {
6 int i = 1, n = 4;
7 pid_t childpid;
8
9 for (i = 1; i < n; i++) {
10 childpid = fork();
11 if (childpid > 0) { // Cdigo del padre.
12 break;
13 }
14 }
15
16 // PID == 1?
17 printf("Proceso %ld con padre %ld\n", (long)getpid(), (long)getppid());
18
19 pause();
20
21 return 0;
22 }
El uso de operaciones del tipo exec implica que el proceso padre tenga que integrar al-
gn tipo de mecanismo de espera para la correcta finalizacin de los procesos que cre con
anterioridad, adems de llevar a cabo algn tipo de liberacin de recursos. Esta problem-
tica se discutir ms adelante. Antes, se estudiar un ejemplo concreto y se comentarn
las principales diferencias existentes entre las operaciones de la familia exec, las cuales se
muestran en el listado de cdigo 1.5.
1 #include <unistd.h>
2
3 int execl (const char *path, const char *arg, ...);
4 int execlp (const char *file, const char *arg, ...);
5 int execle (const char *path, const char *arg, ..., char *const envp[]);
6
7 int execv (const char *path, char *const argv[]);
8 int execvp (const char *file, char *const argv[]);
9 int execve (const char *path, char *const argv[], char *const envp[]);
1.1. Concepto de Proceso [7]
proceso_A
fork()
proceso_A proceso_B
(cont.) (hijo)
execl()
SIGCHLD
wait() exit()
Limpieza
tabla proc zombie
1. La ruta al archivo que contiene el cdigo binario a ejecutar por el proceso, es decir,
el ejecutable asociado al nuevo segmento de cdigo.
2. Una serie de argumentos de lnea de comandos, terminado por un apuntador a
NULL. El nombre del programa asociado al proceso que ejecuta execl suele ser el
primer argumento de esta serie.
La llamada execlp tiene los mismos parmetros que execl, pero hace uso de la variable
de entorno PATH para buscar el ejecutable del proceso. Por otra parte, execle es tambin
similar a execl, pero aade un parmetro adicional que representa el nuevo ambiente del
programa a ejecutar. Finalmente, las llamadas execv difieren en la forma de pasar los
argumentos de lnea de comandos, ya que hacen uso de una sintaxis basada en arrays.
El listado 1.6 muestra la estructura de un programa encargado de la creacin de una
serie de procesos mediante la combinacin de fork() y execl() dentro de una estructura de
bucle.
Como se puede apreciar, el programa recoge por lnea de rdenes el nmero de proce-
sos que se crearn posteriormente2 . Note cmo se hace uso de una estructura condicional
para diferenciar entre el cdigo asociado al proceso padre y al proceso hijo. Para ello, el
valor devuelto por fork(), almacenado en la variable childpid, acta de discriminante.
2 Por simplificacin no se lleva a cabo un control de errores
[8] Captulo 1 :: Conceptos Bsicos
El nuevo cdigo del proceso hijo es trivial y simplemente imprime el ID del proceso
y el nmero de hermanos que tiene. Este tipo de esquemas, en los que se estructura el
cdigo del proceso padre y de los hijos en ficheros fuente independientes, ser el que se
utilice en los temas sucesivos.
La llamada wait() detiene el proceso que llama hasta que un hijo de dicho proceso
finalice o se detenga, o hasta que el proceso que realiz dicha llamada reciba otra seal
(como la de terminacin). Por ejemplo, el estndar POSIX define SIGCHLD como la
seal enviada a un proceso cuando su proceso hijo finaliza su ejecucin.
Otra seal esencial est representada por SIGINT, enviada a un proceso cuando el
usuario desea interrumpirlo. Est seal se representa tpicamente mediante la combina-
cin Ctrl+C desde el terminal que controla el proceso.
El listado 1.9 muestra la inclusin del cdigo necesario para esperar de manera ade-
cuada la finalizacin de los procesos hijo y gestionar la terminacin abrupta del proceso
padre mediante la combinacin de teclas Ctrl+C.
[10] Captulo 1 :: Conceptos Bsicos
En primer lugar, la espera a la terminacin de los hijos se controla mediante las lneas
35-37 utilizando la primitiva waitpid. Esta primitiva se comporta de manera anloga a
wait, aunque bloqueando al proceso que la ejecuta para esperar a otro proceso con un pid
concreto. Note como previamente se ha utilizado un array auxiliar denominado pids (lnea
13 ) para almacenar el pid de todos y cada uno de los procesos hijos creados mediante fork
(lnea 26 ). As, slo habr que esperarlos despus de haberlos lanzado.
Por otra parte, note cmo se captura la seal SIGINT, es decir, la terminacin median-
te Ctrl+C, mediante la funcin signal (lnea 19 ), la cual permite asociar la captura de una
seal con una funcin de retrollamada. sta funcin definir el cdigo que se tendr que
ejecutar cuando se capture dicha seal. Bsicamente, en esta ltima funcin, denominada
controlador, se incluir el cdigo necesario para liberar los recursos previamente reser-
vados, como por ejemplo la memoria dinmica, y para destruir los procesos hijo que no
hayan finalizado.
Si signal() devuelve un cdigo de error SIG_ERR, el programador es responsable de
controlar dicha situacin excepcional.
hebra
Un conjunto de registros.
Una pila.
El resultado de la ejecucin de este programa para un valor, dado por lnea de rdenes,
de 7 ser el siguiente:
cont++
while (1) {
// Produce en nextP.
while (cont == N); r1 = cont
// No hacer nada. r1 = r1 + 1
buffer[in] = nextP; p: r1 = cont
cont = r1
in = (in + 1) % N; p: r1 = r1 + 1
cont++; c: r2 = cont
}
c: r2 = r2 - 1
while (1) { cont--
while (cont == 0); p: cont = r1
// No hacer nada. c: cont = r2
nextC = buffer[out]; r2 = cont
out = (out + 1) % N; r2 = r2 - 1
cont--;
// Consume nextC. cont = r2
}
Las soluciones propuestas deberan ser independientes del nmero de procesos, del
orden en el que se ejecutan las instrucciones mquinas y de la velocidad relativa de eje-
cucin de los procesos.
Una posible solucin para N procesos sera la que se muestra en el listado de c-
digo 1.13. Sin embargo, esta solucin no sera vlida ya que no cumple el principio de
exclusin mutua, debido a que un proceso podra entrar en la seccin crtica si se produce
un cambio de contexto justo despus de la sentencia while (lnea 5 ).
Otro posible planteamiento para dos procesos se podra basar en un esquema de al-
ternancia entre los mismos, modelado mediante una variable booleana turn, la cual indica
qu proceso puede entrar en la seccin crtica, es decir, si turn es igual a i, entonces el
proceso pi podr entrar en su seccin crtica (j == (i 1)).
Esta solucin no cumplira con el principio de exclusin mutua, ya que los dos pro-
cesos podran ejecutar su seccin crtica de manera concurrente.
Los dos procesos comparten tanto el array flag, que determina los procesos que estn
listos para acceder a la seccin crtica, como la variable turn, que sirve para determinar el
proceso que acceder a su seccin crtica. Esta solucin es correcta para dos procesos,
ya que satisface las tres condiciones anteriormente mencionadas.
Para entrar en la seccin crtica, el proceso pi asigna true a flag[i] y luego asigna a
turn el valor j, de manera que si el proceso pj desea entrar en su seccin crtica, entonces
puede hacerlo. Si los dos procesos intentan acceder al mismo tiempo, a la variable turn se
le asignarn los valores i y j (o viceversa) en un espacio de tiempo muy corto, pero slo
prevalecer una de las asignaciones (la otra se sobreescribir). Este valor determinar qu
proceso acceder a la seccin crtica.
1. p1 en SC (premisa)
2. p1 en SC --> flag[1]=true y (flag[2]=false o turn!=2) (premisa)
3. flag[1]=true y (flag[2]=false o turn!=2) (MP 1,2)
4. flag[2]=false o turn!=2 (A o B) (EC 3)
Demostrando A
5. flag[2]=false (premisa)
6. flag[2]=false --> p2 en SC (premisa)
7. p2 en SR (p2 no SC) (MP 5,6)
Demostrando B
8. turn=!2 (premisa)
9. flag[1]=true (EC 3)
10. flag[1]=true y turn=1 (IC 8,9)
11. (flag[1]=true y turn=1) --> p2 en SE (premisa)
12. p2 en SE (p2 no SC) (MP 10,11)
[20] Captulo 1 :: Conceptos Bsicos
Soluciones hardware
Consideraciones
Las soluciones estudiadas hasta ahora no son, por lo general, legibles y presentan
dificultadas a la hora de extenderlas a problemas ms generales en los que se manejen n
procesos.
Por otra parte, los procesos que intentan acceder a la seccin crtica se encuentra en
un estado de espera activa, normalmente modelado mediante bucles que comprueban el
valor de una variable de manera ininterrumpida. Este planteamiento es muy ineficiente y
no se puede acoplar en sistemas multiprogramados.
La consecuencia directa de estas limitaciones es la necesidad de plantear mecanismos
que sean ms sencillos y que sean independientes del nmero de procesos que intervienen
en un determinado problema.
Semforos
Por otra parte, wait y signal son mutuamente excluyentes, es decir, si se ejecutan de
manera concurrente, entonces se ejecutarn secuencialmente y en un orden no conocido
a priori.
Si el valor de un semforo es positivo, dicho valor representa el nmero de procesos
que pueden decrementarlo a travs de wait sin quedarse bloqueados. Por el contrario, si
su valor es negativo, representa el nmero de procesos que estn bloqueados. Finalmente,
un valor igual a cero implica que no hay procesos esperando, pero una operacin wait
har que un proceso se bloquee.
Los semforos se suelen clasificar en contadores y binarios, en funcin del rango de
valores que tome las variables que encapsulan. Un semforo binario es aqul que slo
toma los valores 0 1 y tambin se conoce como cerrojo mutex (mutual exclusion). Un
semforo contador no cumple esta restriccin.
Las principales ventajas de los semforos con respecto a otro tipo de mecanismos de
sincronizacin se pueden resumir en las tres siguientes: i) simplicidad, ya que facilitan
el desarrollo de soluciones de concurrencia y son simples, ii) correctitud, ya que los
soluciones son generalmente limpias y legibles, siendo posible llevar a cabo demostracio-
nes formales, iii) portabilidad, ya que los semforos son altamente portables en diversas
plataformas y sistemas operativos.
La figura 1.12 muestra una posible solucin al problema del productor/consumidor.
Tpicamente los semforos se utilizan tanto para gestionar el sincronismo entre procesos
como para controlar el acceso a fragmentos de memoria compartida, como por ejemplo
el buffer de productos.
Esta solucin se basa en el uso de tres semforos:
Message
Message
Mensaje
Proceso1 Proceso2
Message
Message
Mensaje
Paso de mensajes
Adems, es necesario un canal de comunicacin entre los propios procesos para ga-
rantizar la entrega y recepcin de los mensajes.
Resulta importante distinguir entre varios tipos de comunicacin, en base a los con-
ceptos directa/indirecta y simtrica/asimtrica. En esencia, la comunicacin directa im-
plica que en el mensaje se conocen, implcitamente, el receptor y el receptor del mismo.
Por el contrario, la comunicacin indirecta se basa en el uso de buzones. La comunicacin
simtrica se basa en que el receptor conoce de quin recibe un mensaje. Por el contrario,
en la comunicacin asmetrica el receptor puede recibir de cualquier proceso.
1.2. Fundamentos de P. Concurrente [25]
El listado de cdigo 1.22 muestra un ejemplo bsico de sincronizacin entre dos pro-
cesos mediante el paso de mensajes. En el captulo 3 se discutir ms en detalle el concep-
to de paso de mensajes y su utilizacin en problemas clsicos de sincronizacin. Adems,
se estudiar una posible implementacin utilizando las primitivas que el estndar POSIX
proporciona.
Monitores
Aunque los semforos tienen ciertas ventajas que garantizan su xito en los proble-
mas de sincronizacin entre procesos, tambin sufren ciertas debilidades. Por ejemplo,
es posible que se produzcan errores de temporizacin cuando se usan. Sin embargo, la
debilidad ms importante reside en su propio uso, es decir, es fcil que un programador
cometa algn error al, por ejemplo, intercambiar errneamente un wait y un signal.
Con el objetivo de mejorar los mecanismos de sincronizacin y evitar este tipo de
problemtica, en los ltimos aos se han propuesto soluciones de ms alto nivel, como
es el caso de los monitores.
Bsicamente, un tipo monitor permite que el programador defina una serie de ope-
raciones pblicas sobre un tipo abstracto de datos que gocen de la caracterstica de la
exclusin mutua. La idea principal est ligada al concepto de encapsulacin, de manera
que un procedimiento definido dentro de un monitor slo puede acceder a las variables
que se declaran como privadas o locales dentro del monitor.
Esta estructura garantiza que slo un proceso est activo cada vez dentro del monitor.
La consecuencia directa de este esquema es que el programador no tiene que implementar
de manera explcita esta restriccin de sincronizacin. Esta idea se traslada tambin al
concepto de variables de condicin.
En esencia, un monitor es un mecanismo de sincronizacin de ms alto nivel que, al
igual que un cerrojo, protege la seccin crtica y garantiza que solamente pueda existir un
hilo activo dentro de la misma. Sin embargo, un monitor permite suspender un hilo dentro
de la seccin crtica posibilitando que otro hilo pueda acceder a la misma. Este segundo
[26] Captulo 1 :: Conceptos Bsicos
Datos
compartidos
x
Condiciones
y
Operaciones
Cdigo
inicializacin
hilo puede abandonar el monitor, liberndolo, o suspenderse dentro del monitor. De cual-
quier modo, el hilo original se despierta y continua su ejecucin dentro del monitor. Este
esquema es escalable a mltiples hilos, es decir, varios hilos pueden suspenderse dentro
de un monitor.
Los monitores proporcionan un mecanismo de sincronizacin ms flexible que los
cerrojos, ya que es posible que un hilo compruebe una condicin y, si sta es falsa, el
hijo se pause. Si otro hilo cambia dicha condicin, entonces el hilo original contina su
ejecucin.
El siguiente listado de cdigo muestra el uso del mecanismo de tipo monitor que el
lenguaje Java proporciona para la sincronizacin de hebras. En Java, cualquier objeto
tiene asociado un cerrojo. Cuando un mtodo se declara como synchronized, la llamada
al mtodo implica la adquisicin del cerrojo, evitando el acceso concurrente a cualquier
otro mtodo de la clase que use dicha declaracin.
En el ejemplo que se expone en el listado 1.23, el monitor se utiliza para garanti-
zar que el acceso y la modificacin de la variable de clase _edad slo se haga por otro
hilo garantizando la exclusin mutua. De este modo, se garantiza que no se producirn
inconsistencias al manipular el estado de la clase Persona.
P1 R1 P2 R2
Figura 1.16: Condicin de espera circular con dos procesos y dos recursos.
Los interbloqueos pueden surgir si se dan, de manera simultnea, las cuatro condi-
ciones de Coffman [12]:
R2 R4
Los interbloqueos se pueden definir de una forma ms
precisa, facilitando su anlisis, mediante los grafos de
Figura 1.17: Ejemplo de grafo de
asignacin de recursos. asignacin de recursos. El conjunto de nodos del grafo
se suele dividir en dos subconjuntos, uno para los pro-
cesos activos del sistema P = {p0 , p1 , ..., pn1 } y otro
formado por los tipos de recursos R = {r1 , r2 , ..., rn1 }.
Por otra parte, el conjunto de aristas del grafo dirigido permite establecer las relacio-
nes existentes entre los procesos y los recursos. As, una arista dirigida del proceso pi
al recurso rj significa que el proceso pi ha solicitado una instancia del recurso rj . Re-
cuerde que en el modelo de sistema planteado cada recurso tiene asociado un nmero de
instancias. Esta relacin es una arista de solicitud y se representa como pi rj .
1.2. Fundamentos de P. Concurrente [29]
R1 R3
P2
R1
P1 P2 P3 P1 P3
P4
R2 R4 R2
Figura 1.18: Grafos de asignacin de recursos con deadlock (izquierda) y sin deadlock (derecha).
Por el contrario, una arista dirigida del recurso rj al proceso pi significa que se ha asig-
nado una instancia del recurso rj al proceso pi . Esta arista de asignacin se representa
como rj pi . La figura 1.17 muestra un ejemplo de grafo de asignacin de recursos.
Los grafos de asignacin de recursos que no contienen ciclos no sufren interbloqueos.
Sin embargo, la presencia de un ciclo puede generar la existencia de un interbloqueo,
aunque no necesariamente. Por ejemplo, en la parte izquierda de la figura 1.18 se muestra
un ejemplo de grafo que contiene un ciclo que genera una situacin de interbloqueo,
ya que no es posible romper el ciclo. Note cmo se cumplen las cuatro condiciones de
Coffman.
La parte derecha de la figura 1.18 muestra la existencia de un ciclo en un grafo de
asignacin de recursos que no conduce a un interbloqueo, ya que si los procesos p2 o p4
finalizan su ejecucin, entonces el ciclo se rompe.
Desde un punto de vista general, existen tres formas para llevar a cabo el tratamiento
de los interbloqueos o deadlocks:
3. Ignorar los interbloqueos, es decir, asumir que nunca van a ocurrir en el sistema.
La figura 1.19 muestra un esquema general con las distintas alternativas existentes a
la hora de tratar los interbloqueos. A continuacin se discutirn los fundamentos de cada
una de estas alternativas, planteando las ventajas y desventajas que tienen.
[30] Captulo 1 :: Conceptos Bsicos
1
Prevencin Evasin 2
Info sobre
Algoritmo
el estado de
deteccin
recursos
Figura 1.19: Diagrama general con distintos mtodos para tratar los interbloqueos.
Prevencin de interbloqueos
Estos dos planteamientos presentan dos desventajas importantes: i) una baja tasa de
uso de los recursos, dado que los recursos pueden asignarse y no utilizarse durante un
largo periodo de tiempo, y ii) el problema de la inanicin, ya que un proceso que necesite
recursos muy solicitados puede esperar de forma indefinida.
La condicin de no apropiacin se puede incumplir desalojando los recursos que
un proceso retiene en el caso de solicitar otro recurso que no se puede asignar de forma
inmediata. Es decir, ante una situacin de espera por parte de un proceso, ste liberara los
recursos que retiene actualmente. Estos recursos se aadiran a la lista de recursos que el
proceso est esperando. As, el proceso se reiniciar cuando pueda recuperar sus antiguos
recursos y adquirir los nuevos, solucionando as el problema planteado.
Este tipo de protocolos se suele aplicar a recursos cuyo estado pueda guardarse y
restaurarse fcilmente, como los registros de la CPU o la memoria. Sin embargo, no se
podra aplicar a recursos como una impresora.
Finalmente, la condicin de espera circular se puede evitar estableciendo una re-
lacin de orden completo a todos los tipos de recursos. De este modo, al mantener los
recursos ordenados se puede definir un protocolo de asignacin de recursos para evitar la
espera circular. Por ejemplo, cada proceso slo puede solicitar recursos en orden creciente
de enumeracin, es decir, slo puede solicitar un recurso mayor al resto de recursos ya
solicitados. En el caso de necesitar varias instancias de un recurso, se solicitaran todas a
la vez. Recuerde que respetar la poltica de ordenacin planteada es responsabilidad del
programador.
[32] Captulo 1 :: Conceptos Bsicos
Algoritmo
del banquero
Peticiones de recursos
Algoritmo de Estado No
Deshacer
seguridad seguro?
Asignar recursos
Evasin de interbloqueos
Available, un vector de longitud m, definido a nivel global del sistema, que indica
el nmero de instancias disponibles de cada tipo de recurso. Si available[j] = k,
entonces el sistema dispone actualmente de k instancias del tipo de recurso rj .
Max, una matriz de dimensiones nxm que indica la demanda mxima de cada
proceso. Si max[i][j] = k, entonces el proceso pi puede solicitar, como mximo,
k instancias del tipo de recurso rj .
Allocation, una matriz de dimensiones nxm que indica el nmero de instancias de
cada tipo de recurso asignadas a cada proceso. Si allocation[i][j] = k, entonces el
proceso pi tiene actualmente asignadas k instancias del recurso rj .
Need, una matriz de dimensiones nxm que indica la necesidad restante de recursos
por parte de cada uno de los procesos. Si need[i][j] = k, entonces el proceso pi
puede que necesite k instancias adicionales del recurso rj . need[i][j] = max[i][j]
allocation[i][j].
Allocation Max
p0 0012 0012
p1 1000 1750
p2 1354 2356
p3 0632 0652
p4 0014 0656
needo = [0, 0, 0, 0]
need1 = [0, 7, 5, 0]
need2 = [1, 0, 0, 2]
need3 = [0, 0, 2, 0]
need4 = [0, 6, 4, 2]
En primer lugar, se hace uso de dos vectores: i) work = [1, 1, 0, 0] y ii) f inish =
[f, f, f, f, f ] y se calcula la necesidad de cada uno de los procesos (max allocation):
needo = [0, 0, 0, 0]
need1 = [0, 3, 3, 0]
need2 = [1, 0, 0, 2]
need3 = [0, 0, 2, 0]
need4 = [0, 6, 4, 2]
[36] Captulo 1 :: Conceptos Bsicos
Tradicionalmente, los sistemas de tiempo real se han utilizado para el control de pro-
cesos, la fabricacin y la comunicacin. No obstante, este tipo de sistemas tambin se
utilizan en un contexto ms general con el objetivo de proporcionar una monitorizacin
continua de un determinado entorno fsico.
[38] Captulo 1 :: Conceptos Bsicos