¿Por qué no podemos contar mutexes?

0

Entiendo la diferencia entre un semáforo y un mutex (creo). Solo la tarea que adquirió el mutex puede liberarlo.

¿Qué sucede si tuviéramos tres puertos idénticos que se comparten entre tareas y las tareas no les importa qué puerto usan? Podríamos inicializar el mutex de conteo a tres. Y podríamos asegurarnos de que solo una tarea que adquirió una de estas claves devolvió una clave (como lo hacemos con un mutex común).

Debo estar perdiendo algo porque, aunque me parece que tiene sentido, nunca he oído hablar de un mutex de conteo.

    
pregunta James Rogers

2 respuestas

5

Porque lo que has descrito como un "mutex de conteo" es un semáforo.

Un semáforo tiene un recurso común con un número limitado de copias idénticas; Piensa en una biblioteca con 5 copias de un libro. Los usuarios pueden ir a la biblioteca y sacar una copia, y no importa qué copia obtengan porque son todas iguales. Sin embargo, solo 5 usuarios pueden tener ese libro desprotegido a la vez porque solo hay 5 copias.

Una exclusión mutua, por otro lado, es cuando desea "exclusión mutua", es decir, un usuario tiene la propiedad exclusiva de un recurso. Cada recurso es único. Entonces, digamos que ahora hay una biblioteca que posee solo una copia de 5 libros diferentes. Cada libro puede tener un mutex asociado a ellos porque es importante el libro que extraiga, y solo un usuario puede retirar un libro a la vez.

editar:

Sospecho que el mutex Keil RTX implementa esto adquiriendo un mutex primitivo, luego, una vez adquirido, lo primero es establecer un ID de quién "posee" ese mutex. En este caso, la interfaz de la biblioteca evita que los usuarios liberen un mutex que no poseen.

Implementar esto para un semáforo es más complicado, pero debería ser factible. Una forma es implementar esto podría ser después de adquirir una copia del semáforo primitivo, agregar su ID a una ranura vacía en una lista de tamaño fijo de lo que se ha extraído. Luego, para volver a registrarse, revise esta lista para el ID de la tarea (optimización: almacene este lugar local para la tarea, de modo que el registro sea O (1)), y si lo encuentra, elimínelo de la lista. Finalmente, libera el semáforo primitivo. Nuevamente, esto sería una opción de diseño de interfaz de biblioteca, no algo inherente a un semáforo.

La diferencia ahora es que la extracción es O (n) en el número de copias; esta es una gran diferencia de O (1) para todo lo anterior. No creo que las bibliotecas quieran cargar a todos los usuarios con esta sobrecarga innecesaria, por lo que la mayoría no implementa semáforos como este.

    
respondido por el helloworld922
0

Un mutex es una especialización de un semáforo. Es un semáforo que se utiliza para imponer acceso mutuamente exclusivo a un recurso. La implementación de un servicio de exclusión mutua generalmente incluye algunas características adicionales, más allá de un semáforo, que admiten esta especialización. Una de esas características es que el mutex solo puede liberarse por la tarea que lo obtuvo. Otra característica común de un mutex es el soporte para un mecanismo de herencia de prioridad. (FreeRTOS, uC / OS-II y ThreadX son compatibles con esto, por ejemplo). La tarea que contiene el mutex se elevará a la prioridad de la siguiente tarea que intente obtener el mutex. El mecanismo de herencia de prioridad puede ayudar a aliviar los problemas de inversión de prioridad. Otra característica de algunas implementaciones de mutex es que la misma tarea puede tomar el mutex varias veces. Y luego esa tarea tendría que liberar el mutex el mismo número de veces antes de que el mutex esté disponible para otra tarea. (FreeRTOS llama a esta característica un "mutex recursivo".)

Para su aplicación de ejemplo de múltiples puertos idénticos, debe usar un semáforo de conteo. Las características especializadas de un mutex no están diseñadas para proteger múltiples recursos idénticos. Un mutex está especializado para proteger un solo recurso.

Probablemente podrías hacer una especialización diferente de un semáforo de conteo que permitiría que solo las tareas que han obtenido el semáforo liberen el semáforo. Pero no creo que las otras características comunes de exclusión mutua, la herencia de prioridad y la recursión, se apliquen bien a un semáforo de conteo.

    
respondido por el kkrambo

Lea otras preguntas en las etiquetas