Systèmes et programmation C
Cette page présente le cours de SYS1 tel qu’enseigné en 2025-2026 à l’ENS
Rennes. Les informations seront ajoutées au cours du semestre. Le cours est
donné par Martin Quinson, tandis Mathieu Laurent 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 —
Année 21-22,
23-24,
24-25.
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 (ou Mac si vraiment nécessaire). Si vous n’avez qu’un Windows, trouvez un ami pour vous aider à installer un système Manjaro, ou un système Debian avec l’environnement MATE. Si vous êtes coincés, installez le Windows Subsystem Linux (WSL2) avec une Debian dedans si possible. 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 très 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é.
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
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.
-
TP préquel d’initiation au C Vous êtes sensés connaître les notions vues lors de ce TP 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.
- Avant le premier cours, vous aurez une séance en classe sur
l’exerciseur SHutorial afin de faire vos premiers pas dans le shell.
Paquet à installer sur votre machine: Debian ou ubuntu, Arch. - TD1 : M99 : l’ordinateur en papier.
Semaine 2 : OS et C en pratique
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.
- Poly du deuxième cours
- 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).
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 bugs
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.
- Poly du quatrième cours
- Doc : La vérité sur les tableaux et les pointeurs en C, par Marc Mongenet.
- TP4 : Chasse aux bugs (code fourni). Pour utiliser valgrind sous Mac OSX, voyez ce tuto. Une autre solution est d’utiliser le sanitizer LLVM comme indiqué à la fin du sujet.
Semaine 5 : Maîtrise du langage C
Cette semaine, on termine toutes les notions que nous n’avons pas vues en C, et on étudie comment programmer proprement en C..
- Poly du cinquième cours
- TP5 noté : Igel Argern à faire en binômes.
Semaine 6 : Communiquer en réseau
À 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.
- Poly du sixième cours
- Document: Code pour les sockets BSD (Code de départ: server.c, client.c)
- La séance de TP porte encore sur le projet Igel Argern, il n’y a donc pas de nouveau sujet.
Semaine 7: Internet
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
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.
- Notes de cours.
- TP8: Link Checker
Semaine 9: Couche transport
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.
- Notes de cours.
- Correction de l’évaluation formative faite en classe.
- 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.
- TD10: Routage (code fourni pour l’exercice optionnel)
Pour aller plus loin: notes de lecture https://blog.acolyer.org/2015/01/22/the-design-philosophy-of-the-darpa-internet-protocols/ de l’article /The Design Philosophy of the DARPA Internet Protocols/ de D. Clarke datant de 1988. La note de lecture est écrite par A. Colyer.
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 Univers impitoyable des pointeurs
- 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.
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).