Ressources

Description officielle

Maîtriser et appliquer les concepts fondamentaux des systèmes d’exploitation. Comprendre les mécanismes et les politiques mises-en-oeuvre par les systèmes d’exploitations. Maîtriser la programmation système UNIX/Linux en C.

Rôles, types et structure générale des systèmes d’exploitation. Mécanismes noyaux : appels systèmes, interruptions, modes d’exécution processeur. Gestion des processus : états des processus, création et terminaison (fork et exec). Multitâche : changement de contexte, fils (threads), ordonnancement des tâches. Gestion des fichiers : systèmes de fichiers, inodes, descripteurs de fichiers, fichiers spéciaux. Communication inter-processus : échanges de messages, signaux, tubes, mémoire partagée. Concurrence : synchronisation, sections critiques, interblocages. Gestion de la mémoire : adressage, allocation, protection, pagination, mémoire virtuelle. Entrées-sorties : pilotes, pseudo-périphériques. Les considérations de sécurité seront intégrées au développement de la matière.

Évaluations et échéancier des rendus

Les dates de remise sont des dates “au plus tard”, et s’entendent sur le fuseau horaire de Montréal, à 23:55 le jour de la date de remise. Tout rendu hors délai recevra la note de zéro (0), mais rien ne vous empêche de livrer avant l’échéance. Les règles concernant le plagiat seront appliquées sans aucune tolérance.

Desc % Présentation Du À
💾 TP0 wall-e 10% Enregistrement 🎥 Dimanche 15 mai Lundi 30 mai à 23h55
💾 TP1 echelon 10% Enregistrement 🎥 Lundi 30 mai Dimanche 19 juin à 23h55
💾 TP2 tubeo 20% Enregistrement 🎥 Lundi 11 juillet Dimanche 7 août à 23h55

La note finale (en lettre, A+, A, etc.) pour le trimestre sera attribuée en fonction de l’atteinte des objectifs spécifiques à travers les évaluations. La distribution des résultats dans le groupe pourrait aussi être utilisée. Aucune autre opportunité (travail supplémentaire, etc.) d’augmenter le nombre de points ne sera accordée.

Semainier des séances

Les diapositives téléchargeables (pdf) datent de la sessions d’été 2021 mais le contenu est à jour et sera utilisé tel quel pour la session d’automne 2021.

# Semaine Diapositives Laboratoires
1 2 au 6 mai 100 Introduction - pdf 🖼
110 Définition et rôles - pdf 🖼
Enregistrement 🎥
120 Appels système - pdf 🖼 - progs 💾
130 Mécanismes matériels - pdf 🖼 - progs 💾
Enregistrement 🎥
Pas de laboratoire
2 9 au 13 mai 200 Processus - pdf 🖼
210 Threads - pdf 🖼
220 Mémoire des processus - pdf 🖼 - progs 💾
Enregistrement 🎥
230 Vie et état - pdf 🖼
Lab1 ⌨️
Solutions du lab1
3 16 au 20 mai 240 Création et terminaison - pdf 🖼 - progs 💾
241 fork et création de processus - pdf 🖼 - progs 💾
Enregistrement 🎥
242 exec et recouvrement de processus - pdf 🖼 - progs 💾
243 exit et terminaison de processus - pdf 🖼 - progs 💾
Enregistrement 🎥 (Deuxième partie du cours seulement)
Lab2 ⌨️
Solutions du lab2
4 23 au 27 mai 250 Ordonnancement des processus - pdf 🖼 - progs 💾
Enregistrement 🎥
Lab3 ⌨️
Solutions du lab3
5 30 mai au 3 juin 300 Système de gestion de fichiers - pdf 🖼
310 Manipulation de fichiers - pdf 🖼
Quiz 1
Lab4 ⌨️
Solutions du lab4
6 6 au 10 juin 320 Droits et utilisateurs - pdf 🖼
330 Répertoires - pdf 🖼 - progs 💾
Enregistrement 🎥
Lab5 ⌨️
Solutions du lab5
7 13 au 17 juin 340 Traitement des fichiers ouverts - pdf 🖼 - progs 💾
350 Implémentation des systèmes de fichiers - pdf 🖼
Enregistrement 🎥
Correction intra 🎥
Lab6 ⌨️
Solutions du lab6
8 🌼 20 au 24 juin Examen intra
À la place du cours - Mardi 21 juin 2022
Lab7 ⌨️
Solutions du lab7
9 27 juin au 1 juillet 400 Communication interprocessus - pdf 🖼
410 Signaux - pdf 🖼 - progs 💾
420 Tubes - pdf 🖼 - progs 💾
Enregistrement 🎥
Lab9 ⌨️
Solutions du lab9
10 4 au 8 juillet 430 Sockets - pdf 🖼 - progs 💾
500 Synchronisation - pdf 🖼 - progs 💾
Enregistrement 🎥
Jeudi 7 juillet: date limite d'abandon sans mention d'échec.
Lab10 ⌨️
Solutions du lab10
11 11 au 15 juillet 510 Section critique - pdf 🖼 - progs 💾
520 Outils de synchronisation - pdf 🖼 - progs 💾
530 Interblocage - pdf 🖼 - progs 💾
Enregistrement 🎥
Lab11 ⌨️
Solutions du lab11
12 18 au 22 juillet 600 Gestion de la mémoire - pdf 🖼 - progs 💾
610 Pagination - pdf 🖼
620 Mémoire virtuelle - pdf 🖼
Enregistrement 🎥
Quiz 2
Lab12 ⌨️
Solutions du lab12
13 25 au 29 juillet 621 Mémoire virtuelle avancée - pdf 🖼
622 mmap et cie. - pdf 🖼 - progs 💾
623 Consommation mémoire - pdf 🖼 - progs 💾
630 Allocation - pdf 🖼
Lab13 ⌨️
Solutions du lab13
14 1 au 5 août Rattrapage première semaine Lab14 ⌨️
15 ☀ 8 au 12 août Examen final
À la place du cours - Mardi 9 août 2022
Pas de laboratoire

