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

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

Изменено 17.05.2018 8:17 lpd

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

B>т.е получается ядро просто исполняет некий набор инструкций (user mode) пока не прийдет системное прерывание таймера, или не встретится системный вызов.

B>Тогда управление перейдет в kernel. Т.е в общем случае, освободить ядро досрочно — такая же "по тяжеловесности" операция, как и истечение кванта времени, так?
B>Затем уже в ядре планировщик решает, на какой поток передать управление далее.
B>И "спящий" поток просто будет временно игнорироваться, т.о. исключаясь из планирования. Пока планировщику не просигналят — что он уже готов "проснуться"
B>В общем то, не так все и страшно, значит...

То, что здесь писали про мьютекс и исполнение инструкций pause — это неправильно.
Для освобождения процессора нужно перейти в режим ядра и передать управление системному планировщику. Планировщик сохранит регистры потока в память, полностью прекратит его исполнение, и начнет исполнять на этом ядре какой-то другой поток другого процесса, или ядерный поток, если такие ждут квантов времени.
Переход в режим ядра и тем более переключение контекста на другой поток — достаточно долгие операции.

B>Я думал что condition variable и mutex это некие фундаментальные, не сводимые друг к другу классы, оказывается, первое реализуется через второе?


Это разные операции. В теории одну можно свести к другой, но это не очень удобно.
И мьютекс, и условная переменная реализуются через системный вызов sys_futex().
Re[9]: внутренняя реализация std::mutex?
Здравствуйте, barney, Вы писали:

B>т.е получается ядро просто исполняет некий набор инструкций (user mode) пока не прийдет системное прерывание таймера, или не встретится системный вызов.

B>Тогда управление перейдет в kernel. Т.е в общем случае, освободить ядро досрочно — такая же "по тяжеловесности" операция, как и истечение кванта времени, так?
B>Затем уже в ядре планировщик решает, на какой поток передать управление далее.
B>И "спящий" поток просто будет временно игнорироваться, т.о. исключаясь из планирования. Пока планировщику не просигналят — что он уже готов "проснуться"
B>В общем то, не так все и страшно, значит...

То, что здесь писали про мьютекс и исполнение инструкций pause — это неправильно.
Для освобождения процессора нужно перейти в режим ядра и передать управление системному планировщику. Планировщик сохранит регистры потока в память, полностью прекратит его исполнение, и начнет исполнять на этом ядре какой-то другой поток другого процесса, или ядерный поток, если такие ждут квантов времени. В будущем планировщик может восстановить из памяти регистры усыпленного потока, в том числе переключить таблицу страниц, и вернуть его к исполнению.
Переход в режим ядра и тем более переключение контекста на другой поток — достаточно долгие операции.

B>Я думал что condition variable и mutex это некие фундаментальные, не сводимые друг к другу классы, оказывается, первое реализуется через второе?


Это разные операции. В теории одну можно свести к другой, но это не очень удобно.
И мьютекс, и условная переменная реализуются через системный вызов sys_futex().