Поделиться через


Инверсия приоритета

Явление, известное как инверсия приоритета, возникает, когда поток с высоким приоритетом откладывается на неопределенный срок при ожидании ресурса, удерживаемого потоком с низким приоритетом, который не может продолжаться из-за присутствия несвязанного потока среднего приоритета. В результате поток высокого приоритета фактически запрещает доступ к ЦП более низким средним приоритетом.

Например, поток T1, работающий с приоритетом 4, получает преумноженный поток T2 с приоритетом 8 после получения блокировки. Впоследствии поток T3 с приоритетом 12 поступает, преумножает T2 и блокируется при попытке получить блокировку, удерживаемую T1. На этом этапе, как T1, так и T2 готовы к выполнению, но так как T2 имеет более высокий приоритет, он продолжает выполняться, эффективно предотвращая выполнение T3, более высокий приоритет потока, так как T1 не может запустить и освободить блокировку.

Планировщик потоков решает эту проблему с помощью функции AutoBoost. AutoBoost автоматически отслеживает резервирования ресурсов и корректирует приоритеты потоков, применяя полы приоритета, которые поток никогда не должен падать ниже. Например, если поток с низким приоритетом получает критически важный раздел и поток с более высоким приоритетом блокируется в ожидании критического раздела, приоритет владельца поднимается до максимального приоритета официанта, пока он не выпустит ресурс.