Anciens examens

Liens

  • The Linux Kernel documentation. Documentation officielle du noyau Linux
  • LWN. Site d’information spécialisé sur le noyau linux et son ecosystème (Linux Weekly News)
  • POSIX.1-2017. Norme POSIX (Open Group et IEEE).
  • The Unix Tree. Code source original de nombreuses versions historiques de Unix.

Médiagraphie

Les ressources suivantes sont recommandées.

  • SILBERSCHATZ, A., GAVIN, P.B., GAGNE, G. – Operating Systems Concepts, 10TH EDITION, WILEY, 2018.
  • TANENBAUM, Andrew S. – Modern Operating Systems – PRENTICE HALL, 4RD ED., 2014.
  • TANENBAUM, Andrew S. – Système d’exploitation – PERSON EDUCATION, 3RD ED. (en français)

Des ressources complémentaires sont disponibles

  • NUTT, G. – Operating system concepts – ADDISON WESLEY.
  • STALLING, W. – Operating systems Internals and Design Principles – PRENTICE HALL.
  • BIC, L.F. et SHAW, A.C. – Operating systems principles – PRENTICE HALL.
  • KERNIGHAN, B.W., RITCHIE, D.M. – The C programming language – PRENTICE HALL.
  • BLAESS, C. – Développement système sous Linux – EYROLLES
  • RIFFLET, J.M. – La programmation sous Unix – SCIENCE INTERNATIONAL, PARIS.
  • KERRISK M. – The Linux Programming Interface – NO STARCH PRESS.
  • GRAY, J.S. – Inteprocess communications in Linux – THE NOOKS AND GRANMIS.
  • ROBBINGS, K.A. et ROBBINGS, S. – Unix Systems Programming – PRENTICE HALL.

Laboratoire 4 - fork et exec

L’objectif de ce laboratoire est de se familiariser avec l’utilisation des appels système fork et exec Mise en bouche Écrire un programme fork0 effectuant les opérations suivantes, dans l’ordre : Afficher « Mon PID est <pid>! ». Pour obtenir le PID, utiliser getpid(). Appeler la fonction fork(). Afficher « Je suis le <père|fils> et mon PID est <pid>. » Voici un exemple de résultat: Mon PID est <22097> Je suis le père et mon PID est <22097> Je suis le fils et mon PID est <22098> Multiple fils Écrire un programme famille qui crée 10 processus fils.

Laboratoire 5 - Ordonnanceur

L’objectif de ce laboratoire est de se familiariser avec les stratégies d’ordonnancement standards. Ordonnancement Le programme suivant utilise une version modifiée du crible d’Ératosthène pour compter les nombres premiers inférieurs ou égaux à un nombre passé en argument. Il répartit l’exécution sur plusieurs threads (Comme au lab 3). #include<stdio.h> #include<stdlib.h> #include<stdbool.h> #include<math.h> #include<pthread.h> //variables globales bool *work_list = NULL; long int nb_thread ; long int maximum ; // Chaque thread travaille sur une fraction du tableau // Chacun commence à un indice différent puis "saute" par-dessus les autres void *do_work(void *ptr) { long int depart = (long int)ptr; bool is_prime= false; for(long int i = depart; i <= maximum; i+= nb_thread) { is_prime = true; // C'est inefficace, car on parcourt tous les entiers // au lieu de tester seulement les nombres premiers // mais c'est plus simple à coder (pas de synchronisation nécessaire) for(long int j=2;j <= (long int )sqrt((double)i); j++) { if(i%j == 0){ is_prime = false; break; } } if(is_prime){ work_list[i] = true; } } } int main(int argc, char **argv) { int nb=0, i, depart_argument; if (argc < 3) { fprintf(stderr, "Vous devez fournir la borne supérieure et le nombre de threads\n"); return 1; } char* endptr = NULL; maximum = strtol(argv[1], &endptr, 0); // Entier maximum à tester if (*endptr !

Laboratoire 6 - Systèmes de gestion des fichiers

