Sistemas Operativos MemoriaMemoria Gestión de procesos Generalidades de S.O. Generalidades de...

Post on 02-Mar-2015

23 views 3 download

Transcript of Sistemas Operativos MemoriaMemoria Gestión de procesos Generalidades de S.O. Generalidades de...

Sistemas Operativos

MemoriaMemoria

Gestión deGestión deprocesosprocesos

GeneralidadesGeneralidadesde S.O.de S.O.

Generalidades de Sistemas Operativos is a Design Digital Content & Contents mall developed by Guild Design Inc.

Gestión de procesos is a Design Digital Content & ontents mall developed by Guild Design Inc.

Memoria Contents mall developed by Guild Design Inc.

Sistemas Operativos

ConceptosConceptosde Seguridadde Seguridad

DiscoDiscoDisco is a Design Digital Content & Contents mall developed by Guild Design Inc.

Conceptos de SeguridadContents mall developed by Guild Design Inc.

3

II - GESTIÓN DE PROCESOS

Sistemas Operativos

4

Despachador de procesos

Es la parte del núcleo del SO que se encarga de administrar las tareas.

También llamado despachador de tareas. Un proceso puede perder la CPU porque inicia

una operación de E/S o porque expira su quantum de tiempo.

Esta forma de reparto de CPU es la base de funcionamiento de los sistemas de tiempo compartido.

Es posible manejar prioridades. Cada vez que se cambia de tarea en la CPU, hay

que guardar el contexto.

5

Despachador de procesos

Una tarea que pierde la CPU queda marcada: Indicando que expiró su quantum de tiempo. O indicando que está esperando por alguna

interrupción (por ejemplo una indicación de fin de impresión).

Un sistema operativo monotarea y sin spooling, si tiene que imprimir, directamente puede mandar la información al buffer de la impresora. El compilador puede resolverlo.

En un sistema operativo multitarea, si el compilador encuentra una impresión debe solicitar la impresión a través de la llamada al sistema correspondiente.

6

Proceso

Es un programa en ejecución. Un proceso es una entidad dinámica y un

programa es una entidad estática. Varios procesos diferentes pueden ser

instancias de un mismo programa. El sistema operativo guarda información de

los procesos en una estructura de memoria llamada PCB (process control block).

El PCB contiene, punteros al código, estado del proceso, punteros a recursos en uso, a recursos reservados, nivel de prioridad, etc.

7

Primer diagrama de estados

ListoEn ejecución

Bloqueado

Se despacha el proceso(se le da CPU)

El proceso, en su ejecución, ejecuta una operación tal que queda esperando la ocurrencia de un evento (por ej. El fin de una operación de E/S).

ocurre el evento por el cualestaba bloqueado

timeout

8

Operaciones sobre procesos

tiempo expirado : en ejecución a listo despachar : listo a en ejecución bloquear : en ejecución a bloqueado despertar : en ejecución a listo

9

Procesos

El sistema operativo, en un momento dado, tiene un conjunto de procesos activos, que pueden estar en alguno de los estados anteriores.

La cantidad de procesos “en ejecución” coincide con la cantidad de procesadores del sistema.

De aquí en más suponemos que el sistema tiene un solo procesador.

Un procesador “listo”, sólo espera la CPU para ser ejecutado.

10

Procesos

En definitiva, los procesos en el sistema pueden verse como: Un proceso utilizando la CPU Otros procesos en una “cola de listos”. Otros procesos en “cola de bloqueados”

esperando la ocurrencia de ciertos eventos. Estas colas pueden ser también colas por

prioridad.

11

El PCB

Bloque de control del proceso o descriptor del proceso.

Define al proceso en el sistema operativo. Contiene información del proceso:

Estado actual. Id del proceso en el sistema. Puntero al padre. Punteros a los procesos hijos. Prioridad del proceso. Punteros a las zonas de memoria asignadas al proceso. Punteros a los recursos asignados al proceso. Área para salvaguardar registros. SI hay más de una CPU, la CPU en la que se está ejecutando

el proceso.

12

Operaciones sobre procesos

Crear (un proceso) Destruir Suspender Reanudar Cambiar prioridad Bloquear Despertar Despachar Establecer una comunicación entre

procesos

13

Creación de procesos

Implica: Asignarle un nombre Crear su PCB Darlo de alta en la tabla de procesos del sistema Determinar su prioridad inicial Asignarle los recursos iniciales

Todo proceso puede crear procesos hijos, existiendo entonces una estructura jerárquica que vincula los procesos del sistema.

14

El RCB

Similarmente, el sistema operativo maneja los recursos a través de los Bloques de Control de Recursos.

15

Estados de suspensión

Un proceso suspendido no puede continuar su ejecución a menos que sea reanudado por otro proceso.

La suspensión puede ser usada para disminuir transitoriamente la carga del sistema.

La reanudación es la operación que deja un proceso en el punto inmediatamente anterior a la suspensión.

