Está en la página 1de 39

En un sistema multiprogramado con un nico procesador, los procesos se intercalan en el tiempo para dar la apariencia de ejecucin simultnea.

Como no se consigue un procesamiento paralelo real y aunque se produce una cierta sobrecarga en los intercambios de procesos de un sitio a otro, la ejecucin intercalada produce beneficios importantes en la eficiencia del procesamiento y en la estructuracin de los programas. El problema principal se da por la velocidad relativa de ejecucin de los procesos, la cual no puede predecirse y dependen de las actividades de otros procesos, de la forma en que el SSOO trata las polticas de planificacin.

Compartir recursos globales est lleno de riesgos. Por que ?

Lectura / Escritura

Lectura / Escritura

El orden en que se ejecuten las lecturas y escrituras, es critico. Por que ? :P


Que pasa si un Proceso A solicita uso y obtiene control sobre un canal de E/S y se suspende (el proceso A) antes de hacer uso del canal?

Proceso C

Proceso A

Proceso B

Proceso C

Proceso A

Proceso B

Veamos el siguiente ejemplo:


void echo(){ ent=getchar(); sal=ent; putchar(sal); }

Cualquier programa puede llamar a este procedimiento repetidas veces para recibir la entrada de un usuario y mostrarla en pantalla.
Considrese un sistema multiprogramado con un nico usuario, el cual puede pasar de una aplicacin a otra y cada aplicacin utiliza el mismo teclado para la entrada y la misma salida por pantalla

Como cada aplicacin utiliza el procedimiento echo(), tiene sentido que ste sea un procedimiento compartido que se cargue en una parte de la memoria para todas las aplicaciones; as se usa una copia del procedimiento y se ahorra espacio.
Esto es til, estamos de acuerdo, ya que nos permite una interaccin cercana y eficiente entre los procesos. Sin embargo, compartir puede dar lugar a problemas.
2.- Se activa el proceso B y llama al procedimiento echo, que se ejecuta hasta el final y muestra un caracter Y en la pantalla. 1.- Llama al procedimiento echo y es interrumpido inmediatamente, despus de terminar la funcin de entrada. En este punto, el ltimo carcter ledo, X, estar almacenado en la variable ent. 3.- Se reanuda el proceso A, Ahora el valor de X ha sido sobrescrito en la variable ent con Y; Por lo tanto, lo original para A se perdi.

Proceso B

Proceso A

Que pasa si decimos ahora que solo un proceso a la vez puede utilizar la funcin echo()? El S.O. debe ser capaz de seguir la pista a los distintos procesos (Lo cual hace mediante los PCB) El S.O. debe proteger los datos y los recursos fsicos de cada proceso contra injerencias no intencionadas de otros procesos. Esto supone emplear tcnicas relativas a la memoria, archivos y E/S. Los resultados de un proceso debe ser independientes de la velocidad relativa a la que se realiza la ejecucin de otros procesos concurrentes.

La manera en que interactan los procesos se puede clasificar en funcin del nivel de conocimiento que cada proceso tiene de la existencia de los dems. Procesos no tienen conocimiento de los dems. Estos son llamados procesos independientes que no estn pensados para operar juntos. Ntese que aunque los procesos no trabajen juntos, el S.O. tiene que encargarse de la competencia por los recursos. Procesos tienen conocimiento indirecto de otros. No conocen necesariamente a los otros por sus PID, pero comparten el acceso de algunos objetos, como un Buffer de E/S. Estos procesos muestran Cooperacin indirecta.

Procesos tienen un conocimiento directo de los otros. Estos son capaces de comunicarse con los dems por el PID y estn diseados para trabajar conjuntamente en alguna actividad. Estos procesos muestran , al igual que los anteriores, cooperacin. Obviamente, las condiciones no estarn siempre tan claramente diferenciadas.

Dos o ms procesos necesitan acceder a un recurso durante el curso de su ejecucin; ningn proceso es consciente de la existencia de los otros y no se ve afectado por su ejecucin
Por ende, cada proceso debe dejar tal y como est el estado de cualquier recurso que utilice, como E/S, Memoria, CPU o Reloj. En el caso de que existan procesos en competencia, se deben solucionar tres problemas de control

Esto se da cuando dos o mas procesos quieren acceder a un nico recurso no compartible, como una impresora.
Estos recursos sern llamados, Recursos Crticos y la parte del programa que los accede se conoce como Seccin Critica del programa.
Pide recurso en 00:00:12:15

Recurso Crtico

Proceso A Pide recurso en 00:00:12:16

Proceso B

Imaginemos que tenemos a P1 y P2 con dos recursos R1 y R2. Ahora supongamos que cada proceso necesita acceder a ambo recursos para llevar a cabo una parte de su funcin.

Cual es el problema aqu?!

R1

R2

Ambos necesitan acceder a R1 y R2

Proceso A

Proceso B

Esto es cuando un proceso no puede acceder a un recurso por un tiempo ilimitado.

El recurso sigue existiendo despus de que un proceso lo use (recurso reutilizable) o desaparece una vez utilizado. Los procesos pueden compartir el uso de un recurso o lo deben usar en modo exclusivo o dedicado. Hay un nico ejemplar de cada recurso o existen mltiples unidades de cada uno. Es factible expropiar el recurso al proceso que lo est utilizando.

Proceso P1 Solicita (C) Solicita (I) Uso de los recursos Libera (I) Libera (C)

Proceso P2 Solicita (I) Solicita (C) Uso de los recursos Libera (C) Libera (I)

1.- P1 : solicita (C)


2.- P2 : solicita (I) 3.- P2 : solicita (C) 4.- P1 : solicita (I)

