<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Concurrence et parallélisme on INF1410 - Initiation au génie logiciel</title><link>https://cjauvin.github.io/inf1410-teluq/docs/module2/concurrence/</link><description>Recent content in Concurrence et parallélisme on INF1410 - Initiation au génie logiciel</description><generator>Hugo</generator><language>fr</language><atom:link href="https://cjauvin.github.io/inf1410-teluq/docs/module2/concurrence/index.xml" rel="self" type="application/rss+xml"/><item><title>Pourquoi la concurrence</title><link>https://cjauvin.github.io/inf1410-teluq/docs/module2/concurrence/pourquoi/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://cjauvin.github.io/inf1410-teluq/docs/module2/concurrence/pourquoi/</guid><description>&lt;h1 id="pourquoi-la-concurrence"&gt;Pourquoi la concurrence&lt;a class="anchor" href="#pourquoi-la-concurrence"&gt;#&lt;/a&gt;&lt;/h1&gt;&#10;&lt;h2 id="le-repas-gratuit"&gt;Le repas gratuit&lt;a class="anchor" href="#le-repas-gratuit"&gt;#&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;Pendant une trentaine d&amp;rsquo;années, les programmeurs ont profité d&amp;rsquo;un arrangement&#10;remarquable : il suffisait d&amp;rsquo;attendre. Un programme jugé trop lent en 1995&#10;devenait parfaitement acceptable en 1997, sans qu&amp;rsquo;une seule ligne soit&#10;modifiée, parce que les processeurs devenaient plus rapides d&amp;rsquo;année en année.&#10;Intel vendait des Pentium à 100 MHz en 1994, et des Pentium 4 à plus de 3 GHz&#10;en 2002. Le même code en profitait automatiquement, sans effort et sans&#10;risque. Herb Sutter a donné à cette période un nom qui est resté, celui du&#10;repas gratuit, dans un article de 2005 dont le titre annonçait la mauvaise&#10;nouvelle : &lt;em&gt;The Free Lunch Is Over&lt;/em&gt;.&lt;/p&gt;</description></item><item><title>Processus et threads</title><link>https://cjauvin.github.io/inf1410-teluq/docs/module2/concurrence/processus-threads/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://cjauvin.github.io/inf1410-teluq/docs/module2/concurrence/processus-threads/</guid><description>&lt;h1 id="processus-et-threads"&gt;Processus et threads&lt;a class="anchor" href="#processus-et-threads"&gt;#&lt;/a&gt;&lt;/h1&gt;&#10;&lt;h2 id="un-programme-nest-pas-un-processus"&gt;Un programme n&amp;rsquo;est pas un processus&lt;a class="anchor" href="#un-programme-nest-pas-un-processus"&gt;#&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;Il faut d&amp;rsquo;abord séparer deux choses que le langage courant confond. Un&#10;&lt;strong&gt;programme&lt;/strong&gt; est un fichier, une suite d&amp;rsquo;instructions posée sur un disque, aussi&#10;inerte qu&amp;rsquo;une partition rangée dans un tiroir. Un &lt;strong&gt;processus&lt;/strong&gt; est ce qui arrive&#10;quand on l&amp;rsquo;exécute. Le système d&amp;rsquo;exploitation lit le fichier, réserve une zone&#10;de mémoire, y installe les instructions et de quoi ranger les données, retient&#10;à quelle instruction on en est, tient la liste des fichiers ouverts, et laisse&#10;courir. Le même programme lancé trois fois donne trois processus, qui portent&#10;le même code et n&amp;rsquo;ont rien d&amp;rsquo;autre en commun : trois zones de mémoire&#10;distinctes, trois positions différentes dans ce code, trois jeux de fichiers&#10;ouverts. C&amp;rsquo;est ce qui permet à deux fenêtres du même éditeur de texte&#10;d&amp;rsquo;afficher deux documents sans se mélanger, alors qu&amp;rsquo;elles exécutent&#10;exactement les mêmes instructions.&lt;/p&gt;</description></item><item><title>Ce qui casse</title><link>https://cjauvin.github.io/inf1410-teluq/docs/module2/concurrence/ce-qui-casse/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://cjauvin.github.io/inf1410-teluq/docs/module2/concurrence/ce-qui-casse/</guid><description>&lt;h1 id="ce-qui-casse"&gt;Ce qui casse&lt;a class="anchor" href="#ce-qui-casse"&gt;#&lt;/a&gt;&lt;/h1&gt;&#10;&lt;h2 id="trois-étapes-pas-une"&gt;Trois étapes, pas une&lt;a class="anchor" href="#trois-%c3%a9tapes-pas-une"&gt;#&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;Reprenons le compteur de la sous-section précédente, celui qui donnait&#10;4 000 000 sur un interpréteur et 1 014 951 sur l&amp;rsquo;autre. La ligne coupable est&#10;&lt;code&gt;compteur += 1&lt;/code&gt;, et tout tient au fait qu&amp;rsquo;elle n&amp;rsquo;est pas une opération mais&#10;trois. Le processeur lit la valeur courante en mémoire, l&amp;rsquo;augmente de un&#10;dans un registre, puis écrit le résultat à sa place. Entre la lecture et&#10;l&amp;rsquo;écriture s&amp;rsquo;écoule un temps minuscule mais réel, et rien n&amp;rsquo;interdit à&#10;l&amp;rsquo;ordonnanceur d&amp;rsquo;y glisser un autre thread. Si ce second thread lit à ce&#10;moment-là, il obtient la même valeur que le premier, l&amp;rsquo;augmente lui aussi de&#10;un, et l&amp;rsquo;écrit à son tour. Chacun a ajouté un. Le compteur n&amp;rsquo;a avancé que&#10;d&amp;rsquo;un. En cuisine, c&amp;rsquo;est le cuisinier qui goûte la soupe, la trouve fade, et&#10;part chercher le sel pendant que son collègue, qui l&amp;rsquo;a goûtée une seconde plus&#10;tôt, y verse déjà le sien.&lt;/p&gt;</description></item><item><title>Ne pas partager</title><link>https://cjauvin.github.io/inf1410-teluq/docs/module2/concurrence/ne-pas-partager/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://cjauvin.github.io/inf1410-teluq/docs/module2/concurrence/ne-pas-partager/</guid><description>&lt;h1 id="ne-pas-partager"&gt;Ne pas partager&lt;a class="anchor" href="#ne-pas-partager"&gt;#&lt;/a&gt;&lt;/h1&gt;&#10;&lt;h2 id="sil-ny-a-rien-à-protéger"&gt;S&amp;rsquo;il n&amp;rsquo;y a rien à protéger&lt;a class="anchor" href="#sil-ny-a-rien-%c3%a0-prot%c3%a9ger"&gt;#&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;Tout ce qui cassait dans la sous-section précédente cassait pour une seule&#10;raison : deux threads touchaient à la même mémoire. La condition de course&#10;vient d&amp;rsquo;une variable lue par l&amp;rsquo;un pendant que l&amp;rsquo;autre l&amp;rsquo;écrit. Le verrou existe&#10;pour empêcher cela. L&amp;rsquo;interblocage vient de deux verrous. Retirez le partage,&#10;et toute la chaîne disparaît avec lui : sans mémoire commune il n&amp;rsquo;y a rien à&#10;protéger, sans rien à protéger il n&amp;rsquo;y a pas de verrou, et sans verrou il n&amp;rsquo;y a&#10;pas d&amp;rsquo;interblocage possible. C&amp;rsquo;est la réponse à la question de Lee, et elle est&#10;plus radicale que toutes les règles de discipline : ne pas avoir à poser de&#10;verrous, c&amp;rsquo;est ne rien avoir en commun. En cuisine, c&amp;rsquo;est le poste de travail.&#10;Chaque cuisinier a son couteau, sa planche, ses casseroles, et personne ne&#10;prend rien sur le poste d&amp;rsquo;un autre. Quand un plat doit passer de l&amp;rsquo;un à&#10;l&amp;rsquo;autre, il est posé sur le passe, et l&amp;rsquo;autre le prend. Rien n&amp;rsquo;est jamais tenu&#10;à deux.&lt;/p&gt;</description></item><item><title>Ne jamais bloquer</title><link>https://cjauvin.github.io/inf1410-teluq/docs/module2/concurrence/ne-jamais-bloquer/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://cjauvin.github.io/inf1410-teluq/docs/module2/concurrence/ne-jamais-bloquer/</guid><description>&lt;h1 id="ne-jamais-bloquer"&gt;Ne jamais bloquer&lt;a class="anchor" href="#ne-jamais-bloquer"&gt;#&lt;/a&gt;&lt;/h1&gt;&#10;&lt;h2 id="dix-mille-clients"&gt;Dix mille clients&lt;a class="anchor" href="#dix-mille-clients"&gt;#&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;En 1999, un programmeur nommé Dan Kegel ouvre une page web par une question&#10;faussement modeste : « Il est temps que les serveurs web servent dix mille&#10;clients en même temps, vous ne trouvez pas ? » Le problème a gardé le nom&#10;qu&amp;rsquo;il lui a donné, &lt;strong&gt;C10K&lt;/strong&gt;, dix mille connexions, et il est resté la page de&#10;référence du sujet pendant quinze ans, remise à jour jusqu&amp;rsquo;en 2014. Ce qui le&#10;rendait difficile n&amp;rsquo;était pas la puissance de calcul. Dix mille personnes qui&#10;lisent un site ne demandent presque rien au processeur. Ce qui le rendait&#10;difficile, c&amp;rsquo;est que la manière évidente de s&amp;rsquo;y prendre ne tient pas.&lt;/p&gt;</description></item></channel></rss>