В ядре Redox появилось обнаружение дедлоков по счётчику спин-блокировок
09.03.2026В ядре Redox добавлен счётчик спин-блокировок с порогом срабатывания: при его превышении ядро останавливается, и висящий участок кода можно поймать сразу. Параллельно упорядоченные блокировки расставлены почти везде, где используются мьютексы и блокировки чтения-записи.
Почему дедлок не находится сам по себе
Взаимная блокировка возникает, когда два участка кода держат ресурсы в разном порядке: первый взял A и ждёт B, второй взял B и ждёт A. Ни один из них по отдельности не делает ничего неправильного, поэтому ни процессор, ни отладчик не могут поставить точку «здесь что-то не так». Программа просто перестаёт отвечать.
У пользователя Redox это выглядит как зависшая система без объяснений. Разработчик, у которого на руках пользовательская программа, тем более.
Как теперь это видно
Спин-блокировка — это ожидание без переключения на другой поток, она крутится в цикле, проверяя условие. Новая схема считает, сколько раз блокировка ждала, и по достижении порога останавливает ядро с отладочным сообщением. Именно в этот момент видно, какие блокировки удерживаются двумя сторонами.
Вторая часть работы — упорядоченные блокировки: у каждой блокировки свой номер, и брать их разрешается только по возрастанию номера. Это устраняет сам класс дедлоков, а не только помогает их найти. По словам автора, вместе эти меры позволяют избавиться от большинства дедлоков в ядре.
Что это даёт разработчику
Зависание userspace и зависание ядра выглядят снаружи одинаково — система не отвечает. Эта работа направлена на то, чтобы отличить их: ядро теперь может остановиться в известной точке вместо того, чтобы молча крутить цикл. Для отладки системного кода на Rust это разница между «воспроизводится, но непонятно где» и «вот стек, вот две блокировки».
Оригинал
Коммит Add deadlock detection от 9 марта 2026 года в репозитории redox-os/kernel; сводка «This Month in Redox — March 2026», раздел «Kernel Deadlock Detection»
Упоминаний: 1 · Просмотров: 2