Programmation Système

Ce cours a été remanié de très nombreuses fois au cours du temps. La dernière mouture (non satisfaisante) consistait à mélanger dans le même enseignement l’apprentissage de la programmation en langage C et de la programmation système. Même si ces deux choses sont liées historiquement, les mélanger ainsi en un même enseignement n’était pas réalisable dans les contraintes temporelles qui m’étaient imparties.

On trouvera ici, classées comme j’ai pu, des supports de différents genres autour du systèmes et de sa programmation.

Contenu

Les cours se basent sur

Vous pouvez consulter la page Wikipédia consacrée à Mr Dennis MacAllistair Ritchie, le père d’Unix.

Attention! Si vous savez lire le code suivant, il n’est pas utile de suivre les cours de programmation C.

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;
}

Cours

2016—2017

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

Projet

Le sujet du projet : ici.

Examen

Le sujet de l’examen

Tutoriels

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

Le sujet d’examen, un code possible pour rateau.cfil.carbre.celimine.c et crible.c

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 :

2019

Développement système sous Linux: Ordonnancement multitâche, gestion mémoire, communications, programmation réseau

Christophe Blaess

Développement système sous Linux: Ordonnancement multitâche, gestion mémoire, communications, programmation réseau Ouvrage

2019, ISBN: 978-2212677607.

Liens | BibTeX

Operating System Concepts

Abraham Silberschatz, Peter B. Galvin, Greg Gagne

Operating System Concepts Ouvrage

10, 2019.

Liens | BibTeX

2016

Computer Systems: A Programmer's Perspective, 3rd Edition

Pearson (Ed.)

Computer Systems: A Programmer's Perspective, 3rd Edition Ouvrage

2016, ISBN: 9780134092669.

Liens | BibTeX

2015

Modern Operating Systems, 4th Edition

Andrew S. Tanenbaum, Herbert Bos

Modern Operating Systems, 4th Edition Ouvrage

2015, ISBN: 9780133592184.

Liens | BibTeX

2013

Advanced Programming in the UNIX Environment, 3rd edition

W Richard Stevens, Stephen A. Rago

Advanced Programming in the UNIX Environment, 3rd edition Ouvrage

2013, ISBN: 9780321637734.

Liens | BibTeX

2007

Operating Systems Design and Implementation, 3rd Edition

Andrew S Tanenbaum, Albert S Woodhull

Operating Systems Design and Implementation, 3rd Edition Ouvrage

2007, ISBN: 9780131429871.

Liens | BibTeX

2003

Unix: Programmation et Communication

Jean-Marie Rifflet, Jean-Baptiste Yunès

Unix: Programmation et Communication Ouvrage

Dunod, 2003, ISBN: 978-2100079667.

Résumé | Liens | BibTeX

1996

The Design and Implementation of the 4.4 BSD Operating System

Marshall Kirk McKusick, Keith Bostic, Michael J. Karels, John S. Quarterman

The Design and Implementation of the 4.4 BSD Operating System Ouvrage

1996, ISBN: 978-0201549799.

Liens | BibTeX