Systèmes et programmation C
Cette page présente le cours de SYS1 tel qu’enseigné en 2022-2023 à l’ENS Rennes. Les
informations seront ajoutées au cours du semestre. Le cours de C est donné par Martin
Quinson, tandis que Guillaume Didier donne le cours de réseau. Nicolas Bailluet et Mathieu
Laurent s’occupent des sessions pratiques sur tout le semestre. 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 —
S7: Introduction Réseaux —
S8: Exemples d’applications —
S9: Protocoles de Transport —
S10: Protocoles de Transport (suite) et Plan de Données —
S11: Couche Réseau, Plan de Donnée et Plan de Transport
S12: Plan de Contrôle et Couches Lien et Physique
TP supplémentaires —
Examens —
Année 21-22.
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. Savoir utiliser les commandes de bases dans un shell sera également utile (ces exercices à faire seuls permettent d’apprendre).
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 Debian avec l’environnement MATE. 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 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 sont pas exactement des polycopiés. 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 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. 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.
- Notes de cours de réseau. Ce document concatène les notes que j’ai utilisées en 21-22, mais rien n’a été fait pour rendre cette concaténation lisible…
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
Nous couvrirons le chapitre 1 et la moitié du chapitre 2 cette semaine. 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 les notes de cours donnent quelques pistes supplémentaires.
Semaine 2 : Fichiers en C, et système d’exploitation.
Cette semaine, nous couvrirons la fin du chapitre 2 et le chapitre 3. Après avoir fini notre tour des systèmes d’exploitation en explorant Unix, nous approfondirons notre connaissance du langage C en regardant comment manipuler des fichiers.
- 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.
- TP 2: Entrées/sorties en C (fichiers supplémentaires fournis). Éléments de correction.
- 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 (chapitre 4). 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. En couvrant la fin du chapitre 4, 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). Éléments de correction. Pour utiliser valgrind sous Mac OSX, voyez ce tuto. Une autre solution est d’utiliser le sanitizer LLVM comme indiqué à la fin du sujet.
Semaines 5 et 6 : 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. On prend ensuite une semaine sans cours pour faire des TP et s’entraîner un peu.
- TP5 noté : Igel Argern à faire en binômes, et à rendre pour le vendredi 20 octobre 2023 avant 19h. Copie locale des variantes de règles.
Semaine 7 : Introduction aux réseaux
À partir de cette semaine, vous explorerez le réseau avec Guillaume Didier. Nous n’aurons plus cours ensemble du semestre.
Vous pouvez consulter le syllabus du cours : Syllabus, qui résume les objectifs, le programme, le planning et les règles de cette partie du cours.
Pour cette semaine les slides au format PDF, keynote (Apple) et un rendu vidéo avec les animations 1080p 720p SD
Le sujet du projet est disponible ici : TP6 Applications Réseaux, il est à effectuer en binôme. La date de rendu est les Samedi 18/11/2023 - 20h. (Un rendu en retard est pénalisé de 10% par jour, et n’est pas accepté 48h après la deadline. Vous disposez pour le semestre d’un joker (jour de grace) pour éviter une pénalité de 10%)
Les fichiers supports suivants sont disponible: csapp.c csapp.h codes-R1.c
Semaine 8 : Protocoles Applicatifs
Pour cette semaine les slides au format PDF, keynote (Apple) et un rendu vidéo avec les animations 1080p 720p SD
Semaine 9 : Protocoles de Transport
Attention cette séance est décalée au vendredi 17/11, à Beaulieu, cf ADE.
Pour cette semaine les slides au format PDF, keynote (Apple) et un rendu vidéo avec les animations 1080p 720p SD
Semaine 10 : Protocoles de Transport (suite) et Plan de Données
Pour cette semaine les slides au format PDF, keynote (Apple) et un rendu vidéo avec les animations 1080p 720p SD
Le Projet / TP6 est à rendre Samedi 24 à 20h. Pour rappel, il est à faire en binôme. Pour le rendu, soit archives tar.gz par mail, soit ajoutez les 3 membres de l’équipe à votre dépot git privé, et envoyez un mail avec le hash identifiant le commit git du rendu. Voir le syllabus pour les modalité de rendu en retard.
Le sujet du TP7 à faire en monôme (seul) est disponible, vous disposerez de deux séance de TP faire celui-ci (cette semaine étant encore prévu pour le projet). TP7 Transport Sources
Semaine 11 : Couche Réseau, Plan de Donnée et Plan de Transport
Pour cette semaine les slides au format PDF, keynote (Apple) et un rendu vidéo avec les animations 1080p 720p SD
Semaine 12 : Plan de Contrôle et Couches Lien et Physique
Pour cette semaine les slides au format PDF, keynote (Apple) et un rendu vidéo avec les animations 1080p 720p SD
Le sujet du TD/TP sur le routage est TD8 Transport
Semaine 13 : Révisions
Pas de slides cette semaine, tableaux et craies.
Le sujet du TD de révisions est TD9 Révisions. Vous pouvez aussi utiliser les questions suivantes pour réviser votre cours Questions.
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.
- TP0 premiers pas Ce TP permet de faire ses premiers pas en C, mais il n’est plus utile aux élèves de l’ENS Rennes puisqu’ils ont déjà fait un peu de C dans leur cursus.
- 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.
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).