void ordonnance(void) { cli();//Pour ne pas qu'une interruption empêche le changement d'état int previous = actif->pid; //pour éviter une boucle infinie on ne testera qu'une fois chaque processus. int count = 0; if ( actif->state == ELU ) actif->state = ACTIVABLE; actif = &proc_table[(actif->pid + 1) % NB_PROCESSES]; //Regarde tous les processus jusq'à trouver le premier qui est soit ACTIVABLE soit ENDORMI mais dont l'heure de réveil est arrivée while ( (((actif->state == ENDORMI) && (actif->ttw > time)) || actif->state == MORT) && count < NB_PROCESSES) { actif = &proc_table[(actif->pid + 1) % NB_PROCESSES]; count++; } actif->state = ELU; affiche_etats(); sti(); //Change le contexte d'execution : effectue le changement de processus actif ctx_sw(proc_table[previous % NB_PROCESSES].reg, proc_table[actif->pid % NB_PROCESSES].reg); }
void ordonnance() { // ne pas oublier de changer l'état des processus int32_t pid_actif = mon_pid(); int32_t pid_suivant = (pid_actif +1)%NB_PROCESS; actif->etat = ACTIVABLE; actif = &(tab[pid_suivant]); actif->etat = ELU; ctx_sw(tab[pid_actif].sauvegarde_registre,tab[pid_suivant].sauvegarde_registre); }