Se pueden suspender procesos por: falla inminente en el sistema, comportamiento errático o sospechoso de algún proceso, picos de carga en el sistema, etc.

16

Nuevo diagrama de estados

Listo

En ejecución

Bloqueado

Suspendido- Listo Suspendido-Bloqueado

Se bloquea a esperar por un evento

despachado

Ocurre evento

timeout

suspender

suspender

reanudarsuspender

reanudar

Ocurre evento

17

Interrupciones

Cuando ocurre una interrupción: (una interrupción puede ser generada por el

hardware o por otro proceso) El hardware pasa el control al sistema operativo El sistema operativo guarda el estado del proceso

interrumpido, normalmente en el PCB El sistema analiza la interrupción y transfiere el

control al handler (manejador) correspondiente. Normalmente se resuelve esto a nivel de hardware.

Se ejecuta el handler Se restablece el estado del proceso interrumpido Se ejecuta el proceso interrumpido

18

Interrupciones

Son una forma económica de llamar la atención a la CPU.

Así, la CPU no necesita escrutar los dispositivos para ver si alguno requiere atención.

Recordar que normalmente los handlers se ejecutan con las interrupciones deshabilitadas.

Tipos de interrupciones: de E/S, externas, de reinicio, de verificación de programa (anomalía en la ejecución), de verificación de la máquina (anomalía hardware).

19

El núcleo del SO

Los procesos se controlan por el núcleo. El núcleo es una parte pequeña del SO, pero

es la más utilizada. Por lo general el núcleo reside en memoria

principal, mientras que otras partes se cargan y descargan bajo demanda.

El núcleo abarca la gestión de interrupciones. El núcleo deshabilita las interrupciones

mientras ejecuta algún handler. Los handlers deben ser lo más breves y

simples posibles por esa razón.

20

Funciones del núcleo

Manejo de interrupciones Creación y destrucción de procesos Cambio de estados entre procesos Despacho Suspensión y reanudación Sincronización de procesos Comunicación entre procesos Gestión de PCB Apoyo a actividades de E/S Asignación y liberación de memoria Gestión del file system Mecanismos para llamada y retorno desde procedimientos

21

Tendencias

Partes del núcleo tienden a pasar al microcódigo de la CPU.

Con esto se gana en eficiencia y también en seguridad, ya que ejecuta en los modos privilegiados del procesador.

También parte del núcleo tiende a aparecer embebida en el hardware de los controladores (caso típico es la lógica de manejo de disco).

22

Control de lectura

A esta altura ya debe haber leído hasta el capítulo 3 (inclusive) de Deitel o su equivalente en los otros textos.

23

Concurrencia

Es la posibilidad que varios procesos se ejecuten simultáneamente.

Se denominan procesos concurrentes a aquellos que coexisten en un sistema.

Los procesos concurrentes podrían ser ejecutados en paralelo en procesadores diferentes.

PERO, en el caso más general habrá que repartir los procesadores del sistema entre los procesos en ejecución.

Para simplificar, el problema es repartir el procesador entre los procesos en ejecución.

24

Un primer ejemplo

Fact (n:integer):integerBegin

a:=semifact(1,piso(n/2));b:=semifact(piso(n/2)+1,n);fact:=a*b

End

(ejercicio: hacer semifact(i,j), que calcula el producto de i a j).

25

Introduciendo cobegin/coendFact (n:integer):integerBegin

cobegina:=semifact(1,piso(n/2));b:=semifact(piso(n/2)+1,n)

coend;fact:=a*b

End

26

Comentarios

Al llegar a cobegin, se lanzan concurrentemente los cálculos e las variables a y b.

En el coend se espera por el fin de ambos cálculos para continuar.

En este caso realmente no se gana tiempo de CPU, pues no hay E/S, es todo cálculo y está el overhead por cambiar CPU entre procesos.

De todos modos es un primer ejemplo de programación concurrente.

Si hubiera más de un procesador, tal vez se ganara tiempo. Notar el programador no debe preocuparse por esto al crear el programa.

27

Otro problema

Se quieren realizar los siguientes cálculos:

a:=x + yb:=z+1c:=a-bw:=c+1

28

Otro problema

No es posible lanzar concurrentemente las instrucciones anteriores debido a las precedencias.

Sólo son asincrónicas (así se les llama) las dos primeras. El resto requiere de sincronización según cierto grafo de precedencias.

Si no marcamos en el programa esa precedencia, todo queda librado a la suerte.

29

Grafo de precedencias

Nodos: los procesos a ejecutar. Aristas: existe arista entre v1 y v2 si y

sólo si el proceso asociado al nodo v1 precede al proceso asociado al nodo v2.

El grafo debe ser acíclico. El grafo de precedencias indica sin

ambigüedades en qué orden es necesario ejecutar.

30

Ejemplo (anterior, cont.)

a b

c

w

31

Dos herramientas

Así, tenemos dos herramientas (tal vez con diferente poder expresivo) para describir concurrencia: Grafos de precedencia Cobegin/Coend

