Université de Sherbrooke, PCP

Quelques raccourcis :

Vous trouverez ici quelques documents et quelques liens pouvant, je l'espère, vous être utiles. Vous pouvez aussi consulter, parmi les liens divers mis à votre disposition, ceux portant sur la multiprogrammation et ceux portant sur le parallélisme. Dans les suggestions de lecture, il est probable que vous ayez un intérêt pour celles portant sur les systèmes répartis.

Les documents qui vous sont fournis ici le sont pour vous rendre service.

Je travaille très fort sur chacun de mes cours. Veuillez ne pas vendre (ou donner) les documents que je vous offre ici à qui que ce soit sans mon consentement. Si des abus surviennent, je vais cesser de rendre ce matériel disponible à toutes et à tous.

Si ces documents vous rendent service, faites-le moi savoir. Mon adresse de courriel est disponible sur la page où on trouve mon horaire.

À propos des séances en classe

Notez qu'en cette saison d'été 2017, un lundi est férié : le 22 mai (fête des patriotes).

Index des séances théoriques
S00 S01 S02 S03 S04 S05 S06 S07 S08 S09 S10 S11 S12 S13 S14
Séance Semaine du Contenu
S00

1 mai

Au menu :

Sur le plan des bases de l'opérationnalisation de la multiprogrammation, nous avons jeté un oeil à ce qui suit :

Sur le plan technique, nous avons survolé les opérateurs de transtypage ISO, propres au langage C++ et à la richesse de son système de types, de même que les conventions d'appel, pour lesquelles le concept est général mais l'écriture utilisée pour fins d'illustration (p. ex. : __stdcall)) est celle d'un compilateur en particulier.

Quelques mots sont « échappés » (condition de course, par exemple) sans être expliqués, mais nous y reviendrons...

S01

8 mai

Au menu :

Nous avons aussi survolé la question des concepts d'atomicité et de volatilité dans divers langages, pour comprendre leur utilité (parfois, leur nécessité), leurs limites et leurs ramifications.

Ceci met en relief les limites des compilateurs et de certaines approches plus traditionnelles à la concurrence sur des ordinateurs munis de plusieurs processeurs ou de plusieurs coeurs, et mène à discuter de synchronisation à très bas niveau.

J'ai ajouté un exemple opérationnel d'une classe Mutex avec deux implémentations (système, usager) sur ../../Sujets/Client-Serveur/mutex-deux-impl.html

S02

15 mai

Au menu :

Le TP00 vous sera proposé durant cette séance.

 

22 mai

Congé (fête des patriotes)

S03

29 mai

Au menu :

S04

5 juin

Au menu :

On m'a demandé de mettre en ligne un exemple d'utilisation d'expressions régulières. En voici un (en C++, mais c'est semblable dans d'autres langages) qui consomme et affiche les identifiants d'un fichier source, sans discriminer en fonction du contexte (ce qui est dans une chaîne de caractères ou dans un commentaire sera aussi affiché) :

#include <regex>
#include <string>
#include <fstream>
#include <iostream>
#include <set>
#include <algorithm>
#include <iterator>
using namespace std;
int main() {
   set<string> ze_mots{ "string", "if", "for" }; // liste incomplète, pour fins d'illustration
   string pattern = "[_a-zA-Z][_a-zA-Z0-9]*";
   regex re{ pattern };
   ifstream in{ "z.cpp" };
   string texte{
      istreambuf_iterator<char>{ in },
      istreambuf_iterator<char>{}
   };
   auto debut = sregex_iterator{ begin(texte), end(texte), re };
   auto fin = sregex_iterator{};
   cout << "Nombre d'identifiants : " << distance(debut, fin) << endl;
   for_each(debut, fin, [](auto mot) {
      cout << mot.str() << endl;
   });
}
S05

12 juin

Au menu :

Le calendrier facultaire nous demande de ne pas tenir d'évaluations cette semaine. Pourtant, je vous suggère que nous ayons un minitest comme à l'habitude, puisque je compte les huit meilleurs du lot... Vous ne pouvez que gagner au change!

Remettez le TP00 soit en début de séance (papier) ou au plus tard à 17 h (électronique)

Le TP01 vous sera proposé durant cette séance.

S06

15 juin 18 h-21 h

