Planteamiento y Contexto Aplicable
Un sistema de tiempo real apropiativo, de prioridad fija y de un solo núcleo tiene tres tareas. Un número de prioridad mayor significa una prioridad más alta:
| Tarea | Prioridad | Comportamiento |
|---|---|---|
| H | 90 | Necesita bus_mutex tras despertar y tiene una fecha límite relativa de 10 ms |
| M | 50 | Nunca usa el mutex y necesita 20 ms de trabajo de CPU ininterrumpido tras despertar |
| L | 10 | Ya posee bus_mutex y le quedan 3 ms de trabajo de CPU en la sección crítica |
En t=0, L posee el mutex. Luego H se despierta, desaloja a L, intenta adquirir el mutex y se bloquea. Después de que H ha estado bloqueada durante 1 ms, M pasa a estar lista para ejecución. Explique el orden de ejecución con un mutex ordinario y con herencia de prioridad, calcule un límite para la espera del bloqueo de H y aborde lo siguiente:
- qué hace que esta sea una inversión de prioridad no acotada;
- cómo se propaga y se restaura la prioridad con múltiples mutexes, tareas en espera y bloqueos anidados;
- el balance de compensación entre la herencia de prioridad y los protocolos de techo de prioridad;
- por qué un semáforo ordinario, un intervalo de tiempo (time slice) más corto u otro incremento a la prioridad de H no son una solución equivalente;
- cómo las trazas del planificador y las métricas de fechas límite pueden demostrar que la solución funciona.
Esta pregunta es adecuada para puestos de sistemas embebidos, RTOS, Linux de tiempo real, robótica, audio/video, control industrial y software de sistemas. Las prioridades y los valores de 3 ms, 20 ms y 10 ms son restricciones del ejercicio, no una afirmación sobre un rango de prioridades de un RTOS en particular o un umbral de producción.
Qué Está Evaluando el Entrevistador
La primera capa es separar el bloqueo directo por recursos del retraso introducido por trabajo no relacionado. Que H espere a que L libere un recurso ya es una inversión de prioridad. La parte que destruye la predictibilidad es que M no utiliza el recurso y, aun así, puede desalojar repetidamente al propietario del bloqueo de baja prioridad L, extendiendo la espera de H por cantidades arbitrarias de trabajo de prioridad media.
La segunda capa es dibujar la secuencia de eventos en lugar de recitar una definición. Con un mutex ordinario, L está lista para ejecución después de que H se bloquea, pero es desalojada cuando M despierta. H espera los 20 ms de M más los 3 ms restantes de L, unos 23 ms, lo que excede la fecha límite de 10 ms. Con herencia, H dona la prioridad efectiva 90 a L en el instante en que se bloquea. M no puede desalojar a L, por lo que, bajo las suposiciones del planteamiento, H espera aproximadamente los 3 ms restantes de L más la sobrecarga del planificador.
La tercera capa es comprender el estado de la implementación. Un bloqueo necesita un propietario y tareas en espera ordenadas por prioridad. Cuando una tarea posee varios bloqueos, su prioridad efectiva es el máximo de su prioridad base y cada donación activa. Si la tarea en espera de mayor prioridad agota su tiempo de espera (timeout), se cancela o deja de esperar porque se libera un bloqueo, la prioridad debe recalcularse en lugar de restablecerse incondicionalmente al valor base. Si el propietario promovido se bloquea en otro bloqueo, la donación debe propagarse a lo largo de la cadena de PI.
La cuarta capa son los límites del mecanismo. La herencia limita el retraso no acotado causado por tareas de prioridad media. No acorta la E/S dentro de una sección crítica, regiones con interrupciones deshabilitadas, código no apropiativo u operaciones de hardware, y no elimina los interbloqueos (deadlocks). Un techo de prioridad intercambia configuración previa por un análisis de bloqueo más estático. Un semáforo contador sin un propietario único no proporciona ninguna tarea definida para promover.
Finalmente, el entrevistador busca disciplina de verificación. Una respuesta sólida compara la duración de la espera del bloqueo, el tiempo en que L está lista pero no en ejecución mientras mantiene el bloqueo, si M entra en ese intervalo, las pérdidas de fechas límite de H, y las rutas de bloqueos anidados y tiempos de espera agotados. La utilización promedio de CPU o el argumento de que “el sistema no se colgó” no demuestran un límite de tiempo real.
Preguntas para Aclarar Antes de Responder
- ¿En qué dirección van las prioridades y cuál es la política de planificación? El planteamiento dice que 90 es mayor que 50 y especifica apropiación por prioridad fija en un solo núcleo. Algunos RTOS numeran las prioridades en la dirección opuesta, y un planificador de tiempo compartido normal no soporta directamente el mismo cronograma.
- ¿Son 3 ms de tiempo de reloj (wall-clock) o tiempo de ejecución real de CPU? Aquí es el trabajo de CPU restante de L dentro de la sección crítica. La PI no puede hacer que una espera de dispositivo o una región no apropiativa sea físicamente más rápida.
- ¿Cuándo comienza la fecha límite de 10 ms de H? Aquí comienza cuando H se despierta. Si la fecha límite comienza con la llegada de la solicitud o la liberación periódica, la formación previa en cola también debe entrar en el cálculo del tiempo de respuesta.
- ¿Hay interrupciones o tareas por encima de la prioridad 90? El ejercicio las excluye del primer cálculo. Un límite real debe incluir interferencia de mayor prioridad, el tiempo máximo con interrupciones deshabilitadas, la sobrecarga del planificador y los efectos de caché.
- ¿Es
bus_mutexrealmente un mutex con seguimiento de propietario? Un semáforo binario puede parecer similar pero no necesariamente tiene propietario, desbloqueo exclusivo por el propietario o semántica de PI. - ¿Posee L otro bloqueo o está esperando por uno? Eso determina si la donación debe propagarse recursivamente y cambia tanto el análisis de interbloqueos como el límite de bloqueo.
- ¿Qué protocolos soporta la implementación de destino? POSIX expone
PTHREAD_PRIO_INHERITyPTHREAD_PRIO_PROTECT. El comportamiento del RTOS para múltiples bloqueos, tiempos de espera, bloqueos recursivos y reducción de prioridad difiere, por lo que la documentación de la versión exacta es importante.
Estructura de Respuesta en 30 Segundos
“Con un mutex ordinario, H se bloquea porque L posee bus_mutex. De otro modo, L podría terminar sus 3 ms restantes, pero después de 1 ms, M con prioridad 50 desaloja a L con prioridad 10 y se ejecuta durante 20 ms. M nunca toca el mutex, pero hace que H con prioridad 90 espere indirectamente. Por lo tanto, la espera del bloqueo de H es de aproximadamente 20+3=23 ms, más allá de la fecha límite de 10 ms. Si pueden seguir llegando trabajos de prioridad media, la longitud de la sección crítica de L ya no acota esa espera adicional.
Con herencia de prioridad, el bloqueo de H eleva la prioridad efectiva de L a 90. M no puede desalojar a L después de despertar. L libera el mutex después de aproximadamente 3 ms, recalcula su prioridad a partir de las tareas en espera restantes y los mutexes que posee, y H adquiere el bloqueo. La PI controla el retraso derivado de trabajo de prioridad media no relacionado. No promete cero bloqueo ni repara una sección crítica larga, un interbloqueo o código con interrupciones deshabilitadas.
Yo impulsaría una secuencia de liberación determinista y registraría el bloqueo y desbloqueo de H, el intervalo de posesión de L, los intervalos de ejecución de M y cada pérdida de fecha límite para mutexes ordinarios y con PI. También probaría la donación encadenada, múltiples tareas en espera, el agotamiento del tiempo de espera de una tarea en espera y la liberación incremental de múltiples bloqueos para demostrar que tanto la elevación como la reducción de prioridad son correctas.”
Análisis Detallado Paso a Paso
Paso 1: Dibujar el Cronograma de Inversión No Acotada para un Mutex Ordinario
Utilice el despertar de H como tiempo relativo 0ms. L ya posee el bloqueo y le quedan 3 ms de trabajo de CPU:
| Tiempo relativo | Evento | Resultado |
|---|---|---|
| 0ms | H despierta, desaloja a L y solicita bus_mutex | H se bloquea porque L es el propietario |
| 0–1ms | L se reanuda | L ejecuta 1 ms y le quedan 2 ms en la sección crítica |
| 1ms | M despierta | M de prioridad 50 desaloja a L de prioridad 10 |
| 1–21ms | M se ejecuta durante 20 ms | H sigue esperando; L está lista pero no puede ejecutarse |
| 21–23ms | L ejecuta sus 2 ms restantes y desbloquea | H finalmente se desbloquea |
H espera aproximadamente 23 ms desde que despierta hasta la adquisición del mutex, perdiendo su fecha límite de 10 ms. Si trabajos como M pueden continuar llegando mientras H está bloqueada, la espera de H ya no está acotada por la sección crítica restante de 3 ms de L. Esa es la inversión no acotada aquí. No significa que una espera infinita sea matemáticamente inevitable; significa que el diseño no proporciona un límite de bloqueo finito y auditable derivado del recurso protegido.
Distinga entre interbloqueo, inanición (starvation) y sobrecarga. Un interbloqueo tiene un ciclo de espera sin ninguna tarea capaz de liberar el recurso requerido. La inanición no necesariamente involucra al propietario de un bloqueo. La sobrecarga de CPU comúnmente hace que varias tareas pierdan fechas límite. La cadena de evidencia de la inversión es específica: H espera por un recurso propiedad de L mientras M, que no tiene dependencia de ese recurso, impide que L se ejecute.
Paso 2: Agregar Herencia de Prioridad y Recalcular
Cuando H se bloquea en 0ms, el mutex dona la prioridad 90 de su tarea en espera más alta al propietario L. L conserva la prioridad base 10 y temporalmente tiene la prioridad efectiva 90:
| Tiempo relativo | Evento | Resultado |
|---|---|---|
| 0ms | H se bloquea en el mutex de L | L hereda 90 y se reanuda inmediatamente |
| 1ms | M de prioridad 50 despierta | M no puede desalojar a L de prioridad efectiva 90 |
| 0–3ms | L termina la sección crítica restante y desbloquea | La espera de bloqueo de H es de unos 3 ms más la sobrecarga del planificador |
| Unos 3ms | H adquiere el mutex | Quedan unos 7 ms del presupuesto de la fecha límite |
La conclusión de 3 ms depende del planteamiento: no hay ninguna tarea de mayor prioridad, región larga con interrupciones deshabilitadas, sección no apropiativa, fallo de página o E/S bloqueante, y el mutex realmente implementa PI. El tiempo de respuesta real también debe incluir la ejecución de H y toda la interferencia de mayor prioridad. El beneficio central de la PI es que los 20 ms de M ya no entran en este intervalo de bloqueo de recursos para H.
La elevación de prioridad cambia la prioridad efectiva; no debe sobrescribir permanentemente la prioridad base de L. Si no queda ninguna otra donación tras el desbloqueo, L regresa a 10. Si una tarea en espera de prioridad 80 aún espera en otro mutex propiedad de L, L debe reducir su prioridad solo a 80, no directamente a 10.
Paso 3: Manejar Múltiples Tareas en Espera, Múltiples Bloqueos y una Cadena de PI
Supongamos que L posee tanto R1 como R2, H90 espera en R1 y X70 espera en R2. La prioridad efectiva de L es 90. Después de que L libera R1, H ya no dona a L, pero X todavía espera por R2, por lo que L reduce su prioridad a 70. Regresa a la prioridad base 10 solo después de liberar R2. Un agotamiento del tiempo de espera o cancelación por parte de la tarea en espera más alta debe desencadenar el mismo recálculo.
Ahora supongamos que L está esperando por R3, del cual K es propietario. Promover solo a L no puede liberar el bloqueo de H porque L misma no puede ejecutarse más allá de su espera. La prioridad 90 debe propagarse a lo largo de H → R1 → L → R3 → K. K libera R3, lo que permite a L continuar y eventualmente liberar R1. Linux rt-mutex mantiene esto con un conjunto de tareas en espera ordenadas por prioridad para cada mutex y la tarea en espera más alta de cada mutex poseído en el conjunto de tareas en espera de PI del propietario.
La donación encadenada no repara un mal ordenamiento de bloqueos. Si L espera por K mientras K espera por L, la PI simplemente eleva las prioridades de tareas en un ciclo de espera; no aparece ninguna ruta de liberación ejecutable. Los controles de ingeniería siguen incluyendo un orden global de bloqueos, anidamiento acotado, no realizar E/S bloqueante mientras se retiene un mutex y una duración de sección crítica en el peor caso auditable.
Paso 4: Comparar la Herencia de Prioridad con un Techo de Prioridad
Los protocolos de mutex de POSIX hacen concreta la distinción:
PTHREAD_PRIO_INHERIT: un propietario se promueve solo cuando realmente bloquea a un hilo de mayor prioridad. Su prioridad efectiva se convierte en el máximo de su prioridad base y las donaciones de tareas en espera activas, y el bloqueo anidado se propaga recursivamente.PTHREAD_PRIO_PROTECT: mientras un hilo posee un mutex, se ejecuta al menos al techo de prioridad configurado de ese mutex, exista o no una tarea en espera actualmente.
La herencia paga costos de registro en tiempo de ejecución y de propagación en cadena cuando ocurre contención, pero no requiere conocimiento previo de la prioridad máxima de cada usuario. Un techo requiere que el conjunto de tareas/recursos se conozca y configure correctamente, a cambio de un límite de bloqueo más estático y analizable. Que un protocolo de techo particular evite una clase de interbloqueos también depende de las reglas completas de admisión de techo en ese sistema. La palabra “techo” por sí sola no demuestra la ausencia de interbloqueos.
A continuación se muestra un bosquejo de inicialización POSIX. El código de producción debe verificar el soporte de la implementación, los valores de retorno, los privilegios de planificación y el ciclo de vida del mutex:
pthread_mutexattr_t attr;
int rc = pthread_mutexattr_init(&attr);
if (rc == 0) {
rc = pthread_mutexattr_setprotocol(&attr, PTHREAD_PRIO_INHERIT);
}
if (rc == 0) {
rc = pthread_mutex_init(&bus_mutex, &attr);
}
pthread_mutexattr_destroy(&attr);Establecer el atributo para hilos ordinarios de SCHED_OTHER en Linux no constituye una garantía de fecha límite de tiempo real estricto. La clase de planificación, los privilegios de prioridad de tiempo real, el comportamiento de PREEMPT_RT o del kernel de destino y cualquier otra fuente de bloqueo de la aplicación aún requieren validación.
Paso 5: Elegir la Primitiva Correcta y Acortar la Sección Crítica
La PI depende de un propietario definido. Cuando una tarea en espera de alta prioridad se bloquea, el kernel debe saber qué tarea promover. Proteja el estado compartido con un mutex con seguimiento de propietario que dicho propietario desbloquee. Un semáforo contador utilizado para recuento de recursos o notificación puede no tener un propietario único, por lo que no proporciona un destino de donación confiable. Un semáforo binario no adquiere semántica de PI de mutex simplemente porque su valor esté limitado a cero o uno.
Incluso con PI, haga que la sección crítica sea calculable. Copie solo el estado requerido bajo el bloqueo. Mueva las transferencias a dispositivos, el registro de eventos (logging), la asignación de memoria y las llamadas que puedan suspenderse fuera de ella. Para el acceso serializado a un dispositivo lento, una tarea de servicio dedicada de alta prioridad y el paso de mensajes pueden ser una mejor arquitectura. Una estructura libre de bloqueos (lock-free) puede reducir el bloqueo por mutex pero introduce problemas de liberación de memoria (reclamation), ABA, reintentos y un tiempo de ejecución en el peor caso potencialmente peor. Elija en función del análisis de fechas límite, no por una etiqueta.
Aumentar la prioridad de H no puede resolver este planteamiento: H ya es la tarea más alta y no puede ejecutarse mientras esté bloqueada. Un intervalo de tiempo más corto simplemente planifica a M con más frecuencia; no permite que L con prioridad 10 supere a M con prioridad 50. Deshabilitar la apropiación amplía la latencia de respuesta para cada tarea y traslada el problema a una región no apropiativa.
Paso 6: Verificar el Límite de Bloqueo con una Traza Reproducible
Cree un orden de liberación fijo: L bloquea primero, una barrera confirma la posesión, H es liberada, luego M es liberada 1 ms después de que H se bloquea. Ejecute repetidamente las variantes de mutex ordinario, con PI y con techo de prioridad y registre:
- la distribución de latencia de adquisición del mutex de H y el recuento de pérdidas de fecha límite de 10 ms;
- el tiempo acumulado en que L está lista pero no en ejecución mientras posee el mutex;
- los intervalos de ejecución de M mientras H está bloqueada;
- las prioridades base y efectiva de L, el propietario del mutex, la tarea en espera más alta y el tiempo de desbloqueo;
- los cambios de contexto del planificador, los despertares, el tiempo con interrupciones deshabilitadas y los intervalos no apropiativos.
La traza del mutex ordinario debería mostrar a M entrando en el intervalo y a H esperando unos 23 ms. En la variante con PI, M no debería desalojar durante el intervalo en el que H espera y L está lista mientras posee el mutex; bajo la carga del planteamiento, H debería esperar cerca de 3 ms en lugar de 23 ms. Agregue una segunda tarea en espera con prioridad 70, un mutex anidado, agotamiento de tiempo de espera y la liberación incremental de los dos bloqueos de L para verificar la elevación y reducción de prioridad frente a la donación activa más alta.
El criterio de aceptación no debe decir “PI significa que no habrá más tiempos de espera agotados”. Utilice un límite condicional: dada la sección crítica máxima medida, la interferencia de mayor prioridad, el tiempo máximo con interrupciones deshabilitadas y el presupuesto de sobrecarga del planificador, la respuesta en el peor caso de H permanece por debajo de 10 ms, incluso bajo estrés e inyección de fallos.
Respuesta de Muestra Sólida
“Primero fijaré la dirección de la prioridad y el origen del tiempo: 90 es la más alta y los 10 ms de H comienzan cuando H se despierta. Con un mutex ordinario, H desaloja a L, encuentra que bus_mutex está ocupado y se bloquea. L se reanuda durante 1 ms, luego M con prioridad 50 se despierta y desaloja a L durante 20 ms. L finalmente ejecuta sus 2 ms restantes y desbloquea. Por lo tanto, H tarda unos 23 ms desde que despierta hasta la adquisición del mutex y definitivamente pierde su fecha límite. M nunca usa el mutex, pero indirectamente impide que H, la de mayor prioridad, se ejecute. Si el trabajo de prioridad media puede continuar llegando, la sección crítica de 3 ms de L no puede acotar este bloqueo adicional.
Con PI, H dona la prioridad 90 a L cuando se bloquea. La prioridad base de L permanece en 10 y su prioridad efectiva se convierte en 90, por lo que M no puede desalojar a 1 ms. L completa la sección crítica en aproximadamente 3 ms y libera el mutex, y luego H lo adquiere. El bloqueo de recursos está por lo tanto por debajo de 10 ms bajo las suposiciones del planteamiento. Las tareas de mayor prioridad, el tiempo con interrupciones deshabilitadas y la sobrecarga del planificador están excluidos de ese número y deben restablecerse en un análisis de tiempo de respuesta real.
La implementación no puede almacenar un solo booleano de elevación. Cada mutex necesita un propietario y una tarea en espera más alta. Cada propietario toma el máximo de su prioridad base y las donaciones en todos los mutexes que posee. El agotamiento del tiempo de espera de la tarea en espera más alta o la liberación de un bloqueo provoca un recálculo. Si L está bloqueada en el bloqueo de K, la prioridad 90 debe propagarse a K a lo largo de la cadena de PI. Si hay un ciclo de espera, la elevación no puede liberar ningún recurso, por lo que el ordenamiento de bloqueos y las comprobaciones de interbloqueo siguen siendo necesarios.
Utilizaría una secuencia de liberación para comparar un mutex ordinario con un mutex PTHREAD_PRIO_INHERIT y capturar los cambios de contexto del planificador, la posesión del bloqueo, la prioridad efectiva, la duración del bloqueo de H y las pérdidas de fechas límite. La evidencia directa de éxito es que M ya no se ejecuta mientras H está bloqueada y L, estando lista, posee el mutex, y la espera de H converge de aproximadamente 23 ms a los cerca de 3 ms de sección crítica restante de L más la interferencia del sistema contabilizada. Una segunda tarea en espera, bloqueos anidados, tiempos de espera agotados y desbloqueos uno por uno verifican la elevación encadenada y la reducción de prioridad correcta.”
Errores Comunes
- Decir únicamente “una tarea de baja prioridad bloquea a una tarea de alta prioridad” → esto omite cómo M convierte una sección crítica finita en una interferencia no acotada → dibuje la secuencia completa de H se bloquea, L queda lista, M desaloja.
- Calcular solo una espera de 3 ms para H → esto ignora el desalojo de 20 ms por parte de M bajo el mutex ordinario → siga el orden de eventos hasta aproximadamente 23 ms y compárelo con 10 ms.
- Afirmar que la PI elimina toda inversión de prioridad → H todavía debe esperar por la sección crítica restante de L → indique que la PI elimina la extensión no acotada causada por trabajo no relacionado de prioridad media.
- Restablecer L directamente a 10 tras un desbloqueo → puede quedar una tarea en espera de alta prioridad en otro mutex poseído → recalcule la prioridad efectiva a partir de cada donación activa.
- Promover solo al propietario directo → un propietario bloqueado en otro bloqueo aún no puede ejecutarse → propague a lo largo de la cadena de PI, y acote y observe la profundidad de la cadena.
- Tratar la PI como una reparación de interbloqueos → las tareas promovidas en un ciclo de espera aún carecen de una ruta de liberación ejecutable → mantenga el ordenamiento de bloqueos, la política de tiempos de espera y la detección de interbloqueos.
- Reemplazar el mutex con un semáforo binario asumiendo PI → el semáforo puede no tener propietario, dejando sin tarea a la cual promover → utilice un mutex con propietario que soporte explícitamente PI para la protección de recursos.
- Tratar
PTHREAD_PRIO_INHERITcomo un interruptor de tiempo real estricto → la clase de planificación, los privilegios, la apropiación del kernel, las interrupciones y otras esperas aún afectan las fechas límite → valide la plataforma completa y calcule el tiempo de respuesta en el peor caso. - Verificar solo una latencia promedio mejorada → la reducción de prioridad, la propagación anidada o las rutas de agotamiento de tiempo de espera aún pueden ser incorrectas → verifique las colas de distribución (tails), las pérdidas de fechas límite, las prioridades efectivas y los límites de múltiples bloqueos.
Preguntas de Seguimiento y Respuestas
Pregunta de seguimiento 1: ¿Por qué llamarla no acotada si M se ejecuta exactamente durante 20 ms aquí?
Este ejercicio contiene un solo trabajo de M, por lo que el resultado es calculable en unos 23 ms. “No acotada” describe un mecanismo que no otorga un límite al retraso añadido basado en la sección crítica de L. Si trabajos de la clase M pueden liberarse continuamente, L puede permanecer lista sin recibir CPU y la espera de H crece con el trabajo de M. La PI elimina la interferencia de M de este intervalo de bloqueo; el límite restante proviene de la sección crítica y de la interferencia de mayor prioridad.
Pregunta de seguimiento 2: ¿Qué sucede si H espera por L y L espera por K?
Done la prioridad 90 de H a L, y luego propáguela a través del mutex en el que L espera hacia el propietario K. K ejecuta su sección crítica a la prioridad efectiva 90 y libera el bloqueo, permitiendo a L continuar y eventualmente liberar el bloqueo de H. Una traza debería mostrar la elevación y la reducción inversa de prioridad a través de H → mutex1 → L → mutex2 → K. Observar solo la elevación de L no demuestra que la PI encadenada sea correcta.
Pregunta de seguimiento 3: ¿Qué prioridad debería tener L después de que una tarea en espera de alta prioridad agote su tiempo de espera?
Utilice la demanda más alta que permanezca. Si H90 agota su tiempo de espera pero X70 aún espera en otro mutex que L posee, L reduce su prioridad de 90 a 70. Regresa a la prioridad base 10 solo después de que desaparezca cada donación. La inserción, salida, tiempo de espera agotado, cancelación de tareas en espera y cada desbloqueo deben mantener este estado ordenado por prioridad.
Pregunta de seguimiento 4: ¿Es un techo de prioridad siempre mejor que la herencia?
No. Un techo soporta el análisis estático de bloqueo cuando el conjunto de tareas y las relaciones de acceso a recursos son estables, pero un mal techo puede rechazar accesos legítimos o invalidar el análisis. La herencia promueve ante una contención real y necesita menos configuración, pero debe mantener las tareas en espera, la propagación en cadena y la reducción dinámica de prioridad. Elija en función del protocolo exacto del RTOS, la estabilidad del conjunto de tareas y la sobrecarga aceptable en tiempo de ejecución.
Pregunta de seguimiento 5: ¿Por qué la PI no puede reparar la E/S mientras se retiene el bloqueo?
La elevación ayuda a que un propietario obtenga CPU antes únicamente mientras esté listo para ejecución. Si L se suspende por una transferencia SPI, almacenamiento, un fallo de página u otro evento, permanece suspendida. Si la ejecución tiene las interrupciones deshabilitadas o es no apropiativa, el planificador tampoco puede intervenir. Mueva el trabajo lento fuera de la sección crítica o use una tarea de servicio o un protocolo asíncrono, y luego incluya el peor tiempo de finalización del hardware en el presupuesto.
Pregunta de seguimiento 6: ¿Cómo demuestra que el atributo realmente funciona en el espacio de usuario de Linux?
Verifique los valores de retorno de pthread_mutexattr_setprotocol y pthread_mutex_init, el soporte para _POSIX_THREAD_PRIO_INHERIT, las políticas reales de planificación de los hilos y los privilegios de prioridad de tiempo real. Luego ejecute una carga de trabajo H/M/L controlada y trace la planificación junto con los eventos de futex o bloqueos. Confirme la elevación efectiva de L, la ausencia de M en el intervalo crítico y la reducción correcta de prioridad después del desbloqueo o del tiempo de espera agotado de una tarea en espera. Una inicialización exitosa o una mejora incidental en el p99 no son evidencia suficiente.