Sistemas operativos modernos
Examinemos en forma breve las llamadas de subprocesos que se muestran en la figura 10-8. La primera, pthread_create, crea un subproceso nuevo. Se invoca con err = pthread_create(&tid, atrib, tune, arg); Esta llamada crea un nuevo subproceso en el proceso actual para que ejecute el códigoyi/nc pa sándole arg como parámetro. El idenfificador del nuevo subproceso (TID; Thread IDentifier) se almacena en la memoria en el lugar al que apunta el primer parámetro. El parámetro atrib puede servir para especificar ciertos atributos del nuevo subproceso, como su prioridad para ca lendarización. Una vez que se logra la llamada, hay un subproceso más que antes ejecutándo se en el espacio de direcciones del invocador. Un subproceso que ha llevado a cabo su trabajo y quiere terminar invoca a pthread_exit. Un subproceso puede esperar a que otro termine invocando a pthreadjoin. Si el subproceso al que se deseaba esperar ya terminó, pthreadjoin termina de inmediato; de lo contrario, se bloquea. Los subprocesos pueden sincronizarse empleando bloqueos llamados mutexes. Por lo regu lar, un mutex protege un recurso, como un búfer compartido por dos subprocesos. Para asegurar se de que sólo un subproceso a la vez tenga acceso al recurso compartido, se espera que los subprocesos bloqueen el mutex antes de tocar el recurso y lo desbloqueen cuando hayan termi nado. Mientras todos los subprocesos obedezcan este protocolo, no habrá condiciones de compe tencia. Los mutexes son como semáforos binarios; es decir, semáforos que pueden asumir sólo los valores Oy 1. El nombre mutex proviene del hecho de que se les usa para garantizar la exclu sión mutua (mutual exclusión) en el uso de algún recurso. Los mutexes pueden crearse y destruirse con las llamadas pthread_mutex_init y pth- read_mutex_destroy, respectivamente. Un mutex puede estar en uno de dos estados: blo queado o desbloqueado. Cuando un subproceso necesita bloquear un mutex (empleando pthread_mutex_lock), lo hace y sigue su camino. Pero si un subproceso trata de bloquear un mutex que ya está bloqueado, se bloquea. Cuando el subproceso que estableció el bloqueo ter mina de usar el recurso compartido, debe abrir el mutex correspondiente invocando pthread_ mutex_unlock. Los mutexes están diseñados para operaciones a corto plazo, como proteger una variable compartida; no deben ufilizarse para una sincronización a largo plazo, como esperar a que se desocupe una unidad de cinta. Para la sincronización a largo plazo existen variables de con dición. Éstas se crean y destruyen con llamadas a pthread_cond_init y pthread_cond_ destroy, respectivamente. Para usar una variable de condición, un subproceso debe esperarla y otro debe señalizar la. Por ejemplo, si un subproceso descubre que la unidad de cinta que necesita está ocupada, ejecutará pthread_cond_wait con una variable de condición que todos los subprocesos han convenido en asociar a esa unidad de cinta. Cuando el subproceso que está usando la unidad de cinta la desocupa (lo cual podría tardar horas), usa pthread_cond_sÍgnal para desblo quear exactamente un subproceso que esté esperando esa variable de condición (si hay algu no). Si ningún subproceso está esperando, la señal se perderá. Dicho de otro modo, las variables de condición no llevan cuentas como los semáforos. Hay algunas otras operaciones definidas para subprocesos, mutexes y variables de condición.
RkJQdWJsaXNoZXIy MjI4NDcx