Le calendrier facultaire nous demande de ne pas tenir d'évaluations cette semaine. Pourtant, je vous suggère que nous ayons un minitest comme à l'habitude, puisque je compte les huit meilleurs du lot... Vous ne pouvez que gagner au change!

S07

19 juin

Au menu :

  • Q05
  • Considérations de programmation avec Java
    • String ou StringBuilder
      • comparaison avec ==, est-ce raisonnable?
      • String en tant que constantes
      • String en tant que sentinelle
    • encapsulation en l'absence de réels objets
    • à propos des constructeurs, ces mal aimés / mal utilisés
    • à propos des accesseurs
    • à propos des mutateurs
    • à propos de l'immuabilité
  • Bref de multiprogrammation avec Java
    • classe Thread
    • interface Runnable
    • blocs synchronized
  • Bref de multiprogrammation avec C#
  • Brève incursion dans le monde de Go
  • Si le temps le permet, je vous proposerai aujourd'hui un tour d'horizon « rapide » d'un langage de programmation pensé de prime abord pour la résilience face aux pannes, les systèmes embarqués, les systèmes répartis et (surtout, de notre point de vue) les systèmes massivement parallèles. Ce langage, Erlang, met de l'avant un modèle de programmation nommé programmation par acteurs, qui a plusieurs avantages concret pour le développement de systèmes parallèles

Cette semaine est celle des intras. Puisqu'il n'y a pas d'intras dans ce cours, nous tiendrons une séance (humaine!) en classe

26 juin

Relâche pour vous. Profitez-en!

S08

3 juillet

Au menu : à déterminer

 

10 juillet

Votre chic prof sera à Toronto cette semaine pour la rencontre du WG21. Vous pouvez suivre ses aventures sur ../../Sujets/Orthogonal/wg21-2017-Toronto.html si vous le souhaitez

S09

17 juillet

Au menu :

Le TP02 vous sera proposé durant cette séance.

Remettez le TP01 soit en début de séance (papier) ou au plus tard à 17 h (électronique)

S10

24 juillet

Au menu :

  • Plus d'informations sur les couroutines? Pourquoi ne pas écouter une des sommités sur le sujet sur http://cppcast.com/2017/07/gor-nishanov/?
  • Quelques trucs à surveiller sur le plan procédural :
    • Nommez vos fichiers pour fins de livraison
    • Antidote, je vous en prie!
    • Configurez votre éditeur en langue canadienne-française, et activez les correcteurs orthographique et grammatical
    Quelques trucs à surveiller sur le plan du design :
    • Attention aux API de vos classes et de vos fonctions. Par exemple, accepter int argc et char *argv[], règle générale, c'est pas terrible
      • De manière générale, visez le principe de moindre savoir, et faites en sorte que chaque fonction, chaque classe, chaque thread en sache le moins possible
    • Si vous avez à faire de l'attente active ou à introduire des délais pour que votre design fonctionne (en fait, semble fonctionner), par exemple des this_thread::sleep_for(100us), c'est probablement qu'il y a un problème
    • Une alternative (un if) dont la condition est complexe devrait appeler un prédicat. Voir à cet effet cet article de Jonathan Boccara
    • Une boucle qui contient plus que deux lignes est suspecte. Envisagez remplacer le corps de la boucle par une fonction
    • Une variable devrait vivre le moins longtemps possible : réinitialiser manuellement un compteur à zéro ou une string à "" à la fin d'une boucle est suspect
    • Si votre code dépend de données susceptibles de changer à travers le temps, par exemple une liste de mots clés ou une liste de directives du préprocesseur, envisagez les lire d'un fichier de données auxiliaire
      • Si vous craignez ne pas pouvoir faire de la liste résultante une constante, sachez qu'il existe plusieurs solutions
  • Quelques trucs à surveiller sur le plan de la praxis générale :
  • Quelques trucs à surveiller sur le plan de la praxis propre à C++ :
  • Q08
  • Synchronisation sans verrous (suite) :
S11

31 juillet

Au menu :

