← All posts tagged pthreads

Strategies for Implementing POSIX Condition Variables on Win32

Заставил себя вчитаться. Вчера заснул после PulseEvent, сегодня со свежими силами продолжаю читать про SetEvent. Хотел написать, что никак не могу понять эту часть:
8. Thread C2 is the only thread left and blocks forever since not_empty_ will never be signaledПока писал, почему не могу понять, понял.

То, что в этой статье описывается, как пользоваться WinAPI времён XP, не принципиально.

Во-первых, во второй части указано, как реализовывать события, если их нет, и как реализовывать мониторы поверх событий, если в операционной системе нет атомарного ожидания одного объекта и сигнализации другому (Windows 95, Windows NT 3.51).

Во-вторых, я читаю, как сделан M:N планировщик IBM NGPT, и там тоже поверх событий сделано: на строке 333 ожидание входа в мьютекс, а на строке 998 — ожидание условной переменной, а откуда берётся ev, можно посмотреть по строкам выше.

Это отличается от того, что пишет, например, Дмитрий Завалишин, разработчик Фантом ОС, под авторством которого вышло научно-популярное чтиво про архитектуру примитивов синхронизации:
Иерархия реализации такова: mutex/cond/sema сделаны на базе спинлоков, спинлоки — на базе атомарных операций, предоставляемых процессором.
Внутри ядра мьютекс реализован с помощью спинлоков, а вот спинлоки реализованы сами по себе, автономно. Они — действительно базовый примитив. Ниже — только сам процессор.

Смотрю его код и вижу не событие, а некую очередь, которая то ли так же, как события, работает, то ли нет, но неплохо бы, чтоб это где-то уточнялось. Разработчик osFree, когда я его на эту тему пытал в IRC, говорил, что у них в L4 сообщения посылаются между процессорами.

То есть, восполняя пробелы:
mutex/cond/sema сделаны на базе спинлоков и либо событий, либо очередей потоков, либо сообщений.
События, очереди потоков или сообщения реализованы на базе спинлоков и атомарных операций, предоставляемых процессором.
Спинлоки реализованы на базе атомарных операций, предоставляемых процессором.

Напрашивается предположение, что между подчёркнутым есть изоморфизм или даже синонимия, но сам я такого утверждать не могу, а чтоб где-то авторитетно утверждалось, не вижу. Если про эту часть даже тот, кто сам её писал, «забыл», что говорить о других.

Довольно непросто найти сейчас M:N планировщик. Судя по сохранённой странице IBM NGPT, его последняя версия — 2.2.2, но в Интернет Архиве нашёл только максимум 1.9.90. Ещё хорошо поискав, нашёл NGPT 2.2.1.

Как делать обычные потоки с предвыделенными стеками, уже давно разобрались, а вот с зелёными ещё ничего не решено, и как делать M:N планировщик второго уровня поверх ядра, с академической точки зрения всё ещё интересно.