32

Ejemplo

Dado:inic

S2

S4

S6S5

fin

S3

33

Ejemplo

Es equivalente a:

Begininiccobegin

P1S3

coendfin

End

P1:

BeginS2S4cobegin

P5S6

coendEnd

34Ejemplo

Dado:inic

S2

S4

S6S5

fin

S3

35

Ejemplo No hay forma de describir el grafo anterior en

términos de cobegin/coend. Es fácil demostrar que todo programa escrito por

cobegin/coend puede describirse en términos de un grafo de precedencias.

Entonces, el conjunto de situaciones de concurrencia descripto por cobegin/coend está estrictamente incluido en el conjunto de situaciones de concurrencia descripto por los grafos de precedencias.

Una conclusión inmediata de lo anterior es que vamos a necesitar más herramientas, cobegin/coend no alcanzan.

36

Otro problema...

Consideremos el programa:J:=10Cobegin

print J;J:=1000

Coend ¿ Imprime 10 o imprime 1000 ? Depende del orden en que las

operaciones lleguen a la CPU. Los programas concurrentes deberán ser

independientes de dicho orden.

37

Características que se pedirán a los programas concurrentes Consistencia: Los programas deberán ser

consistentes en el sentido que NO deberán depender del orden en que se ejecuten las instrucciones concurrentes.

Ausencia de deadlocks o puntos muertos: Se deben evitar situaciones en las que un conjunto de procesos quedan bloqueados “eternamente”, cada uno esperando por algún evento asociado a otro elemento del mismo conjunto.

Ausencia de posposición indefinida: Habiendo varios procesos concurrentes, deberá cuidarse que algunos no acaparen la CPU en detrimento de otros.

38

Un problema típico

El problema de la mutua exclusión. Un recurso serialmente reusable (RSR) es un

recurso que puede ser usado varias veces por distintos procesos, pero siempre uno por vez.

Los procesos que quieren usar un recurso serialmente reusable deben esperar a que el mismo se encuentre libre.

Por ejemplo una impresora, o una variable global. El problema de la mutua exclusión se da cuando

dos o más procesos desean acceder concurrentemente a un recurso serialmente reusable.

39

Ejemplos

Varios procesos que imprimen sobre la misma impresora.

Varios procesos que trabajan sobre los mismos saldos.

40

Solución “bruta”

Si los procesos deben hacer cola por el RSR, entonces, anulamos la concurrencia, se ejecuta completamente uno y luego completamente el otro.

Es una solución muy restrictiva, y estaríamos perdiendo la capacidad de modelar situaciones en las que varios procesos coexisten.

41

Alicia y Bernardo (A y B)

Es un problema de acceso bajo mutua exclusión.

Es isomorfo a los problemas anteriores, pero permite ver con más claridad algunas situaciones.

42

El lugar

Patio de usoComún.

Casa de Alicia

Casa de Bernardo

43

Reglas que definen el problema Alicia vive en su casa. Bernardo vive en su casa. Los perros, como parte de su vida, cada

tanto, necesitan “salir al patio”. Si los perros se encuentran en el patio, se

pelean. Se desea programar procesos “Alicia” y

“Bernardo” tales que puedan vivir cumpliendo las reglas anteriores.

44

Solución 1:

Se usa un cartel que indica a quien le toca sacar al perro al patio.

Cada uno pasea el perro (si es su nombre el que está en el cartel) y cambia el nombre para que el otro pueda pasear a su perro.

45

Solución 1

Program Versión 1Procedure AliciaBegin

while true dowhile turno <> 1 do ;paseo_perro;turno:=2;hace_otras_tareas

endwhileEnd Alicia

46

Solución 1

Procedure BernardoBegin

while true dowhile turno <> 2 do ;paseo_perro;turno:=1;hace_otras_tareas

endwhileEnd Bernardo

47

Solución 1

Begin {main}turno:=1;cobegin

Alicia;Bernardo

coendEnd

48

Detalles

Alicia y Bernardo son los procesos. El patio es el recurso a mutuo excluir. Notar que while true do hace un loop

infinito. Notar que los procesos se coordinan

(sincronizan) deteniéndose a esperar con while turno <> 1 do;

49

Un primer problema

Busy Waiting: Los procesos que esperan no liberan la CPU, sino que como parte de su espera desperdician ciclos de reloj.

Nos ocuparemos de este problema más adelante.

50

Problemas

El cartel impone que Alicia y Bernardo se turnen.

No es posible que uno de los perros salga dos veces seguidas al patio.

Si el perro que tiene el turno muere, el otro no puede salir más al patio.

51

Problemas

Si un perro necesita ir muchas veces al patio y otro pocas... entonces esta solución no es adecuada.

52

Solución 2

Alicia y Bernardo tienen cada uno una bandera.

Cuando uno saca al perro levanta su bandera.

Antes de sacar al perro deben fijarse que la bandera del otro no esté puesta.

53

Solución 2

