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