Une salle de TP
25-11
2017

Langage C et Programmation Système

Informations générales

Il existe un cours DIDEL - C6 (C et Systèmes) réservé à cet enseignement. Pour des raisons pratiques, il est nécessaire de s’y inscrire en tant qu’étudiant (lien Utilisateurs), puis de s’inscrire dans le groupe (lien Groupes) correspondant à son inscription pédagogique. Différentes annonces et informations pourront y être postées, par conséquent s’y inscrire pourrait se révéler crucial.

Pré-requis

Ce cours peut-être suivi par tout étudiant ayant des connaissances minimales en programmation et une connaissance des concepts généraux des systèmes d’exploitation.

Contenu

Le cours contient deux éléments :

  1. l’étude du langage C
  2. l’API de programmation systèmes de la famille Unix

À la suite de ce cours, votre expertise C devrait vous mener à comprendre ce code C valide :-)

unsigned funny(unsigned n) {
  See:
  https://en.wikipedia.org/wiki/Fibonacci_number

  <% if (n < 2) return 1;                 %>
  <% if (n < 2) { goto See; goto https; } %>
  unsigned __, *_ = malloc(sizeof(*_) * (n + 1));
  <%0
      <:_:>=1
      <:_:>=1
  ;%>
  for (
      __= + +(0<:_:><<1); !!(__ <= n);
      __= + +(1<:_:><<0)  + +__
  )(__<<0>>0)
  <:_
      :>=(__-(0<:_:><<0))<:_
      :>+(__-(1<:_:><<1))<:_
  :>;
  unsigned res = _[n];
  free(_);
  return res;
}

Organisation

Le cours commencera le jeudi 17 septembre 2015, les TPs suivront la semaine suivante.

L’enseignement est assuré durant les plages horaires et par l’équipe suivante :

Enseignement Horaire Lieu Horaire Lieu Enseignant
Cours Jeudi 8:30–11:30 Amphi 13E     Jean-Baptiste Yunès
TP Groupe 1 Lundi 13:30–15:30 2031 Vendredi 8:30–10:30 2031 Maël Canu
TP Groupe 2 Jeudi 15:00–17:00 2031 Vendredi 8:30–10:30 2032 Benjamin Hellouin
TP Groupe 3 Mardi 9:00–11:00 2032 Mardi 11:00–13:00 2032 Constantin Enea
TP Maths-Info Jeudi 13:00–15:00 2032 Vendredi 15:30–17:30 2032 Benjamin Hellouin


Évaluation des connaissances

L’examen aura lieu le Mardi 3 Janvier 2017, de 8h30 à 11h30

L’examen de seconde session aura lieu le Mardi 20 juin 2017, de 8h30 à 11h30

Une partie de l’évaluation est réalisée en contrôle continu, la présente aux TPs est donc nécessaire.

L’autre partie importante de l’évaluation est la réalisation d’un projet (à venir).

La note finale de première session est calculée de la façon suivante : 20% CC + 40% projet + 40% examen. La note finale de seconde session est calculée ainsi : 40% projet + 60% examen

Cours

  • Premier cours, généralités, Hello World, compilation élémentaire, manuel, shell et ligne de commande, les diapos.
  • Second cours, shell : redirections, pipes, scripts, expansion des variables, arguments, terminaison, C : définition de variables, expressions et opérateurs, instructions, blocs, contrôle de séquence, déclarations et définitions de fonctions, durée de vie, porté et visibilité des variables; les diapos (Attention les diapos sont brutes et recèlent encore des petits manques, des erreurs mineures et typos diverses).
  • Troisième cours, pointeurs divers et variés, un petit retour sur les types, les diapos
  • Quatrième cours, énumérations, types structurés, déclarations anticipées, alignement et bourrage, les diapos
  • Cinquième cours, modularité, chaîune de compilation et makefiles, les diapos
  • Sixième cours, création de bibliothèques (statiques et dynamiques), entrées/sorties en C les diapos
  • Septimère cours, gestion des erreurs en C, Systèmes : système de fichiers, arborescence, inoeuds, appels systèmes et fonctions POSIX les diapos
  • Huitième cours, manipulation des inoeuds et E/S systèmes les diapos
  • ???
  • Dernier cours E/S non-bloquantes : lecteur, écrivain.