Program Versión 2Procedure AliciaBegin

while true dowhile flag_b do ;flag_a:=true;paseo_perro;flag_a:=false;hace_otras_tareas

endwhileEnd Alicia

1234

5

54

Solución 2

Procedure BernardoBegin

while true dowhile flag_a do ;flag_b:=true;paseo_perro;flag_b:=false;hace_otras_tareas

endwhileEnd Bernardo

12345

55

Solución 2

Begin {main}flag_a:=false;flag_b:=false;cobegin

Alicia;Bernardo

coendEnd

56

Esta solución...

No impone, como la solución anterior, restricciones sobre los paseos. Un perro puede salir todas las veces seguidas que quiera.

Restan las preguntas: ¿Se resuelve el problema de la mutua exclusión? ¿Hay consistencia? ¿Hay deadlocks? ¿Hay aplazamiento indefinido?

PARA ESTO SE UTILIZA LA METODOLOGÍA DE LOS ENTRELAZADOS.

57

1

2

1

3

2

4

3 4

FF FF TF TF FF

FF

FF

FT

FT FT

FT TT

TTTT

TT

FF

FF FF

FFTFTF

TF TF

FT

FT

AliciaB

ern

ard

o

RegiónCrítica

58

Comentarios sobre el diagrama Detección de problemas con la mutua

exclusión (intersección de regiones críticas).

Detección de deadlocks. Detección de posposición indefinida. Granularidad de las operaciones

indivisibles.

59

En este caso...

Encontramos que hay casos en que se viola la exclusión mutua.

Es el caso en que los dos “a la vez” intentan consultar la bandera del otro.

Notar que “a la vez” significa que llegan consecutivas al procesador.

No hay deadlocks ni posposición indefinida.

60

Solución 3

Program Versión 3Procedure AliciaBegin

while true doflag_a:=true;while flag_b do ;paseo_perro;flag_a:=false;hace_otras_tareas

endwhileEnd Alicia

61

Solución 3

Procedure BernardoBegin

while true doflag_b:=true;while flag_a do ;paseo_perro;flag_b:=false;hace_otras_tareas

endwhileEnd Bernardo

62

Solución 3

Begin {main}flag_a:=false;flag_b:=false;cobegin

Alicia;Bernardo

coendEnd

63

Comentarios

Esta solución tiene deadlock. Probarlo por medio de los entrelazados.

TT

64

Solución 4

Program Versión 4Procedure AliciaBegin

while true doflag_a:=true;while flag_b do

flag_a:=false;delay (random);flag_a:=true

endwhile;paseo_perro;flag_a:=false;hace_otras_tareas

endwhileEnd Alicia

65

Procedure BernardoBegin

while true doflag_b:=true;while flag_a do

flag_b:=false;delay

(random);flag_b:=true

endwhile;paseo_perro;flag_b:=false;hace_otras_tareas

endwhileEnd Bernardo

Solución 4

66

Solución 4

Begin {main}

flag_a:=false;

flag_b:=false;

cobegin

Alicia;

Bernardo

coend

End

67

Comentarios

No se eliminan completamente el problema del deadlock y de la posposición indefinida. Con probabilidad baja pero podrían ocurrir.

68

Algoritmo de Dekker

Es el que soluciona el problema. Utiliza un cartel y dos banderas. Persiste el problema de Busy Waiting. El algoritmo de Peterson también

resuelve el problema, con busy waiting, pero es un poco más simple.

69

Algoritmo de Dekker

Program DekkerVar

proceso_favorecido: (primero, segundo);p1_desea_entrar, p2_desea_entrar: boolean;

FALTAN PROCEDURES

Begin {main}p1_desea_entrar:=false;p2_desea_entrar:=false;proceso_favorecido:=primero;cobegin

proceso_uno;proceso_dos

coendEnd.

70

Algoritmo de Dekker

Procedure proceso_uno;

Begin

while true do

p1_desea_entrar:=true;

while p2_desea_entrar do

if proceso_favorecido=segundo then

p1_desea_entrar:=false;

while proceso_favorecido= segundo do;

p1_desea_entrar:=true

endif

seccion_critica_1;

proceso_favorecido:=segundo;

p1_desea_entrar:=false;

otras_tareas_uno

endwhile

End proceso_uno

71

Algoritmo de DekkerProcedure proceso_dos;Begin

while true dop2_desea_entrar:=true;while p1_desea_entrar do

if proceso_favorecido=primero then p2_desea_entrar:=false;while proceso_favorecido= primero

do;p2_desea_entrar:=true

endifseccion_critica_2;proceso_favorecido:=primero;p2_desea_entrar:=false;otras_tareas_dos

endwhileEnd proceso_dos

72

Algoritmo de Peterson

Program petersonvar:

proceso_favorecido(primero, segundo);p1_desea_entrar, p2_desea_entrar: boolean;

FALTAN LOS PROCEDURESBegin {main}

p1_desea_entrar:=false;p2_desea_entrar:=false;proceso_favorecido:=primero;cobegin

