This post beschreibt, wie make
Ziele in der richtigen Reihenfolge erstellt. Ich würde gerne mehr über die Parallelität speziell erfahren. Von der Post:Make mit der "-j" -Option: Wie weiß Make, wann im Abhängigkeitsgraphen weiterzugehen ist?
Unter normalen nichtparallelen Betrieb machen Sie einfach wählen Sie eine einzelne Ziel jeder Iteration und bauen Sie es. Wenn es parallel ist, wird es so viele abhängigkeitslose Ziele wie möglich aufnehmen und sie parallel aufbauen, bis zur Anzahl der erlaubten simultanen Jobs.
Was ich Bild:
- ohne fehlende Abhängigkeiten alle Ziele finden.
- Erstellen Sie alle diese Ziele.
- Warten Sie, bis alle parallelen Worker fertig sind (synchronisieren).
- Zurück zu Schritt (1).
Aber das ist falsch: make -j
weiß irgendwie, wenn in der Grafik ohne Schritt (3) voranzukommen. Neue Ziele beginnen erst, wenn alle Abhängigkeiten abgeschlossen sind und ein paralleler Worker verfügbar ist. Wie?
Betrachten wir zum Beispiel die Grafik:
A -> C
B -> D
In meine erste Vermutung, make -j2
würde für warten beideA
und B
zu beenden, bevor entwederC
oder D
beginnt. Es scheint jedoch zu wissen, dass es weitergehen kann zu C
, wenn A
endet, aber B
ist noch in Bearbeitung.
Also die Mutex geschützte Datenstruktur, die asynchronicity behandelt (und schließlich ein erreichbares Token erzeugt) ist ausschließlich innerhalb des Jobservers beschränkt, verstehe ich. – Vroomfondel
Nun, make ist kein Multithread, daher gibt es eigentlich keine Mutex- oder geschützte Datenstruktur für Token. Make setzt ausschließlich auf die Atomizität von Single-Byte-Lesevorgängen von einer Pipe, um den Jobserver funktionsfähig zu machen. http://make.mad-scientist.net/papers/jobserver-implementation/ enthält eine Beschreibung, obwohl einige der Details in neueren Versionen von GNU make falsch sind (die jetzt pselect() verwenden). – MadScientist