Architecture et Systèmes
Cette page n’est plus d’actualité. Pour le cours PCR en 22-23, voyez la page de Rémi Hutin qui assure le cours cette année. La suite de cette page porte sur le module d’ArcSys1 tel qu’enseigné l’an passé à l’ENS Rennes par Martin Quinson.
Le C n’ayant pas beaucoup changé entre temps, le contenu peut s’avérer utile si vous n’êtes pas élève à Rennes.
Prérequis et objectifs
Les prérequis du module sont une bonne maîtrise de la programmation dans un langage de programmation, quel qu’il soit. Les bases de l’algorithmique sont également supposées connues. Savoir utiliser les commandes de bases dans un shell sera également utile (ces exercices en ligne permettent d’apprendre).
Ce cours est conçu pour donner aux élèves issus d’une classe préparatoire en MP un bon aperçu du domaine des systèmes d’exploitations et les réseaux. On visitera différents systèmes existants (Unix, Internet) en insistant sur les motivations qui ont poussé les concepteurs à concevoir les choses ainsi. Pour garder un souvenir plus durable de la visite, on parlera finalement plus de concepts que de technologies. J’espère que cela vous permettra de découvrir les concepts et défis clés des systèmes d’exploitation (performance, compatibilité, composabilité). En pratique, après avoir suivi ce cours, vous saurez:
- Écrire et debugger des petits programmes en C, avec tous les éléments principaux du langage (y compris les sockets);
- Survivre au terminal UNIX et y utiliser les 5 ou 6 commandes de base.
- Vous connaîtrez le modèle en 4 couches d’Internet, avec une bonne compréhension générale du fonctionnement des principaux algorithmes et protocoles des couches 2, 3 et 4 (mais pas 1).
Pour faire les travaux pratiques, il est bien préférable d’avoir un ordinateur fonctionnel sous Linux (ou Mac si vraiment nécessaire). Si vous n’avez qu’un Windows, trouvez un ami pour vous aider à installer Xubuntu. Si vous êtes coincés, installez le Windows Subsystem Linux (WSL2). Si vous avez un Mac, vous n’êtes pas complétement tirés d’affaire car le TP debug utilise des outils (valgrind et gdb) qui marchent mal sous Mac (ces outils semblent fonctionner avec WSL2). Mauvaise nouvelle : je ne sais pas faire des programmes non triviaux en C sans ces outils. Vous risquez de trouver un plafond de verre assez cruel si vous insistez pour utiliser Mac dans ce module. Désolé.
Syllabus du cours
Semaine 1: Langage C et dissection d’ordinateur
Nous avons deux objectifs pour cette première semaine. Il s’agit tout d’abord de voir les bases en C, langage qui nous servira dans toutes les sessions pratiques de ce module. Nous verrons pourquoi ce langage, un historique, les bases de la syntaxe, et quelques astuces pour survivre en C. Ensuite, nous explorerons l’intérieur d’un ordinateur, d’un point de vue conceptuel. Nous verrons le principe fondamental d’ordinateur comme machine programmable (ie, ce qui fait qu’un ordinateur n’est pas un calculateur), avant de passer en revue les principaux les composants et leurs fonctions.
- Le pense-bête du C contient le strict minimum sur la syntaxe, la bibliothèque standard, et un starter pack d’exemples de code.
- Notes de cours. Ces notes personnelles ne sont là que pour votre curiosité, voir tout en bas.
- TP1: Premiers programmes en C. Code à rendre avant jeudi 20h, voir plus bas.
- M99 : l’ordinateur en papier (activité facultative)
Semaine 2: Fichiers en C, et système d’exploitation.
Cette semaine, nous continuons la découverte du langage C en regardant comment manipuler des fichiers. En parallèle, nous verrons en cours une première introduction à la notion de système d’exploitation et de sécurité informatique.
- Notes de cours. Ces notes personnelles ne sont là que pour votre curiosité, voir tout en bas.
- TP2: Entrées/sorties en C (fichiers supplémentaires fournis). Code à rendre avant jeudi 20h, voir plus bas.
- Doc: Code C illisible
Semaine 3: Mémoire statique en C
Maintenant que nous avons fait le tour de la syntaxe du C, nous pouvons rentrer dans le vif du sujet : la mémoire en C. Nous parlerons d’abord de portée des identifiants et du mot-clé static. Nous présenterons ensuite la pile d’appel et le layout mémoire d’un processus, avant de détailler les notions d’adresse mémoire et de pointeur.
- Notes de cours. Ces notes personnelles ne sont là que pour votre curiosité, voir tout en bas.
- TD: mémoire statique (séance pratique sans ordinateur). Pas de rendu cette semaine.
- Doc: code étudié en cours
Semaine 4: Mémoire dynamique et projet!
Cette semaine marque la fin notre exploration de la mémoire en C. Nous parlerons de transtypage, de pointeur générique (void*) et d’arithmétique des pointeurs avant de jouer au jeu des 7 différences entre les tableaux et les pointeurs, . Nous terminerons par la cerise sur le gateau de la mémoire en C : la fonction malloc. Enfin! Pour fêter ça, le TP de cette semaine est un mini-projet à faire en binôme sur deux semaines.
- Notes de cours. Ces notes personnelles ne sont là que pour votre curiosité, voir tout en bas.
- Doc: La vérité sur les tableaux et les pointeurs en C, par Marc Mongenet.
- TP4: projet 7 colors (code fourni). Projet noté à rendre dans deux semaines, donc pas de rendu jeudi soir.
Semaine 5: C bonus
Cette semaine, on termine toutes les notions que nous n’avons pas vu en C, et on étudie comment programmer proprement en C. Dans la partie pratique, on découvrira les outils de debug comme gdb ou valgrind. Comme la meilleure façon d’apprendre à programmer, c’est de programmer, vous trouverez aussi quelques TP optionnels pour vous perfectionner si vous le souhaitez.
- TP5a: Bug hunting (code fourni). Pour utiliser valgrind sous Mac OSX, voyez ce tuto.
- TP5b: Allocations de vecteurs et matrices (code fourni)
- TP bonus: L’univers impitoyable des pointeurs
- TP bonus: Dice Poker
- TP bonus: Boggle (code fourni)
Semaine 6: Introduction au réseau
Cette semaine, on commence à explorer le réseau. Pour fêter ça, nous avons deux cours d’affilé avant le prochain TP. Il s’agit tout d’abord de savoir faire communiquer des programmes entre eux, en ouvrant des sockets. Ensuite, on explore les aspects nécessaires d’un réseau informatique à l’échelle mondiale.
- Notes de cours. Ces notes personnelles ne sont là que pour votre curiosité, voir tout en bas.
- Document: Code pour les sockets BSD (Code de départ: server.c, client.c)
- TP6: Jouer en réseau (demo jouable)
Semaine 7: Internet
Après l’introduction sur ce à quoi pourrait ressembler un réseau mondial en toute généralité, étudions un peu l’Internet tel qu’il existe. J’aimerais vous montrer que la stucture d’Internet est une belle construction. Il faut juste voir plus loin que tous ces trigrammes.
- Notes de cours. Ces notes personnelles ne sont là que pour votre curiosité, voir tout en bas.
- (pas de TP)
Semaine 8: Couche applicative
Cette semaine, nous allons étudier quelques façons classiques d’organiser le dialogue entre les ordinateurs: Client/serveur, pair-à-pair. Nous disequerons ensuite quelques protocoles classiques (mail, ftp, http).
- Notes de cours. Ces notes personnelles ne sont là que pour votre curiosité, voir tout en bas.
- TP8: Link Checker
Semaine 9: Couche transport
Cette semaine, c’est la fête des trigrammes. Il faut dire que la couche transport regorge de ces sigles en 3 lettres. Nous tâcherons de voir la beauté algorithmique de TCP malgré tous ces détails techniques.
- Notes de cours. Ces notes personnelles ne sont là que pour votre curiosité, voir tout en bas.
- TD9: Transmettre des données
Semaine 10: Couche routage
Et pour finir cette rapide découverte d’Internet, voici son protocole phare : IP. Nous parlerons adressage, forwarding et … routage.
- Notes de cours. Ces notes personnelles ne sont là que pour votre curiosité, voir tout en bas.
- TP10: Routage (code fourni)
- Pour aller plus loin: notes de lecture de l’article “The Design Philosophy of the DARPA Internet Protocols” [D. Clarke 1988] par A. Colyer.
Semaine 11: Examen
Chaque année, le seul document autorisé pendant l’examen est un recto A4 écrit de votre main. Vous pouvez écrire tout ce que vous voulez sur cette feuille (et vous pouvez écrire de la taille que vous voulez). Le premier avantage est que préparer cette feuille est une bonne méthode pour comprendre et apprendre ce qui est important dans le cours. De plus, cela fait que l’examen est plus porté sur la réflexion que sur la mémorisation.
Rendu de code
Vous devez me renvoyer votre code par mail avant jeudi 20h. Je n’exécuterais pas vos programmes, mais j’annoterais le code. Il est donc important d’écrire le plus lisiblement possible. Attachez-vous à documenter l’intention du code, à le factoriser correctement, et à bien nommer vos variables et fonctions. Un bon code est élégant et facile à comprendre. Un code plus compliqué que nécessaire n’est pas impressionnant : il est juste trop compliqué.
Si vous savez que votre programme ne fonctionne pas dans certains cas, il est important de l’écrire en commentaire car je n’aime pas trouver des bugs énormes dans un code réputé correct. À l’inverse, si vous n’arrivez vraiment pas à faire un exercice, ce n’est pas un problème tant que vous expliquez le problème en commentaire. N’hésitez pas à mettre aussi en commentaire quelques exemples d’affichage de vos programmes.
Avant de rendre votre code, il faut l’indenter puis tout mettre dans le même fichier. On peut faire cela en une seule ligne de commande (au besoin, demandez à explainshell.com de vous expliquer la ligne):
for f in exo1.c exo2.c exo3.c ; do clang-format -i $f ; echo "///////"; echo "//// $f" ; cat $f; done > MONNOM_tp1.c
Seul le projet de la semaine 4 est noté. Les autres rendus ne donnent pas lieu à une évaluation notée. Nos retours sur ces autres rendus ne visent qu’à vous aider à améliorer votre style pour vous permettre de progresser. Il est important de lire les retours et d’appliquer les conseils pour les fois suivantes.
Bibliographie pour la partie C
Il y a énormément de matériel sur le C et UNIX en ligne. Le plus difficile est de trouver une ressource qui vous convient. La liste suivante est volontairement courte, pour vous permettre d’aller droit au but.
- Apprendre en C sur OpenClassroom. Particulièrement intéressant pour les débutants.
- Modern C par Jens Gustedt. Particulièrement intéressant pour les confirmés.
- Polycopié de C de l’ENSIMAG.
- Programmation C sur wikibook en français. Une bonne introduction, peut-être un peu rapide. N’hésitez pas à améliorer cette ressource si vous pouvez.
- C programming sur wikibook en anglais. Une introduction mieux détaillée.
Voici quelques liens supplémentaires, plus amusants qu’indispensables:
- Clean code. Présentation amusante sur pourquoi et comment programmer proprement.
- Wat, une présentation sarcastique et hors sujet sur les horreurs du javascript. Juste pour rire.
Bibliographie pour la partie réseau
Mon approche pour enseigner la partie réseau est directement inspirée du livre de Jim Kurose (dans toutes les bonnes bibliothèques), centrée sur les concepts (qui restent) plus que sur les technologies (qui lassent et passent), et suivant une approche top-down voire problem solving. J’insiste également volontiers sur les algorithmes distribués mis en jeu, même si le temps manque dans ce module pour les détails.
La plupart des ressources disponibles en ligne sont plutôt bottom-up, où l’on regarde ce qu’on peut faire avec les outils qu’on comprend déjà. Je n’aime pas cette approche car on ne comprend qu’à posteriori pourquoi chaque bout est tel qu’il est. Pourtant, la plupart des choix de design que les architectes d’internet ont fait étaient motivés par un besoin dans une couche supérieure.
Méfiez-vous surtout des ressources trop techniques (qui se limitent souvent à des catalogues de technos n’abordant jamais le pourquoi), voire technologiques (qui peuvent tout au plus vous apprendre à configurer votre réseau à la main). Voici quelques saines lectures pour compléter le cours:
- Le livre de Kurose, bien sûr. Mais il n’est pas disponible en ligne.
- Tanenbaum and Wetherall, Computer Networks. Un autre livre de référence habituel.
- Peterson and Davie, Computer Networks: A Systems Approach. Un livre complet en accès libre.
- Computer Networks, cours de l’université de Brown enseigné par Rodrigo Fonseca. Les transparents associés aux cours sont très bien. L’approche est bottom-up alors je vous conseille de lire les chapitres à l’envers pour bien comprendre. Mais ils ont un très bon niveau de détail et d’abstraction. Les projets proposés sont également très bien, mais trop chronophages au vu du volume horaire attribué au module.
- Computer Networking un livre disponible sous licence libre. Il est de bonne facture, même s’il est lui aussi bottom-up.
À propos des notes de cours diffusées
J’ai pris le parti de diffuser le document qui me sert de notes de cours, même si j’ai un peu honte de sa forme actuelle. Peut-être pourront-elles être utiles à d’autres personnes, mais j’en doute. Elles sont mises en page pour être lisibles sur mon téléphone pendant la séance. Si vous n’étiez pas en cours (au moins en distanciel), ce document ne sera pas suffisant pour comprendre ce qu’il faut apprendre. Je n’utilise pas toutes les parties du support pour le cours (en fonction du temps disponible), et je change parfois l’ordre des parties en live (en fonction des retours de l’assistance).
Merci de ne pas me tenir rigueur de l’état actuel de ces notes de cours, et de m’indiquer toute amélioration possible: typo, inexactitude, imprecision, etc. Si j’avais énormément de temps, je ne rendrais pas ce texte beaucoup plus long, mais j’ajouterais des liens vers les pages wikipedia détaillant les différents points.
Merci de signaler toute erreur sur
framagit (vous devez
être authentifié sur framagit pour cela).
Les collègues
enseignants peuvent demander un accès “Guest” au projet, pour accéder
aux sources et corrigés
(qui sont masqués surtout pour cacher les examens avant le jour J).