La programmation système en C sous Unix 4 heures ! {0} Facile|{1} Moyenne|{2} D

La programmation système en C sous Unix 4 heures ! {0} Facile|{1} Moyenne|{2} Difficile Mis à jour le 19/03/2018 " # Les processus Dans ce chapitre, nous allons apprendre à maîtriser les processus de bout en bout, de leur création jusqu'à leur terminaison. Dans cette première sous-partie, nous allons découvrir la notion de processus de façon généraliste, c'est-à-dire les concepts de ces derniers présents dans tous les systèmes d'exploitation qui les utilisent. Parallélisme et pseudo-parallélisme La base des ordinateurs modernes, c'est le parallélisme. Il est désormais inconcevable qu'un ordinateur ne puisse exécuter plusieurs programmes en même temps. Du point de vue matériel, le processeur passe d'un programme à un autre en quelques millisecondes, ce qui va donner à l'utilisateur une impression de simultanéité. C'est le pseudo- parallélisme, à différencier avec le véritable parallélisme des systèmes multiprocesseurs. Les processus sont la base du pseudo-parallélisme. Programmes et processus Il est très important de différencier la notion de programme et la notion de processus. La définition exacte d'un processus, c'est programme en cours d'exécution auquel est associé un Connectez-vous ou inscrivez-vous gratuitement pour bénéficier de toutes les fonctionnalités de ce cours ! $ Présentation des processus % Accueil > Cours > La programmation système en C sous Unix > Les processus environnement processeur et un environnement mémoire. En effet, au cours de son exécution, les instructions d'un programme modifient les valeurs des registres (le compteur ordinal, le registre d'état...) ainsi que le contenu de la pile. Un programme, c'est une suite d'instructions (notion statique), tandis qu'un processus, c'est l'image du contenu des registres et de la mémoire centrale (notion dynamique). Espace d’adressage des processus Chaque processus possède un espace d'adressage, c'est-à-dire un ensemble d'adresses mémoires dans lesquelles il peut lire et écrire. Cet espace est divisé en trois parties : le segment de texte (le code du programme) ; le segment de données (les variables) ; la pile. Voici une schématisation d'un espace d'adressage : Eh bien, c'est un trou. La pile empiète sur cet espace de manière automatique et l'extension du segment de données commence lors d'une allocation dynamique. Le segment de texte (le code), quant à lui, ne bouge pas. Ordonnancement des processus Lorsqu'un processus est lancé, le système doit gérer la mémoire et l'allocation du processeur lui étant accordée. Il fait appel à l'ordonnanceur (scheduler en anglais). Un système d'exploitation est préemptif lorsqu'il peut arrêter à tout moment n'importe quelle application pour passer à la suivante (exemple : Windows XP, Windows 7 et GNU/Linux sont des systèmes préemptifs). Il peut aussi être coopératif quand il permet à plusieurs applications de fonctionner et d'occuper la mémoire, et leur laissant le soin de gérer cette occupation (exemple : Windows 95, 98 et Millénium sont des systèmes coopératifs). En résumé : multitâche préemptif : le système d'exploitation garde le contrôle et se réserve le droit de fermer l'application. multitâche coopératif : le système d'exploitation laisse les applications gérer. Hep, minute ! C'est quoi ce vide au milieu ? Vous aurez donc compris que le multitâche coopératif est plus « dangereux » pour le système, car risque de blocage si une application fait des siennes. Enfin, dernière chose à retenir : les systèmes basés sur Unix sont des systèmes préemptifs. Nous allons maintenant voir certaines notions et termes de vocabulaire relatifs aux processus, en étudiant leur implémentation sous Unix. Particularités de la gestion des processus sous Unix Dans les systèmes basés sur Unix tout particulièrement, les processus jouent un rôle très important. Le concept de processus a été mis au point dès les débuts de ce système : il a ainsi participé à sa gloire et à sa célébrité. Une des particularités de la gestion des processus sous Unix consiste à séparer la création d'un processus et l'exécution d'une image binaire. Bien que la plupart du temps ces deux tâches sont exécutées ensemble, cette division a permis de nouvelles libertés quant à la gestion des tâches. Par exemple, cela permet d'avoir plusieurs processus pour un même programme. Autrement dit, sous les autres systèmes d'exploitation (mis à part quelques exceptions), processus = nouveau programme, alors que sous Unix ce n'est pas forcément le cas. Ce principe, peu utilisé dans les autres systèmes, a survécu de nos jours. Alors que la plupart des systèmes d'exploitation offrent un seul appel-système pour exécuter un nouveau programme, Unix en possède deux : fork et exec (nous étudierons ce dernier dans le troisième chapitre). PID Chaque processus peut être identifié par son numéro de processus, ou PID (Process IDentifier). Un numéro de PID est unique dans le système : il est impossible que deux processus aient un même PID au même moment. Lorsque l'on crée un processus (nous verrons comment faire dans la suite du chapitre), on utilise une fonction qui permet de dupliquer le processus appelant. On distingue alors les deux processus par leur PID. Le processus appelant est alors nommé processus père et le nouveau processus processus fils. Quant on s'occupe du processus fils, le PID du processus père est noté PPID (Parent PID). Attribution du PID Par défaut, le noyau attribue un PID avec une valeur inférieure à 32768. Le 32768ème processus créé reçoit la plus petite valeur de PID libéré par un processus mort entre-temps (paix à son âme... ). Par ailleurs, cette valeur maximale peut être changée par l'administrateur en modifiant la valeur du fichier /proc/sys/kernel/pid_max. De plus, les PID sont attribués de façon linéaire. Par exemple, si 17 est le PID le plus élevé affecté, Notions % un processus créé à cet instant aura comme PID 18. Le noyau réutilise les PID de processus n'existant plus uniquement quand la valeur de pid_max est atteinte. UID Les systèmes basés sur Unix sont particulièrement axés sur le côté multi-utilisateur. Ainsi, il existe de très nombreuses sécurités sur les permissions nécessaires pour exécuter telle ou telle action. C'est pour cela que chaque utilisateur possède un identifiant, sous forme numérique, nommé UID (User IDentifier). En conséquence, nous pouvons également distinguer les processus entre eux par l'UID de l'utilisateur qui les a lancés. Quelques remarques sur la valeur de l'UID La valeur de l'UID est comprise entre les constantes UID_MIN et UID_MAX du fichier /etc/login.defs. Conventionnellement, plus l'UID est bas, plus l'utilisateur a des privilèges. Néanmoins, l'attribution de l'UID est de la compétence de l'administrateur du système. Ainsi, cette règle n'est pas toujours vérifiable. Les valeurs inférieures à 100 sont généralement réservées aux utilisateurs standards (« par défaut » si vous préférez). Différents UID On distingue trois identifiants d'utilisateur par processus : l'UID réel : il correspond à l'UID de l'utilisateur qui a lancé le processus ; l'UID effectif : il correspond aux privilèges accordés à cet utilisateur ; l'UID sauvé : c'est la copie de l'ancien UID réel quand celui-ci a été modifié par un processus. Pour examiner tous les utilisateurs de l'ordinateur, allez dans /etc et ouvrez le fichier texte nommé passwd. Ce fichier rassemble des informations sur tous les utilisateurs ayant un compte sur le système ; une ligne par utilisateur et 7 champs par ligne, séparés par le caractère deux-points ( : ). NOM : MOT DE PASSE : UID : GID : COMMENTAIRE : RÉPERTOIRE : COMMANDE En fait, l'analyse de ce fichier ne nous importe peu mais cela peut vous permettre de connaître les différents utilisateurs de l'ordinateur (les plus connus étant root et vous-même ; mais vous pouvez remarquer qu'il en existe plein d'autres!). Permission Set – UID Il existe une permission spéciale, uniquement pour les exécutables binaires, appelée la permission Set – UID. Cette permission permet à l'utilisateur ayant les droits d'exécution sur ce fichier d'exécuter le fichier avec les privilèges de son propriétaire. On met les droits Set - UID avec la commande chmod et l'argument +s. On passe en second argument le nom du fichier. Exemple : GID Chaque utilisateur du système appartient à un ou plusieurs groupes. Ces derniers sont définis dans le fichier /etc/groups. Un processus fait donc également partie des groupes de l'utilisateur qui l'a lancé. Comme nous l'avons vu avec les UID, un processus dispose donc de plusieurs GID (Group IDentifier) réel, effectif, sauvé, ainsi que de GID supplémentaires si l'utilisateur qui a lancé le processus appartient à plusieurs groupes. Connaître le GID d'un processus n'est pas capital, c'est pourquoi nous ne nous arrêterons pas sur ce point. Organisation des processus Les processus sont organisés en hiérarchie. Chaque processus doit être lancé par un autre (rappelez-vous les notions sur processus père et processus fils). La racine de cette hiérarchie est le programme initial. En voici quelques explications. Le processus inactif du système (System idle process : le processus que le noyau exécute tant qu'il n'y a pas d'autres processus en cours d'exécution) a le PID 0. C'est celui-ci qui lance le premier processus que le noyau exécute, le programme initial. Généralement, sous les systèmes basés sous Unix, le programme initial se nomme init, et il a le PID 1. Si l'utilisateur indique au noyau le programme initial à exécuter, celui-ci tente alors de le faire uploads/Industriel/ les-processus-la-programmation-systeme-en-c-sous-unix-openclassrooms-pdf.pdf

  • 13
  • 0
  • 0
Afficher les détails des licences
Licence et utilisation
Gratuit pour un usage personnel Attribution requise
Partager