Информация об изменениях

Сообщение Re[8]: внутренняя реализация std::mutex? от 17.05.2018 19:21

Изменено 17.05.2018 19:22 okman

Re[8]: внутренняя реализация std::mutex?
Здравствуйте, barney, Вы писали:

B>А такое можно реализовать легковесно в user mode не отдавая контекст ядру/планировщику?


Наверное, ничего лучше инструкции pause пока ничего не придумали.

B>Любопытный вопрос. А какие практики используются вместо этого в ядре?


Конкретно ядро Windows перед захватом спинлока задирает IRQL до DISPATCH_LEVEL, это предотвращает вытеснение
потока планировщиком (хотя это не исключает, например, приход прерывания, в результате чего код все равно
будет временно вытеснен). Ну и вместо обычных спинлоков рекомендуется применять спинлоки с очередями на
стеке (in-stack queued spinlock) — там каждый поток вместо глобальной переменной теребит переменную у
себя в стеке, ну и гарантируется порядок захвата спинлока потоками (т.е. убирается проблема "starvation").

Про linux не в курсе, я его видел только "на картинках"

В режиме пользователя запретить вытеснение потока нельзя. Думаю, в режиме пользователя по этой
причине никаких спинлоков быть не должно.
Re[8]: внутренняя реализация std::mutex?
Здравствуйте, barney, Вы писали:

B>А такое можно реализовать легковесно в user mode не отдавая контекст ядру/планировщику?


Наверное, ничего лучше инструкции pause пока не придумали.

B>Любопытный вопрос. А какие практики используются вместо этого в ядре?


Конкретно ядро Windows перед захватом спинлока задирает IRQL до DISPATCH_LEVEL, это предотвращает вытеснение
потока планировщиком (хотя это не исключает, например, приход прерывания, в результате чего код все равно
будет временно вытеснен). Ну и вместо обычных спинлоков рекомендуется применять спинлоки с очередями на
стеке (in-stack queued spinlock) — там каждый поток вместо глобальной переменной теребит переменную у
себя в стеке, ну и гарантируется порядок захвата спинлока потоками (т.е. убирается проблема "starvation").

Про linux не в курсе, я его видел только "на картинках"

В режиме пользователя запретить вытеснение потока нельзя. Думаю, в режиме пользователя по этой
причине никаких спинлоков быть не должно.