Как реализовать главную машину, управляющую несколькими подчиненными машинами через Linux C ++ - PullRequest
0 голосов
/ 13 декабря 2011

Может ли кто-нибудь дать совет, как реализовать главную машину, управляющую некоторыми подчиненными машинами через C ++?

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

Если решение можно использовать как для Linux, так и для Windows, было бы намного лучше.

Ответы [ 3 ]

2 голосов
/ 13 декабря 2011

Вы должны использовать рамки, а не делать свои собственные.Вам нужно найти Cluster Computing .тот, который может работать легко, это Boost.MPI

0 голосов
/ 13 декабря 2011

С n-машинами вам нужно отслеживать, какие из них свободны, и, если их нет, загружать по своим подчиненным (то есть, сколько задач было поставлено в очередь на каждой), а затем ставить в очередь на самой низкой загруженной машине ( или какой бы алгоритм вы ни сочли лучшим), скажем, лучшее оборудование означает, что некоторые подчиненные работают лучше, чем другие и т. д. Я бы начал с простого алгоритма распределения, а затем настроил бы его, как только он заработал ...

Более интересные проблемы возникнут в исключительных обстоятельствах (то есть, умирают рабы и другие подобные проблемы).

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

0 голосов
/ 13 декабря 2011

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

while still tasks to do
   launch a task on a slave

Если вам нужно выполнить только одну работу на слейве, тогда вам понадобитсячто-то вроде массива флагов, по одному на каждое ведомое устройство

 slaves : array 0 to (number of slaves - 1)
 initialize slaves to all FALSE

 while not done
    find the first FALSE slave -- it's not in use
    set that slave to TRUE
    launch a job on that slave

    check for slaves that are done
    set that slave to FALSE

Теперь, если у вас несколько потоков, вы можете сделать это в два потока

 while not done
    find the first FALSE slave -- it's not in use
    set that slave to TRUE
    launch a job on that slave

 while not done
    check for slaves that are done
    set that slave to FALSE
...