OxL Справочник OxL
РусскийEnglish

8.1 Модель исполнения

  • Единица исполнения — задача: лёгкая корутина со своим стеком. Задачи выполняются на пуле потоков ОС (по умолчанию — по потоку на ядро) с перераспределением работы (work stealing).
  • Ввод-вывод реализации СЛЕДУЕТ делать через io_uring (Linux), kqueue (macOS/BSD), IOCP (Windows).
  • Реализация ДОЛЖНА вытеснять задачу, выполняющуюся без точек приостановки дольше 10 мс (механизм определяется реализацией).
  • Вызовы blocking { … } и FFI-функции без атрибута @nonblocking выполняются в отдельном пуле блокирующих потоков.
  • @pinned на функции или акторе привязывает задачу к одному потоку (shard-per-core); такая задача никогда не мигрирует.

Определяется реализацией. Бэкенд ввода-вывода и вытеснение (D-8051; DIV-035; D-1600..D-1604). Эта реализация: сетевой и файловый ввод-вывод — через единый io_uring процесса (на ядрах без него или при OXL_NO_IO_URING=1 — неблокирующие сокеты и один поток epoll; файловые операции без io_uring — пул блокирующих потоков); kqueue и IOCP не реализованы. Вытеснение задач, работающих дольше 10 мс, — поток-монитор и сигнал; проверка вытеснения стоит на обратных рёбрах циклов, причём в самом внутреннем цикле — не реже одного раза на 1024 итерации (D-8063; D-7680).

Определяется реализацией. Переполнение стека (D-8051; DIV-003; D-3562). Стандарт о переполнении стека молчит. Эта реализация: стек задачи — 256 КиБ, корневой задачи main — 8 МиБ; переполнение — чистая паника stack overflow (сообщение в stderr, код выхода 101), а не аварийное завершение процесса по сигналу. Развёртывания стека (defer, деструкторы) при этом не происходит, так как стек исчерпан.

blocking-in-task

См. также

Исходник: docs/spec/oxl-standard.md