Эффективно ли использовать epoll с устройствами (/dev/event/...)?

Я работаю над однопоточным апплетом процесса, который создает виртуальное прокси-устройство (точнее виртуальную панель Xbox 360); Мне удается создать его с помощью интерфейса uinput, я настроил его правильно, и он работает просто отлично.

Чтобы передать команды этому виртуальному устройству, я считываю события из другого реального интерфейса (в данном случае панель PS3) и открываю файл реального устройства с такими флагами:

fd = open("/dev/input/event22", O_RDONLY); // open the PS3 pad

Основной цикл выглядит примерно так (минус проверка ошибок):

while(run) {
    input_event ev = {0};
    read(fd, &ev, sizeof(struct input_event));
    // convert from PS3 --> Xbox 360
    convert(ev);
    // write to the new virtual pad
    write(fd_virtual, &ev, sizeof(struct input_event));
}

Как вы можете себе представить read(fd, &ev, sizeof(struct input_event)); это блокирующий вызов, и я хотел бы иметь своего рода тайм-аут для циклического прохождения цикла и проверки других событий / выполнения другого кода.

По этим причинам я думаю об инкапсуляции этого read(fd... вызов внутри цикла epoll, поэтому у меня также может быть время ожидания.

Вопрос в том, было бы эффективно сделать это таким образом? Ввиду использования epoll_wait, я добавляю дополнительные задержки в токовую петлю, таким образом, задержки в отзывчивости виртуальной площадки?

1 ответ

Ввиду использования epoll_wait, я добавляю дополнительные задержки в токовую петлю, таким образом, задержки в отзывчивости виртуальной площадки?

Да, конечно.

было бы эффективно сделать это таким образом?

Я уверен, что да, но это очень зависит от вашего определения "эффективный".

То, о чем мы здесь говорим, это устройство ввода человека. Когда мы имеем дело с HID, нас больше всего беспокоит задержка, она не должна отставать, реакция на нажатие клавиши должна быть мгновенной. Что такое "мгновенный" для человека? Там есть хорошая дискуссия, но один аргумент, который мне нравится больше всего, состоит в том, что на соревнованиях по легкой атлетике высокого уровня вы были бы дисквалифицированы за то, что стартовали менее чем через 100 мс после сигнала.

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

В любом случае, я думаю, что 1 мс - это абсолютно безопасные накладные расходы, которые вы можете добавить с помощью прокси-сервера, и никто не заметит, скажем, это наша цель максимальной задержки (как в определении "эффективного").

Итак, давайте предположим, что вы удовлетворены временем ответа вашего текущего кода. Что меняется при добавлении epoll() вызов? По сути, вы добавляете некоторое время для выполнения другого системного вызова, потому что теперь вместо одного системного вызова, чтобы получить значение, вы делаете два. Так что потенциально он примерно в два раза медленнее, чем ваш исходный код (на данный момент давайте забудем о разнице во времени обработки для разных системных вызовов). Но так ли это плохо?

Чтобы ответить на этот вопрос, нам нужно иметь некоторую оценку того, что такое издержки системного вызова. Если мы слишком ленивы, чтобы измерить это сами, мы можем использовать некоторые числа от 20 лет назад, некоторые числа от людей, которым небезразличны системные вызовы, некоторые числа IPC от ребят из микроядра (они всегда заботятся), некоторые случайные числа от Stackru или просто спросить Богатый и обоснованный вокруг чего-то микросекундного уровня как безопасное предположение.

Таким образом, вопрос сводится к тому, является ли добавление некоторых (скажем, 10) микросекунд заметным в пределах вашего миллисекундного (как в 1000 мкс) временного бюджета. Я думаю, что нет.

Есть только одна небольшая возможная проблема, когда вам нужно "просто добавить epoll()"чтобы

цикл по циклу и проверить другие события / выполнить другой код.

Вы должны быть осторожны, чтобы не превышать бюджет времени для этих циклов и проверок. Но опять же 1 мс, вероятно, более чем достаточно для вас здесь.

Другие вопросы по тегам