futex в общей памяти на Redox: исправлены страницы copy-on-write
19.07.2026В ядре Redox исправлено использование futex в разделяемой памяти: страницы copy-on-write теперь корректируются до трансляции адресов. Из-за прежнего порядка синхронизация в процессах, разделяющих память, работала неверно.
Зачем нужен futex
futex — это системный вызов «уснул, пока не выполнится условие». На его базе построены почти все блокировки в современном коде: мьютексы, условия, семафоры. Ожидание происходит в пользовательском пространстве, в ядро программа заходит только чтобы уснуть или разбудить кого-то.
Ключевая оптимизация — в разделяемой памяти futex обходится без системного вызова: достаточно обычной атомарной операции, если ожидающих нет.
Что такое copy-on-write и почему важен порядок
Когда процесс создаётся через fork или клонируется поток, физические страницы памяти не копируются. Обе копии получают одни и те же страницы с пометкой «только чтение», а при первой попытке записи ядро создаёт отдельную копию для того, кто пишет. Это и есть copy-on-write.
В разделяемой памяти ситуация обратная: страница должна остаться общей и быть доступной на запись с обеих сторон. Значит, при обращении к futex в такой странице ядро обязано снять пометку «только чтение» и получить настоящую разделяемую копию — до того, как идти дальше. Прежний порядок приводил к тому, что ядро работало с неверным состоянием страницы.
Практическое следствие
Разделяемая память с futex — это не экзотика, а основа многопроцессной работы на Rust: std::sync поверх fork, пулы процессов, IPC-библиотеки, заполнители задач, разделяющие счётчики между процессами. Ошибка проявлялась как зависание или испорченные данные при синхронизации, а не как явный отказ.
Оригинал
Коммит Fix futex on shared memory by correcting CoW pages before translation от 19 июля 2026 года в репозитории redox-os/kernel
Упоминаний: 1 · Просмотров: 3