Primitives sleep() et wakeup()
{"Image DocumentName": "Primitives sleep() et wakeup()", "Image ImageDescription": "Module Syst\u00e8mes d exploitation. BTS G\u00e9nie Informatqiue. Primitives sleep() et wakeup() #define N 100 // nbre d\u2019emplacement ds tampon. int compteur = 0 ; // nbre d\u2019objets ds tampon. void producteur () { while (1) { produire_objet(o) ; if (compteur == N) sleep () ; mettre_objet(o) ; compteur ++ ; If (compteur == 1) wakeup(consommateur) ; } } void consommateur () { if (compteur == 0) sleep() ; retirer_objet(o) compteur -- ; if (compteur == N-1) wakeup (producteur) ; consommer_objet(o) ; } Quel probl\u00e8me existe ici ? Dict\u00e9. Cette solution est \u00e9l\u00e9gante, mais conduit aux conflits d\u2019acc\u00e8s \u00e0 la variable compteur. Consid\u00e9rant en effet la situation suivante : la file (tampon) est vide, et le consommateur vient de lire la valeur 0 ds la variable compteur; l\u2019ordonnanceur l\u2019interrompt et donne la main au producteur, qui ins\u00e8re un objet ds la file, incr\u00e9mente le compteur, et appelle wakeup pour r\u00e9veiller le consommateur; comme celui-ci n\u2019\u00e9tait pas endormi, l\u2019appel wakeup est sans effet (R\u00e9veils perdus); l\u2019ordonnanceur donne la main au consommateur, qui appelle la routine sleep. Comme le producteur n\u2019appellera plus la routine wakeup, et que le consommateur est endormi, le producteur remplira la file jusqu\u2019\u00e0 ce quelle soit pleine, puis s\u2019endormira \u00e0 son tour, et donc les deux processus seront bloqu\u00e9s (il y a interblocage). Ici encore, les probl\u00e8mes apparaissent du fait de la non-atomicit\u00e9 du test et de l\u2019action qui lui est associ\u00e9e. Solution voir diapositive suivant. Enseigant : AAMMOU Souhaib.", "Image XResolution": "37", "Image YResolution": "37", "Image ResolutionUnit": "Pixels/Centimeter", "Image Software": "SlidePlayer", "Image YCbCrPositioning": "Centered"}