Mutex доступ и системный вызов - PullRequest
8 голосов
/ 15 августа 2011

Я знаю, что в Linux мьютексы реализованы как futexes внизу, а futex использует механизм сравнения и замены .И обычно для получения блокировок потоку пользовательского пространства не нужно совершать системный вызов, поскольку блокировка разрешается в пространстве пользователя.

Теперь мой вопрос заключается в том, что происходит, когда существует высокая конкуренция, и многие потоки пытаются заблокировать мьютекс одновременно.Происходит ли тогда системный вызов, чтобы ядро ​​решило, какой поток предоставить мьютекс?Особенно, когда приоритеты потоков отличаются?Я сам так думаю.

Ответы [ 2 ]

8 голосов
/ 15 августа 2011

Пока нет конфликтов, системные вызовы не выполняются.Если возникает конфликт, то выполняется системный вызов для помещения потока в очередь ожидания, которая затем будет использоваться для поиска первого потока, который проснется, когда мьютекс станет свободным.Кроме того, в системном вызове вносится корректировка в значение futex, чтобы текущий владелец потока не проходил процедуру разблокировки быстрого маршрута пользователя (которая просто сбрасывает futex обратно в ноль или «разблокирован»).значение), но вместо этого выполнит другой системный вызов, чтобы проверить очередь ожидания на наличие ожидающих потоков, чтобы передать владение блокировкой.Чем больше потоков борется за блокировку, тем больше вероятность того, что конфликт будет найден, но с другой стороны, если нет конкуренции, то sys-вызов не выполняется.

3 голосов
/ 15 августа 2011

Futexes делают небольшое количество циклов перед тем, как вернуться к системному вызову, поэтому в случае высокого напряжения блокировки существует высокая вероятность того, что потоки вернутся к системному вызову.

...