2010-09-02 5 views
1

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

условия является таким, как, например:

  1. Каждого устройство может обрабатывать только одну задачу в то время, например, одна задачи должна завершить работу на назначенном устройства перед последующей задачей существ processeed.
  2. Планировщик должен быть эффективным. В настоящее время обработка рабочей очереди заданного устройства занимает больше времени, чем сумма его задач.

Вот основное описание текущей реализации:

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

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

Любые предложения по улучшению? Я ясно это сказал? Если нет, сообщите мне, и я сделаю все возможное, чтобы уточнить.

Спасибо, что нашли время посмотреть это. С уважением.

+0

Может ли данная задача обрабатываться одним и только одним устройством или любое устройство может обрабатывать любую задачу? Что вы подразумеваете под «задача занимает <5 мс, чтобы начать выполнение»? Вы имеете в виду, что он должен быть запущен в течение 5 мс? (Если нет, то как этот факт имеет значение?) –

+0

@Stephen - задача занимает <5 мс, чтобы начать выполнение, поскольку несколько шагов предшествуют выполнению задачи, например, с устройством необходимо связаться ... и т. Д. –

+0

@Stephen - a задание или набор задач связано с уникальным устройством, поэтому для ответа на ваш вопрос: нет, любое устройство не может обработать какую-либо задачу. –

ответ

1

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

Я предлагаю вам запустить свой код через профилировщик, чтобы увидеть, какие потоки в настоящее время блокируются (кажется, что это будут потоки вашего производителя). Я могу порекомендовать YourKit Java Profiler, однако его не бесплатно.

+0

Это первый раз, когда я слышал о интерфейсе CompletionService; Спасибо.После прочтения описания моя текущая реализация очень похожа на текущую реализацию ExecutorCompletionService. Однако, я проверю это. Возможно, это уменьшит время обработки очереди. –

0

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

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

+0

Рабочий поток, потребляющий глобальную очередь выполнения, имеет доступ к пулу потоков ExecutorService; поэтому несколько устройств обрабатывают задачи. Я согласен, что нить на устройство является неправильным подходом. Спасибо за ваши комментарии. –