proceso_uno;proceso_dos

coendEnd.

73

Algoritmo de Peterson

Procedure Proceso_unoBegin

while true dobegin p1deseaentrar:=true; proceso_favorecido:=segundo; while p2_desea_entrar and proceso_favorecido =

segundo do; sección_crítica_1; p1_desea_entrar:=false; otras_taeras_uno

endWhileEnd Proceso_uno

74

Algoritmo de PetersonProcedure Proceso_dosBegin

while true dobegin p2deseaentrar:=true; proceso_favorecido:=primero; while p1_desea_entrar and proceso_favorecido = primero

do; sección_crítica_2; p2_desea_entrar:=false; otras_taeras_dos

endWhileEnd Proceso_dos

75

Hasta aquí

Tenemos algoritmos para resolver el problema de la mutua exclusión: Persiste el problema de Busy Waiting Las soluciones logradas no son fáciles de

generalizar: A n procesos. A n recursos.

76

Un detalle

El patio podría ser por ejemplo una variable global.

En todo momento hay que decidir la granularidad de las operaciones a ser realizadas en forma atómica por la CPU.

En los ejemplos anteriores la granularidad venía dada como que cada instrucción del pseudoPascal usado era atómica, es decir, no se podía perder el procesador durante su ejecución.

Pero podría trabajarse a nivel de Assembler, es decir, con la posibilidad de perder CPU a nivel de una instrucción de Assembler.

77

Un detalle

Proceso 1 Proceso 2x:=x + 3 x:=x + 10

LOAD XLOAD XREG =REG+3

REG=REG+10STORE X

STORE X

78

Un detalle

Como se ve, pueden aparecer los mismos problemas de intercalamiento de operaciones a este nivel.

Pero también aparece (no está reflejado ahí) el hecho de salvar el contexto al quitar la CPU a un proceso.

79

Se necesitan otras herramientas Con los semáforos:

Se trabajará con primitivas bloqueantes, eliminando así el problema del busy waiting.

Se lograrán soluciones que pueden generalizarse con mayor facilidad.

80

Semáforos

Son un TAD, inventado por Dijkstra. Utiliza el estado “bloqueado”, por lo

tanto no hay busy waiting. s:Semáforo, s pertenece a N init(s, v) Inicializa la variable s con el

valor v. Sólo se puede usar una vez, y es cuando se crea el semáforo.

P(s) Operación WAIT. V(s) Operación SIGNAL.

81

Semáforos

P(s) If s > 0 then

s:=s-1Else

wait on sEndif

wait on S, significa que se bloquea hasta que el evento asociado a S lo despierte.

El proceso que hace P(s) queda en estado bloqueado, entonces no usa la CPU. No hay busy waiting.

82

Semáforos V(s)

If (existe tarea esperando en s ) thense despierta alguna en ellas

Elses:=s+1

Endif

Se despierta alguna tarea que se bloqueó haciendo P(s).

Al elegir alguna implementación concreta se determinará el orden en que se van despertando las tareas bloqueadas. De acuerdo al TAD, se despierta una cualquiera.

83

Comentarios

P y V son operaciones que deben ejecutarse en forma INDIVISIBLE.

No es posible interrumpir su ejecución. Las soluciones que usan semáforos no

deben presuponer que las tareas bloqueadas por P, son despertadas por V en algún orden particular.

84

Otra implementación alternativa init(s,v) P(S):

s:=s-1;if s<0 then wait

V(S):s:=s+1;if s<=0 then despertar_alguna_tarea

85

Problema de A y B implementado con semáforos.Program Mutua_ExclusiónVar

s:semáforo;Procedure Alicia;Begin

while true doP(s);Paseo_perro;V(s);

endwhileEnd;

86

Continuación...

Procedure Bernardo;Begin

while true doP(s);Paseo_perro;V(s);

endwhileEnd;

87

Continuación...

Begin {main}init(s,1);cobegin

Alicia;Bernardo

coendEnd.

88

Comentarios

Notar como la operación P de Alicia es desbloqueada por la operación V de Bernardo y viceversa.

No hay busy waiting. Si son varias Alicia o varios Bernardo la

generalización es inmediata. El semáforo se asocia al recurso a mutuo

excluir: el patio. Se cumple la siguiente propiedad

(invariante): s vale 0 sii algún proceso está ejecutando en la región crítica. (1a implem).

89

Comentarios

Si se quiere generalizar a más patios, hay que proteger cada patio con un semáforo, y discutir algunos detalles más de cómo se comparten.

La idea es que se pone un semáforo por cada recurso a mutuo excluir.

Si a algún proceso le falta el V(s) puede quedar algún proceso bloqueado eternamente...

90

Una variante del problema

Si queremos que de n procesos, sólo k (k<n) entren a la vez a la región crítica, entonces basta cambiar: Init (s,k) En lugar de init (s,1).

Ejercicio: reformular el invariante para este caso.

91

