История изменений
Исправление pon4ik, (текущая версия) :
На практике буфер служит для (внезапно) буферизации каких-то i/o или вычислительных задач. В зависимости от характера данных он либо всегда содержит данные для процессинга и тогда спать не эффективно по определению.
Но чаще всего ввод вывод имеет немного другой характер, имеются пиковые нагрузки и состояние простоя. Как раз вариации на тему busy_poll являются эффективным подходом в таком случае в паре с ожиданием на cv или семафоре.
Например я видел примерно такой подход, который справлялся с задачей на ура:
- ждём входа на cv (спать пока буфер пуст)
- разгребаем его полностью (всё что успеваем, на то он и ring)
- активно(не отдавая поток планировщику) ждём ещё 2us(параметр из конфига, под конкретное окружение), если он начинает заполнятся разгребаем
- засыпаем на cv
Да, тут можно было бы попробовать вести статистику и менять этот таймаут в рантайме, вопрос сколько бы заняли эти вычисления и какова была бы их точность. Сложная статистика вполне могла бы занять дольше 2us :) А простая давать плохие результаты. Но история не про классический sleep(по сути если на родственных (affinity) ядрах крутится кто-то ещё, это команда отзаниматься им своими делами и уснуть, а потом, так уж и быть если таймаут истёк тебя разбудить), а про то, как выработать квант максимально эффективно.
Исходная версия pon4ik, :
На практике буфер служит для (внезапно) буферизации каких-то i/o задач. В зависимости от характера данных он либо всегда содержит данные для процессинга и тогда спать не эффективно по определению.
Но чаще всего ввод вывод имеет немного другой характер, имеются пиковые нагрузки и состояние простоя. Как раз вариации на тему busy_poll являются эффективным подходом в таком случае в паре с ожиданием на cv или семафоре.
Например я видел примерно такой подход, который справлялся с задачей на ура:
- ждём входа на cv (спать пока буфер пуст)
- разгребаем его полностью (всё что успеваем, на то он и ring)
- активно(не отдавая поток планировщику) ждём ещё 2us(параметр из конфига, под конкретное окружение), если он начинает заполнятся разгребаем
- засыпаем на cv
Да, тут можно было бы попробовать вести статистику и менять этот таймаут в рантайме, вопрос сколько бы заняли эти вычисления и какова была бы их точность. Сложная статистика вполне могла бы занять дольше 2us :) А простая давать плохие результаты. Но история не про классический sleep(по сути если на родственных (affinity) ядрах крутится кто-то ещё, это команда отзаниматься им своими делами и уснуть, а потом, так уж и быть если таймаут истёк тебя разбудить), а про то, как выработать квант максимально эффективно.