Я полагаю, что нет веских причин, чтобы заставить ваш процесс проснуться, если он не имеет ничего общего. Просто установите время ожидания, когда вам сначала понадобится , чтобы что-то сделать. Например, если у вашего сервера есть семантика отключения клиента после N секунд бездействия, установите время ожидания epoll на время после того, как первый клиент должен был быть отключен, предполагая отсутствие активности. Другими словами, установите его на:
тт {expire_time (клиент); для каждого клиента} - current_time
Или, если это отрицательно, вы можете немедленно отключить хотя бы одного клиента. В общем, это работает не только для отключения клиентов; Вы можете абстрагировать вышеизложенное в «программные таймеры» в вашем приложении.
Я не вижу упомянутого вами компромисса. Если вы используете тайм-аут, меньший, чем нужно, вы проснетесь, прежде чем у вас появится , а затем, вероятно, вернетесь ко сну, потому что вам нечего делать. Что хорошего в этом? С другой стороны, вы не должны использовать тайм-аут, превышающий то, что вам нужно - потому что это заставит вашу программу не соблюдать политику тайм-аута отключения.
Если ваша программа не ожидает какого-либо события, основанного на времени (например, отключение клиентов), просто присвойте epoll_wait () значение тайм-аута -1, заставив его ждать вечно.
ОБНОВЛЕНИЕ Если вы беспокоитесь, что этот процесс получает меньше ресурсов ЦП, когда другие процессы активны, просто присвойте ему более низкое значение nice (приоритет планировщика). С другой стороны, если вы обеспокоены тем, что ваш серверный процесс будет выгружен на диск в пользу других процессов, когда он простаивает, можно избежать его замены . (или вы можете просто уменьшить / proc / sys / vm / swappiness, влияя на все процессы)