Etat d'un processus

Série d'exercices

Cet exercice fait partie d'une série :

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 note pid pour « 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_pret qui renvoie True si l'état du processus est à prêt ;
  • active qui fait passer l'état du processus à "prêt" ;
  • elit qui change l'état à "élu" et initialise le temps alloué avec la valeur du quantum passée en paramètre ;
  • execute qui 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 ;
  • bloque qui fait passer l'état du processus à "bloqué" ;
  • debloque qui 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.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 10/10
.128013s3o_8;bcdufvgI/0lyq n7AaêpS.r1-me,(P2=4:}twk{i9D5hx)é6050j0H0Q0y0U0r0b0u0i0r0y0b0b0M010Q0U0A010406050b0k0G0G0y0D0s040B0d0r0k0`0d0v050p111315170 0A041g1n051q0p1q1s1n0 0j0U0m0/0;0?0^0Y0U0n0Y0r1G0Y0Q0}050*0h0r0H1B0=0@011F1H1J1H0Q1P1R1N0Q0h0d0j171O0D1o0Q0Y0/1a0b0A0y0v0^0L011T1D010l0,0H0v0y0G0H1N1^1`1 1V221R25270}0a0u0K0D0d0A0d0b0U1d0v0u0(1?0D0D0H0i2s1g2a0v1o0p1;2F0Q1/1.1:0j2c0^1J0v242p1N1y1A0:1U2P0U2R0v1+1z1N0A2y1o2D2F2-101_2t2X202$0D140r0}0u0E2C2;0~2:2b2?1V2^2`2|0L2 1`312D2O01360y2{040u0c3a2E0 3d340^3g3i0u0N3m3c2;3e3s2|0X3w3o3y3q3f0d2_3h2|0$3D322=1C353I373j0w3N3p3Q3r3S3K3j0f3W3F3Y3H3J3t0V3(333*3A040E0q3/3P2Y3+3T0E2~1h303E3:3{3=0E39403b423`2@3!3i0E3l483n3O3z4d0}0E3v4h3x434c3,4m3C4p4a4k4t3?3M4w4j3G453V4C3X444l3?3%4H3)4J4z0E3.4N4r3R4z0L3^4T4b4V3T0L3 2-4x4E4K0L474)4D3;4,4g4/4I4s4$4o4@4O4_3#0L4v4|4U3Z4W4B524!544$4G574y4$4M5c4+4W4S5g4;4z0c4Y5k4P3T0c4(414:5q3#0c4.5u4^4#5x4?5A4}5C3i0c4{5F533|5x515L585N5I565Q5d5x5b5V5h5r5f301p2+1g2V2I0j2M3e0i1+281o5+1r5)2/4p055:0(2,5G0^0S0}343w5v200R2|655B3r0i0}2l0d0i0H0?0k0b6a60010|040J0!0O3D060u6w0u661V62040(0l6m5M683j6F5R0l0G0}0e0e2!2r6O6J3e6p0J6T3G0h6p0b0H0r6E5{6b6o0}0I3w6y6*0v0}0A0U0j6X3*6p6-4p6/6n6;6C0k2y0H6_3{6p6s3D6x7a6~5M6Z0}6#6%75200d0}0C7i356=6@6.6z0^7k040M7r6:7p6^4w7b6x7s017e047g6(2/6*7u7m6)6 6N0j720H746}7E7u7w7V7y7173797C7c5R7G7I7n7t7l7-3f0}0)0y0Q7x6n7X7_5M0b1}043H0k0m0H0y0k017%7C7E7+6$7J5%7L7/7O5M700Q0H0G0A0b0e3h0r0d0k7U2-7)3e7{7Z6n0G0U0}5o416v7D6*6B6D7:6H6y8h5R0v0l7=1J7^8O6U0}6W8V6Y6!8c7:6{7|8P0}0t0k1`0Q128%0}787B7(8a8#7h8Z3*7M7:8j8l8n8p0r8r8t8)8x0}7Y8v7E708,8.8:8@896*8b8{7K7`8g9m8i7=0*8U9b8f7v973G7~0}010#1b874w8G6w7E8J0H8d3b7E8M8 8R040H0Z2z1c8u8e6n6V7:9k9L2E7E776t9h7b8_7f8$8|3{8~9:2@7Q7S9W3b8w3G8y9u6n9#7:9=9p8*040e7R7$8z5M7u0F9x3*8B4m889,9j8`9$5 ab9o9X9q048k8m8o8q8s9`2E9|8}99ae3{a19?1Va3aqa5at92aw96aa5RacaD20ag3?ai7a9I0}0UamaAaEala2ap9M7!a79_aSaH999a30a$aT8C048Ea+9Y0}9*4)7(aja0a(aG7.047Na43z9r7@a/b6a=9{7E9z808k2_2!0#9Eb08^8I8Sa!bd7Fb4b99}a*9%7!aLav94axbu7Xbfaz7EaUa{bAa}04a 41b1aXak9.9laJ98b78 bb9ta?7WaCaP3ebi6o0D0z1M6ubT6n9Jam9N69b53f9Q6i0Q0e2*0)8;6q9!bwbX3G9)aW8Hb?0}2y8/0D1fb*8!bVb^9vb8c73;b#bGa;bub,2*b/bo8Fb=5Mb@8Lb`bx3;9Q1Q0d8,ayan5R9Zb{aFcE768=bQ49b19-7H9/cQ7jbzcLba9R9scr9wci3*b,cH8,bnb;cbcA0}8Kb{9Ob{8Qc^0Hc/aOcZ1VcNd20^cPcocR048?bp9ib3cka)bZc|cqc,9;b)9 7}7 b-cwc=9Hbr6C9KcC6Ic|9Q0y2A1zcK9(8Xc5dfb{c99+cz7*c6a|aodhd57;c(bcdkc!c+dn5Rcub.b:9FdM3ecBc`cDd82@b}0bb 220v0Uc38YdSd7dPcMcScadtcc04ce72chdZ3ed|bNdQcnd}c%7?b$bg9v0MbI6I6*b,bk8B0vc;d(c?5Rd+dSc{dS6L6N0e2y2*6SdJdGcOdOead~dacT4i6*8M8^b{0b0j9A01010x0l220i0Y0y0n28eVe0a@6Acd0)e5ct0y0}cl6nb,0J0K0o0Wekbha_0TdHcXbWedbydRd.7o046?7AdS2q0}0P7:bi0u0g2u720#0He}eme f17,b{aIf4cpa6a87Tfga_ffeR7 fi0u0#9sfoe@fqeHdIdSfueJeec)eRfBfgfEfjbC0uaN0#fJ7}fLd{eIc$f5ecfQ4E0}bC9395dEfpfefV8=cx491g5}0H2Fc12F5@2G5-1g2J2I1*1,2I0y1Qg05*1z310p0(0*0,0b04.