Varios problemas

3 personas, 1 patio, 1 por vez en el patio: 1 semáforo valiendo 0 o 1.

3 personas, 1 patio, no más de 2 en el patio: 1 semáforo con valores 0, 1 o 2. (Para eso Init en 2).

100 personas, 3 patios, no más de 2 por patio: 3 semáforos con {0,1,2}.

92

Un caso problemático

Si un proceso hace:P(Q)V(S)

Y otro proceso hace:P(S)V(Q)

Si al principio S y Q están en 0, puede haber deadlock.

93

Implementación con busy waiting (se implementan de forma atómica) P(s):

While s <=0 do ;s:=s-1

V(s):s:=s+1

Init(s,k):s:=k

94

Implementaciones menos problemáticas Normalmente se implementan con

llamadas al despachador de tareas, usando los cambios de estados asociados a las situaciones de bloqueo.

También existen implementaciones basadas en “test_and_set”, etc.

95

Desventajas de los semáforos No son útiles en procesos concurrentes

en distintos sistemas dentro de una misma red (donde es costosísimo e inconveniente trabajar con variables globales).

Los semáforos son variables globales y tienen las dificultades de manejo que tienen estas.

96

Semáforos binarios

Sus valores son 0 y 1. Si está en 0 y hay un signal, entonces

queda en 1. Si está en 1 y hay un signal, entonces

queda en 1. Son más fáciles de implementar y a partir

de ellos se pueden implementar los generales (haciendo que las operaciones indivisibles sean protegidas con un semáforo binario).

97

Retomando el problema de los grafos de precedencia

Dado:inic

S2

S4

S6S5

fin

S3

No se podía escribir con cobegin/coend

98

Continuación...

Primero se etiquetan las aristas “problemáticas” (donde hay bifurcaciones y donde se juntan).

inic

S2

S4

S6S5

fin

S3

a b

cd

e

f

g

99

Solución

Var a,b,c,d,e,f,g: semáforo;

Begininit(a,0);init(b,0);..............init(g,0)

100

Solución

Cobegin;begin S1;V(a);V(b);end;begin P(a); S2; S4; V(c);V(d);end;begin P(b); S3; V(e); end;begin P(c); S5; V(f); end;begin P(d); P(e); S6; V(g); end;begin P(f); P(g); S7; end

Coend;

101

Comentarios

Notar como dentro de cada una de las líneas del cobegin/coend hay ejecución secuencial (de izda. a derecha).

Los semáforos se inicializan en 0, por lo tanto todas las P bloquean.

Son las V las que van destrancando ordenadamente.

En definitiva, con cobegin/coend y semáforos se logra el mismo poder expresivo que con los grafos de precedencia.

102

Problema del Productor-Consumidor El productor coloca datos en un buffer. El consumidor toma datos del buffer. Deben hacerlo en forma sincronizada

pues: Al buffer hay que acceder bajo mutua

exclusión. El productor no puede seguir colocando en

un buffer lleno. El consumidor no puede tomar de un buffer

vacío.

103

Solución

Program Productor_Consumidor;Var

n,e,s: semáforo;Procedure Productor;Procedure Consumidor;Begin {Main}

init(s,1);init(n,0);init(e,tamaño+/-1)cobegin

productor;consumidor

coendEnd.

104

Solución

Procedure Productor;Begin

while true doproduce;P(e); {para que no produzca si lleno}P(s); {mut exc}Agrega_buffer;V(s);V(n); {Avisa que si estaba vacío ya no lo está}endWhile

End

105

Solución

Procedure Consumidor;Begin

while true doP(n); {por si está vacío hay que bloq.}P(s); {mut exc}Toma_Buffer;V(s);V(e); {Avisa que si estaba lleno ya no lo

está}endWhile

End;

106

Comentarios

Semáforo s: se usa para la mutua exclusión al acceder al buffer.

Semáforo n: Evita que se extraiga de un buffer vacío.

Semáforo e: Evita que se coloque en un buffer lleno.

Los semáforos n y e son usados, como se ve, para sincronización.

107

Ejercicio

Implementar la solución anterior con todo detalle.

El buffer se puede implementar mediante un array circular: Un array y dos punteros sobre el array.

108

Observación

TypeTbuffer=record

datos:array[0..N] of T;próximo_a_insertar,próximo_a_leer,cant_elems:0..N

end;Var

buffer:Tbuffer

109

Generalización

Es inmediata, no requiere cambios. Podrían lanzarse en el cobegin/coend

varios Productores y varios Consumidores.

110

Problema de los lectores y escritores Un conjunto de lectores y escritores

acceden a un área en común. Cualquier cantidad de lectores pueden

acceder simultáneamente al área común. Dos escritores no pueden acceder

simultáneamente. Si un escritor está en el área, tampoco

pueden acceder lectores a la misma.

111

Solución

Program lect_escr;Var

wrt,mutex:semaforo;read_cnt:integer;

Procedure reader;Procedure writer;Begin {main}

