2012-03-24 8 views
0

Ich möchte den Code der Minix-Datei /usr/src/kernel/proc.c für die Implementierung des FCFS-Algorithmus anpassen, aber ich bekomme keine Ahnung oder Anhaltspunkt. Ich habe gesagt, dass der aktuelle Algorithmus mit einer gewissen Prioritätsstufe arbeitet und alle Prozesse zuerst in eine einzige Warteschlange gehen und dann einen Algorithmus verwenden, dann werden den Prozessen einige Prioritäten zugewiesen. Aber wenn ich FCFS implementieren muss, dann sollte ich mit nur einer einzigen Warteschlange arbeiten.Wie proc.c in Minix anpassen für die Implementierung von FCFS-Algorithmus?

Aber wie diese Dinge zu beziehen?

+0

Sie erhalten möglicherweise eine bessere Antwort, wenn Sie einen Link (URL) angeben, über den Personen die Quelle überprüfen können. Eine Möglichkeit besteht darin, die Prioritäten zu reduzieren: Stellen Sie alles auf Priorität 1 (oder einen anderen geeigneten Wert) ein. Es wird dann wahrscheinlich FCFS funktionieren. Wenn Sie die Dinge so entwirren möchten, dass Sie nur eine einzige (nicht priorisierte) Liste haben, müssen Sie den Code-Modus kennen, wissen, wo die Prioritätslisten erstellt werden (und dann nur eine erstellen) und vielleicht sogar die Priorität aus dem entfernen Schnittstellen. Dies ist jedoch eine viel umfangreichere Operation am Code und wahrscheinlich nicht nur diese Datei. –

+0

Vielen Dank für diese Hilfe. Du hast erwähnt, dass ich die Priorität auf 1 oder andere geeignete Werte setzen sollte, und in diesem Fall hat jede Warteschlange die gleiche Priorität ... aber ich habe herausgefunden, dass es in minix tatsächlich 16 Warteschlangen gibt, die auf unterschiedlichen Prioritäten arbeiten, aber in FCFS alles, was ich brauche, um mit nur einer Warteschlange zu arbeiten, in der alle Prozesse zum Betrieb kommen, ist der Link = http://eng.upm.edu.my/~kmbs/teaching/OS/html/proc_8c.html, hier in der Enqueue-Funktion alle Prozesse werden in den MIN_USER_Q gestellt, das ist die Warteschlange, mit der ich arbeiten muss.Aber ich brauche weitere Hilfe zu Prioritäten, können Sie pls helfen? –

Antwort

2

Eine Möglichkeit – wahrscheinlich keine gute – ist die enqueue() Funktion zu ändern:

PUBLIC void enqueue(register struct proc *rp) 
{ 
    /* Add 'rp' to one of the queues of runnable processes. This function is 
    * responsible for inserting a process into one of the scheduling queues. 
    * The mechanism is implemented here. The actual scheduling policy is 
    * defined in sched() and pick_proc(). 
    */ 
    int q = rp->p_priority;      /* scheduling queue to use */ 

Statt rp->p_priority zuzuweisen, weisen Sie einfach 0:

int q = 0; 

Alle Prozesse werden dadurch die Warteschlange eingereiht auf aa Single-Priority-Queue (Queue-Nummer 0) und Sie haben ein einzelnes FCFS-System. Dies setzt natürlich voraus, dass enqueue() die einzige Funktion ist, die Prozesse zu Warteschlangen hinzufügt. Es gibt eine gute Chance, dass es die einzige ist, aber Sie müssen die meisten des Minix-Kernels sicher wissen.

Mit dieser Änderung können Sie dann untersuchen, ob zu viel Platz verschwendet wird, um mehrere Warteschlangen zu unterstützen. Wenn dies der Fall ist, können Sie die Warteschlangendeklarationen entsprechend anpassen. Die Warteschlangenstruktur ist wahrscheinlich nur ein Array von Zeigern; die verfügbare Platzeinsparung ist daher nicht groß.

Beachten Sie jedoch, dass Sie wahrscheinlich nur FCFS nicht möchten; Die Prioritätswarteschlangen sind aus guten Gründen da. Zum Beispiel sollten deine Interrupt-Handler schneller bedient werden als das Monster, das für SETI arbeitet. Das bedeutet, dass einige Prioritäten gesetzt werden müssen.

+0

Danke Jonathan Leffler. Ich bin dir dankbar, denn deine Instruktion hat mir geholfen, den Minix-Kernel erfolgreich zu modifizieren (ich glaube bis jetzt). Aber würde es Ihnen etwas ausmachen, mir zu sagen, dass es einen Prozess oder eine Funktion gibt, mit der ich überprüfen kann, ob mein FCFS funktioniert oder ob es logische Fehler gibt oder nicht (es gibt keinen Kompilierungsfehler, dessen bin ich mir sicher)? Ich wäre Ihnen dankbar. –

+0

Kurz, ich weiß es nicht. Aber da der Code läuft und es nur eine Warteschlange gibt, ist es etwas schwierig zu sehen, wie er anders als FCFS funktionieren könnte. Vielleicht können Sie ein Dutzend rechenintensive Prozesse ausführen (die keine Systemaufrufe machen, also 100x100 Matrizen oder etwas anderes invertieren) und zeigen, dass Ihre interaktiven Terminalprozesse warten, bis die rechenintensiven Prozesse abgeschlossen sind ihre Zeitscheibe. Wenn Computer mit 25 MHz betrieben wurden, war es viel einfacher zu sehen, dass sie jetzt mit 2,5 GHz arbeiten. –

+0

danke ..... mit freundlichen Grüßen –