Le sujet du projet : ici.

Cours 2015-2016

  • Premier cours : UNIX en tant qu’utilisateur, quelques commandes de base (cd, pwd, ls) et quelques-unes de leurs options. Les redirections des entrées/sorties. À quoi sert un shell ? « Bonjour le monde » en langage C.
  • Second cours : Retour sur le C. La chaîne de compilation avec gcc. Les inclusions en préprocessing. La génération de code. L’édition de liens (concept de bibliothèque). La décomposition des phases avec gcc. L’outil make et la description d’un arbre de dépendances. Notion de code source, entêtes, code objet, fichier exécutable. L’usage de printf.
  • Troisième cours : pointeurs, tableaux, arithmétique des pointeurs et autres amusements…
  • Quatrième cours : Entrées/Sortie en C vs entrées/sorties systèmes. Une copie de fichier en C et sa cousine avec l’API Posix. Les résultats de l’expérience (sur OSX El Capitan 10.11) sont donnés dans le tableau ci-dessous.

Observations (attention les échelles sont logarithmiques) : Avec l’API C le temps system est quasi-constant (le travail du système est donc constant), le temps elapsed se stabilise au-delà de 1000. Avec l’API POSIX le temps system devient quasi-constant au-delà d’une taille de quelques milliers (~5000) et les temps user et elapsed se recouvrent (il n’y a que le système qui travaille). À la limite, pour l’API C le temps user se stabilise à une valeur supérieure à celui de l’API POSIX (ce qui suggère donc que la version C fournit un travail plus important en mode utilisateur, un calcul est caché derrière les appels C). Sachant que l’API C fait ultimement appel à l’API POSIX et qu’elle utilise un cache, il est fort probable que la longueur de ce cache soit de l’ordre du millier d’octets (sur ce système la valeur exacte est 1024). L’effet équivalent pour la couche POSIX indique qu’il s’agit d’un cache d’environ 5000 octets (en réalité, on le verra après, c’est 4096, la taille d’une page VM qui intervient puisque sous FreeBSD les fichiers sont mappés en mémoire et le cache utilise le mapping).


Projet

Le sujet du projet pour l’année 2015—2016 est disponible ici.

Examen

2015—2016 : le sujet d’examen, un code possible pour rateau.c, fil.c, arbre.c, elimine.c et crible.c

2016-2017: le sujet de l’examen

Bibliographie

Une bibliographie n’est jamais exhaustive et est souvent une affaire de goût, mais il vous est conseillé de jeter un œil attentif aux ouvrages suivants :

  • Abraham Silberschatz, Peter Baer Galvin, Greg Gagne, Operating Systems Concepts, 9th edition, John Wiley & sons
  • Andrew S Tanenbaum, Operating Systems: Design and implementation, 3rd edition, Prentice Hall
  • Andrew S Tanenbaum, Operating Systems: Global Eition, 4th edition, Pearson education
  • Richard Stevens, Stephen A. Rago, Advanced Programming in the UNIX Environment, 3rd edition, Addison-Wesley
  • Jean-Marie Rifflet, Jean-Baptiste Yunès, UNIX : Programmation et communication, Dunod
  • Marshall Kirk McKuzick, Keith Bostic, Mickael J. Karels, John S. Quaterman, The Design and Implementation of the 4.4 BSD Operating System, Addison-Wesley
  • Randal E. Bryant, David R. O’Hallaron, Computer Systems: A Programmer’s Perspective, 2nd edition, Addison-Wesley
  • Christophe Blaess, Développement système sous Linux, Eyrolles