Si la question du parallélisme vous intéresse même une fois le cours terminé, je vous invite à lire ces deux articles extrêmement importants, dont je traite parfois en classe (mais le temps ne m'a pas permis de le faire cette fois) :

Ce sont tous des textes profonds, instructifs, et qui valent la peine d'être lus avec attention.

S12

7 août

Je ne vais pas terriblement bien aujourd'hui, et il ne semble pas possible de reprendre le cours à une date ultérieure du fait que les examens finaux débutent demain.

Pour cette raison, j'ai laissé ci-dessous ce que je comptais faire avec vous cette semaine, incluant une version PDF du minitest (que vous pourrez faire – individuellement! – dans le confort de votre foyer). Je vous invite à jeter un coup d'oeil aux sujets prévus, en particulier celui des continuations et la présentation de Michael Wong sur les exécuteurs (dans la vidéo, il y a beaucoup de trucs périphériques, alors ce qui vous intéresse débute autour de la 55e minute).

Au menu :

« S14 »

14 août

À la « séance 14 », vous aurez droit à un on-ne-peut-plus-chic examen final, qui se tiendra de 9h à 12h au local D7-3021.

Le TP02 doit être remis en début de séance (si vous privilégiez la forme imprimée) ou à 17 h aujourd'hui (si vous privilégiez la remise électronique).

Code des cas sous étude dans les notes de cours

Les sections qui suivent proposent du code ou des exemples proposés en classe, le tout dans le but de vous permettre d'étudier la chose, de critiquer, de commenter, de questionner et d'expérimenter à loisir.

Le dîner des philosophes

Sélectionnez cette cible pour les sources de l'exemple Philosophes-0. Ces sources implémentent une solution naïve... tellement qu'il ne s'agit pas d'une solution (elle ne fonctionne pas vraiment, contenant une condition de course). Pour une cible plus globale, touchant chacune des solutions proposées, voir ceci.

Sélectionnez cette cible pour les sources de l'exemple Philosophes-1. Cette solution repose sur l'intervention d'un médiateur (un Waiter), qui implémente une politique de permission évitant de réelles situations problématiques. Pour une cible plus globale, touchant chacune des solutions proposées, voir ceci

Sélectionnez cette cible pour les sources de l'exemple Philosophes-2. Cette solution repose sur un protocole entre les philosophes (on ne prend les baguettes que dans un ordre bien précis). Pour une cible plus globale, touchant chacune des solutions proposées, voir ceci

Sélectionnez cette cible pour les sources de l'exemple Philosophes-3. Cette solution repose sur un moniteur capable de d'accorder le privilège de manger à un philosophe seulement s'il est certain que ses deux voisins ne mangent pas déjà. Pour une cible plus globale, touchant chacune des solutions proposées, voir ceci

Résultats des questions quasi-hebdomadaires

Les moyennes des résultats obtenus aux questions quasi-hebdomadaires suivent. Notez que l'écart-type n'est pas significatif étant donné la pondération des questions (sur cinq points, un point de différence représente , ce qui bousille quelque peu cette composante statistique).

 Question   Séance 
Q00 S02
Q01 S03
Q02 S04
Q03 S05
Q04 S06
Q05 S07
Q06 S08
Q07 S09
Q08 S10
Q09 S11
 :

Petite remarque sur les moyennes par question et sur la moyenne globale telles que présentées ici : je ne tiens compte que des participant(e)s au minitest, excluant les absent(e)s ce jour-là (ce qui explique les variations dans la colonne du ) ce qui signifie que la moyenne globale qui servira à évaluer la note finale sera, règle générale, un peu plus faible que ce que vous voyez ici (les absents à chaque minitest auront alors zéro pour ce minitest). Ce qui m'intéresse ici est de montrer les résultats pour celles et ceux qui ont effectivement répondu aux questions.

Consignes des travaux pratiques

Les consignes des travaux pratiques en lien avec le cours sont ci-dessous. Notez que dû aux contraintes du calendrier, il est possible que deux travaux pratiques se chevauchent; tenez-en compte dans votre gestion du temps.

Travail Consignes Date de proposition Date de remise

TP00

IFT630--TP00.pdf

S02 (15 mai) S05 (12 juin)

TP01

IFT630--TP01.pdf

S05 (12 juin) S08 (17 juillet)

TP02

IFT630--TP02.pdf

S08 (17 juillet) « S14 » (16 août)

Valid XHTML 1.0 Transitional

CSS Valide !