Какова стоимость условной переменной? - PullRequest
2 голосов
/ 21 апреля 2011

Предположим, что неиспользуемые ресурсы выполнения доступны на рассматриваемом компьютере, то есть не все процессоры используются.Если поток ожидает условную переменную, каковы затраты, связанные с пробуждением этого потока?Аналогично, каковы затраты, связанные с ожиданием переменной условия?Я заинтересован как в грубой количественной оценке, так и в том, откуда берутся затраты.Если ответ «зависит», я в первую очередь забочусь о последних версиях Windows и Linux для x86 / x64.

Редактировать: поскольку вызовы ядра связаны, насколько дороже вызов ядраобычный вызов функции?

Ответы [ 3 ]

2 голосов
/ 21 апреля 2011

Я не знаю каких-либо подробностей о реализации pthreads или D, но в общих чертах наилучшие издержки для условной переменной - это один дополнительный вызов ядра и возможное переключение контекста.

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

Для условной переменной существует дополнительная задача по повторному получению мьютекса, который, конечно, может блокироваться. Если это не блокирует, то это все еще вызов ядра. Это может в конечном итоге быть оптимизировано до нескольких атомарных команд ЦП, которые очень быстры по сравнению, но ограничены одним процессом. [ed: CRITICAL_SECTION в Win32 или futex в Linux, например.]

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

0 голосов
/ 29 сентября 2011

Чтобы ответить на ваш последний вопрос:

Поскольку задействованы вызовы ядра, насколько дороже вызов ядра, чем обычный вызов функции?

Да, примерно в 1000 раз дороже.

0 голосов
/ 26 апреля 2011

Это связано с вашим вопросом, хотя я не думаю, что это тот ответ, который вы ищете.

Мы сравнили сигналы с мьютексом / условием, чтобы определить, какой метод может спать и пробуждать поток быстрее.Для сигналов мы использовали sigwait () для приостановки и pthread_kill для пробуждения.Для мьютекса / условий Мы использовали один мьютекс и одно условие для каждого потока.Мы обнаружили, что можем спать и пробуждать потоки в 5 раз быстрее, используя сигналы.

Мы не тестировали фьютексы.

...