Nehmen wir mal an du willst sämtliche 8bit langen Passwörter ausprobieren und du hast 8VMs dafür, dann kannst du "recht" simpel aufteilen.
Normalerweise gibt es einen Master (das kann ein Prozess oder eine Maschine sein), der kontrolliert und koordiniert und eben die Worker, die nur noch "stupide" arbeiten.
Der Master kennt seine 8 worker und er kennt auch die zu berechnende Range: VM1 - VM8 als worker, 00000000[SUB]2[/SUB] bis 11111111[SUB]2[/SUB] (010 - 255[SUB]10[/SUB]) als Range.
Er weiß jetzt, dass er bei 8 workern über die ersten 3 high bit aufteilen kann. (000 - 111) alle darunter liegenden Möglichkeiten (da wir ja 8 und nicht nur 3 bit haben), müssen sich die worker selbst berechnen.
VM1 bekommt die high-bit 000 - folglich "prüft" sie sämtliche 000xxxxx mit x aus {0, 1} Möglichkeiten
VM2 bekommt die high-bit 001 - folglich "prüft" sie sämtliche 001xxxxx mit x aus {0, 1} Möglichkeiten
VM3 bekommt die high-bit 010 - folglich "prüft" sie sämtliche 010xxxxx mit x aus {0, 1} Möglichkeiten
VM4 bekommt die high-bit 011 - folglich "prüft" sie sämtliche 011xxxxx mit x aus {0, 1} Möglichkeiten
VM5 bekommt die high-bit 100 - folglich "prüft" sie sämtliche 100xxxxx mit x aus {0, 1} Möglichkeiten
VM6 bekommt die high-bit 101 - folglich "prüft" sie sämtliche 101xxxxx mit x aus {0, 1} Möglichkeiten
VM7 bekommt die high-bit 110 - folglich "prüft" sie sämtliche 110xxxxx mit x aus {0, 1} Möglichkeiten
VM8 bekommt die high-bit 111 - folglich "prüft" sie sämtliche 111xxxxx mit x aus {0, 1} Möglichkeiten
Die zu prüfenden Bereiche sehen also so aus:
VM1: 00000000 - 00011111 (0 - 31)
VM2: 00100000 - 00111111 (32 - 63)
VM3: 01000000 - 01011111 (64 - 95)
VM4: 01100000 - 01111111 (96 - 127)
VM5: 10000000 - 10011111 (128 - 159)
VM6: 10100000 - 10111111 (160 - 191)
VM7: 11000000 - 11011111 (192 - 223)
VM8: 11100000 - 11111111 (224 - 255)
Der Master weist also jedem worker seinen Bereich zu und die worker prüfen für jedes Passwort aus ihrem jeweiligen Bereich, ob es richtig ist.
Sobald ein worker das gültige Passwort gefunden hat, meldet er es an den Master und alle können aufhören.
Sobald ein worker offline geht (das heißt, der Master hört für eine gewisse Zeit nichts mehr von ihm), kann der Master diesen Bereich neu aufteilen.
Beispielsweise geht VM3 offline ohne zu melden, ob sie das Passwort gefunden hat oder nicht. Damit ist der Bereich 01000000 - 01011111 unbearbeitet.
Der Master kann ihn jetzt neu aufteilen:
010 || 00000 - 00011
010 || 00100 - 00111
010 || 01000 - 01011
010 || 01100 - 01111
010 || 10000 - 10011
010 || 10100 - 10111
010 || 11000 - 11011
010 || 11100 - 11111
Sobald ein worker mit seinem Bereich fertig ist ohne ein gültiges Passwort zu finden, dann kann er dem Master bescheid sagen und erhält von diesem einen neuen Bereich zugewiesen, solange noch unbearbeitete Bereiche übrig sind.
Beispielsweise könnte VM1 fertig werden ohne ein Passwort zu finden und der Master, der ja den Ausfall von VM3 bemerkt hat, könnte VM1 dann den Bereich 01000000 - 01000011 zuweisen.
Natürlich ist das mit 8 Bit und 8 VMs ein sehr simples Beispiel, aber das funktioniert natürlich auch für wesentlich größere Bereiche.
Die Kommunikation, die ausgeführt wird:
Master -> worker: die zu berechnende Formel, etwa: hash(x) == referenzwert
Master -> worker: der Wertebereich für x
worker -> Master: wip ("ich lebe noch")
worker -> Master: rdy ("ich bin fertig, habe nichts gefunden")
worker -> Master: found, x ("ich habe einen gültigen Wert, x, gefunden")
Die Rechenlast bzw. Zeitkosten erzeugt dabei im Wesentlichen die hash(x)-Funktion.