1.- P1 : solicita (C) 2.- P1 : solicita (I) 3.- P2 : solicita (I) 4.- P1 : libera (I) 5.- P2 : solicita (C) 6.- P1 : libera (C) 7.- P2 : libera (C) 8.- P2 : libera (I)

Proceso P1 Enviar (P3,A) Recibir (P3,B)

Proceso P2 Recibir (P1,D) Enviar (P3,E)

Proceso P3 Recibir (P2,F) Enviar (P1,G)

Enviar (P2,C)

Recibir(P1,H)

Proceso P1
solicitar (C) Enviar (P2,A) libera (C)

Proceso P2
solicita (C) Recibir (P1,B) libera (C)

G={ {N} , {A} } N se descompone de dos subconjuntos disjuntos que se corresponden con los procesos P y los recursos R. Cada recurso Ri tiene asociado un valor que representa cuntas unidades del recurso existen. El conjunto de aristas A se descompone de similar manera. Las Aristas de asignacin que relacionan R con P indican que el proceso tiene asignada una unidad de dicho recurso. Las aristas de solicitud que relacionan P con R indican que el proceso est esperando la concesin de una unidad de dicho recurso.

Tomando en cuenta que tenemos un sistema con 3 recursos, R1 con 2 unidades, R2 con 3 unidades y R3 con 2 unidades. A su vez, tenemos tres procesos que realizan la siguiente traza de peticiones: 1.- P1 : solicita (R1[2]) 2.- P2 : solicita (R2[1]) 3.- P2 : solicita (R1[1])

4.- P3 : solicita (R2[1])


N = { P1,P2,P3,R1(2),R2(3),R3(2) } A = { R1P1, R1P1, R2P2, P2 R1, R2P3 }

N = { P1,P2,P3,R1(2),R2(3),R3(2) } A = { R1P1, R1P1, R2P2, P2 R1, R2P3 }

P1

P2

P3

R1

R2

R3

5.- P3 : solicita (R2[1]) 6.- P1 : solicita (R2[1],R3[2])

N = { P1,P2,P3,R1(2),R2(3),R3(2) } A = { R1P1, R1P1, R2P2, P2R1, R2P3, R2P3, P1R2, P1R3,P1R3}

P1

P2

P3

R1

R2

R3

Tomando en cuenta que tenemos un sistema con 3 recursos, cada uno de ellos con una sola unidad y 4 procesos que realizan las siguiente traza de peticiones: 1.- P1 : solicita (R1[1]) 2.- P2 : solicita (R2[1]) 3.- P2 : solicita (R1[1]) 4.- P3 : solicita (R2[1]) 5.- P4 : solicita (R3[1]) 6.- P1 : solicita (R2[1]) N = ??? A = ???

N = { P1,P2,P3,P4,R1(1),R2(1),R3(1) } A = {R1P1, R2P2,P2R1,P3R2,R3P4,P1R2}

P1

P2

P3

P4

R1

R2

R3

Veremos el mtodo de Dekker, el cual tiene la ventaja de ilustrar la mayora de los errores habituales que se producen en la construccin de programas concurrentes.
Primer Intento de Dekker
/* Proceso A*/ While(turno !=0) /*hacer nada*/ /*Seccin Critica*/ Turno=1;

/* Proceso B*/ While(turno !=1) /*hacer nada*/ /*Seccin Critica*/ Turno=0;

Segundo Intento de Dekker


/* Proceso A*/ While(seal[1]) /*hacer nada*/ Seal[0]=true; /*Seccin Critica*/ Seal[0]=false; /*Resto Cdigo*/

/* Proceso B*/
While(seal[0]) /*hacer nada*/ Seal[1]=true; /*Seccin Critica*/

Seal[1]=false;
/*Resto Cdigo*/

Tercer Intento de Dekker

/* Proceso A*/ Seal[0]=true; While(seal[1]) /*hacer nada*/ /*Seccin Critica*/

Seal[0]=false;

/* Proceso B*/ Seal[1]=true; While(seal[0])

/*hacer nada*/
/*Seccin Critica*/ Seal[1]=false;

Cuarto Intento de Dekker

/* Proceso A*/ Seal[0]=true;

While(seal[1])
/*hacer nada*/ Seal[0]=false; /*Seccin Critica*/ Seal[0]=true;

/* Proceso B*/ Seal[1]=true; While(seal[0]) /*hacer nada*/

Seal[1]=false;
/*Seccin Critica*/ Seal[1]=true;

Dos o mas procesos pueden cooperar por medio de seales simples de forma que se pueda obligar a detener un proceso en una posicin determinada hasta que reciba una seal especifica. Para esta sealizacin se usan unas variables especificas llamadas semforos. Para transmitir una seal por el semforo X los procesos ejecutan la primitiva Signal(X). Para recibir una seal de los procesos se ejecuta la primitiva Wait(X)

Los Semforos son variables que tienen un valor entero sobre el que se pueden definir las tres operaciones siguientes: Un semforo puede iniciarse con un valor no negativo. Wait disminuye el valor del semforo. Si el valor se hace negativo, el proceso que ejecuta wait se bloquea. Signal incrementa el valor del semforo. Si el valor no es positivo, se desbloquea un proceso bloqueado por wait.

struct semaforo{ int contador; tipoCola cola; } void wait(semaforo s){ s.contador--; if(s.contador <0){

poner este proceso en s.cola;


bloquear este proceso; } }

void signal(semaforo s){


s.contador++; if(s.contador <=0){ quita un proceso de s.cola; Poner proceso P en la cola de listos; } }

Wait(cierre)

-1 B El valor absoluto de este numero es igual a la cantidad de proceso que hay en cola.

Wait(cierre)

-2 B C -1 C 0 Signal(cierre) Signal(cierre)

Wait(cierre)

Signal(cierre)

También podría gustarte