You are on page 1of 2

ΠΛΥ510 Λειτουργικά Συστήματα

Εργαστήριο 3: Υλοποίηση Δίκαιης Χρονοδρομολόγησης στο Minix 3.0

Σκοπός της εργαστηριακής άσκησης ήταν η εξοικείωση με το λειτουργικό σύστημα Minix


3.0 σε περιβάλλον VΜware και στην συνέχεια η επέκταση του συστήματος για την υποστήριξη
πολιτικής δίκαιης χρονοδρομολόγησης και η εφαργογή κάποιων scripts ώστε να επιβεβαιωθεί οτι
το σύστημα λειτουργεί κανονικά.

Αρχικά, έγινε η εγκατάσταση του λειτουργικού στο VMware και η επαλήθευση οτι το
σύστημα εγκαταστάθηκε σωστά μέσα απο κάποια tests. Αφού έγινε η εξοικείωση με την δομή του
λειτουργικού, έγιναν οι απαραίτητες αλλαγές ώστε να εισάγουμε δίκαιη χρονοδρομολόγηση.

Σαν πρώτο βήμα μεταφέρθηκε η ταυτότητα του οδηγού ομάδας από το pm στο kernel κατά
την κλήση της fork(). Αυτό έγινε με την προσθήκη του πεδίου rmc->mp_procgrp στην κλήση της
sys_fork() στην συνάρτηση do_fork() μέσα στο αρχείο pm/forkexit.c ( η κλήση ήταν sys_fork(who,
child_nr, rmc->mp_procgrp); ). Τροποποιήθηκε επίσης το syslib.h όπου προστέθηκε το groupid
στα ορίσματα της sys_fork.( _PROTOTYPE( int sys_fork, (int parent, int child, int groupid)); )Η
επιβεβαίωση έγινε τυπώνοντας την ταυτότητα του οδηγού ομάδας μιας νέας διεργασίας στη
συνάρτηση do_fork() του αρχείου kernel/system/do_fork.c χρησιμοποιώντας την kprintf()
kprintf("---%d---\n",m_ptr->m1_i3); . Στο σημείο η διαδιεργασιακή επικοινωνία έγινε με την
χρήση μηνυμάτων. Tροποιήθηκε το sys_fork.c και προστέθηκε το int groupid; και το m.m1_i3 =
groupid;.

Στην συνέχεια, τροποιήθηκε η δομή proc στο proc.h και συμπεριλήφθηκαν τα πεδία
procgrp, proc_usage, gpr_usage και fss_priority. (int procgrp; float proc_usage; float grp_usage;
float fss_priority; ).Έπειτα, έγινε τροποίηση στο proc.h όπου μειώθηκε το συνολικό λήθος ουρών
απο 16 σε 9. Διατηρήθηκαν το USER_Q=7 και το IDLE_Q=8, ενω μειώθηκε το MIN_USER_Q=7.

Κατόπιν, έγιναν οι απαραίτητες τροποποίησεις για την δίκαιη χρονοδρομολόγηση του Minix
3.0. Ενημερώθηκαν τα πεδία procgrp, proc_usage, gpr_usage και fss_priority μεσα στην
lock_dequeue() που βρίσκεται στο proc.c για όλες τις διεργασίες που περιμένουν στην ουρά
rdy_head[USER_Q]. (i -> proc_usage = i->proc_usage/2.0; i -> grp_usage = i->grp_usage/2.0;
i -> fss_priority = i->proc_usage/2.0 + i->grp_usage*number/4 + 80; i = i->p_nextready; ).
Επίσης στην lock_dequeue() έγιναν κάποιες ενημερώσεις για τον υπολογισμό του κόστους.
lock(4, "dequeue");

kostos = (next_ptr->p_quantum_size - next_ptr->p_ticks_left)*10;

bill_ptr->proc_usage += kostos;
bill_ptr->grp_usage += kostos;
i = rdy_head[USER_Q];
while(i != NIL_PROC){

if(bill_ptr!=i && bill_ptr->procgrp == i->procgrp){


i->grp_usage+=kostos;
}
i = i->p_nextready;
}
number=0;
i = rdy_head[USER_Q];
while(i!=NIL_PROC){
j = i ->p_nextready;
while(j!=NIL_PROC){
if(i->procgrp==j->procgrp){
break;
}
j = j ->p_nextready;
}

if(j==NIL_PROC){
number++;
}
i = i->p_nextready;
}

i = rdy_head[USER_Q];
while(i!=NIL_PROC){
i -> proc_usage = i->proc_usage/2.0;
i -> grp_usage = i->grp_usage/2.0;
i -> fss_priority = i->proc_usage/2.0 + i->grp_usage*number/4 + 80;
i = i->p_nextready;
}
dequeue(rp);
unlock(4);
}

Τέλος, τροποποιήθηκε η pick_proc() για να επιλέγει την διεργασία χρήστη με την


χαμηλότερη τιμή προταιρεότητας fss_priority.
for (q=0; q < NR_SCHED_QUEUES; q++) {
if ( (rp = rdy_head[q]) != NIL_PROC) {
if( q ==USER_Q){
i = rdy_head[USER_Q];
minfss = i->fss_priority;
minproc=i;
while(i!=NIL_PROC){
if(i->fss_priority < minfss){
minfss = i->fss_priority;
minproc= i;
}
i = i->p_nextready;
}
rp = minproc;

You might also like