2013-08-10 4 views
1

Я работаю над частью более крупного проекта, который должен читать из многих FIFO и перенаправлять их должным образом, в зависимости от команд. Для этого FIFO читаются по порядку в бесконечном цикле.Управляемый бесконечный цикл использует слишком много ресурсов

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

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

Есть ли у вас какие-либо другие идеи, чтобы избежать перегрузки?

+1

Если это Linux, вы можете использовать 'nice' из командной строки и' select' внутри. – Paul

+0

Так вы пытаетесь одноканальной обработки нескольких FIFO в центральную отправку? Мне кажется, что поток за FIFO, который тянет с блокировкой, толкает в один fifo, который должен быть вашей централизованной диспетчеризацией (или я полностью не понимал проблему как описано). – WhozCraig

+0

@Paul Select кажется очень полезным. У вас есть подробный пример, потому что документации недостаточно. – markmb

ответ

0

Как предложил Павел, я думаю, что лучший вариант - использовать select. example that he gave достаточно ясен, чтобы понять, как его использовать (я не мог понять его с man-страницы). Это очень полезный инструмент, и я не буду использовать его в последний раз.

1

Будет ли пул потоков подходящим? http://en.wikipedia.org/wiki/Thread_pool_pattern

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

+0

Когда вы говорите «постоянно проверяет новую работу», как это реализовать? Используя управляемый бесконечный цикл? Это то, что у меня есть, и это работает, но использует много ресурсов. Но на самом деле, не зная, я использую очень похожую структуру (я не использую потоки, но я перестаю искать новую работу и выполняю действие, потому что действия короткие). – markmb

+0

Да, проверьте новую работу с бесконечным циклом, как вы уже делаете.Повышение производительности - это когда вы отправляете отдельный поток для выполнения работы, потому что этот поток может работать параллельно с вашей основной программой (при условии, что у вас несколько ядер). Даже если это не так, все же может быть усиление производительности, если какая-то работа тяжелая в/в, а другая - тяжелая. – superdesk

Смежные вопросы