Sistemas operativos modernos
El otro USOde los semáforos es para sincronización. Los semáforos llenas y vacias se ne cesitan para garantizar que ciertas secuencias de sucesos se presenten o no. En este caso, cui dan que el productor deje de ejecutarse cuando el búfer está lleno, y que el consumidor deje de ejecutarse cuando el búfer está vacío. Este uso es distinto de la exclusión mutua. 2.3.6 Mutexes Cuando no se necesita la capacidad de contar del semáforo, suele utilizarse una versión sim plificada del semáforo, llamada mutex (abreviatura de “exclusión mutua”, en inglés). Los mu texes sólo sirven para administrar la exclusión mutua respecto a algún recurso o fragmento de código comparüdo. Su implementación es sencilla y eficiente, por lo que son útiles sobre todo en los sistemas de subprocesos que se implementan por completo en espacio de usuario. Un mutex es una variable que puede estar en uno de dos estados: desbloqueado o bloquea do. Por ello, sólo se necesita un bit para representarlo, aunque en la práctica es común que se use un entero, de tal modo que Osignifique desbloqueado y todos los demás valores signifiquen bloqueado. Se usan dos procedimientos con mutexes. Cuando un subproceso (o proceso) nece sita obtener acceso a una región crítica, invoca a mutexjock. Si el mutex está desbloqueado (o sea que la región crítica está disponible), la llamada procede y el subproceso invocador puede entrar en la región crítica. En cambio, si el mutex ya estaba bloqueado, el subproceso invocador se bloqueará hasta que el subproceso que está en la región crítica termine e invoque a mutexjunlock. Si hay varios subprocesos bloqueados en espera del mutex, se escoge uno de ellos al azar y se le permite ad quirir el bloqueo. Por su sencillez, es fácil implementar los mutexes en espacio de usuario, si se cuenta con una instrucción TSL. En la figura 2-25 se muestra el código para mutexjock y mutexjunlock que se usaría en un sistema de subprocesos en el nivel de usuario. mutex_lock: T S L R EG ISTRO ,M UTEX I copia el mutex en el registro y establece a 1 CMP R EG ISTRO ,#0 I ¿mutex era cero? J Z E ok I si era O, estaba desbloqueado, por lo tanto, regresa C A L L thread_yield I mutex ocupado; calendariza otro subproceso JMP mutex_lock I reintenta después ok: R E T I regresa al invocador; se entró en región crítica mutexjunlock: MOVE MUTEX,#0 I almacena un O en el mutex R E T I regresa ai invocador Figura 2-25. Implementación de m utexjock y mutex_unlock. El código de mutexjock es similar al de entrar_region de la figura 2-22 pero con una di ferencia crucial. Cuando entrar_region no logra entrar en la región crítica, sigue probando el
RkJQdWJsaXNoZXIy MjI4NDcx