Sistemas Operativos [Procesos]

Anuncio
Sistemas Operativos [Procesos]
M. en C. Sergio Luis Pérez Pérez
UAM C UAJIMALPA , M ÉXICO, D. F.
Trimestre 13-O
Sergio Luis Pérez (UAM C UAJIMALPA)
Curso de Sistemas Operativos
1 / 62
Procesos
Procesos I
Un proceso es un programa en ejecución.
Cada proceso tienen asociado un espacio de direcciones que el
proceso puede leer y escribir.
Todo proceso está asociado a un conjunto de registros como el
PC, SP y otros registros que permiten la ejecución de un
programa.
Periódicamente, el sistema decide dejar de ejecutar un proceso
para comenzar a ejecutar otro.
Generalmente la información referente a todos los procesos es
almacenada en una tabla de procesos.
Sergio Luis Pérez (UAM C UAJIMALPA)
Curso de Sistemas Operativos
2 / 62
Procesos
Procesos II
Una tabla de procesos es un arreglo o lista enlazada de
estructuras.
Un proceso suspendido consiste de una entrada en la tabla de
procesos y su espacio de direcciones.
Las llamadas importantes al sistema involucran la creación y
terminación de un proceso.
Un proceso hijo es un proceso creado por otro proceso.
El término pseudoparalelismo se refiere al hecho de que un
procesador sólo puede ejecutar un proceso a la vez pero ejecuta
tantos en un segundo que da la ilusión al usuario de paralelismo.
Sergio Luis Pérez (UAM C UAJIMALPA)
Curso de Sistemas Operativos
3 / 62
Procesos
Procesos III
El término multiprogramación se refiere a la rápida conmutación
que un procesador realiza para cambiar de un proceso a otro.
Aunque sólo existe un contador fı́sico de programa, cada proceso
lleva su propio contador lógico de programa.
La rapidez con la que un proceso efectúa sus operaciones no es
uniforme por lo que no se deben realizar programas con
suposiciones de tiempo al momento de hacer programas.
¿Cuál es la diferencia entre un programa y un proceso?
Sergio Luis Pérez (UAM C UAJIMALPA)
Curso de Sistemas Operativos
4 / 62
Procesos
Procesos IV
Creación de procesos I
Los principales sucesos que causan la creación de procesos son:
Arranque del sistema.
Ejecución de una llamada al sistema para crear procesos por parte
de otro proceso en ejecución.
Solicitud de un usuario para crear un proceso.
Inicio de un trabajo por lotes.
Al arranque del sistema se crean dos tipos de procesos: de
primer plano y de segundo plano.
Un proceso de primer plano es un proceso que interactúa con el
usuario.
Un proceso de segundo plano no está asociado a un usuario sino
a una función especı́fica y también se conocen como demonios.
Sergio Luis Pérez (UAM C UAJIMALPA)
Curso de Sistemas Operativos
5 / 62
Procesos
Procesos V
Creación de procesos II
En UNIX se puede utilizar el comando ps para ver la lista de
procesos mientras que en WINDOWS hay que revisar en el
administrador de tareas.
En UNIX la llamada fork indica al sistema que debe crear un
proceso mientras que en WINDOWS existen varias como
CreateProcess, CreateProcessAsUser y
CreateProcessWithLogonW.
Una vez que se crea un proceso, tanto el padre como el hijo
tienen sus propios espacios de direcciones distintos.
En UNIX el espacio de direcciones del hijo corresponde a una
copia del que tiene en ese momento el padre, mientras que en
WINDOWS ambos son diferentes desde el principio.
Sergio Luis Pérez (UAM C UAJIMALPA)
Curso de Sistemas Operativos
6 / 62
Procesos
Procesos VI
Creación de procesos III
BOOL WINAPI
In opt
Inout opt
In opt
In opt
In
In
In opt
In opt
In
Out
);
CreateProcess(
LPCTSTR lpApplicationName,
LPTSTR lpCommandLine,
LPSECURITY ATTRIBUTES lpProcessAttributes,
LPSECURITY ATTRIBUTES lpThreadAttributes,
BOOL bInheritHandles,
DWORD dwCreationFlags,
LPVOID lpEnvironment,
LPCTSTR lpCurrentDirectory,
LPSTARTUPINFO lpStartupInfo,
LPPROCESS INFORMATION lpProcessInformation
Sergio Luis Pérez (UAM C UAJIMALPA)
Curso de Sistemas Operativos
7 / 62
Procesos
Procesos VII
Terminación de procesos
Los principales sucesos que causan la terminación de procesos
son:
Terminación normal. Se puede utilizar exit en UNIX y ExitProcess
en Windows.
Terminación por error. Por ejemplo intentar compilar un archivo que
no exista.
Error fatal. Por ejemplo intentar hacer uso de memoria no
reservada, dividir por cero.
Terminado por otro proceso. Se puede utilizar kill -9 ProcesoId en
UNIX y en WINDOWS TerminateProcess.
Sergio Luis Pérez (UAM C UAJIMALPA)
Curso de Sistemas Operativos
8 / 62
Procesos
Procesos VIII
Jerarquı́as de procesos
En UNIX cuando un proceso (padre) crea otro proceso (hijo)
dicha asociación se mantiene.
En UNIX un proceso y todos sus descendientes forman un grupo
de procesos.
Si el usuario envı́a una señal desde el teclado ésta es recibida
por todos los miembros del grupo de procesos asociados en ese
momento al teclado.
En WINDOWS no existe la jerarquı́a de procesos, lo que significa
que todos son iguales.
Sergio Luis Pérez (UAM C UAJIMALPA)
Curso de Sistemas Operativos
9 / 62
Procesos
Procesos IX
Estados de los procesos
Los procesos pueden encontrarse en alguno de los siguientes
tres estados.
1
En ejecución. (De este estado es posible ir a los estados 2 y 3)
2
Listo o en espera. (De este estado sólo es posible ir a 1)
3
Bloqueado. (De este estado sólo es posible ir a 2)
Todo el manejo de interrupciones y lo pormenores de la
suspensión y reactivación de procesos quedan ocultos en el
calendarizador.
Sergio Luis Pérez (UAM C UAJIMALPA)
Curso de Sistemas Operativos
10 / 62
Procesos
Procesos X
Implementación de procesos I
¿Cómo se mantiene la ilusión de múltiples procesos secuenciales
en una máquina con un sólo procesador y una variedad de
dispositivos E/S?
Todo dispositivo E/S está asociado con una posición de memoria
llamada vector de interrupción.
El vector de interrupción contiene la dirección del procedimiento
del servicio de interrupción.
Las acciones requeridas para atender la interrupción, como
guardar los registros y ajustar el SP, se suelen expresar en
lenguaje ensamblador.
Generalmente las interrupciones son procedimientos en C.
Sergio Luis Pérez (UAM C UAJIMALPA)
Curso de Sistemas Operativos
11 / 62
Procesos
Procesos XI
Implementación de procesos II
1
El hardware de interrupción mete en la pila actual el PC y la
palabra de estado del programa.
2
El hardware carga un nuevo contador de programa tomándolo del
vector de interrupción.
3
Un procedimiento ensamblador guarda los registros.
4
Un procedimiento ensamblador crea la nueva pila.
5
Se ejecuta el servicio de interrupción en C (que por ejemplo lee
ciertas entradas y las pone en un búfer).
6
El calendarizador decide que programa ejecutará ahora.
7
El procedimiento en C regresa el control al código ensamblador.
8
Un procedimiento ensamblador arranca el nuevo proceso actual.
Sergio Luis Pérez (UAM C UAJIMALPA)
Curso de Sistemas Operativos
12 / 62
Procesos
Procesos XII
Algunos campos de una entrada tı́pica de la tabla de procesos
Admon. procesos
Registros
PC
SP
Estado de proceso
ID proceso
Prioridad
Señales
Hora inicio
Sergio Luis Pérez (UAM C UAJIMALPA)
Admon. memoria
Apuntador a seg. datos
Apuntador a seg. texto
Apuntador a seg. pila
Curso de Sistemas Operativos
Admon. archivos
Directorio raı́z
Directorio de trabajo
ID de usuario
ID de grupo
Descriptores archivo
13 / 62
Subprocesos
Subprocesos I
Un proceso puede verse como una forma de agrupar recursos
relacionados.
Un subproceso forma parte de un proceso y posee lo siguiente:
Un contador de programa que indica la siguiente instrucción a
ejecutarse.
Registros con las variables de trabajo actuales.
Tiene una pila que contiene el historial de ejecución.
La diferencia es que los procesos sirven para agrupar recursos y
los subprocesos son las entidades que se calendarizan para
ejecutarse en el procesador.
Sergio Luis Pérez (UAM C UAJIMALPA)
Curso de Sistemas Operativos
14 / 62
Subprocesos
Subprocesos II
Los subprocesos le permiten al modelo de procesos la posibilidad
de que haya varias ejecuciones en el mismo entorno de proceso.
Debido a que los subprocesos tienen algunas propiedades de los
procesos suelen denominarse procesos ligeros.
Cuando varios subprocesos son asociados a un mismo proceso
éstos comparten el mismo espacio de direcciones.
Los subprocesos también pueden pasar por los mismos estados
que los procesos.
Generalmente todos los subprocesos son iguales aunque pueden
llegar a existir relaciones jerárquicas de padre-hijo.
Sergio Luis Pérez (UAM C UAJIMALPA)
Curso de Sistemas Operativos
15 / 62
Subprocesos
Subprocesos III
Elementos de los subprocesos
Elementos globales
Espacio de direcciones
Variables globales
Archivos abiertos
Procesos hijos
Alarmas pendientes
Señales y manejadores de señales
Sergio Luis Pérez (UAM C UAJIMALPA)
Elementos privados
PC
Registros
Pila
Estado
Curso de Sistemas Operativos
16 / 62
Subprocesos
Subprocesos IV
Algunas funciones para crear subprocesos
Las siguientes funciones y muchas más se encuentran en la librerı́a
pthread.h para lenguaje C.
pthread create. Especifica el nombre de un procedimiento nuevo
que se ejecutará.
pthread exit. Indica que se debe terminar la labor del subproceso.
pthread join. Suspende la ejecución de un subproceso hasta que
otro termina.
pthread self. Devuelve el ID del subproceso que lo manda llamar.
Sergio Luis Pérez (UAM C UAJIMALPA)
Curso de Sistemas Operativos
17 / 62
Subprocesos
Subprocesos V
¿Por qué son útiles los subprocesos?
Permiten realizar varias tareas al mismo tiempo dentro de un
proceso, por lo que algunos de ellos se bloquean de vez en
cuando.
Al no estar enlazados con los recursos hardware, son más fáciles
de crear y destruir que los procesos.
Los procesos mejoran el desempeño del procesador cuando se
realiza una cantidad considerable de operaciones E/S.
Son útiles en sistemas con múltiples procesadores.
Sergio Luis Pérez (UAM C UAJIMALPA)
Curso de Sistemas Operativos
18 / 62
Subprocesos
Subprocesos VI
Ejemplo 1: Caso del procesador de texto
Un procesador de texto trata de mostrar el documento casi en la
forma exacta en que éste sera impreso.
Supongamos que un editor está escribiendo un libro.
El editor podrı́a escribir todo el libro en un sólo archivo o bien
cada capı́tulo en un archivo independientes.
¿Que ocurre si se tuviera que hacer una modificación particular
en todo el libro?
Supongamos que el usuario decide hacer su trabajo en un sólo
documento.
¿Qué ocurre cuando el usuario realiza una modificación en una
oración de la página 1 y luego una de la página 600?
Sergio Luis Pérez (UAM C UAJIMALPA)
Curso de Sistemas Operativos
19 / 62
Subprocesos
Subprocesos VII
Ejemplo 2: Un servidor para un sitio Web
Llegan solicitudes de páginas y la página es enviada al cliente.
Generalmente cuando una página es muy solicitada los
servidores Web la mantienen en memoria principal.
Dentro del proceso servidor Web se podrı́an usar los siguientes
subprocesos.
Subproceso despachador. Lee las solicitudes que llegan al
servidor.
Subproceso trabajador. Es un subproceso escogido por el
despachador y procesa la solicitud. Este subproceso primero
verificará si la página solicitada está en la caché.
Si la página no está en la cache se invoca una operación read
para obtener la página y el subproceso se bloquea.
Sergio Luis Pérez (UAM C UAJIMALPA)
Curso de Sistemas Operativos
20 / 62
Subprocesos
Subprocesos VIII
Espacio del kernel (kernel space)
El kernel junto con el SO se ocupan de gestionar los recursos de
hardware de la máquina de una forma eficiente y sencilla.
De manera que el kernel y el SO ofrecen al usuario una interfaz
de programación simple y uniforme.
El kernel y sus drivers constituyen un puente o interface entre el
programador de aplicaciones para el usuario final y el hardware.
Toda subrutina que forma parte del kernel (como los módulos o
drivers) se considera que está en el espacio del kernel.
Sergio Luis Pérez (UAM C UAJIMALPA)
Curso de Sistemas Operativos
21 / 62
Subprocesos
Subprocesos IX
Espacio de usuario (user space)
Los programas que utiliza el usuario final (como las terminales
shell) residen en el espacio de usuario.
Las aplicaciones que necesitan interactuar con el hardware del
sistema lo hacen a través de las funciones que soporta el kernel.
Sergio Luis Pérez (UAM C UAJIMALPA)
Curso de Sistemas Operativos
22 / 62
Subprocesos
Subprocesos X
Implementación de subprocesos en el espacio del usuario I
Este método consiste en colocar el sistema de subprocesos en
espacio de usuario.
En esta caso el kernel sólo administra procesos ordinarios de un
subproceso.
La ventaja es que pueden mantenerse subprocesos en el nivel del
usuario en sistemas operativos que no manejan subprocesos.
Cuando los subprocesos se ejecutan en el espacio de usuario
necesitan su tabla de subprocesos privada.
La tabla de subprocesos es administrada por el sistema en tiempo
de ejecución.
Sergio Luis Pérez (UAM C UAJIMALPA)
Curso de Sistemas Operativos
23 / 62
Subprocesos
Subprocesos XI
Implementación de subprocesos en el espacio del usuario II
Cuando un subproceso termina de ejecutarse su información es
almacenada en la tabla de subprocesos y el calendarizador
puede invocar otro subproceso para su ejecución.
Ambos procedimientos (de almacenaje e invocación) son locales
por lo que esto es mucho más eficiente que llamar al kernel.
Lo anterior significa que no se requieren interrupciones, no se
cambia el contexto y no se lleva el cache al disco.
Los subprocesos de usuario permiten que cada proceso tenga su
propio algoritmo de calendarización personalizado.
Sergio Luis Pérez (UAM C UAJIMALPA)
Curso de Sistemas Operativos
24 / 62
Subprocesos
Subprocesos XII
Problemas del los subprocesos en el espacio del usuario
Llamadas bloqueadoras. Ej. lectura del teclado cuando aún no
hay información en este.
Fallos de página. Ocurren cuando el programa salta a una
dirección que no está en la memoria.
Ejecución indefinida de subprocesos. Al no haber
interrupciones el subproceso sólo cede de manera voluntaria.
Sergio Luis Pérez (UAM C UAJIMALPA)
Curso de Sistemas Operativos
25 / 62
Subprocesos
Subprocesos XIII
Implementación de subprocesos en el espacio del kernel
Los subprocesos serán administrados en una tabla de
subprocesos general y no por cada proceso.
Cuando un proceso se quiere crear o destruir emite una llamada
al kernel, la cual actualiza la tabla de subprocesos.
Cuando un subproceso se bloquea el kernel decide ejecutar otro.
No se necesitan nuevas llamadas al sistema no bloqueadoras.
El fallo de página no representa un problema.
El principal problema es que el costo de crear y destruir
subprocesos en el kernel es mucho mayor.
Para lo anterior se utiliza el concepto de reciclaje de subprocesos.
Sergio Luis Pérez (UAM C UAJIMALPA)
Curso de Sistemas Operativos
26 / 62
Subprocesos
Subprocesos XIV
Implementación hı́brida de subprocesos
Esta idea trata de combinar las ventajas del uso de subprocesos
en modo kernel y en modo usuario.
Una forma es mantener el concepto de subprocesos en kernel y a
estos dividirlos en subprocesos en el espacio del usuario
multiplexándolos.
De este modo el kernel sólo tiene conocimiento de los
subprocesos del espacio del kernel.
Los subprocesos de usuario de un subproceso del kernel se
crean, se destruyen y calendarizan igual que los de usuario.
Sergio Luis Pérez (UAM C UAJIMALPA)
Curso de Sistemas Operativos
27 / 62
Subprocesos
Subprocesos XV
Subprocesos emergentes
Es un concepto utilizado un poco más para sistemas distribuidos.
Cuando llega un mensaje (solicitud de servicio), se crea un nuevo
subproceso que lo administra.
Generalmente todos los subprocesos emergentes son idénticos y
se crean desde cero.
El uso de procesos emergentes reduce el tiempo entre la
recepción del mensaje y su ejecución.
Lo más común es hacer que un subproceso emergente se ejecute
en el kernel.
Sergio Luis Pérez (UAM C UAJIMALPA)
Curso de Sistemas Operativos
28 / 62
Comunicación entre procesos
Comunicación entre procesos I
Existen tres situaciones básicas de comunicación entre procesos
(IPC InterProcess Communication):
Pasar información de un proceso a otro. Ej. la salida del un proceso
es la entrada de otro.
Que dos o más procesos no se estorben al realizar sus funciones.
Ej. reservación de memoria.
Dependencia entre procesos. Ej. Si un proceso produce datos y el
otro imprime el segundo debe esperar a que haya datos.
Lo anterior también se aplica a los subprocesos aunque el primer
punto no es un problema pues se comparte el espacio de
direcciones.
Sergio Luis Pérez (UAM C UAJIMALPA)
Curso de Sistemas Operativos
29 / 62
Comunicación entre procesos
Condiciones de competencia
Condiciones de competencia I
Un ejemplo clásico para entender el problema de las condiciones de
competencia es la cola (spooler) de impresión.
Cuando un proceso quiere imprimir un archivo coloca su nombre
en un directorio que administra la cola de impresión.
Otro proceso llamado demonio de impresora revisa de forma
periódica si es necesario imprimir algún archivo.
Cuando un archivo es impreso el demonio borra el nombre del
archivo de dicho directorio.
Supongamos que se manejan dos variables compartidas para
administrar dicho directorio, in y out.
Sergio Luis Pérez (UAM C UAJIMALPA)
Curso de Sistemas Operativos
30 / 62
Comunicación entre procesos
Condiciones de competencia
Condiciones de competencia II
En este caso in apunta la siguiente ranura desocupada del
directorio y out al siguiente archivo que se imprimirá.
¿Como podrı́a un proceso A afectar la solicitud de impresión de
otro proceso B?
El valor actual de in = 7 y el de out = 5.
A lee in y lo guarda en una variable local, en ese momento hay una
interrupción de reloj y el procesador cambia de A a B.
B lee in también y almacena su valor en una variable local, pero él
sı́ pone su nombre de archivo en el directorio y actualiza in a 8.
Nuevamente A es ejecutado y continua en donde se quedo, ahora
si decide escribir su nombre de archivo en el directorio de la cola
de impresión. ¿Donde escribe A su nombre de archivo?
Sergio Luis Pérez (UAM C UAJIMALPA)
Curso de Sistemas Operativos
31 / 62
Comunicación entre procesos
Regiones crı́ticas
Regiones crı́ticas I
Una forma de evitar el problema de condiciones de competencia
es mediante la exclusión mutua.
Con la exclusión mutua nos aseguraremos que si un proceso
utiliza una variable compartida otro no lo haga.
Para realizar la exclusión, cuando un proceso tiene que acceder a
memoria o archivos compartidos esa parte del programa se sitúa
en su región crı́tica o sección crı́tica.
Si se logra que dos procesos no entren a su región crı́tica al
mismo tiempo se habrá resuelto el problema de condiciones de
competencia.
Sergio Luis Pérez (UAM C UAJIMALPA)
Curso de Sistemas Operativos
32 / 62
Comunicación entre procesos
Regiones crı́ticas
Regiones crı́ticas II
Esto se logra siempre que se cumplan las siguientes condiciones:
1
Dos procesos no pueden estar al mismo tiempo dentro de sus
regiones crı́ticas.
2
No pueden hacerse suposiciones sobre las velocidades ni el
número de procesadores.
3
Ningún proceso que se ejecute fuera de su región crı́tica puede
bloquear a otros procesos.
4
Ningún proceso tendrá que esperar de forma indefinida para entrar
a su región crı́tica.
De esta manera si A entra en su región crı́tica B no lo podrá hacer
hasta que A termine, logrando una exclusión mutua.
Sergio Luis Pérez (UAM C UAJIMALPA)
Curso de Sistemas Operativos
33 / 62
Comunicación entre procesos
Exclusión mutua con espera activa
Exclusión mutua con espera activa I
Algunas formas de lograr la exclusión mutua son:
Inhabilitación de interrupciones.
Variables de bloqueo.
Alternancia estricta.
Solución de Peterson.
La instrucción TSL.
Sergio Luis Pérez (UAM C UAJIMALPA)
Curso de Sistemas Operativos
34 / 62
Comunicación entre procesos
Exclusión mutua con espera activa
Exclusión mutua con espera activa II
Inhabilitación de interrupciones
Implica que cada proceso inhabilita todas las interrupciones al
entrar a su región critica.
El proceso rehabilitará las interrupciones al salir de su región
crı́tica.
Esta solución no es la más conveniente.
¿Qué ocurre si a un proceso de usuario se le olvida habilitar de
nuevo las interrupciones?.
Otra desventaja es si el sistema el multiprocesador, pues la
deshabilitación de interrupciones sólo afectara al procesador que
hizo la llamada de deshabilitación.
Sergio Luis Pérez (UAM C UAJIMALPA)
Curso de Sistemas Operativos
35 / 62
Comunicación entre procesos
Exclusión mutua con espera activa
Exclusión mutua con espera activa III
Variables de bloqueo
Esta es una solución software en la que se utiliza una variable
compartida de bloqueo que inicialmente es cero.
Si un proceso desea entrar a su región crı́tica establece la
variable a uno y entra a su región crı́tica.
Si la variable es uno los demás procesos deben esperar a que
cambie a cero.
Esta solución tiene el mismo problema que el de la cola de
impresión.
Sergio Luis Pérez (UAM C UAJIMALPA)
Curso de Sistemas Operativos
36 / 62
Comunicación entre procesos
Exclusión mutua con espera activa
Exclusión mutua con espera activa IV
Alternancia estricta
Esta solución se modela mediante el siguiente código para un par
de procesos.
while(1){
while(turno != 0);
region critica();
turno = 1;
region no critica();}
while(1){
while(turno != 1);
region critica();
tuno = 0;
region no critica();}
Esta solución resuelve el problema de condiciones de
competencia, pero ¿qué condición de las cuatro mencionadas
previamente es violada?
Sergio Luis Pérez (UAM C UAJIMALPA)
Curso de Sistemas Operativos
37 / 62
Comunicación entre procesos
Exclusión mutua con espera activa
Exclusión mutua con espera activa V
Solución de Peterson
Este algoritmo fue propuesto en 1981 por G. L. Peterson.
int turno, interesado[2];
void entrar region(int proceso){
int otro = 1-proceso;
interesado[proceso] = 1;
turno = proceso;
while(turno == proceso && interesado[otro] == 1);}
void salir region(int proceso){
interesado[proceso] = 0;}
Ejercicio: ¿Cómo se puede generalizar esta idea a más procesos?
Sergio Luis Pérez (UAM C UAJIMALPA)
Curso de Sistemas Operativos
38 / 62
Comunicación entre procesos
Exclusión mutua con espera activa
Exclusión mutua con espera activa VI
La instrucción TSL
Muchas computadoras tienen la instrucción:
TSL RX, BLOQUEO //TSL = Test and Set Lock
Lee el contenido de la palabra de memoria bloqueo, lo coloca en
el registro RX y guarda un valor diferente de cero en la dirección
de memoria bloqueo.
Recordemos que las operaciones de leer una palabra y escribir
en ella son atómicas.
Este mecanismo se ayuda de la variable compartida bloqueo que
cuando es cero cualquier proceso la puede poner en uno con la
instrucción TSL.
Luego el proceso que la puso en uno puede leer o escribir de la
memoria compartida.
Sergio Luis Pérez (UAM C UAJIMALPA)
Curso de Sistemas Operativos
39 / 62
Comunicación entre procesos
Exclusión mutua con espera activa
Exclusión mutua con espera activa VII
Solución con la instrucción TSL
Para esto se requiere una solución en ensamblador parecida a la
siguiente.
entrar region:
TSL REGISTRO, BLOQUEO
CMP REGISTRO,0
JNE entrar region
RET
salir region:
MOVE BLOQUEO,0
RET
Sergio Luis Pérez (UAM C UAJIMALPA)
Curso de Sistemas Operativos
40 / 62
Comunicación entre procesos
Activar y desactivar
Activar y desactivar I
La solución de Peterson y TSL son correctas pero tienen la
desventaja de que requieren una espera activa.
Además estos algoritmos desperdician tiempo de procesador.
¿Que ocurre si se ejecutan dos procesos A, B donde A es
prioritario?
A siempre esta en estado listo.
Cuando B entra en su región crı́tica supongamos que A queda listo
para ejecutarse.
Supongamos que A requiere entrar a su región crı́tica, pero no
puede por que esta B, y entra en un estado de espera.
Sergio Luis Pérez (UAM C UAJIMALPA)
Curso de Sistemas Operativos
41 / 62
Comunicación entre procesos
Activar y desactivar
Activar y desactivar II
Pero como B no se calendariza, pues tiene menor prioridad,
entonces nunca saldrá de su región crı́tica.
El problema anterior se conoce como el problema de la
inversión de prioridad.
Otra solución es que en vez de desperdiciar tiempo de
procesador se utilicen las llamadas al sistema sleep y wakeup.
Sleep es una llamada al sistema que hace que el invocador se
bloquee hasta que otro proceso lo active.
Wakeup es una llamada al sistema que como parámetro tiene el
proceso a activar.
Sergio Luis Pérez (UAM C UAJIMALPA)
Curso de Sistemas Operativos
42 / 62
Comunicación entre procesos
Activar y desactivar
Activar y desactivar III
El problema del productor-consumidor I
Supongamos que dos procesos comparten un búfer de tamaño
fijo.
El primer proceso coloca información en el búfer y el segundo la
saca.
Los problemas surgen cuando el productor quiere colocar
información en el búfer pero éste ya esta lleno.
Lo mismo ocurre con el consumidor si el búfer está vacı́o.
El siguiente código resuelve éste problema utilizando las
llamadas al sistema sleep y wakeup.
Sergio Luis Pérez (UAM C UAJIMALPA)
Curso de Sistemas Operativos
43 / 62
Comunicación entre procesos
Activar y desactivar
Activar y desactivar IV
El problema del productor-consumidor II (El productor)
#define N 100
int cuenta = 0;
void productor(){
int elem;
while(1){
elem = producir elem();
if(cuenta == N) slep();
insertar elem(elem);
cuenta = cuenta + 1;
if(cuenta == 1) wakeup(consumidor);
}
}
Sergio Luis Pérez (UAM C UAJIMALPA)
Curso de Sistemas Operativos
44 / 62
Comunicación entre procesos
Activar y desactivar
Activar y desactivar V
El problema del productor-consumidor III (El consumidor)
void consumidor(){
int elem;
while(1){
if(cuenta == 0) slep();
elem = sacar elem()
cuenta = cuenta - 1;
if(cuenta == N-1) wakeup(productor);
consumir elem(elem);
}
}
¿Qué ocurre con el problema de la condición de competencia?
Sergio Luis Pérez (UAM C UAJIMALPA)
Curso de Sistemas Operativos
45 / 62
Comunicación entre procesos
Semáforos
Semáforos I
En 1965, Dijkstra propuso el uso de una variable entera que
contabilizara el número de llamadas wakeup guardadas para su
uso futuro.
El propuso para este control una nueva variable llamada
semáforo.
Si el semáforo tiene el valor 0 indica que no hay guardadas
llamadas wakeup.
Dijkstra propuso las operaciones down y up.
La operación down verifica si el valor del semáforo es cero y si lo
es se desactiva, en caso contrario continúa.
Sergio Luis Pérez (UAM C UAJIMALPA)
Curso de Sistemas Operativos
46 / 62
Comunicación entre procesos
Semáforos
Semáforos II
La operación up incrementa el valor del semáforo.
Si hay procesos que estuvieran desactivados el sistema escoge
uno de ellos y le permite continuar, aunque el semáforo
seguirá siendo cero.
Las operaciones verificar, modificar y desactivar se ejecutan
como una sola acción atómica.
A continuación se presenta la solución al problema del
productor-consumidor empleando semáforos.
Sergio Luis Pérez (UAM C UAJIMALPA)
Curso de Sistemas Operativos
47 / 62
Comunicación entre procesos
Semáforos
Semáforos III
El problema del productor-consumidor con semáforos I (El productor)
#define N 100
typedef int semaforo;
semaforo mutex = 1, vacias = N, llenas = 0;
void productor(){
int elem;
while(1){
elem = producir elem();
down(&vacias);
down(&mutex);//entra en región crı́tica
insertar elem(elem);
up(&mutex);//sale de la región crı́tica
up(&llenas);}}
Sergio Luis Pérez (UAM C UAJIMALPA)
Curso de Sistemas Operativos
48 / 62
Comunicación entre procesos
Semáforos
Semáforos IV
El problema del productor-consumidor con semáforos II (El
consumidor)
void consumidor(){
int elem;
while(1){
down(&llenas);
down(&mutex);//entra en región crı́tica
elem = sacar elem;
up(&mutex);//sale de la región crı́tica
up(&vacias);
consumir elem(elem);
}
}
Sergio Luis Pérez (UAM C UAJIMALPA)
Curso de Sistemas Operativos
49 / 62
Comunicación entre procesos
Mutexes
Mutexes I
Cuando no se necesita la capacidad de contar del semáforo se
utiliza una versión simplificada llamada mutex.
Los mutexes permiten administrar la exclusión mutua con
respecto a algún recurso o fragmento de código.
Un mutex es una variable que puede estar en uno de dos
estados: bloqueado o desbloqueado.
Existen dos procedimientos básicos para el uso de mutex.
El procedimiento mutex lock permite que un proceso entre a la
región crı́tica siempre que este disponible.
Sergio Luis Pérez (UAM C UAJIMALPA)
Curso de Sistemas Operativos
50 / 62
Comunicación entre procesos
Mutexes
Mutexes II
El procedimiento mutex unlock será invocado cuando un proceso
salga de su región crı́tica.
Entonces al salir será seleccionado algún otro proceso en espera
de la región crı́tica.
Si se cuenta con la instrucción TSL entonces los mutexes son
fáciles de implementar en el espacio de usuario.
Sergio Luis Pérez (UAM C UAJIMALPA)
Curso de Sistemas Operativos
51 / 62
Comunicación entre procesos
Mutexes
Mutexes III
Implementación de mutex lock y mutex unlock
mutex lock:
TSL REGISTRO, MUTEX
CMP REGISTRO,0
JZE ok
CALL thread yield//el mutex está ocupado (calendariza otro proceso)
JMP mutex lock
ok: RET
mutex unlock:
MOVE MUTEX,0
RET
Sergio Luis Pérez (UAM C UAJIMALPA)
Curso de Sistemas Operativos
52 / 62
Problemas clásicos de comunicación entre procesos
Problemas clásicos de comunicación entre procesos I
Algunos de los problemas clásicos de comunicación entre
procesos son:
El problema de la cena de los filósofos. Propuesto por Dijkstra en
1965.
El problema de los lectores y escritores. Propuesto por Courtois en
1971.
El problema del barbero dormilón.
Sergio Luis Pérez (UAM C UAJIMALPA)
Curso de Sistemas Operativos
53 / 62
Problemas clásicos de comunicación entre procesos
El problema de la cena de los filósofos
El problema de la cena de los filósofos I
Cinco filósofos están sentados entorno a una mesa circular.
Cada uno de ellos tiene un plato de espagueti.
Entre cada plato hay un tenedor, pero cada filósofo requiere dos
tenedores para comerlo.
La vida de un filósofo consiste en comer y pensar.
Cuando un filósofo quiere comer necesita forzosamente dos
tenedores.
¿Se puede diseñar un programa tal que cada filósofo haga lo que
debe sin atorarse?
Sergio Luis Pérez (UAM C UAJIMALPA)
Curso de Sistemas Operativos
54 / 62
Problemas clásicos de comunicación entre procesos
El problema de la cena de los filósofos
El problema de la cena de los filósofos II
Solución equivocada al problema de los filósofos
#define N 5
void filosofo(int i){
while(1){
pensar();
// esta función toma un tenedor hasta que esté disponible
tomar tenedor(i);
tomar tenedor((i+1) %N);
comer();
dejar tenedor(i);
dejar tenedor((i+1) %N);
}
}
Sergio Luis Pérez (UAM C UAJIMALPA)
Curso de Sistemas Operativos
55 / 62
Problemas clásicos de comunicación entre procesos
El problema de los lectores y escritores
El problema de los lectores y escritores I
Este problema permite modelar el acceso a una base de datos.
En un sistema de reservaciones cualquiera puede leer de la base
de datos sin problemas.
El problema ocurre cuando hay una actualización.
Si un proceso actualiza no debe haber otros procesos
accediéndola, ni siquiera los lectores.
A continuación se presenta una solución a este problema.
Sergio Luis Pérez (UAM C UAJIMALPA)
Curso de Sistemas Operativos
56 / 62
Problemas clásicos de comunicación entre procesos
El problema de los lectores y escritores
El problema de los lectores y escritores II
Una solución para el problema de los lectores y escritores I
typedef int semaforo;
semaforo mutex = 1;//controla el acceso a ’rc’
semaforo db = 1;//controla el acceso a la base de datos
int rc = 0;//numero de procesos que leen o quieren leer
void escritor(){
while(1){
inventar datos();//región no crı́tica
down(&db); //obtiene acceso exclusivo
escritor base datos();
up(&db); //libera el acceso exclusivo
}
}
Sergio Luis Pérez (UAM C UAJIMALPA)
Curso de Sistemas Operativos
57 / 62
Problemas clásicos de comunicación entre procesos
El problema de los lectores y escritores
El problema de los lectores y escritores III
Una solución para el problema de los lectores y escritores II
void lector(){
while(1){
down(&mutex);//obtiene acceso exclusivo a rc
rc++;
if(rc == 1) down(&db);//es el primer lector
up(&mutex);//libera acceso exclusivo a rc
leer base datos();
down(&mutex);//obtiene acceso exclusivo a rc
rc–;
if(rc == 0) up(&db);//si es el último lector libera db
up(&mutex);//libera acceso exclusivo a rc
usar datos leidos();
}}
Sergio Luis Pérez (UAM C UAJIMALPA)
Curso de Sistemas Operativos
58 / 62
Problemas clásicos de comunicación entre procesos
El problema de los lectores y escritores
El problema de los lectores y escritores IV
¿Cómo funciona la solución anterior?
Cuando llega el primer lector obtiene acceso exclusivo a la base
de datos.
Si antes de que termine este llegan más, estos estarán
esperando y usando la base de datos hasta que todos acaben.
Si llegara un escritor mientras el lector lee debe esperar a que
todos ellos acaben.
Si llegan varios escritores y lectores entraran conforme lleguen,
sin embargo cuando le toque a un lector o varios consecutivos,
estos dejarán esperando a los escritores.
Sergio Luis Pérez (UAM C UAJIMALPA)
Curso de Sistemas Operativos
59 / 62
Problemas clásicos de comunicación entre procesos
El problema del barbero dormilón
El problema del barbero dormilón I
Este problema ocurre en una peluquerı́a.
El establecimiento tiene un barbero, una silla de barbero y n sillas
de espera para los clientes.
Si no hay clientes el barbero se sienta en su silla y se duerme.
Cuando llega un cliente debe despertar al barbero.
Si un cliente esta siendo atendido los demás se sientan en una
silla desocupada y si todas están ocupadas el cliente se sale.
El problema consisten en programar a los clientes y a al barbero
sin caer en condiciones de competencia.
Sergio Luis Pérez (UAM C UAJIMALPA)
Curso de Sistemas Operativos
60 / 62
Problemas clásicos de comunicación entre procesos
El problema del barbero dormilón
El problema del barbero dormilón II
Solución para el problema del barbero dormilón I
#define SILLAS 5
typedef int semaforo;
semaforo mutex = 1;//para exclusión mutua
semaforo barberos = 0, clientes = 0;//barberos y clientes que esperan
int espera = 0;//clientes esperando
void barbero(){
while(1){
down(&clientes);//se desactiva si clientes = 0
down(&mutex); //obtiene acceso exclusivo a espera
espera–;
up(&barberos); //el barbero esta listo para cortar el pelo
up(&mutex); //libera el acceso exclusivo a espera
}}
Sergio Luis Pérez (UAM C UAJIMALPA)
Curso de Sistemas Operativos
61 / 62
Problemas clásicos de comunicación entre procesos
El problema del barbero dormilón
El problema del barbero dormilón III
Solución para el problema del barbero dormilón II
void cliente(){
down(&mutex)//entra en región crı́tica (acceso exclusivo a espera)
if(espera < SILLAS){
espera++;
up(&clientes);//activa al barbero si es necesario
up(&mutex);//libera el acceso a espera
down(&barberos);//se desactiva si no hay barberos desocupados
recibir corte();
else{
up(&mutex);//la peluquerı́a esta llena, el cliente se va
}
}
Sergio Luis Pérez (UAM C UAJIMALPA)
Curso de Sistemas Operativos
62 / 62
Descargar