Etat d'un processus
Processus et ordonnanceur
Lors de son fonctionnement, le système d'exploitation d'un ordinateur doit partager la ressource de calcul entre différents processus.
L'ordonnanceur manipule l'ensemble des processus, regroupés dans une même structure de données (généralement une file).
L'ordonnanceur choisit un processus et l'exécute durant un certain de temps de calcul appelé quantum (le choix du processus se fait selon l'algorithme).
Si, à l'issue de ce temps de calcul, le processus n'est pas terminé, un autre processus (ou parfois le même) est choisi.
On dispose initialiement d'une classe Processus, permettant de représenter un processus caractérisé par son PID et sa durée.
On souhaite faire évoluer cette classe afin qu'elle puisse gérer les changements d'états du processus, en fonction des choix de l'ordonnanceur.
Etats d'un processus
Un processus en cours d'exécution peut être dans un des trois états suivants : prêt, élu ou bloqué.
stateDiagram
[*] --> prêt
prêt --> élu
élu --> prêt
élu --> bloqué
bloqué --> prêt
élu --> [*]
À ces trois états s'ajoutent les deux états suivants :
- L'état nouveau (état initial du diagramme représenté par un simple point) correspond à un un programme qui a été sélectionné pour être démarré, mais qui doit être chargé en mémoire avant que le processus ne soit inséré dans la liste des processus prêts.
- À l'opposé, le processus passera à l'état terminé (état final du diagramme représenté par un point cerclé) quand sa durée d'exécution sera atteinte. Pour se terminer, un processus doit obligatoirement se trouver dans l'état élu.
La Classe Processus
Un processus est un objet de la classe Processus, qui possède initialement deux attributs :
pid: nombre entier positif permettant d'identifier le processus. On notepidpour « process id » ;_duree: nombre entier positif ou nul représentant la durée d'exécution restante, exprimée en ms.
On ajoute à cette classe les attributs suivants :
etat(initialisé à"nouveau") : état du processus, à savoir"élu","prêt","bloqué","nouveau"ou"terminé",temps_alloue(initialisé à 0) : temps d'exécution alloué par l'ordonnanceur lorsqu'il élit le processus.
Elle dispose des méthodes suivantes :
est_pretqui renvoieTruesi l'état du processus est à prêt ;activequi fait passer l'état du processus à"prêt";elitqui change l'état à"élu"et initialise le temps alloué avec la valeur du quantum passée en paramètre ;executequi décrémente de \(1\) temps d'horloge le temps alloué et la durée d'exécution et peut changer l'état du processus à"terminé"si la durée devient nulle ou à"prêt"si le temps alloué devient nul ;bloquequi fait passer l'état du processus à"bloqué";debloquequi fait passer l'état du processus à"prêt".
La méthode __init__ doit permettre d'initialiser les différents attributs.
Exemples
>>> processus_courant = Processus("P1", 4)
>>> processus_courant.active()
>>> processus_courant.est_pret()
True
>>> processus_courant
(PID=P1 ; durée=4 ; état=prêt ; temps alloué=0)
>>> processus_courant.elit(2)
>>> processus_courant
(PID=P1 ; durée=4 ; état=élu ; temps alloué=2)
>>> processus_courant.execute()
>>> processus_courant
(PID=P1 ; durée=3 ; état=élu ; temps alloué=1)
>>> processus_courant.execute()
>>> processus_courant
(PID=P1 ; durée=2 ; état=prêt ; temps alloué=0)
>>> processus_courant.elit(2)
>>> processus_courant
(PID=P1 ; durée=2 ; état=élu ; temps alloué=2)
>>> processus_courant.execute()
>>> processus_courant
(PID=P1 ; durée=1 ; état=élu ; temps alloué=1)
>>> processus_courant.bloque()
>>> processus_courant
(PID=P1 ; durée=1 ; état=bloqué ; temps alloué=1)
>>> processus_courant.debloque()
>>> processus_courant
(PID=P1 ; durée=1 ; état=prêt ; temps alloué=1)
>>> processus_courant.elit(2)
>>> processus_courant
(PID=P1 ; durée=1 ; état=élu ; temps alloué=2)
>>> processus_courant.execute()
>>> processus_courant
(PID=P1 ; durée=0 ; état=terminé ; temps alloué=1)
>>>
Compléter le code suivant.
# Tests(insensible à la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)