init(wrt,1);init(mutex,1);read_cnt:=0;

cobeginreader;reader; ......writer;writer;......

coendEnd.

112

Continuación...

Procedure readerBegin

P(mutex);read_cnt:=read_cnt+1;if read_cnt=1 then P(wrt);V(mutex);LEYENDO;P(mutex);read_cnt:=read_cnt-1;if read_cnt=0 then V(wrt);V(mutex)

End;

113

Continuación...

Procedure writer;Begin

P(wrt);ESCRIBIENDO;V(wrt)

End;

114

Comentarios

El semáforo mutex se usa para el manejo bajo mutua exclusión de la variable read_cnt.

El primer lector es quien bloquea con el semáforo wrt.

El último lector avisa al semáforo wrt que es el último (operación V).

Notar que puede haber varios lectores y varios escritores ejecutando concurrentemente.

Este algoritmo da prioridad a los lectores sobre los escritores.

115

Problema de los filósofos

5 filósofos se sientan a la mesa. Su vida (de acuerdo al ejercicio) consiste

en pensar y comer, pensar y comer, etc. Para comer requieren dos tenedores. Pero hay sólo 5 tenedores, dispuestos a la

izquierda de cada filósofo. Los filósofos se sientan a una mesa

circular, según se muestra en el esquema. Se debe programar los filósofos, buscando

que todos puedan comer.

116

Problema de los filósofos

Plato

Tenedor

F

F

F

FF

117

Primera solución

Program Filósofos;Var

tenedor:array[0..4] of semáforo;Procedure Filósofo(i:integer); (más adelante)Begin {main}

for i:=0 to 4 do init (tenedor[i],1);cobegin

filosofo(0);...filosofo(4)

coendEnd.

118

continuación

Procedure Filósofo(i:integer);Var

izq,der:integer;Begin

izq:=i;der:=(i+1) mod 5;while true do

