Cours Programmation Système Filière GI: AL & SRS Dr. HAJJI Tarik Faculté des sc
Cours Programmation Système Filière GI: AL & SRS Dr. HAJJI Tarik Faculté des sciences de l’ingénieure Université Privée de Fès Plan du cours • Ch1. Fonctions sur les processus • Ch.2. Gestion des signaux • Ch.3. Communication classique entre processus – Synchronisation père /fils – Tubes anonymes – Tubes nommés • Ch.4. Threads Posix • Ch.5. Communications avec les IPC Système V – Les files de messages – Segments de mémoire partagée – Les sémaphores 02/12/2021 2 hajji@upf.ac.ma Références • Ressources Internet • Livres: En particulier la référence suivante: • Titre: Programmation système en C sous Linux Signaux, processus, threads, IPC et sockets 2e édition • Auteur: Christophe Blaess • Edition: Eyrolles 02/12/2021 3 hajji@upf.ac.ma Chapitre I. Introduction aux processus • Le système Unix/Linux est multi-tâche: Plusieurs programmes peuvent s’exécuter simultanément sur le même processeur. • Puisque le processeur ne peut exécuter qu'une seule instruction à la fois, le noyau va donc découper le temps en tranches de quelques centaines de millisecondes (quantum de temps) et attribuer chaque quantum à un programme le processeur bascule entre les programmes. • L'utilisateur voit ses programmes s'exécuter en même temps. • Pour l’utilisateur, tout se passe comme si on a une exécution réellement en parallèle. 02/12/2021 4 hajji@upf.ac.ma 2. Définitions • Programme: c’est un fichier exécutable stocké sur une mémoire de masse. Pour son exécution, il est chargé en mémoire centrale. • • Processus (process en anglais), est un concept central dans tous système d’exploitation: – C’es un programme en cours d’exécution; c’est-à-dire, un programme à l’état actif. • C’est l’image de l’état du processeur et de la mémoire pendant l’exécution du programme. C’est donc l'état de la machine à un instant donné 02/12/2021 5 hajji@upf.ac.ma 3. Contexte d’un processus • Le contexte d’un processus (Bloc de Contrôle de Processus : BCP) contient toute les ressources nécessaires pour l’exécution d’un processus. – Il regroupe le code exécutable, sa zone de données, sa pile d’exécution, son compteur ordinal ainsi que toutes les informations nécessaire à l’exécution du processus. • L'opération qui consiste à sauvegarder le contexte d'un processus et à copier le contexte d'un autre processus dans le processeur s'appelle changement (ou commutation) de contexte. – La durée d'une commutation de contexte varie d'un constructeur à un autre, elle reste toutefois très faible. 02/12/2021 6 hajji@upf.ac.ma Remarque: • A chaque instant, le processeur ne traite qu’un seul processus. • Un processeur peut être partagé par plusieurs processus. – L’ordonnanceur (un algorithme d’ordonnancement) permet de déterminer à quel moment arrêter de travailler sur un processus pour passer à un autre. • Les processus permettent d’effectuer plusieurs activités en "même temps". • Exemple : – Compiler et en même temps imprimer un fichier. 02/12/2021 7 hajji@upf.ac.ma 4. Relations entre processus • 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) – Exemples • imprimante • Coopération – Situation dans laquelle plusieurs processus collaborent à une tâche commune et doivent se synchroniser pour réaliser cette tâche. – Exemples: soient p1 et p2 deux processus • p1 produit un fichier, p2 imprime le fichier • p1 met à jour un fichier, p2 consulte le fichier • Synchronisation: La synchronisation se ramène au cas suivant : un processus doit attendre qu’un autre processus ait terminé. 02/12/2021 8 hajji@upf.ac.ma 5. États d’un processus • A un instant donné, un processus peut être dans l'un des états suivants : – Actif (Elu, en Exécution): Le processus en cours d’exécution sur un processeur (il n'y a donc qu'un seul processus actif en même temps sur une machine mono- processeur). • On peut voir le processus en cours d’exécution en tapant la commande « ps » sur une machine Unix. – Un processus élu peut être arrêté, même s'il peut poursuivre son exécution. • Le passage de l'état actif à l'état prêt est déclenché par le noyau lorsque la tranche de temps attribué au processus est épuisée. 02/12/2021 9 hajji@upf.ac.ma 5. États d’un processus • prêt : Le processus est suspendu provisoirement pour permettre l'exécution d'un autre processus. – Le processus peut devenir actif dès que le processeur lui sera attribué par le système (il ne lui manque que la ressource processeur pour s’exécuter). • bloqué (en attente): Le processus attend un événement extérieur (une ressource) pour pouvoir continuer, par exemple lire une donnée au clavier. Lorsque la ressource est disponible, il passe à l'état "prêt". • Un processus bloqué ne consomme pas de temps processeur; il peut y en avoir beaucoup sans pénaliser les performances du système. • Terminé : le processus a terminé son exécution. 02/12/2021 10 hajji@upf.ac.ma 5. États d’un processus • La transition entre ces trois état est matérialisée par le schéma suivant: 02/12/2021 11 hajji@upf.ac.ma 6. Les identifiants d’un processus • Chaque processus est identifié par un numéro unique, – le PID (Processus IDentification) – et il appartient à un propriétaire identifié par UID (User ID) – et à un groupe identifié par GID (Group ID). • Le PPID (Parent PID) d’un processus correspond au PID du processus qui l’a créé. 02/12/2021 12 hajji@upf.ac.ma Les primitifs • La fonction « int getpid() » renvoie le numéro (PID) du processus en cours. • La fonction « int getppid() » renvoie le numéro du processus père (PPID). Chaque processus a un père, celui qui l’a créé. • La fonction« int getuid() » permet d’obtenir le numéro d’utilisateur du processus en cours (UID). • La fonction « int getgid() » renvoie le numéro du groupe du processus en cours (GID). 02/12/2021 13 hajji@upf.ac.ma 7. Création d’un processus • Un processus est créé au moyen d’un appel système – (« fork() » sous UNIX/Linux). • Cette création est réalisée par un autre processus (processus père). • Au démarrage du système, le processus « init » est lancé et les autres processus descendent directement ou indirectement de lui . • notion d’arborescence de descendance des processus (père- fils). – Cette arborescence admet un ancêtre unique et commun à tous: le processus « init ». – Pour avoir des informations sur les processus on utilise les commandes shells: « ps » ou « pstree » 02/12/2021 14 hajji@upf.ac.ma L’appel système de « fork() » • L’appel système « fork() » dans un processus permet de créer un nouveau processus. – Elle est déclarée dans <unistd.h>. • Il faut inclure le fichier d’en-tête <unistd.h> ( # include <unistd.h>) dans le programme qui appelle « fork() » • Syntaxe – pid_t fork(void); – La fonction « fork() » renvoit un entier. – « pid_t » est nouveau type qui est identique à un entier. • Il est déclaré dans « /sys/types.h ») . • Il est défini pour l’identificateur du processus. • A la place de «pid_t» on peut utiliser « int ». 02/12/2021 15 hajji@upf.ac.ma L’appel système de « fork() » • Le processus qui a invoqué la fonction « fork() » est appelé le processus père tandis que le processus créé est appelé le processus fils. • Le père et le fils ne se distinguent que par la valeur de retour de «fork()». • – Dans le processus père: la fonction « fork() » renvoie le numéro du processus nouvellement créé (le processus fils). – Dans le processus fils: la fonction « fork() » renvoie 0. – En cas d’échec, le processus fils n’est pas crée et la fonction renvoie « -1 ». 02/12/2021 16 hajji@upf.ac.ma Utilisation classique sans gestion des erreurs: • include <unistd.h> • include <stdio.h> • … • if (fork() != 0) { /*Exécution du code correspondant au processus père */ • } • else { /* if (fork() == 0) */ /*Exécution du code correspondant au processus fils */ • } 02/12/2021 17 hajji@upf.ac.ma • Exemple 1: Le processus père crée un fils, ensuite chaque processus affiche son identifiant. • #include <stdio.h> • #include <unistd.h> • int main() { if(fork() !=0) { printf("Je suis le pere: "); printf(" Mon PID est %d \n",getpid()); } else { printf("Je suis le fils:"); printf(" Mon PID est %d\n",getpid()); } } • Exécution: – % testfork – Je suis le pere: Mon PID est 1320 – Je suis le fils: Mon PID est 1321 – % • Attention: l’affichage peut apparaître dans l’ordre inverse. 02/12/2021 18 hajji@upf.ac.ma • Exemple 1: Le processus père crée un fils, ensuite chaque processus affiche son identifiant. #include <stdio.h> #include <unistd.h> int main() { if(fork() !=0) { printf("Je suis le pere: "); printf(" Mon PID est %d \n",getpid()); } else { printf("Je suis le fils:"); printf(" Mon PID est %d\n",getpid()); } } • Exécution: – % testfork – Je suis le pere: Mon PID est 1320 – Je suis le fils: Mon PID est 1321 – % • Attention: l’affichage peut apparaître dans l’ordre inverse. 02/12/2021 19 hajji@upf.ac.ma • Exemple 2: Le processus père crée un fils ensuite affiche son identifiant ainsi que celui de son fils. Le fils affiche son identifiant ainsi que celui de son père. #include <stdio.h> uploads/Industriel/ 2-programmation-systeme.pdf
Documents similaires
-
29
-
0
-
0
Licence et utilisation
Gratuit pour un usage personnel Attribution requise- Détails
- Publié le Dec 24, 2021
- Catégorie Industry / Industr...
- Langue French
- Taille du fichier 1.3551MB