<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Comprendre tout simplement &#187; Sémaphore</title>
	<atom:link href="https://blog.developpez.com/comprendre/pcategory/programmation-concurrente/semaphore/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.developpez.com/comprendre</link>
	<description></description>
	<lastBuildDate>Fri, 16 Dec 2011 13:04:30 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.1.42</generator>
	<item>
		<title>Correction : Le Coiffeur fatigué</title>
		<link>https://blog.developpez.com/comprendre/p10047/programmation-concurrente/semaphore/correction_le_coiffeur_fatigue</link>
		<comments>https://blog.developpez.com/comprendre/p10047/programmation-concurrente/semaphore/correction_le_coiffeur_fatigue#comments</comments>
		<pubDate>Sun, 12 Jun 2011 15:38:27 +0000</pubDate>
		<dc:creator><![CDATA[wafiwafi]]></dc:creator>
				<category><![CDATA[Sémaphore]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[On aura besoin de trois sémaphores pour protéger l&#8217;accès aux ressources partagées : coiffeur : pour l&#8217;accès au coiffeur. client : pour l&#8217;accès aux clients. mutex : un sémaphore pour l&#8217;accès en exclusion mutuelle sur la variable partagée NbClientsEnAttente. Exemple d&#8217;algorithme pour le problème du coiffeur fatigué : initialisations : sémaphore présence_client = 0 ; // le coiffeur dort au début; il est fatigué! sémaphore coiffeur = 1 ; // pas de clients au début. [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>On aura besoin de trois sémaphores pour protéger l&rsquo;accès aux ressources partagées :<br />
coiffeur : pour l&rsquo;accès au coiffeur.<br />
client : pour l&rsquo;accès aux clients.<br />
mutex : un sémaphore pour l&rsquo;accès en exclusion mutuelle sur la variable partagée NbClientsEnAttente.</p>
<p><strong>Exemple d&rsquo;algorithme pour le problème du coiffeur fatigué :<br />
</strong><br />
<strong>initialisations :</strong><br />
sémaphore présence_client = 0 ; // le coiffeur dort au début; <strong>il est fatigué!</strong><br />
sémaphore coiffeur = 1 ; // pas de clients au début. Le coiffeur est disponible de suite.<br />
<strong>                    Mais attention, il va falloir le réveiller! </strong><br />
sémaphore mutex = 1 ; // la variable NbClientsEnAttente est accesssible<br />
entier NbClientsEnAttente = 0 ; // pas de clients au début</p>
<p><strong>Processus coiffeur :<br />
</strong></p>
<p><code class="codecolorer text default"><span class="text">while (TRUE) {</span></code></p>
<p>//Le coiffeur demande une ressource appelée présence_client.<br />
// Si un client est présent, il doit se réveiller. Sinon il poursuit sa sieste.</p>
<p><code class="codecolorer text default"><span class="text">P(présence_client) ;</span></code></p>
<p>// A ce stade, le coiffeur est réveillé. <strong>Mais dans quel état?!</strong><br />
//On doit accéder la variable NbClientsEnAttente<br />
//Si elle est prise, on attend. Sinon, on la décrémente car le client va quitter son siège //qui devient libre.</p>
<p><code class="codecolorer text default"><span class="text">P(mutex) ;</span></code></p>
<p>// La variable est libérée. On décrémente.</p>
<p><code class="codecolorer text default"><span class="text">NbClientsEnAttente=NbClientsEnAttente-1 ;</span></code></p>
<p>// le coiffeur est prêt à prendre en charge un client de la file d’attente.</p>
<p><code class="codecolorer text default"><span class="text">V(coiffeur) ;</span></code></p>
<p>// Il doit libérer NbClientsEnAttente</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">V(mutex) ; <br />
&nbsp;<br />
Coiffer() ; <br />
&nbsp;<br />
}</div></div>
<p><strong>Processus Client :</strong></p>
<p>//un client qui arrive doit vérifier si tous les sièges sont pris.<br />
// Il doit accéder à NbClientsEnAttente.</p>
<p><code class="codecolorer text default"><span class="text">P(mutex) ;</span></code></p>
<p>//Vérifier s’il y a de la place ou pas.</p>
<p><code class="codecolorer text default"><span class="text">if (NbClientsEnAttente &lt; N) {</span></code></p>
<p>//il y a une place. Le client la prend mais doit incrémenter NbClientsEnAttente.</p>
<p><code class="codecolorer text default"><span class="text">NbClientsEnAttente=NbClientsEnAttente+1 ;</span></code></p>
<p>// Une nouvelle ressource présence_client est disponible pour le coiffeur.<br />
// C’est une manière de signaler votre présence au coiffeur.</p>
<p><code class="codecolorer text default"><span class="text">V(présence_client) ;</span></code></p>
<p>// On doit libérer NbClientsEnAttente</p>
<p><code class="codecolorer text default"><span class="text">V(mutex) ;</span></code></p>
<p>// Le client est pris en compte dans la file d’attente du coiffeur. <strong>Chacun à son tour !</strong></p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">P(coiffeur) ; <br />
&nbsp;<br />
} <br />
&nbsp; &nbsp; <br />
Else &nbsp;{</div></div>
<p>// Tous les sièges sont occupés. Le client libère NbClientsEnAttente</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">V(mutex) ;</div></div>
<p>//Le client s&rsquo;en va.</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">Sortir_client() ; <br />
&nbsp;<br />
} <br />
}</div></div>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Enoncé : Le coiffeur fatigué</title>
		<link>https://blog.developpez.com/comprendre/p10048/programmation-concurrente/semaphore/enonce_le_coiffeur_fatigue</link>
		<comments>https://blog.developpez.com/comprendre/p10048/programmation-concurrente/semaphore/enonce_le_coiffeur_fatigue#comments</comments>
		<pubDate>Sun, 12 Jun 2011 15:46:37 +0000</pubDate>
		<dc:creator><![CDATA[wafiwafi]]></dc:creator>
				<category><![CDATA[Sémaphore]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Dans un salon de coiffure, il y a un coiffeur C, un fauteuil F dans lequel se met le client pour être coiffé et N sièges pour attendre. • S&#8217;il n&#8217;a pas de clients, le coiffeur C somnole dans le fauteuil F. • Quand un client arrive et que le coiffeur C dort, il le réveille, C se lève. Le client s&#8217;assied dans F et se fait coiffer. • Si un client arrive pendant que [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Dans un salon de coiffure, il y a un coiffeur C, un fauteuil F dans lequel se met le client pour être coiffé et N sièges pour attendre.<br />
•	S&rsquo;il n&rsquo;a pas de clients, le coiffeur C somnole dans le fauteuil F.<br />
•	Quand un client arrive et que le coiffeur C dort, il le réveille, C se lève. Le client s&rsquo;assied dans F et se fait coiffer.<br />
•	Si un client arrive pendant que le coiffeur travaille :<br />
o	 si un des N sièges est libre, il s&rsquo;assied et attend,<br />
o	 sinon il ressort.<br />
A l’aide de sémaphores, proposez un algorithme permettant de synchroniser les activités du coiffeur et de ses clients.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Enoncé : Des babouins intelligents</title>
		<link>https://blog.developpez.com/comprendre/p10046/programmation-concurrente/semaphore/enonce_des_babouins_intelligents</link>
		<comments>https://blog.developpez.com/comprendre/p10046/programmation-concurrente/semaphore/enonce_des_babouins_intelligents#comments</comments>
		<pubDate>Sat, 11 Jun 2011 22:12:14 +0000</pubDate>
		<dc:creator><![CDATA[wafiwafi]]></dc:creator>
				<category><![CDATA[Sémaphore]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Un étudiant qui se spécialise en anthropologie et accessoirement en informatique s’est embarqué dans un projet de recherche pour voir s’il était possible d’enseigner les interblocages aux babouins d’Afrique. Il repère un profond canyon et y jette une corde au travers, de sorte que les babouins puissent le traverser à bout de bras. Plusieurs babouins peuvent traverser en même temps, pourvu qu’ils aillent tous dans la même direction. Si des babouins qui se dirigent vers [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Un étudiant qui se spécialise en anthropologie et accessoirement en informatique s’est embarqué dans un projet de recherche pour voir s’il était possible d’enseigner les interblocages aux babouins d’Afrique. Il repère un profond canyon et y jette une corde au travers, de sorte que les babouins puissent le traverser à bout de bras. Plusieurs babouins peuvent traverser en même temps, pourvu qu’ils aillent tous dans la même direction. Si des babouins qui se dirigent vers l’est et d’autres vers l’ouest se trouvent sur la corde au même moment, cela conduit à un interblocage(les babouins sont bloqués au point de rencontre sur la corde) : en effet, ils n’ont pas la possibilité de passer les uns par-dessus les autres alors qu’ils sont suspendus au-dessus du canyon. Si un babouin souhaite traverser le canyon, il doit vérifier qu’aucun autre babouin ne traverse en sens inverse.<br />
1. Au moyen de sémaphores, écrivez un programme pour éviter l’interblocage. Ne traitez pas le cas d’un groupe infini de babouins se déplaçant d’un côté et interdisant tout passage à ceux qui se déplacent vers l’autre côté.<br />
2. Reprenez la question précédente, mais en évitant la privation de ressources (famine). Lorsqu’un babouin qui souhaite traverser le canyon vers l’est arrive à la corde et trouve un babouin qui traverse vers l’ouest, il attend jusqu’à ce que la corde soit vide, mais aucun babouin se déplaçant vers l’ouest n’est autorisé à démarrer jusqu’à ce qu’au moins un babouin ait traversé dans l’autre sens.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Corrigé : Des babouins intelligents</title>
		<link>https://blog.developpez.com/comprendre/p10045/programmation-concurrente/semaphore/title_195</link>
		<comments>https://blog.developpez.com/comprendre/p10045/programmation-concurrente/semaphore/title_195#comments</comments>
		<pubDate>Sat, 11 Jun 2011 16:34:52 +0000</pubDate>
		<dc:creator><![CDATA[wafiwafi]]></dc:creator>
				<category><![CDATA[Sémaphore]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[1- Un babouin qui se présente pour traverser doit d&#8217;abord passer par un processus de gestion. Il formule sa demande. Soit elle est mise dans une file d&#8217;attente d&#8217;un sémaphore appelé gestion_est, soit elle est prise en compte directement si la ressource gestion_est est disponible. P(gestion_est) C&#8217;est tout de même un babouin de plus! il faut donc incrémenter le nombre de babouins (nb_babouin_est) dont les demandes ont été formulées. nb_babouin_est ++ On doit tester s&#8217;il [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>1-<br />
Un babouin qui se présente pour traverser doit d&rsquo;abord passer par un processus de gestion.<br />
Il formule sa demande. Soit elle est mise dans une file d&rsquo;attente d&rsquo;un sémaphore appelé gestion_est, soit elle est prise en compte directement si la ressource gestion_est est disponible.</p>
<p><code class="codecolorer text default"><span class="text">P(gestion_est)</span></code></p>
<p>C&rsquo;est tout de même un babouin de plus! il faut donc incrémenter le nombre de babouins (nb_babouin_est) dont les demandes ont été formulées.</p>
<p><code class="codecolorer text default"><span class="text">nb_babouin_est ++</span></code></p>
<p>On doit tester s&rsquo;il s&rsquo;agit du premier babouin. Dans ce cas, il doit demander la ressource <strong>corde</strong>. Si c&rsquo;est le premier, la variable nb_babouin_est sera égale à 1.</p>
<p>	<code class="codecolorer text default"><span class="text">si nb_babouin_est == 1 alors P(corde)</span></code></p>
<p>La demande de la corde du premier babouin est dans la file d&rsquo;attente du sémaphore <strong>corde</strong>. Il ne peut l&rsquo;avoir que si la corde est libérée par l&rsquo;ordre V(corde).</p>
<p>Dès que la corde est libérée, le premier babouin réquisitionne la corde; il ne la rendra que si tous les babouins de l&rsquo;est traversent. Ces derniers n&rsquo;ont pas besoin de demander la corde, ils peuvent traverser directement. Un babouin qui n&rsquo;est pas de l&rsquo;est ne peut traverser puisque la corde n&rsquo;est pas rendue libre.<br />
<strong>Les babouins de l&rsquo;ouest doivent attendre!</strong></p>
<p>Une fois un babouin est pris en compte, il doit immédiatement libérer la ressource <strong>gestion_est</strong> pour les autres babouins_est qui arrivent. il n&rsquo;attendra pas la fin de sa traversée.</p>
<p>Mis à part le premier babouin, tous les babouins_est peuvent traverser sans se préoccuper de la ressource corde!<br />
<strong>Néanmoins, il est important de noter que la ressource gestion_est détenue par le premier babouin ne peut être libérée que si ce dernier obtient la ressource corde. Tous les babouins_est sont dans ce cas en attente.<br />
</strong></p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">V(gestion_est) <br />
traverser()</div></div>
<p>Mais il faut repérer la fin de traversée du dernier babouin pour libérer la ressource corde pour une autre vague de babouin (est ou ouest). Dans ce cas la file d&rsquo;attente est forcément nulle. </p>
<p>On est tenté à écrire :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">nb_babouin_est –- <br />
si nb_babouin_est == 0 alors V(corde)</div></div>
<p>Cela voudrait dire qu&rsquo;une fois un babouin a traversé, le nombre de babouins doit être décrémenté. Si on arrive à la valeur 0, ça sera forcément le dernier babouin; on doit donc rendre la corde.<br />
Mais il se pose un problème :<br />
Imaginons qu&rsquo;à l&rsquo;instant t le denier babouin est entrain de terminer sa traversée.<br />
A cette même instant, un autre babouin_est prend la ressource gestion_est, il lit la variable nb_babouin qui est à 1 qui n&rsquo;est pas encore incrémenté. Puis son processus est endormi par le système.<br />
Ensuite, le dernier babouin rend la ressource <strong>corde</strong> après avoir décrémenté la variable nb_babouin_est qui est à 0. Admettons qu&rsquo;ensuite un babouin ouest la saisi puis commence à traverser.</p>
<p>Au moment ou le processus endormis se réveille, la valeur nb_babouin  est erronée et le babouin en question se met à traverser sans avoir besoin de la ressource corde puis qu&rsquo;il ne se considère pas comme premier mais plutôt second. <strong>Il peut se trouver nez à nez avec le baboin ouest </strong>. <strong>On n&rsquo;a pas l&rsquo;air malin!</strong></p>
<p>C&rsquo;est pour ce type de problème qu&rsquo;on va faire en sorte qu&rsquo;après chaque arrivée de babouin, de rendre la ressource gestion_est occupée.Dans ce cas aucun babouin_est n&rsquo;est pris en compte; il doit attendre. Une fois le test passé on rend la gestion_est libre, peut être pour un autre groupe de babouins de l&rsquo;est ou encore un groupe de babouins de l&rsquo;ouest.</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">P(gestion_est) <br />
nb_babouin_est –- <br />
si nb_babouin_est == 0 alors V(corde) <br />
V(gestion_est)</div></div>
<p><strong>Il en est de même pour le sémaphore gestion_ouest.</strong></p>
<p>2-<br />
Jusqu&rsquo;au là, nous ne sommes pas à l&rsquo;abri de la famine car si des babouins sont engagés, il n’y a aucune garantie pour ceux de l’autre côté de passer un jour.<br />
Pour remédier à cette dernière, il faut modifier l’algorithme en ajoutant un sémaphore ordre_arrivee autour du protocole d’entrée. C’est donc le système qui gère la file d’attente de ceux ayant demandé la ressource qui garantira le respect de l’ordre des demandes.</p>
<p>Le code est donc le suivant :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">P(ordre_arrivée) <br />
P(gestion_est) <br />
nb_babouin_est ++ <br />
si nb_babouin_est == 1 alors <br />
P(corde) <br />
V(gestion_est) <br />
V(ordre_arrivée) <br />
traverser() <br />
P(gestion_est) <br />
nb_babouin_est -- <br />
si nb_babouin_est == 0 alors <br />
V(corde) <br />
V(gestion_est)</div></div>
<p>Dès qu&rsquo;un babouin de l&rsquo;Est ou de l&rsquo;Ouest prend la ressource ordre, son processus s&rsquo;exécute. Il la rend dès qu&rsquo;il s&rsquo;apprête à traverser juste après avoir rendu la ressource gestion. C&rsquo;est le babouin suivant dans la file d&rsquo;attente du sémaphore ordre_arrivée qui voit son processus s&rsquo;exécuter; Il peut s&rsquo;agir d&rsquo;un babouin_est ou d&rsquo;un babouin_ouest.<br />
<strong>La famine est irradiée!</strong></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
