2012-04-03 17 views
2

Ich arbeite an einem Programm, das die Affinität für einen Prozess festlegt. Ich habe Daten vordefiniert, die mir erlauben, den ungefähren Prozentsatz einer CPU (oder eines Kerns) zu berechnen, den ein Prozess während jeder der drei Phasen der Programmlebensdauer verwendet. Jeder Prozess hat die gleichen drei Stufen und ich habe für jeden Prozess in jeder dieser drei Phasen Daten vordefiniert. Ich versuche den besten Algorithmus zu finden, der die Prozesse sortieren kann. Der Kicker ist, ich kann nicht jede Stufe einzeln sortieren. Für den Prozess X müssen alle drei Stufen berücksichtigt werden, wenn sie im Algorithmus mit dem Prozess Y verglichen werden. Als ein Beispiel mit einigen Daten aus:Load Balancing Sortieralgorithmus

CPU's currently at the following loads: 

    CPU | Stage 1 | Stage 2 | Stage 3 
    --------------------------------- 
    1 | 25%  | 25%  | 25% 
    2 | 50%  | 50%  | 50% 
    3 | 75%  | 25%  | 75% 
    4 | 50%  | 25%  | 10% 

    Process X was pre-determined to take up 
    10% in stage 1, 20% in stage 2, and 30% in stage 3. 

Was habe ich mit so weit kommen wird, um die vorgegebenen Prozent dieser Prozess X für jede CPU in Anspruch nimmt hinzuzufügen, die dazu führen würde:

CPU | Stage 1 | Stage 2 | Stage 3 
    --------------------------------- 
    1 | 35%  | 45%  | 55% 
    2 | 60%  | 70%  | 80% 
    3 | 85%  | 45%  | 105% 
    4 | 60%  | 45%  | 40% 

und Rang jede Stufe der CPU gegen die anderen (Bindungen denselben Wert zu geben), die dazu führen würde:

CPU | Stage 1 | Stage 2 | Stage 3 
    --------------------------------- 
    1 | Rank 1 | Rank 1 | Rank 2 
    2 | Rank 2 | Rank 2 | Rank 3 
    3 | Rank 3 | Rank 1 | Rank 4 
    4 | Rank 2 | Rank 1 | Rank 1 

und das Gewicht dann die Rangliste durch die, wie viel jeder Prozess in jeder Phase verwendet, ein d das Hinzufügen der finalen Rang * -Gewichte über jede Stufe, um eine ganze Zahl zu erhalten, um zu bestimmen, welche CPU-Zuweisung am besten ist. In diesem Beispiel würde ich Stufe 3 ein Gewicht von 3 geben, weil es die Stufe mit dem höchsten Wert für dieses Verfahren ist, Stufe 2 ein Gewicht von 2 und Stufe 1 ein Gewicht von 1 aus dem gleichen Grund wie Stufe 3. Dies würde ergeben:

Da CPU 4 die niedrigste Summe hat, ist sie daher der beste Kandidat, um Prozess X zuzuweisen. Ich glaube, dass es immer noch ein paar Fehler gibt, und ich denke, dass es einen viel besseren Weg geben könnte (weshalb ich dich frage!). Ich dachte nur, ich würde erklären, was ich bisher gemacht habe, nur um dir eine Vorstellung davon zu geben, mit was ich arbeite.

Edit: Ich sollte hinzufügen, dass Sie nicht einfach die Stufen für jede CPU summieren und dann einen Sortieralgorithmus anwenden können. Jede Stufe muss unter 100% bleiben, und wenn Sie die Stufen summieren, können Sie versehentlich einer CPU einen Prozess zuweisen, der dafür keinen Platz bietet. IE, Zuweisen von Prozess Y mit 90%/20%/30% wurde berechnet (unter der Annahme der Summierung der Stufen), die der CPU 1 mit 20%/30%/40% zugewiesen werden. Die Summe der Stufen für diese CPU könnte kleiner als jede andere CPU sein, aber das Hinzufügen der Stufe 1 des Prozesses Y (90%) zur Stufe 1 der CPU 1 (20%) ist größer als 100% und würde zu einem Überlauf führen.

Summierung der Stufen sollte überall vermieden werden, weil es mögliche Probleme versteckt.

Worauf ich glaube, dass es wirklich darauf ankommt ... Wie sortieren Sie Datensätze? Da jede CPU im Wesentlichen ein Datensatz (Stufe 1, Stufe 2, Stufe 3) ist, den ich sortieren muss, um die Prozesszuordnung zu bestimmen.

Edit 2: Ich bin gerade mit meiner Beschreibung hier gelandet.

Antwort

0

Sie sagen also, dass Sie PROZESSE so sortieren möchten, dass Sie so viele von ihnen planen können, dass sie unter der aktuellen Last von CPUs laufen können?

Dies ist genau wie ein 01-knapsack Problem, außer es gibt drei Dimensionen (Stufen) statt zwei (Größe, Gewicht). Ich nehme an, dass die Lösungen für Knapsack (dynamische Programmierung oder gierig) auch für Sie funktionieren.