Systèmes et programmation C
Cette page présente le cours de SYS1 tel qu’enseigné en 2026-2027 à l’ENS
Rennes. Les informations seront ajoutées au cours du semestre. Le cours est
donné par Martin Quinson, tandis Simon Rokicki et Pablo Leboulanger s’occupent
des sessions pratiques. Vous pouvez nous joindre par email à
prenom.nom@irisa.fr, ou par Discord.
Navigation rapide :
Prérequis et objectifs —
Polys —
S1: Machine et OS —
S2: C et fichiers —
S3: Mémoire statique —
S4: Mémoire dynamique —
S5: Maîtrise du C —
S6: Communiquer en réseau —
S7: Internet —
S8: Couche applicative –
S9: Couche Transport —
S10: Couche Routage —
TP supplémentaires —
Examens.
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 aussi supposées connues. Un ordinateur sous unix est nécessaire (voir plus bas), mais nous apprendrons ensemble à l’utiliser.
Ce cours est conçu pour donner aux élèves issus d’une classe préparatoire en MP ou MPI une bonne maîtrise du langage C, et une bonne compréhension des réseaux informatiques (pile OSI et pile TCP/IP). Il constitue de plus une première introduction rapide à l’assembleur et aux concepts et défis clés des systèmes d’exploitation. Pour garder un souvenir plus durable de la visite, on parlera finalement plus de concepts que de technologies, même si la pratique tient une place importante dans ce module. 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 quatre 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. Si vous n’avez qu’un Windows, trouvez un ami pour vous aider à installer un système Manjaro en Dual boot. Si vous êtes coincés, installez le Windows Subsystem Linux (WSL2) avec un Linux dedans. Si vous avez un Mac, installez une image virtuelle Linux.
Au final, on utilisera donc un système Linux dans tous les cas. Soit directement en natif, soit dans WSL soit dans une image virtuelle sur Mac. On pourrait croire qu’un Mac pourrait faire l’affaire, mais le TP debug utilise des outils (valgrind et gdb) qui marchent très mal hors Linux. Je ne sais pas faire des programmes C sans ces outils et vous risqueriez de trouver un plafond de verre assez cruel si vous insistez pour utiliser un Mac pur dans ce module. Désolé.
Polycopiés du cours
En vérité, les documents de cours ne forme pas exactement un polycopié. Il s’agit plutôt de mes notes de cours : c’est ce que j’utilise en séance pour structurer mon discours et ne rien oublier. Je n’utilise pas forcément toutes les sections à l’oral (en fonction du temps disponible), et je change parfois l’ordre des parties en live (en fonction de mon inspiration et des retours de l’assistance).
Cela fait que le texte est concis, car j’ai besoin de pouvoir m’y repérer en live pendant que je parle en cours. S’il y a trop de lettres, je risque de m’y perdre. Il sera donc rapide à relire pour vous aussi, si vous savez de quoi il retourne. Vous y trouverez même des complément que je n’ai pas dit en classe. En revanche, ce document n’est pas suffisamment rédigé pour être auto-suffisant et vous permettre de tout comprendre sans venir en cours.
- Notes de cours de C telles qu’utilisées cette année, en un seul document.
- Notes de cours de réseau telles qu’utilisées cette année.
Merci de m’indiquer toute amélioration possible : typo, inexactitude, imprécision, etc. Si j’avais énormément de temps, je ne rendrais pas ce texte beaucoup plus long. Je rédigerai simplement les phrases en entier sans omettre autant de mots, et j’ajouterais des liens vers les pages Wikipédia détaillant les différents points.
Séances
Semaine 1 : Des machines et des OS
Poly du premier cours. Après un très rapide résumé de quelques thématiques de recherche intéressantes en systèmes, nous nous attacherons à bien comprendre le principe fondamental d’ordinateur comme machine programmable (c-à-d, ce qui fait qu’un ordinateur n’est pas un calculateur), et son contenu habituel. Nous n’allons pas ouvrir physiquement un ordinateur, mais nous présenterons les différents composants (CPU, mémoire, disque, caches, bus, etc) et leurs fonctions. Nous présenterons ensuite le principe général d’un système d’exploitation. Nous n’avons malheureusement pas le temps de présenter les OS en détail dans ce module, mais on y revient l’an prochain.
- Consommation électrique et efficacité énergétique des infrastructures de calcul, par Anne-Cécile Orgerie. Document supplémentaire (juste pour assouvir votre curiosité) présentant l’évolution historique des infrastructures de calcul très bien faite. C’est court, mais plus détaillé que le cours.
Une séance pratique est consacrée à l’exerciseur SHutorial avant le premier
cours afin de faire vos premiers pas dans le shell. Comme le réseau de
l’université n’est pas terrible, téléchargez l’image docker correspondante
avant la séance avec la commande docker pull mquinson/shutorial Si vous avez
un processeur ARM, faites plutôt docker pull mquinson/shutorial:arm.
Vous êtes sensés connaître les notions vues lors de ce TP préquel d’initiation au C avant notre cours. C’est facilement le cas si vous avez déjà eu du C dans votre cursus ou si vous suivez le module MPI de notre cursus. Sinon, il est à faire en autonomie (code fourni). Nous serons ravis de répondre aux éventuelles questions.
Semaine 2 : OS et C en pratique
Poly du deuxième cours. Cette semaine, nous finirons notre tour des systèmes d’exploitation en explorant Unix, avant d’approfondir notre connaissance du langage C en regardant comment manipuler des fichiers. Nous n’irons pas plus loin dans notre étude des interactions entre le système d’exploitation et le langage C ce semestre, pour nous concentrer sur le langage C les semaines suivantes.
- 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.
- Doc : Code C illisible (les fichiers sources)
- TP 2: Entrées/sorties en C (fichiers supplémentaires fournis). Éléments de correction.
Semaine 3 : Mémoire statique en C
Poly du troisième cours. 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 bugs
Poly du quatrième cours. Cette semaine marquera 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 sept différences entre les tableaux et les pointeurs. Nous terminerons par la cerise sur le gâteau de la mémoire en C : la fonction malloc. Enfin ! Avec tous les beaux bugs qu’on va pouvoir faire avec tout ça, on aura bien besoin d’un TP pour découvrir différents outils de debug.
- Doc : La vérité sur les tableaux et les pointeurs en C, par Marc Mongenet.
- TP4 : Chasse aux bugs (code fourni). Utiliser Valgrind sous Mac OSX est très difficile sans machine virtuelle Linux. Le plus simple (si vous ne pouvez pas installer une VM Linux) est d’utiliser le sanitizer LLVM comme indiqué à la fin du sujet dès les premières questions sur Valgrind.
Semaine 5 : Maîtrise du langage C
Poly du cinquième cours. Cette semaine, on termine toutes les notions que nous n’avons pas vues en C, et on étudie comment programmer proprement en C.
- TP5 noté : Igel Argern à faire en binômes.
Semaine 6 : Communiquer en réseau
Poly du sixième cours. À partir de cette semaine, nous explorerons le réseau et les systèmes. Il s’agit tout d’abord de savoir faire communiquer des programmes entre eux, en ouvrant des sockets.
Semaine 7: Internet
Poly du septième cours. Cette semaine, nous explorons les aspects nécessaires et contingents d’un réseau informatique à l’échelle mondiale. 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. Maintenant que le projet de hérissons est fini, la séance de TP sera dédiée à écrire de petits programmes C interagissant par le reseau.
Semaine 8: Couche applicative
Notes de cours. 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, http) avant de dire un mot du DNS si le temps le permet.
Semaine 9: Couche transport
Notes de cours. C’est maintenant 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 fois l’intérêt pratique et la beauté algorithmique de TCP malgré tous ces détails techniques. Cela nous prendra deux séances de cours, suivies d’une seule séance de TD.
Semaine 10: Couche routage
Notes de cours. Et pour finir cette rapide découverte d’Internet, voici son protocole phare : IP. Nous parlerons adressage, forwarding et … routage.
TP supplémentaires
Les TP suivants ne sont diffusés ici que pour référence. Ils ne font pas partie du module de l’ENS, même s’ils parlent des mêmes sujets. Ils sont surtout là pour d’éventuels visiteurs extérieurs et autres curieux. Après tout, la meilleure façon d’apprendre à programmer, c’est de programmer alors faites-vous plaisir. Ca sert à rien mais certains sont marrants (j’espère).
- TP allocations de vecteurs et matrices. Un TP peut-être un peu répétitif, mais autocorrigé et très instructif.
- TP pointeurs impitoyables. Un TP demandant de manipuler une structure arborescente complexe mais récréative.
- TP boggle (code fourni). Il s’agit d’un vieux projet de programmation que je n’ai jamais utilisé en cours depuis que je suis à Rennes, mais je persiste à le trouver intéressant quand même.
- TP Dice Poker. Un mini projet n’utilisant pas de constructions très avancées en C, mais relativement intéressant à faire.
- TP 7 colors (code fourni). Il s’agit du projet que l’on utilisait il y a quelques années. De nos jours, nous utilisons un autre jeu pour cela.
- TP 7 couleurs en réseau (demo jouable)
Anciens examens
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.
Si vous le souhaitez, vous trouverez les archives des versions précédentes de ce cours ici : 21-22, 23-24, 24-25, 25-26.
Autres cours
Ce module fait partie d’un ensemble relativement cohérent d’enseignements à l’ENS Rennes :
- SYS1 : Programmation C, réseau et introduction aux systèmes informatiques (L3S1).
- GL : Programmation C++ et génie logiciel (L3S2).
- ProgSys : Programmation système : forks, I/O, synchronisations et threads.
- HPC : Programmation haute performance: pratique de MPI (M1S1).
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
(qui sont masqués surtout pour cacher les examens avant le jour J).