Поддержку объектов задания (job objects) приняли в основную ветку ReactOS 2026 года. Этот механизм ядра Windows объединяет процессы в группу с общими ограничениями и общим завершением; без него не запускаются современные браузеры и часть системных служб. В ядро вошли создание, открытие, назначение и завершение заданий, а также чтение и запись базовых ограничений. Число ошибок в связанных с заданиями тестах Wine kernel32 после этих изменений снизилось с 60 до нуля. Реализация повторяет поведение заданий в версиях до Windows 8, часть возможностей отложена на будущее.

Пулл-реквест открыли в ноябре 2024 года
Заявка с базовой поддержкой заданий в ядре ntoskrnl появилась , а в master её приняли только , после 62 коммитов и нескольких кругов правок по замечаниям рецензентов. Полный список изменений опубликован в пулл-реквесте 7500.
Новая реализация пришла на смену давней черновой заявке по той же теме и частично на ней основана – первые наработки по объектам задания появились в проекте почти десять лет назад. Реализация двух классов ограничений перенесена из отдельного патча, предложенного ранее одним из основных участников. О принятом коде в проекте сообщили в аккаунте ReactOS в X.
Объект задания – именуемый и защищаемый объект ядра Windows, который объединяет процессы в группу и позволяет управлять ими как единым целым: задавать общие ограничения, вести учёт ресурсов и завершать все входящие процессы одной операцией.
Создание, назначение и завершение заданий в ядре
В ntoskrnl появился набор системных вызовов, которых до сих пор не было:
- создание и открытие объекта задания – NtCreateJobObject и NtOpenJobObject;
- назначение процесса заданию, в том числе при создании процесса – NtAssignProcessToJobObject;
- проверка принадлежности процесса заданию – NtIsProcessInJob;
- завершение всех процессов задания – NtTerminateJobObject;
- чтение сведений о задании – NtQueryInformationJobObject с классами JobObjectBasicAccountingInformation, JobObjectBasicAndIoAccountingInformation, JobObjectBasicLimitInformation, JobObjectExtendedLimitInformation и JobObjectBasicProcessIdList;
- запись ограничений – NtSetInformationJobObject с классами JobObjectBasicLimitInformation, JobObjectExtendedLimitInformation и JobObjectAssociateCompletionPortInformation.
Отдельно закрыты сценарии выхода процесса из задания и обработка флага CREATE_BREAKAWAY_FROM_JOB, из-за которого дочерние процессы прежде вели себя не так, как в Windows. При установке ограничений JOB_OBJECT_LIMIT_PRIORITY_CLASS и JOB_OBJECT_LIMIT_SCHEDULING_CLASS ядро теперь проверяет привилегии вызывающего процесса, как это описано в документации Microsoft.
Порт завершения ввода-вывода – очередь ядра, в которую система складывает уведомления о завершённых асинхронных операциях. Привязка такого порта к заданию позволяет приложению получать события о процессах группы, не опрашивая их по одному.
Ноль ошибок вместо 60 в тестах Wine kernel32
До принятия изменений связанные с заданиями тесты из набора kernel32 проекта Wine давали 60 ошибок, после них не осталось ни одной. Автор заявки приложил результаты прогонов в системе тестирования ReactOS для 32- и 64-разрядных сборок под KVM, а стопроцентное прохождение этих тестов было прямо заявлено целью работы.
Набор тестов Wine – автоматические проверки поведения библиотек Windows API, написанные в проекте Wine. В ReactOS их синхронизируют и прогоняют на собственных сборках, чтобы сравнивать поведение системы с оригинальной Windows.
Код рассчитан на задания до Windows 8
Реализация повторяет поведение объектов задания в версиях Windows младше восьмой. Вложенные задания, появившиеся в Windows 8 и Windows Server 2012, в неё не входят: процесс по-прежнему может принадлежать только одному заданию.
К следующим этапам отнесли поддержку наборов заданий, дополнительные классы ограничений в NtQueryInformationJobObject и NtSetInformationJobObject, а также разбор оставшихся флагов состояния задания. В самой заявке это оговорено прямо: часть возможностей намеренно оставлена нетронутой.
Зачем объекты задания браузерам и службам
Ограничения на ресурсы, групповое завершение и ограничения безопасности – три задачи, ради которых приложения для Windows обращаются к заданиям. Браузеру задание нужно, чтобы держать процессы в песочнице: группе назначается общий предел по памяти и рабочему набору, а при закрытии всё, что в неё попало, снимается одной операцией. Тем же механизмом пользуются службы и фоновые процессы, которым важно гарантированно завершать порождённые дочерние процессы.
Песочница – изолированная среда выполнения, в которой процесс работает с урезанными правами и ограниченным доступом к файлам, реестру и другим системным ресурсам.
Half-Life 2 и первый системный вызов NT6
Предыдущие заметные шаги проекта пришлись на лето. В июле в ReactOS запустили Half-Life 2 через месяц после первой части – на реальной машине, а не в виртуальной. Тогда же в ядро приняли первый системный вызов Windows NT6, с которого начинается работа над совместимостью с приложениями для Windows Vista.
Заключение
Появление объектов задания закрывает один из заметных пробелов в ядре ReactOS: без них современные браузеры и часть системных служб не работают вовсе. Поддержка пока базовая – вложенных заданий, наборов заданий и большинства классов ограничений в ней нет, часть флагов состояния ещё предстоит разобрать. Измеримый результат уже есть: связанные с заданиями тесты Wine kernel32 проходят без ошибок, то есть этот участок Windows API в ReactOS ведёт себя так же, как в оригинальной системе.