Architecture et Systèmes

Cette page n’est plus d’actualité. Pour la version courante du module, voyez plutôt à cette adresse. La suite de cette page porte sur la version 2021-2022 du module d’ArcSys1 de l’ENS Rennes. Le C et Internet 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:

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.

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.

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.

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.

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.

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.

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.

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).

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.

Semaine 10: Couche routage

Et pour finir cette rapide découverte d’Internet, voici son protocole phare : IP. Nous parlerons adressage, forwarding et … routage.

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.

Voici quelques liens supplémentaires, plus amusants qu’indispensables:

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:

À 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).