Programmation Système
Programmation Système
Programmation Système
Linux
Plan
1 Linux
Mars 2023
Système d’exploitation ?
La naissance d’Unix
➥ New Ken’s System
Z 1969
Z En assembleur
Z Inspiré de Multics
➥ 1971 : réécriture en C
➥ 1975 : large distribution
Présentation Chiheb Ameur ABID 5/ 79 Présentation Chiheb Ameur ABID 6/ 79
Linux Linux
Famille Unix
Linux, enfin
Présentation Chiheb Ameur ABID 11/ 79 Présentation Chiheb Ameur ABID 12/ 79
Linux Linux
1 Linux
La norme POSIX ?
➥ Tous proviennent d’Unix, mais ils commençaient lentement à diverger. 2 Les processus
Gestion des processus
➥ IEEE a lancé le POSIX spécifications en 1988, permettant interopérabilité entre les
Identification des processus
systèmes d’exploitation.
Z POSIX a évolué depuis (la spécification la plus récente en 2017).
3 Les threads Posix
➥ Tous les systèmes d’exploitation POSIX ont des caractéristiques spécifiques au-delà de
POSIX, mais ils partagent la partie POSIX.
4 Partage de données entre les threads
➥ POSIX et "Unix-like" sont parfois utilisé des manière interchangeable.
Présentation Chiheb Ameur ABID 15/ 79 Présentation Chiheb Ameur ABID 16/ 79
Les processus Les processus
Notion de processus
➥ Un processus est un programme encours d’exécution
➥ Permet de partager un même matériel entre plusieurs utilisateurs
➥ Isole les programmes
Z Communications simplifiées mais encadrées
Z Sécurité
Z Stabilité (exemple : crash de Firefox ne doit pas gêner LibreOffice)
➥ Notion des années 70, toujours d’actualité
Z Faire des traitements parallèles
Présentation Chiheb Ameur ABID 17/ 79 Présentation Chiheb Ameur ABID 18/ 79
Les processus Les processus
Notion de processus
➥ Dans le noyau du système d’exploitation, un processus est représenté par une structure de Ordonnancement des processus
données qui comprend : ➥ Dans un système multi-utilisateurs à temps partagé, plusieurs processus peuvent être
Z Un identificateur de processus présents en mémoire centrale en attente d’exécution
Z Un espace de mémoire virtuelle qui contient les instructions du programme et des ➥ Si plusieurs processus sont prêts, le système d’exploitation doit gérer l’allocation du
bibliothèques dynamique, une pile (stack) et un tas (heap) processeur aux différents processus à exécuter. C’est l’ordonnanceur (scheduler) qui
Z Une liste de descripteurs (handle ou descriptor) des différentes ressources systèmes s’acquitte de cette tâche.
(p. ex. les fichiers ouverts) accessibles par le processus.
Z Un jeton de sécurité qui permet au système d’exploitation de déterminer ce que le ➥ Un ordonnanceur fait face à deux problèmes principaux :
processus à le droit de faire. Z Le choix du processus à exécuter ;
Z le temps d’allocation du processeur au processus choisi
➥ Les principaux objectifs d’un ordonnanceur :
Z s’assurer que chaque processus en attente d’exécution reçoive sa part de temps
processeur ;
Z minimiser le temps de réponse ;
Z utiliser le processeur à 100
Z utiliser d’une manière équilibrée les ressources ;
Z prendre en compte les priorités ;
Z être prédictible.
Présentation Chiheb Ameur ABID 19/ 79 Présentation Chiheb Ameur ABID 20/ 79
Les processus Les processus
Plan Parallélisme
1 Linux
2 Les processus
Programmation parallèle
Gestion des processus ➥ Il est parfois utile d’exécuter simultanément plusieurs sousprogrammes pour
Identification des processus l’accomplissement d’une tâche.
➥ Il est possible de réaliser ces sous-programmes comme des programmes séparés et de les
3 Les threads Posix exécuter simultanément (p. ex. : scripts CGI).
Notion de threads ➥ Cela présente toutefois certains désavantages :
Modèles de séparation d’un programme en threads
Z La gestion des processus est relativement lourde pour le système.
Gestion des threads
Z Le temps nécessaire au démarrage d’un processus peut être long par rapport au temps
Attributs d’un thread
d’exécution du programme.
Z Les processus sont isolés les uns des autres, l’échange de données ou la
4 Partage de données entre les threads synchronisation entre les processus est mal aisé.
Les mutex
Sémaphore
Variable de condition
Présentation Chiheb Ameur ABID 23/ 79 Présentation Chiheb Ameur ABID 24/ 79
Les processus Les processus
Gestion des processus Gestion des processus
Présentation Chiheb Ameur ABID 27/ 79 Présentation Chiheb Ameur ABID 28/ 79
Les processus Les processus
Gestion des processus Gestion des processus
PID et PPID
➥ Connaitre son PID
1 Linux
1 pid_t getpid(void);
2 Les processus
➥ Connaitre le PPID
Gestion des processus
Identification des processus 1 pid_t getppid(void);
Présentation Chiheb Ameur ABID 31/ 79 Présentation Chiheb Ameur ABID 32/ 79
Les processus Les processus
Identification des processus Identification des processus
UID et EUID
➥ Un processus avec le bit Set-UID démarre avec les privilèges du propriétaire du
Exemple d’affichage l’UID et l’EUID programme
Z Généralement, le propriétaire du programme possède plus de privilèges
1 #include <stdio.h> Z Il est possible de réduire les privilèges en demandant de remplacer l’UID effectif par
2 #include <unistd.h> l’UID réel
3 #include <stdlib.h>
4 1 #include <unistd.h>
5 int main() { 2 /* Définir l’UID effectif du processus appelant. Si cet UID effectif est celui
6 printf("Real UID = %u , Effective UID = %u\n",getuid(),geteuid()); 3 * du superutilisateur, les UID réels et sauvés sont également définis */
7 return EXIT_SUCCESS; 4 int setuid(uid_t uid);
8 } 5
6 /* Définir l’UID effectif du processus appelant. Les processus non privilégiés
➥ Exécution normale 7 * peuvent uniquement définir leur UID effectif à la valeur de leur UID réel,
8 * de leur UID effectif ou de leur UID sauvé. */
9 int seteuid(uid_t euid);
➥ Exécution après l’ajout du bit Set-UID par l’utilisateur root 10
$ sudo chown root Exemple 11 /* Définir les ID d’utilisateur effectif et réel du processus appelant
12 * Les processus non privilégiés peuvent seulement définir leur UID effectif à
$ sudo chmod u+s Exemple la valeur de l’UID réel, de l’UID effectif ou de l’UID sauvé.Les utilisateurs
non privilégiés peuvent seulement définir l’UID réel à la valeur de l’UID réel
ou de l’UID effectif. */
13
14 int setreuid(uid_t ruid, uid_t euid);
Présentation Chiheb Ameur ABID 35/ 79 Présentation Chiheb Ameur ABID 36/ 79
Les processus Les threads Posix
Identification des processus
UID et EUID
➥ Lorsqu’une application s’exécute avec un UID effectif différent de son UID réel, c’est
dans le but de disposer par moment de privilèges auxquels son utilisateur n’a pas droit
directement 1 Linux
➥ Pour limiter les risques d’attaques, il est conseillé de modifier au plus vite l’UID effectif
pour employer l’identité réelle de l’utilisateur 2 Les processus
1 uid_t e_uid_initial;
2 uid_t r_uid; 3 Les threads Posix
3 int main (int argc, char * argv []) { Notion de threads
4 /* Sauvegarde des différents UIDs */
5 e_uid_initial = geteuid (); Modèles de séparation d’un programme en threads
6 r_uid = getuid (); Gestion des threads
7 seteuid (r_uid); /* limitation des droits à ceux du lanceur */ Attributs d’un thread
8 ...
9 fonction_privilegiee ();
10 ...
4 Partage de données entre les threads
11 }
12
13 void fonction_privilegiee (void) {
14 seteuid (e_uid_initial); /* Restitution des privilèges initiaux */
15 ...
16 /* Portion nécessitant les privilèges */
17 ...
18 seteuid (r_uid); /* Retour aux droits du lanceur */
19 }
Présentation Chiheb Ameur ABID 37/ 79 Présentation Chiheb Ameur ABID 38/ 79
Les threads Posix Les threads Posix
Notion de threads Notion de threads
1 Linux
Présentation Chiheb Ameur ABID 39/ 79 Présentation Chiheb Ameur ABID 40/ 79
Les threads Posix Les threads Posix
Notion de threads Notion de threads
Processus vs Thread
Processus vs Thread
➥ Processus (lourd)
Z Contient tout ce qui est nécessaire à l’exécution (registre du processeur, ressources,
mémoire, etc.)
Z Communication uniquement via des canaux dédiés (IPC) : Signaux, Tubes, Memory
Map, Sockets, etc.
Z Commutation de contexte lente
➥ Thread (processus léger)
Z Un processus contient un ou plusieurs threads
Z Chaque thread a son propre compteur programme, sa propre pile
Z Ces threads partagent les mêmes ressources, la même mémoire
Z Commutation de contexte plus rapide
Z Communications = partage de variables ⇒ Accès concurrents
Présentation Chiheb Ameur ABID 41/ 79 Présentation Chiheb Ameur ABID 42/ 79
Les threads Posix Les threads Posix
Notion de threads Modèles de séparation d’un programme en threads
1 Linux
Présentation Chiheb Ameur ABID 43/ 79 Présentation Chiheb Ameur ABID 44/ 79
Les threads Posix Les threads Posix
Modèles de séparation d’un programme en threads Modèles de séparation d’un programme en threads
Modèles de séparation d’un programme en threads Modèles de séparation d’un programme en threads
Le modèle délégation
➥ Un seul thread, le patron, accepte les entrées pour l’ensemble du programme
Z Sur la base de cette entrée, le patron transmet des tâches spécifiques à un ou plus aux
threads de travail
➥ Le patron crée chaque thread de travail, lui attribue des tâches et, si nécessaire, attend qu’il
Comment décomposer un programme en threads ? se termine
➥ Comment décomposer un programme en plusieurs threads ? ➥ Il est important que vous minimisez la fréquence à laquelle le patron et ouvriers
communiquent.
➥ Il existe plusieurs modèles
Z Le modèle délégation (boss-worker model ou delegation model)
Z Le modèle pair (peer model)
Z Le modèle pipeline (pipeline model)
Présentation Chiheb Ameur ABID 45/ 79 Présentation Chiheb Ameur ABID 46/ 79
Les threads Posix Les threads Posix
Modèles de séparation d’un programme en threads Modèles de séparation d’un programme en threads
Modèles de séparation d’un programme en threads Modèles de séparation d’un programme en threads
Le modèle pair
➥ Tous les threads travaillent simultanément sur leurs tâches sans leader.
➥ Un seul thread doit créer tous les autres threads homologues au démarrage du programme.
Z Ce thread agit ensuite comme un autre thread, ou se suspend en attendant les autres Le modèle pipeline
pairs finir.
➥ Le modèle de pipeline suppose
➥ Le modèle de pair convient aux applications qui ont un ensemble fixe et bien défini
Z Un long flux d’entrée
d’entrées
Z Une série de sous-opérations (appelées étapes ou filtres) à travers lesquelles chaque
unité d’entrée doit être traitée.
Z Chaque étape de traitement peut gérer une unité d’entrée différente à la fois.
Présentation Chiheb Ameur ABID 47/ 79 Présentation Chiheb Ameur ABID 48/ 79
Les threads Posix Les threads Posix
Modèles de séparation d’un programme en threads Modèles de séparation d’un programme en threads
1 Linux
2 Les processus
Gestion des processus
Généralités sur l’interface Pthreads Identification des processus
➥ Types de données sont structures opaques, fonctions d’accès spécifiques
➥ L’interface compte 60 fonctions, nous ne verrons pas tout 3 Les threads Posix
Notion de threads
➥ Il faut charger le fichier d’entête pthread.h dans les sources Modèles de séparation d’un programme en threads
➥ Il faut spécifier l’option -pthread à gcc Gestion des threads
Attributs d’un thread
Présentation Chiheb Ameur ABID 51/ 79 Présentation Chiheb Ameur ABID 52/ 79
Les threads Posix Les threads Posix
Gestion des threads Gestion des threads
Z Le thread A joint le thread B : A bloque jusqu’à la fin de B Z Détacher un thread revient à dire que personne ne le joindra à sa fin
Z Utile pour la synchronisation (rendez-vous) Z Le système libère ses ressources au plus vite
Z Second argument reçois un pointeur vers la valeur retour du pthread_exit() Z Evite les threads zombies quand on ne veut ni synchroniation, ni code de retour ´
Z On ne peut pas ré-attacher un thread détaché
Présentation Chiheb Ameur ABID 55/ 79 Présentation Chiheb Ameur ABID 56/ 79
Les threads Posix Les threads Posix
Attributs d’un thread Attributs d’un thread
1 Linux
1 Linux
Modèle de mémoire partagée
2 Les processus ➥ Tous les threads ont accès à la même mémoire
partagée globalement
3 Les threads Posix ➥ Les données peuvent être partagées ou privées
➥ Les données partagées sont accessibles par tous les
4 Partage de données entre les threads threads
Les mutex
Sémaphore ➥ Les données privées ne peuvent être accédées que par
Variable de condition les threads qui les possèdent
➥ Synchronisation explicite
Présentation Chiheb Ameur ABID 59/ 79 Présentation Chiheb Ameur ABID 60/ 79
Partage de données entre les threads Partage de données entre les threads
Partage de données entre les threads Partage de données entre les threads
1 Linux
2 Les processus
Problème de section critique Gestion des processus
Identification des processus
➥ Lorsqu’un thread manipule une donnée (ressource) partagée avec d’autres, nous disons
qu’il se trouve dans une section critique
3 Les threads Posix
➥ Le problème de la SC est de trouver un algorithme d’exclusion mutuelle de threads
Notion de threads
Z Les résultats de leurs actions ne dépend pas de l’ordre de leur entrelacement Modèles de séparation d’un programme en threads
➥ L’exécution de la section critique doit être mutuellement exclusive et indivisible Gestion des threads
Z Un seul thread exécute la SC Attributs d’un thread
Présentation Chiheb Ameur ABID 63/ 79 Présentation Chiheb Ameur ABID 64/ 79
Partage de données entre les threads Partage de données entre les threads
Les mutex Les mutex
Présentation Chiheb Ameur ABID 67/ 79 Présentation Chiheb Ameur ABID 68/ 79
Partage de données entre les threads Partage de données entre les threads
Les mutex Sémaphore
Sémaphore Sémaphore
Présentation Chiheb Ameur ABID 71/ 79 Présentation Chiheb Ameur ABID 72/ 79
Partage de données entre les threads Partage de données entre les threads
Sémaphore Sémaphore
Sémaphore Sémaphore
Z Renvoie 0 si OK, sinon un code d’erreur Z Renvoie 0 si OK, sinon un code d’erreur
Z name : le nom du sémaphore ➥ Décrémenter un sémaphore : l’opération P() et bloque le thread si nécessaire
Z value : valeur initiale du sémaphore. Par défaut 1.
Z flags : Seulement quelques valeurs possibles de flags parmi celles du open : 1 int sem_wait(sem_t *s);
1 Linux
2 Les processus
Gestion des processus Présentation
Identification des processus ➥ Attendre (sans CPU) qu’un autre thread ait réalisé un traitement
➥ Notifier les autres threads quand un travail est terminé
3 Les threads Posix Z Coopération entre les threads !
Notion de threads
Modèles de séparation d’un programme en threads ➥ Nécessite la mise en place de variables partagées
Gestion des threads Z Pour indiquer la fin d’un traitement
Attributs d’un thread Z Pas d’attente active
Z Donc, basée sur l’utilisation de mutex
4 Partage de données entre les threads
Les mutex
Sémaphore
Variable de condition
Présentation Chiheb Ameur ABID 75/ 79 Présentation Chiheb Ameur ABID 76/ 79
Partage de données entre les threads Partage de données entre les threads
Variable de condition Variable de condition
Présentation
➥ En C, les variables de conditions sont représentées par le type pthread_cond_t
Principe d’utilisation d’une variable de condition
➥ Principe de fonctionnement
Z Un thread reste bloqué jusqu’à que la condition spécifiée par la variable de condition ➥ Une variable de condition est toujours associée à un mutex
soit réalisée Z Éviter les problèmes d’accès concurrents à la variable
Z Un autre thread sert à signaler que la condition a été bien remplie ➥ Le thread qui doit attendre une condition
➥ Avant son utilisation, une variable de condition doit être initialisée Z Initialise la variable et le mutex qui lui est associé
Z Initialisation statique Z Bloque le mutex , puis se mettre en attente de la réalisation de la condition
Z Libère le mutex
1 pthread_cond_t cond=PTHREAD_COND_INITIALIZER;
➥ Le thread réalisant la condition
Z Initialisation dynamique Z Travaille jusqu’à réaliser la condition
1 int pthread_cond_init(pthread_cond_t *cond,const pthread_condattr_t *cattr); Z Bloque le mutex associé à la condition
Z Envoie un signal pour montrer que la condition est remplie
L’argument cattr n’a pas d’utilité et il est fixé à NULL Z Libère le mutex
➥ Une variable de condition inutilisée est libérée avec pthread_cond_destroy()
1 int pthread_cond_destroy(pthread_cond_t *cond);
Présentation Chiheb Ameur ABID 77/ 79 Présentation Chiheb Ameur ABID 78/ 79
Partage de données entre les threads Partage de données entre les threads
Variable de condition Variable de condition
Questions ?