¿La herencia de prioridad cura la inversión de prioridad?

2

En la página de descripción de Mutex del sitio web de FreeRTOS se puede encontrar la siguiente oración:

  

La herencia de prioridad no cura la inversión de prioridad

Por lo que sé, pensé que la herencia de prioridad era una cura para la inversión de prioridad. Si la tarea de prioridad alta A está bloqueada por la tarea de prioridad baja B, con herencia de prioridad, la tarea B hereda el nivel de prioridad de la tarea A (alta). Esto significa que ninguna tarea de prioridad media puede retrasar la ejecución de la tarea A. Como consecuencia, la inversión de prioridad no se produce. ¿Qué está mal en mi razonamiento?

    
pregunta Robbo

2 respuestas

6

Lo que se quiere decir es que hay situaciones que pueden ocurrir que son inversión de prioridad y no se resuelven por herencia de prioridad.

Un ejemplo: La situación normal utilizada es que la tarea A , B , C tienen una prioridad decreciente. C toma un mutex, luego B se prepara y se está ejecutando. Ahora A está listo. A necesita el mutex, por lo que se bloquea. Luego B continúa ejecutándose, lo que evita que C libere el mutex. Esto hace que B tenga la prioridad suficiente para impedir que A haga el trabajo.

La herencia de prioridad haría que C tenga la misma prioridad que A . Pero considere el caso donde C no puede completar su trabajo para liberar el mutex sin B hacer trabajo. Entonces, debido a la herencia de prioridad, tiene un punto muerto.

Por lo tanto, la inversión de prioridad puede existir y puede ser difícil detectar fallas potenciales. La solución es intentar evitarlo diseñando lo más posible.

Aquí está la propaganda completa del sitio de freertos:

  

¡La herencia de prioridad no cura la inversión de prioridad! Es solo   Minimiza su efecto en algunas situaciones. Aplicaciones duras en tiempo real   debe ser diseñado de tal manera que la inversión de prioridad no ocurra en el   primer lugar.

    
respondido por el caveman
1

Si la tarea C necesita la tarea B para completar un trabajo para que la tarea C pueda transmitir el primer mutex, entonces debe haber una segunda conexión de bloqueo / mutex entre las tareas C y B, que la herencia de prioridad podría usar para aumentar la prioridad de la tarea B, permitiendo que la tarea B termine el trabajo que necesita la tarea C para que pueda liberar el primer mutex.

    
respondido por el ecodelta

Lea otras preguntas en las etiquetas