Chapitre 1 : Parallélisme Processus Threads - Système d’exploitation PDF
Document Details
Uploaded by Deleted User
Université de Blida 1
Dr N. TOUBALINE
Tags
Related
- Système d’exploitation I - 2024/2025 - Université Moulay Ismail
- TD10 Application simple en mode utilisateur en MIPS PDF
- Séquence de démarrage pour disques MBR PDF
- Chapitre 2 : L'Exclusion Mutuelle Entre Processus PDF
- Création de comptes utilisateurs sur le système d'exploitation PDF
- Support de Cours SE2 2024/2025 (PDF)
Summary
Ce document est un chapitre d'un cours de système d'exploitation, qui porte sur le concept de parallélisme au travers des processus et des threads. Il présente les notions de base et décrit les différents états d'un processus, ainsi que les ressources utilisées et les relations entre processus. Il aborde également des concepts spécifiques au système d'exploitation Linux.
Full Transcript
Université de Blida 1 Système d’exploitation 2 Département d’informatique L3 SIQ Chapitre 1 : Notion de parallélisme (Processus & Threads) 1. Notion de processus Un p...
Université de Blida 1 Système d’exploitation 2 Département d’informatique L3 SIQ Chapitre 1 : Notion de parallélisme (Processus & Threads) 1. Notion de processus Un processus peut être défini comme l’exécution d’un programme comportant des instructions et des données : c’est un élément dynamique créé à un instant donné et qui disparaît en général au bout d’un temps fini, après être passé par différents états au cours de sa durée de vie dans le système. 2. Etats d’un processus La période d'existence d'un processus est celle s'écoulant entre l'instant de sa création et l'instant de sa destruction. Durant son existence, tout processus peut passer par une série d'états. Principaux états: 1) Etat Actif: le processus dispose de toutes les ressources y compris le processeur. 2) Etat Prêt: le processus dispose de toutes les ressources sauf du processeur. 3) Etat Bloqué: le processus ne peut plus progresser, il est en attente d'une ressource autre que le processeur. 3. Ressources d’un processus L’exécution d’un processus nécessite un certain nombre de ressources. Ces ressources peuvent être logiques ou physiques. Les ressources physiques sont la mémoire, le processeur, les périphériques etc. Les ressources logiques peuvent être une variable, un fichier, un code, etc. Certaines ressources peuvent être utilisées en même temps (ou partagées) par plusieurs processus. Dans ce cas, elles sont dites partageables ou à accès multiple. Dans le cas contraire, elles sont dites à un seul point d’accès ou à accès exclusif. Dans ce dernier cas, il est nécessaire d’ordonner l’accès à ce type de ressources pour éviter des situations incohérentes. 4. Relations entre processus : Parallélisme, coopération et compétition La programmation parallèle consiste à exécuter simultanément plusieurs programmes, qui coopèrent pour réaliser un but commun et/ou qui sont en compétition pour la possession de ressources. L’exécution parallèle peut se faire : Sur une machine ne disposant que d’un seul processeur partagé. Sur une machine ayant plusieurs processeurs. Sur plusieurs machines différentes relier par un réseau de communication. Durant leur évolution, les processus d’un système interagissent les uns avec les autres. Selon que les processus se connaissent mutuellement ou pas, deux types interactions sont possibles : 1) Compétition : Situation dans laquelle plusieurs processus doivent utiliser simultanément une ressource à accès exclusif (ressource ne pouvant être utilisée que par un seul processus à la fois). Exemple : Processeur (cas du pseudo-parallélisme) ; Imprimante. - Une solution possible : Faire attendre le processus demandeurs que l'occupant actuel ait fini. 2) Coopération : Situation dans laquelle plusieurs processus collaborent à une tâche commune et doivent se synchroniser pour réaliser cette tâche. Exemple : P1 produit un fichier ; P2 imprime le fichier. P1 met à jour un fichier ; P2 consulte le fichier. Chargée de cours Dr N. TOUBALINE 1/4 Université de Blida 1 Système d’exploitation 2 Département d’informatique L3 SIQ - La synchronisation se ramène au cas suivant : Un processus doit attendre qu'un autre processus ait franchi un certain point de son exécution. Dans les 2 types de relations (compétition ou coopération), on est conduit à faire attendre un processus. 5. Processus sous Linux Un processus est identifié de manière unique par un numéro (pid: Process IDentifier). La fonction getpid() indique le numéro du processus qui l’exécute. Sous UNIX, les processus sont organisés sous forme d'une hiérarchie (chaque processus à un processus père). La fonction getppid() indique le numéro du processus père. On peut faire appel a la fonction fork() pour créer de nouveau processus parallèles. Cette primitive crée un nouveau processus (appelé fils) qui est une copie exacte du processus appelant (processus père). La différence est faite par la valeur de retour de fork(), qui est égale à zéro chez le processus fils, et elle est égale au pid du processus fils chez le père. La primitive renvoie -1 en cas d’erreur. L’appel système wait() suspend l’exécution du processus appelant (père) jusqu’à ce que l’un de ses fils se termine (le premier fils qui se termine). La fonction waitpid() peut être utiliser pour attendre un fils particulier (spécifier par son pid comme argument de la fonction). Les processus peuvent transmettre des signaux (signal.h). On utilise généralement les signaux SIGUSR1 et SIGUSR2 qui sont à la disposition des usagers (développeurs). La fonction kill() permet d’émettre un signal à un processus kill (pid_ du_ processus_destination, nom_du_signal ). La fonction signal() permet d’indiquer l'action à effectuer en réponse à un signal. Son premier paramètre est le numéro du signal, et le deuxième paramètre est soit: SIG_IGN, qui indique que le signal doit être ignoré; SIG_DFL, qui correspond à l'action par défaut pour le signal; Le nom de la fonction de gestion de signal (la fonction doit être de type void). La fonction pause() de unistd.h permet à un processus de se mettre en attente bloquante de n'importe quel signal. 6. Les processus légers (Threads) Un processus est un programme qui s’exécute selon un chemin unique (compteur ordinal). On dit qu’il a un flot de contrôle unique (un seul thread). De nombreux systèmes d’exploitation modernes offrent la possibilité d’associer à un même processus plusieurs chemins d’exécution. On parle du multithread qui permet d’exécuter en parallèle des parties d'un même processus. Chaque partie correspond à un chemin d'exécution du processus. Les différents threads d’une application partage un même espace d’adressage en ce qui concerne leurs données (variables globales). Chaque thread a cependant, en plus des ressources communes, sa propre zone de données ou de variables locales, sa propre pile d'exécution, ses propres registres et son propre compteur ordinal. Chargée de cours Dr N. TOUBALINE 2/4 Université de Blida 1 Système d’exploitation 2 Département d’informatique L3 SIQ 6.1. Création d’un thread (POSIX) La création d'un processus donne lieu à la création du thread principal (thread main). Un retour à la fonction main entraîne la terminaison du processus et par conséquent la terminaison de tous ses threads. Le thread principal peut créer des threads annexes par la fonction pthread_create(). Le nouveau thread crée : -est identifié par un identificateur unique TID : Thread Identifier (pthread_self). -exécute une fonction passée en paramètre lors de sa création. -possède des attributs : sa stratégie d'ordonnancement, sa priorité, tâche joignable/détachable, etc. -peut se terminer (pthread_exit). -peut attendre la fin d'un autre thread : appartenant au même processus (pthread_join). Un retour de la fonction correspondante au thread annexe ou un appel à la fonction pthread_exit entraîne la terminaison du thread annexe sans effet sur l'existence du processus ou des autres threads. Par contre, l'appel de la fonction exit() par un thread annexe provoque la terminaison du processus et de tous les autres threads. Le thread qui exécute pthread_join() se bloque seulement si le thread attendu n’est pas terminé. Dans le cas ou le thread attendu est déjà terminé, le thread appelant ne se bloqué pas. Et puis, le thread attendu doit être joignable (non détachable). Les threads sont par défaut dans l’état joignable. Exemple : #include #include void *fonctionThread() { printf(“\n Je suis le thread %d“,pthread_self()) ; pthread_exit(NULL) ; } main() { printf(“\nJe suis le main“) ; pthread_t th ; pthread_create(&th,NULL,fonctionThread,NULL) ; pthread_join(th,NULL); } 6.2. Etapes d’exécution sous Linux Etape de compilation : la commande « gcc -o nom_executable nom_fichier.c -lpthread » Lors de la compilation, l'option -lpthread indique au compilateur que le programme utilise la bibliothèque pthread. L'option -o permet de générer le fichier exécutable nom_executable (on peut choisir le nom de l’exécutable au moment de la compilation) issu du fichier source nom_fichier.c (ou notre programme est déjà édité). Etape d’exécution : «./nom_executable ». Chargée de cours Dr N. TOUBALINE 3/4 Université de Blida 1 Système d’exploitation 2 Département d’informatique L3 SIQ 6.3. Inconvénient des threads Dans une application multi-threads, les échanges de données entre threads se font facilement par accès aux variables globales communes. L’inconvénient des threads résulte ainsi de ce partage d’un même espace entre tous les threads d'un même processus. Il faut donc gérer l’accès concurrent à ces ressources. Ce qui nécessité de programmer des sections critiques et de synchroniser les threads. Exemple d’opérations bancaires Solde initial=1000 Programme 1 Programme 2 1. Courant=lire_compte(1867A) 1. Courant=lire_compte(1867A) 2. Nouveau=courant+1000 2. Nouveau=courant+3000 3. Ecrire_compte(1867A, nouveau) 3. Ecrire_compte(1867A, nouveau) Exécuté par un processus P1 Exécuté par un processus P2 Les processus p1 et p2 sont lancés depuis deux agences différentes. Les deux processus se déroulent en parallèle, l’exécution des opérations peut être entrelacée dans un ordre quelconque. 1ère exécution : p1.1 ; p1.2 ; p1.3 ; p2.1 ; p2.2 ; p2.3 Quel est le solde résultant ? 2ème exécution : p1.1 ; p2.1 ; p1.2 ; p2.2 ; p1.3; p2.3 Quel est le solde résultant ? Quel est le problème ? Que peut-on conclure ? Chargée de cours Dr N. TOUBALINE 4/4