L’objectif de ce laboratoire est de se familiariser avec le système de gestion des fichiers. Remarque: n’oubliez pas, lors de l’utilisation d’appels systèmes, de traiter les cas d’erreur. Attributs des fichiers et table des inodes L’objectif est d’écrire une version simplifiée du programme ls. Des options supplémentaires sont ajoutées dans le laboratoire suivant. Essayez de suivre les étapes suivantes : Écrivez un programme mini_ls qui, pour un fichier donné en argument, affiche à l’écran: le numéro d’inode, le type de fichier, les droits d’accès, le nombre de liens durs, l’uid et le gid propriétaires, la taille du fichier, et la date de dernière modification.

Laboratoire 6 - Systèmes de gestion des fichiers

Attributs des fichiers et table des inodes L’objectif est d’écrire une version simplifiée du programme ls. Essayez de suivre les étapes suivantes : Le programme mini_ls avec uid et gid #include <stdio.h> #include <sys/stat.h> #include <unistd.h> #include <sys/types.h> #include <string.h> #include <time.h> #include <sys/sysmacros.h> int main(int argc, char * argv[]) { struct stat statbuf; int retour_stat, i; char type[30]; char permission[4]; char droits[20] = ""; char Date_modification[30]; if (argc != 2) { printf("Usage: %s nom_du_fichier\n", argv[0]); return 1; } retour_stat = lstat(argv[1], & statbuf); if (retour_stat == -1) { perror("Erreur de la récupération des informations"); return 1; } switch (statbuf.

Laboratoire 7 - Droits et répertoires

Remarque: n’oubliez pas, lors de l’utilisation d’appels système, de traiter les cas d’erreur. Mini ls (suite) Modifiez le programme mini_ls du lab 6 pour: ajouter une option -n, qui, à la place d’afficher l’uid et le gid propriétaire, affiche le nom de l’utilisateur et du groupe propriétaire du fichier. Pour cela, utilisez les fonctions getpwuid et getgrgid afin de faire la conversion. Comparez votre programme avec la sortie de ls -lid.

Laboratoire 7 - Droits et répertoires

Mini ls (suite) -n pour afficher le nom du propriétaire et du groupe #include <stdio.h> #include <sys/stat.h> #include <pwd.h> #include <grp.h> #include <string.h> #include <sys/types.h> #include <time.h> #include <sys/sysmacros.h> int main(int argc, char* argv[]){ struct stat statbuf; int retour_stat, i; struct passwd *pw; struct group *gr; char type[30]; char permission[4]; char droits[20]=""; char Date_modification[30]; int arg = 1, show_name = 0; if(argc < 2){ printf("Usage: %s nom_du_fichier\n", argv[0]); return 1; } if (strcmp(argv[1], "-n") == 0) { arg = 2; show_name = 1; } retour_stat = lstat(argv[arg], &statbuf); if(retour_stat == -1){ perror("Erreur de la récupération des informations"); return 1; } switch (statbuf.

Laboratoire 9 - Traitement des fichiers ouverts

Remarque: n’oubliez pas, lors de l’utilisation d’appels système, de traiter les cas d’erreur. Redirection de fichiers Développez un programme redir.c avec l’usage ./redir IN OUT commande [argument...]. Ce programme permet d’exécuter une commande avec ses arguments, mais en redirigeant l’entrée standard depuis le fichier IN et la sortie standard ainsi que la sortie standard d’erreur vers le fichier OUT. Note: Les appels systèmes dup2 et creat peuvent vous être utiles.

Laboratoire 9 - Traitement des fichiers ouverts et des répertoires

Descripteur de fichier Le programme permet de créer un fichier resultat qui contient Programme Programme mystère. En effet, on a deux descripteurs qui pointent sur la même entrée dans la table des fichiers ouverts (TFO) (qui dans notre cas est le fichier resultat). Le premier descripteur est utilisé pour écrire Programme mystère\n, le deuxième est utilisé pour reculer le curseur de 9 donc le curseur est positionné après Programme , et enfin le premier descripteur est réutilisé pour réecrire Programme mystère\n.

Solution des exercices du laboratoire 1

Unix et ligne de commande #!/bin/bash #Question 1 ls -l | grep .txt | wc -l > f1 # Les extensions ne sont pas un moyen fiable pour identifier des fichiers, préférer la commande file # par exemple (peut être amélioré!) file -i * | grep 'text/plain' | wc -l > f1 #Question 2 head -5 /etc/hosts | tail -1 # ou tail -n +5 /etc/hosts | head -n 1 #Question 3 ln -s /bin/sh toto #Question 4 #chmod 777 --> utilisateur: rwx, groupe: rwx, autres: rwx #chmod 640 --> utilisateur: rw-, groupe: r--, autres: --- #chmod 005 --> utilisateur: ---, groupe: ---, autres: r-x #Question 5 #1 ls -1 /etc/c* #2 find /etc -maxdepth 2 -name "c*" 2> /dev/null #3 grep "^c" /usr/share/dict/words Programmation C Exercice 1 #include <stdio.