В ядре 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