pensar;P(tenedor[izq]);P(tenedor[der]);comer;V(tenedor[der];V(tenedor[izq]

endWhileEndFilósofo;

119

Problemas

Una secuencia de acciones problemática, ocurre cuando todos los filósofos “a la vez” hacen P(izq).

En ese caso todos quedan bloqueados, esperando por el filósofo a su derecha.

Entonces, esa solución no sirve pues tiene deadlock.

120

Solución

No se permite a los 5 filósofos estar sentados a la mesa a la vez.

La cantidad de filósofos en el comedor se restringe a 4.

121

Implementación de la solución

Program FilósofosV2;Var

tenedor:array[0..4] of semáforo;comedor:semáforo;

Procedure Filósofo(i:integer); (más adelante)Begin {main}

for i:=0 to 4 do init (tenedor[i],1);init(comedor,4); {no deja pasar más de 4 al comedor}cobegin

filosofo(0);...filosofo(4)

coendEnd.

122

continuación

Procedure Filósofo(i:integer);Var

izq,der:integer;Begin

izq:=i;der:=(i+1) mod 5;while true do

pensar;P(comedor); P(tenedor[izq]); P(tenedor[der]);comer;V(tenedor[der]; V(tenedor[izq];

V(comedor)endWhile

EndFilósofo;

123

Observación

De acuerdo a las operaciones del TAD semáforo, no hay forma de consultar el valor del semáforo.

O sea, NO hay una operación status. Esto implica que al hacer una operación

wait (P) no es posible saber antes si ese wait bloqueará.

Sin embargo, es usual encontrarla en las implementaciones de semáforos que proveen los sistemas operativos o los lenguajes de programación.

124

Una variante: semáforos bibloqueantes Un proceso puede quedar bloqueado al

hacer wait (P) (como en los semáforos comunes), pero también al hacer signal (V) sobre el valor máximo.

Init queda igual. P queda igual. V(s) signal sobre el valor máximo (que

es con el que se inicializa el semáforo) queda también bloqueado.

125

Semáforos en Unix

En Unix System V se trabaja con arrays de semáforos.

Operaciones: id=semget(key,count,flag)

Crea un semáforo. En id devuelve el identificador del semáforo. El nombre del semáforo es key, count da el largo máximo del array de semáforos, flag permite manejar distintas variantes.

val_viejo=semop(id,oplist,count) id es el semáforo a operar, oplist es un array con

valores y count dice cuantos de esos valores se consideran. Se suman los valores del array oplist al array del semáforo. Si algún semáforo da 0, el proceso que hizo semop se bloquea.

126

Continuación...

Basta dar largo 1 para tener el caso estudiado (semáforos de Dijkstra). semctl(id,nro,cmd,arg)

Setea el semáforo, id identifica al array de semáforos sobre el que opera, nro es el número a configurar en todos los elementos del array, cmd y arg permiten comandos y argumentos específicos.

127

Críticas a los semáforos

El problema es que si olvido un P o un V la solución se tranca.

O sea, si bien es un TAD, deja abiertas muchas alternativas para usarlos mal.

Se recurre entonces a primitivas de más alto nivel, que no dejen abiertas estas posibilidades de usos problemáticos.

Entre ellas, las critical regions, los monitores y los rendez_vous de Ada son casos tópicos que veremos.

128

Control de lectura

A esta altura ya debe haber leído hasta el capítulo 4 (inclusive) de Deitel o su equivalente en los otros textos.

129

Regiones críticas

v: shared t v es una variable compartida de tipo t

Region v do S;

Define una región de mutua exclusión sobre la variable v.

130

continuación

Region v do S1

Y

Region v do S2

Se ejecutan bajo mutua exclusión.

131

continuación

El compilador, por cada:

Region v do S

Genera:

P(SV);S;V(SV)

132

Un caso problemático

Region t do Region v do S3

Region v do Region t do S4

Si se ejecutan concurrentemente, puede ocurrir deadlock.

133

Más críticas

Estas primitivas no tienen el mismo poder expresivo que los semáforos.

Por ejemplo el problema de los filósofos no puede resolverse con esta herramienta.

134

Diferencias con semáforos

Los semáforos son herramientas de más bajo nivel que las critical regions.

Normalmente los semáforos se manejan a nivel del SO.

Normalmente las critical regions se manejan a nivel del LP.

135

Conditional critical regions

Son una alternativa a las CR, con mayor poder expresivo.

Region V when B do S

Sólo si B es verdadera entra en la CR.Si B no es verdadera, se bloquea a esperar que lo sea.

136

Problema del productor consumidorProgram Prod_Cons;Var

buffer:shared recordpool[0..n-1] of item;count, in,out:integer:=0

end;Procedure Produce; (MAS ADELANTE)Procedure Consume;(MAS ADELANTE)

137

continuación

Begin{main}cobegin

produce;consume

coendEnd.

138

continuación

Procedure Produce;Begin

while true dodato:=obtener_dato();region buffer when (cont < N ) do

pool[in]:=dato;in:=(in+1) mod N;count:=count+1

endRegionendWhile

EndProduce;

139

continuación

Procedure Consume;Begin

while true doregion buffer when (cont > 0 ) do

dato_c:=pool[out]out:=(out+1) mod N;count:=count-1;consume(dato_c)

endRegionendWhile

EndProduce;

140

Comentarios

Al poner regiones críticas se logra acceder al buffer bajo mutua exclusión.

Con el when en productor se evita que se inserte en un buffer lleno.

Con el when en consumidor se evita que se tomen datos del buffer vacío.

141

Detalle importante

Los procesos que se bloquean por la región crítica LO HACEN FUERA DE LA MISMA.

Por ejemplo si el consumidor está esperando en la CR a que el buffer no esté vacío, lo hace fuera de la misma y de ese modo el productor podrá en algún momento colocar algún valor en el buffer.

Para entrar a la región crítica hay que: Satisfacer las condiciones en el When. No debe haber otro proceso dentro de la CR.

142

Implementación con semáforos y busy waitingRegion V when B do S

Se implementa como:

While not B do ;P(SV);S;V(SV)

143

Equivalencia

Las CCR tienen el mismo poder expresivo que los semáforos.

Es posible implementar semáforos con CCR.

Es posible implementar CCR con semáforos.

144

Otra variante para CCR

Region v do begin

S1;await(B);S2

end

Await(B) hace que el proceso se bloquee a esperar asociado a la región crítica.

O sea, se bloquea y libera la CR, y cuando me señalan, indicando que se cumple B, ejecuta S2.

145

continuación

Siempre luego de un await se retoma desde donde estaba.

146

Problema de los lectores y escritoresProgram lect_esc;Var

v:shared recordnlect,nescrit:integer;ocupado:boolean

end;ocupado:=false;nlect:=0;nescrit:=0

147

continuaciónProcedure lector; (MAS ADELANTE)Procedure escritor; (MAS ADELANTE)Begin{main}

ocupado:=false;nlect:=0;nescrit:=0;cobegin

lector;lector; ...escritor;escritor; ...

coendEnd.

148

Lector

Procedure lector;Begin

region v doawait(nescrit=0);nlect:=nlect+1

endRegion;leer;region v do

nlect:=nlect-1endRegion

EndLector;

149

Escritor

Procedure Escritor;Begin

region v donescrit:=nescrit+1;await(not(ocupado) and (nlect=0));ocupado:=true

endRegion;escribir;region v do

nescrit:=nescrit-1;ocupado:=false

endRegionEnd;

150

Comentario

await(C)

Es equivalente a:

Esperar hasta que ocurra C y ceder la región crítica.

151

Críticas

Tanto en regiones críticas como en regiones críticas condicionales se necesitan variables globales para la sincronización.

Las variables globales restan claridad, dificultan el mantenimiento de la solución.

Las variables globales complican la generalización de procesos concurrentes en una máquina a procesos concurrentes que intercambian datos a través de la red.

Surgen los monitores, con el fin de evitar estos problemas (1974).