Cours - SE - Umapon Seance4

Télécharger au format pdf ou txt
Télécharger au format pdf ou txt
Vous êtes sur la page 1sur 110

Cours de Système d’Exploitation

Université Mapon

By: Cyrille KESIKU


Ph.D. Student— Universidad de deusto — Bilbao - Spain
cyrille.kesiku@opendeusto.es

Novembre, 2023
Contenus du cours

Chapitre 2 : Processus et
Chapitre 1 : Introduction aux
Threads
Systèmes d’Exploitation
A lire pour ce cours (références )
1 ANDREW, S. Tanenbaum et HERBERT, Bos. Modern
operating systems. Pearson Education, 2015.
2 HAILPERIN, Max. Operating Systems and Middleware:
Supporting Controlled Interaction. Max Hailperin, 2007.
Chapitre 1 : Introduction aux Systèmes d’Exploitation

Dans ce chapitre on va voir


▶ 1.1. Définitions et Concepts Fondamentaux
▶ 1.2. Architecture d’un Système d’Exploitation
▶ 1.3. Types de Systèmes d’Exploitation
▶ 1.4. Éléments de Base du Système d’Exploitation
1.1. Définitions et Concepts Fondamentaux

1.1.1 Définition d’un système d’exploitation (SE)


Un système d’exploitation est un logiciel (chef d’orchestre) qui
utilise les ressources matérielles d’un système informatique pour
fournir un support à l’exécution d’autres logiciels. Il propose les
services suivants :
▶ Le système d’exploitation permet à plusieurs calculs de se
dérouler simultanément sur un seul système informatique.
▶ Le système d’exploitation contrôle les interactions entre les
calculs simultanés.
▶ Le système d’exploitation peut fournir un support pour
l’interaction contrôlée des calculs même lorsqu’ils ne
s’exécutent pas simultanément.
▶ Le système d’exploitation peut fournir un support pour
l’interaction contrôlée des calculs répartis entre différents
systèmes informatiques en utilisant le réseau.
Execuetion d’un programme dans un OS
Sans système d’exploitation, un ordinateur peut exécuter
directement un seul programme. Contrairement avec un
système d’exploitation, l’ordinateur peut prendre en charge des
calculs simultanés, contrôler les interactions entre eux et
permettre la communication à travers le temps et l’espace via
des fichiers et le réseau.
1.1.2 Rôles d’un SE
les systèmes d’exploitation agissent comme un gestionnaire
essentiel des ressources informatiques, fournissant une interface
entre le matériel et les logiciels tout en assurant la stabilité, la
sécurité et l’efficacité du système informatique. Parmis les rôle
principaux on retrouve:
▶ Interface Utilisateur : Fournir une interface utilisateur, qui
peut être en ligne de commande (CLI) ou graphique (GUI),
pour faciliter l’interaction entre l’utilisateur et l’ordinateur.
▶ Gestion des erreurs : Gérer les erreurs matérielles et
logicielles de manière à minimiser les perturbations et à
assurer la stabilité du système.
▶ Planification des tâches : Planifier l’exécution des tâches de
manière à optimiser l’utilisation des ressources et à
répondre aux besoins de performance du système.
▶ Communication inter-processus : Faciliter la
communication et la coopération entre les différents
processus en cours d’exécution sur le système.
▶ Maintenance du système : Assurer la maintenance et la
mise à jour du système d’exploitation pour incorporer de
nouvelles fonctionnalités, corriger des erreurs, et améliorer
la sécurité.
1.1.3 Histoire et évolution des systèmes d’exploitation
L’évolution des systèmes d’exploitation a été marquée par des
avancées constantes en matière de fonctionnalités, de
convivialité, de sécurité, et d’adaptation aux nouveaux
paradigmes informatiques.
▶ 1940-1950: Les premiers ordinateurs, tels qu’ENIAC et
UNIVAC, n’avaient pas de systèmes d’exploitation. Les
programmes étaient écrits directement en langage machine
et exécutés séquentiellement.
▶ 1950-1960: Les moniteurs de programmes sont développés
pour simplifier la programmation. Ils permettaient
l’exécution de plusieurs programmes en séquence, mais la
transition d’un programme à un autre nécessitait souvent
une intervention manuelle.
▶ Années 1960: Les premiers systèmes d’exploitation, tels
que CTSS (Compatible Time-Sharing System) et IBM
OS/360, ont été introduits. Ils ont permis le partage du
temps, permettant à plusieurs utilisateurs d’accéder
simultanément à l’ordinateur.
▶ Années 1970 L’émergence d’UNIX: Le système
d’exploitation UNIX, développé par Ken Thompson et
Dennis Ritchie aux laboratoires Bell, a introduit des
concepts clés tels que les fichiers, les répertoires, et le
multitâche. UNIX a eu une influence significative sur le
développement des systèmes d’exploitation.
▶ Années 1980 L’avènement des micro-ordinateurs: Les
micro-ordinateurs personnels tels que l’IBM PC sont
devenus populaires. Microsoft a lancé MS-DOS, un
système d’exploitation en ligne de commande, tandis
qu’Apple a introduit le système d’exploitation Macintosh
avec une interface graphique.
▶ Années 1990 La montée en puissance de Windows et Linux:
Microsoft Windows devient prédominant sur les
ordinateurs personnels avec l’introduction de Windows 3.0,
Windows 95, et les versions ultérieures. Linux, un système
d’exploitation open source basé sur UNIX, gagne également
en popularité.
▶ Années 2000-2010 La virtualisation et les systèmes
d’exploitation mobiles: La virtualisation devient une
technologie clé, permettant l’exécution de plusieurs
systèmes d’exploitation sur une seule machine. Les
systèmes d’exploitation mobiles, tels qu’iOS et Android,
émergent avec la prolifération des smartphones.
▶ Depuis 2010 L’essor du Cloud et des systèmes
d’exploitation modernes: Les systèmes d’exploitation
modernes, tels que Windows 10, macOS, et les
distributions Linux, intègrent des fonctionnalités avancées
et une sécurité renforcée. L’informatique en nuage (cloud
computing) influence également la manière dont les
applications interagissent avec les systèmes d’exploitation.
1.2. Architecture d’un Système d’Exploitation

1.2.1 Les différentes couches d’un SE


Un système d’exploitation (SE) est souvent conçu avec
différentes couches, chacune ayant des responsabilités
spécifiques. Ces couches sont organisées de manière hiérarchique
pour fournir un ensemble de services et de fonctionnalités.

Figure 1: Couches d’un SE


1.2.1.1. Noyau (Kernel)
Le noyau est la couche la plus basse du système d’exploitation.
Il constitue le cœur du système et est responsable de l’accès
direct aux ressources matérielles. Le noyau gère les opérations
fondamentales, telles que la gestion de la mémoire, la
planification des processus, la gestion des entrées/sorties, et la
gestion des interruptions.
1.2.1.2. Gestionnaire de système de fichiers
Cette couche est responsable de la gestion des fichiers et des
répertoires sur les dispositifs de stockage. Elle permet aux
utilisateurs et aux applications d’organiser, de stocker et de
récupérer des données de manière structurée. Les systèmes de
fichiers peuvent également inclure des mécanismes de contrôle
d’accès et de sécurité.
1.2.1.3. Gestionnaire des processus
Cette couche est chargée de la gestion des processus et de la
coordination de leur exécution. Elle alloue des ressources aux
processus, les planifie pour une exécution efficace, et permet la
communication entre les processus si nécessaire.
1.2.1.4. Gestionnaire de la mémoire
La gestion de la mémoire est assurée par cette couche, qui
alloue et libère la mémoire pour les processus en cours
d’exécution. Elle gère la mémoire virtuelle et physique pour
optimiser l’utilisation des ressources.

1.2.1.5. Gestionnaire des entrées/sorties


Cette couche gère les interactions avec les périphériques
d’entrée/sortie. Elle facilite la communication entre le système
d’exploitation et les périphériques, gérant les transferts de
données de manière efficace.
1.2.1.6. Interface utilisateur (Shell)
L’interface utilisateur, souvent appelée ”shell” en ligne de
commande, est la couche par laquelle les utilisateurs
interagissent avec le système. Elle permet l’exécution de
commandes et fournit un moyen de contrôler et de
communiquer avec le système d’exploitation.
1.2.2. Communication entre les composants du SE
La communication entre ces composants se fait souvent à
travers des interfaces bien définies, des appels système, des
structures de données partagées, et d’autres mécanismes de
communication. Une gestion efficace de cette communication
est essentielle pour assurer la stabilité, la sécurité et les
performances du système d’exploitation.
1.2.2.1. Communication entre le Noyau et les Processus :
Les processus communiquent avec le noyau du système
d’exploitation pour demander des ressources, effectuer des
opérations d’entrées/sorties, et signaler des événements tels que
la fin d’une tâche. Le noyau gère également la planification des
processus et la coordination de leur exécution.
1.2.2.2. Communication entre le Gestionnaire de la
Mémoire et les Processus :
Le gestionnaire de la mémoire gère l’allocation et la libération
de la mémoire pour les processus. Les processus peuvent
communiquer avec le gestionnaire de la mémoire pour demander
de l’espace mémoire, libérer de la mémoire non utilisée, et gérer
la mémoire virtuelle.
1.2.2.3. Communication entre le Gestionnaire des
Entrées/Sorties et les Processus :
Les processus peuvent communiquer avec le gestionnaire des
entrées/sorties pour effectuer des opérations d’entrées/sorties,
telles que la lecture à partir ou l’écriture vers des fichiers. Le
gestionnaire des entrées/sorties gère également les interruptions
liées aux périphériques.
1.2.2.4. Communication entre le Gestionnaire de Système
de Fichiers et les Processus :
Les processus interagissent avec le gestionnaire de système de
fichiers pour organiser, lire et écrire des données sur le stockage.
Les opérations de fichiers, comme l’ouverture, la fermeture, la
lecture et l’écriture, sont gérées par le gestionnaire de système
de fichiers.
1.2.2.5. Communication entre le Noyau et les Périphériques
Matériels :
Le noyau communique directement avec les périphériques
matériels pour gérer les interruptions, l’allocation de ressources,
et le contrôle général des périphériques. Les pilotes de
périphériques, des composants du noyau, facilitent cette
communication.
1.2.2.6. Communication entre le Noyau et le Gestionnaire
de Processus :
Le noyau et le gestionnaire de processus travaillent ensemble
pour gérer la création, la terminaison et la communication entre
les processus. Des mécanismes tels que les signaux peuvent être
utilisés pour signaler des événements entre les processus.
1.2.2.7. Communication entre le Noyau et l’Interface
Utilisateur (Shell) :
L’interface utilisateur, souvent sous la forme d’un shell,
communique avec le noyau pour exécuter des commandes et
obtenir des informations sur l’état du système. Le noyau peut
également envoyer des messages d’erreur ou d’état à l’interface
utilisateur.

Figure 2: Communication User Kernel


1.2.3. Modèles d’architecture : monolithique, en couches,
micronoyau
Les modèles d’architecture des systèmes d’exploitation
définissent la manière dont les composants du système sont
organisés et interagissent. Trois modèles d’architecture
couramment utilisés sont le modèle monolithique, le modèle en
couches et le modèle micronoyau.
1.2.3.1. Modèle Monolithique :
Dans un système d’exploitation monolithique, l’ensemble du
noyau du système est un bloc unique, une entité monolithique.
Toutes les fonctionnalités, y compris la gestion des processus, la
gestion de la mémoire, la gestion des fichiers, etc., sont
implémentées dans ce noyau monolithique. Cela signifie que
toutes les parties du noyau ont un accès direct aux structures
de données et aux fonctions du noyau.
Avantages :
+ Performances généralement meilleures car les appels de
fonctions sont directs.
+ Pas de surcoût lié à la communication entre les différentes
parties du noyau.
Inconvénients :
+ Moins modulaire et moins facile à maintenir.
+ Un problème dans une partie du noyau peut affecter
l’ensemble du système.
1.2.3.2. Modèle en Couches :
Dans un modèle en couches, le noyau est divisé en couches
distinctes, chaque couche offrant des services spécifiques.
Chaque couche communique uniquement avec les couches
adjacentes. Par exemple, une couche de gestion de la mémoire
peut communiquer avec une couche de gestion des processus,
mais pas directement avec la couche de gestion des fichiers.
Avantages :
+ Plus modulaire, ce qui facilite la maintenance et l’extension
du système.
+ Isolation entre les différentes fonctionnalités, réduisant le
risque d’impact global en cas de problème dans une couche.
Inconvénients :
+ Un surcoût peut être introduit par la nécessité de passer
par plusieurs couches pour accéder à certaines
fonctionnalités.
1.2.3.3. Modèle Micronoyau :
Le modèle micronoyau repousse encore plus loin le concept de
modularité. Dans ce modèle, le noyau est réduit au minimum
absolu. Les services de base tels que la gestion des processus, la
gestion de la mémoire et la communication entre processus sont
mis en œuvre dans le micronoyau. Les services supplémentaires,
tels que les systèmes de fichiers ou les pilotes de périphériques,
sont déplacés en tant que processus utilisateur en dehors du
noyau.
Avantages :
+ Extrême modularité et extensibilité.
+ Possibilité de mettre à jour ou remplacer des composants
du système sans redémarrer l’ensemble du système.
Inconvénients :
+ Une légère surcharge de performance due à la nécessité de
communiquer entre processus pour accéder à certains
services.
+ La complexité peut être plus élevée en raison de la
nécessité de gérer les communications inter-processus.
1.3. Types de Systèmes d’Exploitation

1.3.1. Systèmes d’exploitation pour ordinateurs personnels


Les systèmes d’exploitation pour ordinateurs personnels sont
conçus pour répondre aux besoins des utilisateurs individuels et
offrir une interface conviviale.
1.3.1.1. Microsoft Windows :
Windows est l’un des systèmes d’exploitation les plus répandus
pour les ordinateurs personnels. Les versions populaires
incluent Windows 10, Windows 8, et leurs prédécesseurs.
Windows propose une interface graphique utilisateur (GUI)
avec le bureau, des icônes et une barre des tâches.
1.3.1.2. macOS :
Développé par Apple, macOS est le système d’exploitation
utilisé sur les ordinateurs Macintosh. Il offre une expérience
utilisateur intuitive et est connu pour son design élégant.
macOS intègre des fonctionnalités spécifiques aux produits
Apple, comme le Finder et Siri.

1.3.1.3. Linux (et distributions Linux) :


Linux est un système d’exploitation open source basé sur
UNIX. Bien que davantage utilisé dans des environnements
serveur, Linux est également déployé sur les ordinateurs
personnels. Il existe de nombreuses distributions Linux, telles
qu’Ubuntu, Fedora, et Debian, chacune offrant des
fonctionnalités spécifiques.
1.3.1.4. Chrome OS :
Chrome OS, développé par Google, est conçu pour les
ordinateurs portables appelés Chromebooks. Il est basé sur le
navigateur web Google Chrome et met l’accent sur l’utilisation
d’applications web et le stockage dans le cloud.

BSD (Berkeley Software Distribution) :


Les systèmes BSD, dérivés d’UNIX, sont utilisés dans des
environnements variés, y compris les ordinateurs personnels.
FreeBSD, NetBSD, et OpenBSD sont des exemples de
distributions BSD.
1.3.2. Systèmes d’exploitation pour serveurs
Les systèmes d’exploitation pour serveurs sont spécialement
conçus pour répondre aux besoins de gestion de ressources, de
stabilité et de sécurité dans des environnements serveur.
Le choix du système d’exploitation pour un serveur dépend
souvent des besoins spécifiques de l’entreprise, des applications
à exécuter et des compétences disponibles pour la gestion du
système. Chaque système d’exploitation a ses propres avantages
et inconvénients en termes de performances, de sécurité et de
fonctionnalités.
1.3.2.1. Linux (et distributions Linux) :
Linux est largement utilisé comme système d’exploitation
serveur en raison de sa stabilité, de sa sécurité et de son modèle
open source. De nombreuses distributions Linux, telles que
Ubuntu Server, CentOS, Red Hat Enterprise Linux (RHEL), et
Debian, sont populaires pour les serveurs.

1.3.2.2. Windows Server :


Microsoft propose une version du système d’exploitation
spécifiquement destinée aux serveurs, appelée Windows Server.
Il offre des fonctionnalités adaptées aux besoins des
environnements serveur, comme la gestion des utilisateurs, la
virtualisation et les services réseau.
1.3.2.3. Unix :
UNIX, un système d’exploitation robuste et puissant, a
influencé de nombreux systèmes d’exploitation actuels. Certains
dérivés d’UNIX, tels qu’AIX (IBM), Solaris (Oracle), et HP-UX
(Hewlett Packard), sont utilisés sur des serveurs d’entreprises.

1.3.2.4. FreeBSD :
Basé sur BSD, FreeBSD est un système d’exploitation qui
combine des fonctionnalités de performance et de sécurité. Il est
utilisé dans des environnements serveur, en particulier pour les
services de réseau et l’hébergement web.
1.3.2.5. VMware ESXi :
VMware ESXi est un hyperviseur bare-metal conçu
spécifiquement pour la virtualisation. Il est souvent utilisé
comme système d’exploitation pour les serveurs qui hébergent
des machines virtuelles.

1.3.2.6. Oracle Linux :


Oracle propose une distribution Linux appelée Oracle Linux,
qui est optimisée pour les charges de travail Oracle et les
environnements d’entreprise.
1.3.2.7. OpenBSD :
OpenBSD, une variante de BSD, se concentre sur la sécurité et
la stabilité. Il est parfois utilisé dans des environnements
serveur pour des applications nécessitant un niveau élevé de
sécurité.
1.3.3. Systèmes d’exploitation embarqués
Les systèmes d’exploitation embarqués sont conçus pour être
intégrés dans des dispositifs et équipements spécifiques, tels que
des dispositifs IoT (Internet des Objets), des appareils
électroniques grand public, des systèmes embarqués dans
l’automobile, des dispositifs médicaux, etc. Ces systèmes ont
des contraintes particulières en termes de taille, de ressources et
de performances.
1.3.3.1. FreeRTOS
FreeRTOS est un système d’exploitation temps réel open source
conçu pour les systèmes embarqués. Il est compact et offre des
fonctionnalités de gestion des tâches en temps réel. Il est
souvent utilisé dans des applications telles que les
microcontrôleurs et les systèmes basés sur ARM Cortex-M.

1.3.3.2.Embedded Linux
Linux peut également être utilisé dans des systèmes embarqués,
souvent dans une version allégée et personnalisée pour répondre
aux contraintes de taille et de performances. Des distributions
Linux embarquées, telles que Buildroot et Yocto Project,
facilitent la création de systèmes d’exploitation personnalisés
pour des applications embarquées.
1.3.3.3. FreeBSD Embedded :
FreeBSD, un système d’exploitation basé sur UNIX, propose
une version embarquée adaptée aux contraintes des systèmes
embarqués. Elle offre une base solide pour des applications
nécessitant un système d’exploitation robuste.

1.3.3.4. Micrium OS :
Micrium OS, basé sur le noyau µC/OS, est un système
d’exploitation temps réel destiné aux microcontrôleurs et aux
dispositifs embarqués. Il offre des fonctionnalités de temps réel
et de gestion des tâches.
1.3.3.5. VxWorks :
VxWorks est un système d’exploitation temps réel utilisé dans
des applications critiques, telles que l’aérospatiale, l’automobile,
et les systèmes de communication. Il est connu pour sa fiabilité
et sa capacité à prendre en charge des systèmes complexes.

1.3.3.6. QNX :
QNX est un système d’exploitation temps réel qui trouve des
applications dans les systèmes embarqués critiques, notamment
dans l’industrie automobile, les systèmes de divertissement
embarqués, et les dispositifs médicaux.
1.3.4. Systèmes d’exploitation mobiles
Les systèmes d’exploitation mobiles sont conçus pour alimenter
les appareils mobiles tels que smartphones, tablettes et autres
dispositifs portables. Ils offrent une interface utilisateur adaptée
à l’écran tactile, des fonctionnalités spécifiques aux mobiles, et
une gestion efficace de l’énergie.
1.3.4.1. Android :
Android, développé par Google, est le système d’exploitation
mobile le plus utilisé au monde. Il est basé sur le noyau Linux
et est utilisé par de nombreux fabricants de smartphones.
Android offre une grande flexibilité et une variété d’applications
via Google Play Store.

1.3.4.2. iOS
iOS est le système d’exploitation d’Apple utilisé exclusivement
sur les appareils de la marque, tels que l’iPhone, l’iPad et l’iPod
Touch. Connu pour son interface utilisateur fluide, son
écosystème d’applications robuste et sa sécurité renforcée, iOS
est largement utilisé dans les produits Apple.
1.3.4.3. HarmonyOS
HarmonyOS est développé par Huawei et est conçu pour
fonctionner sur une gamme d’appareils, y compris les
smartphones, les tablettes, les téléviseurs intelligents et les
appareils IoT. Il est conçu pour offrir une expérience utilisateur
cohérente et une connectivité fluide entre les appareils

1.3.4.4. Windows 10 Mobile (désormais obsolète) :


Microsoft avait développé Windows 10 Mobile pour les
smartphones, mais il a été désactivé et n’est plus pris en charge
depuis 2019. Cependant, Windows 10 continuera d’être utilisé
sur certains appareils 2-en-1 et tablettes.
1.3.4.5. Tizen :
Tizen est un système d’exploitation open source développé
principalement par Samsung. Il est utilisé dans certains de leurs
smartphones, smartwatches, et autres dispositifs connectés.
Tizen a également trouvé des applications dans le domaine des
téléviseurs intelligents.

1.3.4.6. KaiOS
KaiOS est un système d’exploitation léger destiné aux
téléphones mobiles basiques et aux fonctionnalités intelligentes.
Il est conçu pour fonctionner sur des appareils avec des
spécifications matérielles plus modestes.
1.4. Éléments de Base du Système d’Exploitation

1.4.1. Gestion des processus et threads Gestion de la


mémoire
La gestion des processus, des threads et de la mémoire sont des
aspects cruciaux des systèmes d’exploitation qui contribuent à
l’efficacité et à la stabilité des systèmes informatiques.
1.4.1.1. Gestion des Processus :
Un processus est une instance d’un programme en cours
d’exécution. Il comprend le code exécutable, les données
associées, et les ressources système telles que les fichiers ouverts
et les connexions réseau.
Création et Terminaison :
Le système d’exploitation est responsable de la création et de la
terminaison des processus. La création implique l’allocation de
ressources, la copie du code exécutable, et l’initialisation des
données. La terminaison implique la libération des ressources.
Planification :
La gestion de la planification des processus détermine l’ordre
d’exécution des processus. Le noyau décide quel processus doit
être exécuté en fonction de politiques de planification
spécifiques (par exemple, priorité, temps partagé).

Communication entre Processus :


Les processus peuvent communiquer entre eux par le biais de
mécanismes tels que les files d’attente, les tubes (pipes), les
signaux et les sémaphores.
1.4.1.2. Gestion des Threads :
Un thread est une unité d’exécution plus légère qu’un processus.
Plusieurs threads peuvent exister au sein d’un même processus,
partageant le même espace d’adressage et les mêmes ressources.
Création et Terminaison :
La création et la terminaison de threads sont généralement plus
rapides que celles des processus, car les threads partagent les
mêmes ressources que leur processus parent.
Planification :
La planification des threads est généralement plus rapide, car
elle implique des changements de contexte moins lourds que la
planification des processus.

Communication entre Threads :


Les threads partageant le même espace d’adressage, ils peuvent
communiquer entre eux de manière plus directe. Cependant,
cela nécessite souvent des mécanismes de synchronisation pour
éviter des problèmes tels que les conditions de concurrence.
1.4.1.3. Gestion de la Mémoire :
Allocation de Mémoire :
Le système d’exploitation gère l’allocation de mémoire aux
processus et aux threads. Il alloue de l’espace mémoire pour le
code, les données et la pile.

Désallocation de Mémoire :
Lorsqu’un processus ou un thread se termine, le système
d’exploitation libère l’espace mémoire qu’il occupait, évitant les
fuites de mémoire.
Protection de Mémoire :
Le système d’exploitation assure la protection de la mémoire en
définissant des zones d’accès pour les processus et les threads,
empêchant ainsi l’accès non autorisé à la mémoire d’autres
entités.

Pagination et Mémoire Virtuelle :


Certains systèmes d’exploitation utilisent des techniques comme
la pagination et la mémoire virtuelle pour gérer de manière plus
efficace la mémoire physique disponible.
1.4.2. Gestion des fichiers et des systèmes de fichiers
La gestion des fichiers et des systèmes de fichiers , permettant
aux utilisateurs et aux applications d’organiser, de stocker, de
récupérer et de manipuler des données de manière structurée.

1.4.2.1. Gestion des Fichiers :


Un fichier est une unité logique de stockage qui peut contenir
des données, des programmes ou d’autres informations. Les
fichiers peuvent être de différents types, tels que texte, image,
audio, etc.
+ Opérations sur les Fichiers : Les opérations courantes sur
les fichiers comprennent la création, la suppression,
l’ouverture, la fermeture, la lecture et l’écriture. Ces
opérations sont gérées par le système d’exploitation à
travers des appels système.
+ Attributs de Fichier : Chaque fichier a des attributs
associés tels que le nom, le type, la taille, la date de
création, la date de modification, les permissions d’accès,
etc.
+ Systèmes de Fichiers Hiérarchiques : Les fichiers sont
souvent organisés dans des structures hiérarchiques,
formant des répertoires (ou dossiers). Cette organisation
permet de mieux structurer les données et de faciliter la
navigation.
1.4.2.2. Systèmes de Fichiers :
Un système de fichiers est une méthode de stockage et
d’organisation des fichiers sur un support de stockage, tel qu’un
disque dur ou une mémoire flash.
+ Organisation des Données : Les systèmes de fichiers
déterminent comment les données sont organisées, stockées,
nommées et récupérées. Différents systèmes de fichiers
peuvent être utilisés en fonction des besoins et des
caractéristiques du support de stockage.
+ Exemples de Systèmes de Fichiers :
- FAT (File Allocation Table) : Utilisé couramment sur des
dispositifs tels que les cartes SD.
- NTFS (New Technology File System) : Utilisé sur les
systèmes d’exploitation Windows.
- ext4 (fourth extended filesystem) : Un système de fichiers
couramment utilisé sur les systèmes Linux.
- HFS+ (Hierarchical File System Plus) : Utilisé sur les
anciens systèmes macOS.
+ Journalisation : Certains systèmes de fichiers utilisent des
journaux pour enregistrer les modifications apportées aux
fichiers. Cela aide à récupérer rapidement en cas de panne
du système.
+ Compression et Chiffrement : Certains systèmes de fichiers
offrent des fonctionnalités telles que la compression des
données pour économiser de l’espace et le chiffrement pour
garantir la confidentialité des données.
+ Réparation et Maintenance : Certains systèmes de fichiers
incluent des outils pour la vérification et la réparation
d’éventuelles erreurs, contribuant ainsi à la stabilité du
système de fichiers.
Chapitre 2 : Processus et Threads

Dans ce chapitre on vera :


▶ 2.1. Introduction aux Processus
▶ 2.2. Gestion des Threads
▶ 2.3. Ordonnancement des Processus
2.1. Introduction aux Processus

Le concept le plus central dans n’importe quel système


d’exploitation est le processus : une abstraction d’un
programme en cours d’exécution. Les processus sont l’une des
abstractions les plus anciennes et les plus importantes que les
systèmes d’exploitation fournissent. Ils permettent la possibilité
d’une opération (pseudo) concurrente même lorsqu’il n’y a
qu’un seul CPU disponible. Ils transforment un seul CPU en
plusieurs CPU virtuels. Sans l’abstraction des processus,
l’informatique moderne ne pourrait pas exister.
2.1.1. Modèle de processus
L’ensemble des logiciels exécutables sur l’ordinateur, parfois y
compris le système d’exploitation, est organisé en plusieurs
processus séquentiels, ou simplement des processus. Un
processus est simplement une instance d’un programme en
cours d’exécution, incluant les valeurs actuelles du compteur de
programme, des registres et des variables. Conceptuellement,
chaque processus a son propre CPU virtuel.
En réalité, le vrai CPU bascule d’un processus à l’autre, mais
pour comprendre le système, il est beaucoup plus facile de
penser à une collection de processus s’exécutant en (pseudo)
parallèle que d’essayer de suivre comment le CPU bascule d’un
programme à l’autre. Ce basculement rapide est appelé
multiprogrammation.
Figure 3: Processus

Dans la figure(a), nous voyons un ordinateur faisant de la


multiprogrammation avec quatre programmes en mémoire.
Dans la figure(b), il y a quatre processus, chacun avec son
propre flux de contrôle (c’est-à-dire son propre compteur de
programme logique), et chacun s’exécutant indépendamment
des autres. Dans la figure(c), sur un intervalle de temps
suffisamment long, tous les processus ont progressé, mais à un
instant donné, seul un processus est réellement en cours
d’exécution.
2.1.2. Creation du processus
Dans des systèmes très simples, ou dans des systèmes conçus
pour exécuter une seule application il peut être possible d’avoir
tous les processus nécessaires déjà présents lorsque le système
démarre. Dans les systèmes à usage général, cependant, il est
nécessaire d’avoir un moyen de créer et de terminer des
processus au besoin pendant le fonctionnement.
Quatre événements principaux entraı̂nent la création de
processus :
1. L’initialisation du système.
2. L’exécution d’un appel système de création de processus
par un processus en cours d’exécution.
3. Une demande de l’utilisateur de créer un nouveau
processus.
4. Le lancement d’un travail par lot (batch job).
2.1.3. Terminaison du Processus
Une fois qu’un processus a été créé, il commence à s’exécuter et
effectue la tâche qui lui est assignée. Le nouveau processus se
terminera, généralement en raison de l’une des conditions
suivantes :
1. Sortie normale (volontaire).
2. Sortie avec erreur (volontaire).
3. Erreur fatale (involontaire).
4. Arrêt par un autre processus (involontaire).
La plupart des processus se terminent parce qu’ils ont accompli
leur tâche. Lorsqu’un compilateur a compilé le programme qui
lui a été donné, le compilateur exécute un appel système pour
informer le système d’exploitation qu’il a terminé.
2.1.4 manipulation des Processus
Sous Windows, le shell en ligne de commande principal est
CMD (Command Prompt). Voici quelques commandes
couramment utilisées pour la manipulation des processus :
▶ Tasklist: Affiche la liste des processus en cours d’exécution
tasklist
▶ Taskkill : Permet de terminer un processus en utilisant son
PID (Process ID) ou son nom d’image
taskkill /PID 1234 ou
taskkill /IM notepad.exe
▶ Pour forcer la terminaison d’un processus sous Windows,
vous pouvez utiliser la commande taskkill avec l’option /F
(force)
taskkill /F /PID 1020
▶ Start : Lance un nouveau programme ou processus.
start Spotify.exe
▶ Start-Process (PowerShell) : Dans PowerShell, vous pouvez
utiliser Start-Process pour démarrer un nouveau processus.
Start-Process -FilePath ”C:/Chemin/programme.exe”
▶ WMIC (Windows Management Instrumentation
Command-line) : Fournit une interface pour interagir avec
le noyau.
wmic process list brief /* pour affichier les processus en
cours d’execution
wmic process where Name=”Spotify.exe” delete /*
Terminer un processus par son PID
Propriétés couramment utilisées pour les processus
Lorsqu’on utilise WMIC pour interroger des informations sur
les processus, on peut spécifier différentes propriétés à
récupérer. quelques-unes des propriétés :
1. Name : Le nom du processus.
2. ProcessId : L’identifiant du processus (PID).
3. ThreadCount : Le nombre de threads associés au processus.
4. VirtualSize : La taille virtuelle du processus en octets.
5. WorkingSetSize : La taille de l’ensemble de travail du
processus en octets.
6. PageFileUsage : L’utilisation du fichier de pagination par
le processus.
7. PageFaults : Le nombre total de fautes de page par le
processus.
8. CreationDate : La date et l’heure de création du processus.
9. Priority : La priorité du processus.
10. Caption : Le nom lisible du processus.
11. CommandLine : La ligne de commande utilisée pour
démarrer le processus.
12. ParentProcessId : L’identifiant du processus parent.
13. Status : L’état du processus (en cours d’exécution,
suspendu, etc.).
14. PercentProcessorTime : Le pourcentage du temps
processeur utilisé par le processus.
▶ Affcihier toutes les propriétés du processus :
wmic process get
Name,ProcessId,ThreadCount,VirtualSize,
WorkingSetSize,PageFileUsage,PageFaults,
CreationDate,Priority,Caption,
CommandLine,ParentProcessId,
Status
▶ Afficher juste le nom, le ProcessId, et le nombre des
Threads des processus en cours d’exécution : wmic process
get Name,ProcessId,ThreadCount
▶ WMIC pour interroger des informations sur le cache
mémoire avec la classe OSCache:
wmic OS get FreePhysicalMemory,FreeVirtualMemory,
TotalVirtualMemorySize,TotalVisibleMemorySize
2.1.5. Etat d’un processus
Dans les systèmes d’exploitation, un processus est un
programme en cours d’exécution. L’état d’un processus se réfère
à sa situation à un moment donné dans son cycle de vie. Les
systèmes d’exploitation utilisent différents états pour suivre
l’avancement des processus.
1. Prêt (Ready) : Le processus a été chargé dans la mémoire
et est prêt à être exécuté, mais il attend sa part de temps
CPU.
2. En cours d’exécution (Running) : Le processus est en train
d’être exécuté par le processeur central. À un moment
donné, un seul processus peut être en cours d’exécution sur
un cœur de processeur.
3. Bloqué (Blocked) : Le processus est incapable de
poursuivre son exécution en raison d’une interruption,
d’une attente d’une ressource (comme une entrée/sortie),
ou d’une autre condition bloquante. Il est mis en attente
jusqu’à ce que la condition bloquante soit levée.
4. erminé (Terminated) : Le processus a terminé son
exécution. Il peut avoir atteint la fin de son code ou avoir
été interrompu prématurément pour diverses raisons.
Le passage d’un état à un autre est géré par le système
d’exploitation et est souvent influencé par des événements tels
que des interruptions matérielles, des appels système, des
signaux, etc.
Un diagramme d’états ou un modèle de machine à états finis est
parfois utilisé pour représenter graphiquement les transitions
d’états d’un processus. Ces états fournissent une vue structurée
de la manière dont les processus interagissent avec le système
d’exploitation et les ressources matérielles.

Figure 4: Etat du processus


2.1.6. Hierarchie des processus
Dans certains systèmes, lorsqu’un processus crée un autre
processus, le processus parent et le processus enfant continuent
à être associés de certaines manières. Le processus enfant peut
à son tour créer davantage de processus, formant ainsi une
hiérarchie de processus. Dans UNIX, un processus et tous ses
enfants, ainsi que les descendants ultérieurs, forment ensemble
un groupe de processus.
Hierarchie sous UNIX
Lorsqu’un utilisateur envoie un signal depuis le clavier, le signal
est transmis à tous les membres du groupe de processus
actuellement associé au clavier (généralement tous les processus
actifs créés dans la fenêtre actuelle). Individuellement, chaque
processus peut intercepter le signal, ignorer le signal ou adopter
l’action par défaut, qui consiste à être terminé par le signal.
Pour illustrer davantage le rôle clé de la hiérarchie des
processus, examinons comment UNIX s’initialise lorsqu’il est
démarré, juste après le démarrage de l’ordinateur. Un processus
spécial appelé ”init” est présent dans l’image de démarrage.
Lorsqu’il commence à s’exécuter, il lit un fichier indiquant le
nombre de terminaux disponibles. Ensuite, il crée un nouveau
processus par terminal. Ces processus attendent qu’un
utilisateur se connecte. Si une connexion réussit, le processus de
connexion exécute un interpréteur de commandes pour accepter
des commandes. Ces commandes peuvent démarrer d’autres
processus, et ainsi de suite. Ainsi, tous les processus dans
l’ensemble du système appartiennent à un seul arbre, avec
”init” à la racine.
En revanche, Windows n’a pas de concept de hiérarchie de
processus. Tous les processus sont égaux. Le seul indice d’une
hiérarchie de processus est que lorsqu’un processus est créé, le
parent reçoit un jeton spécial (appelé une poignée) qu’il peut
utiliser pour contrôler l’enfant. Cependant, il est libre de
transmettre ce jeton à un autre processus, invalidant ainsi la
hiérarchie. Les processus dans UNIX ne peuvent pas déshériter
leurs enfants.
Processus enfant et thread
Un processus enfant est une instance indépendante d’un
programme qui s’exécute séparément, tandis qu’un thread est
une unité d’exécution légère à l’intérieur d’un processus qui
partage le même espace mémoire avec d’autres threads du
même processus. Les threads sont plus légers en termes de
surcharge que les processus, mais ils nécessitent une gestion
plus attentive des accès concurrents aux données partagées.
Processus Enfant :
▶ Isolation : Les processus enfants sont des instances
séparées d’un programme en cours d’exécution, et ils sont
généralement isolés les uns des autres. Chaque processus a
son propre espace mémoire et ses ressources, ce qui signifie
qu’ils n’ont pas d’accès direct aux variables ou aux données
des autres processus.
▶ Séparation des Ressources : Les processus enfants ont leur
propre espace d’adressage mémoire, des descripteurs de
fichiers indépendants, et d’autres ressources système. Ils ne
partagent généralement pas ces ressources avec d’autres
processus, sauf via des mécanismes d’intercommunication
explicites comme les tubes, les files d’attente ou les signaux.
Thread :
▶ Partage des Ressources :Les threads, en revanche, sont des
unités d’exécution plus légères qui partagent le même
espace d’adressage mémoire. Tous les threads d’un même
processus ont accès aux mêmes variables et données
partagées. Cela facilite la communication entre les threads
mais nécessite une gestion appropriée pour éviter les
conflits de données (conditions de concurrence).
▶ Moins de Surheads : Les threads partagent souvent des
ressources telles que des descripteurs de fichiers, des
connexions réseau, et d’autres ressources du processus
parent, ce qui signifie qu’ils peuvent être plus efficaces en
termes d’utilisation de la mémoire et des ressources
système par rapport aux processus enfants.
2.2. Gestion des Threads

2.2.1. Définitions
Les threads, également appelés fils d’exécution, sont des unités
d’exécution légères qui existent au sein d’un processus. Un
processus peut contenir un ou plusieurs threads, et ces threads
peuvent s’exécuter de manière concurrente, partageant les
mêmes ressources et l’espace mémoire du processus parent.
2.2.2. Modèles de threads
Il existe deux principaux modèles de threads : le modèle de
threads au niveau du noyau (kernel-level threads) et le modèle
de threads au niveau de l’utilisateur (user-level threads). Ces
modèles définissent la manière dont les threads sont créés, gérés
et planifiés par le système d’exploitation.
2.2.2.1. Modèle de Threads au Niveau du Noyau
(Kernel-Level Threads) :
Caractéristiques :
+ Les threads sont gérés entièrement par le noyau du système
d’exploitation.
+ Le système d’exploitation a une connaissance complète de
chaque thread et peut les planifier indépendamment.
+ Les opérations de création, de gestion et de synchronisation
des threads sont effectuées par des appels système.
+ Chaque thread au niveau du noyau est une entité distincte
pour le système d’exploitation.
Figure 5: Kernel-Level Threads
Avantages :
– La planification des threads peut être optimisée par le
système d’exploitation pour une utilisation efficace des
ressources.
– La gestion des threads peut profiter des fonctionnalités
avancées du noyau.

Inconvénients :
– La création et la gestion des threads sont souvent plus
coûteuses en termes de performance.
– Les opérations de création/destruction de threads
nécessitent des appels système, ce qui peut être plus lent.
Modèle de Threads au Niveau de l’Utilisateur (User-Level
Threads) :
Caractéristiques :
+ Les threads sont gérés au niveau de l’utilisateur par une
bibliothèque de threads, sans l’intervention directe du
noyau.
+ Le noyau du système d’exploitation est souvent inconscient
de l’existence des threads au niveau de l’utilisateur.
+ La création, la planification et la synchronisation des
threads sont réalisées par la bibliothèque de threads dans
l’espace utilisateur.
+ Plusieurs threads au niveau de l’utilisateur peuvent être
associés à un seul thread au niveau du noyau.
Figure 6: Ueser-Level Threads
Avantages :
– La création et la gestion des threads sont généralement
plus rapides car elles n’impliquent pas d’appels systèmes
fréquents.
– Les applications peuvent être plus flexibles dans la gestion
des threads.

Inconvénients :
– La planification des threads dépend entièrement de
l’application et peut ne pas être optimale pour l’utilisation
des ressources.
– Les opérations bloquantes d’un thread peuvent affecter
l’ensemble de l’application.
2.2.3. Multithreading
Le multithreading est une technique de programmation qui
permet à plusieurs threads d’être exécutés simultanément au
sein d’un même processus. Chaque thread représente une
séquence d’instructions indépendante qui peut être planifiée et
exécutée de manière concurrente avec d’autres threads.
2.2.3.1. Création de Threads :
Les threads peuvent être créés de différentes manières, en
fonction du langage de programmation et de l’environnement.
En général, le programmeur peut explicitement créer des
threads en utilisant des bibliothèques ou des API spécifiques.
Par exemple simple en Python utilisant le module threading
pour créer et exécuter les threads simultanément.
2.2.3.2. Contexte de Thread :
Chaque thread a son propre contexte d’exécution, comprenant
le compteur de programme, les registres, la pile d’exécution, et
d’autres informations nécessaires à son exécution. Le système
d’exploitation gère ces contextes lors de la commutation entre
les threads.

2.2.3.3. Partage de Ressources :


Les threads partagent le même espace mémoire et les mêmes
ressources au sein d’un processus. Cela peut conduire à des
problèmes de concurrence, car plusieurs threads peuvent
accéder et modifier les mêmes données simultanément. Des
mécanismes de synchronisation, tels que les verrous (locks) et
les sémaphores, sont utilisés pour gérer cet accès concurrent et
éviter les incohérences.
2.2.3.4. Planification des Threads :
Le système d’exploitation est responsable de la planification des
threads pour leur exécution. La planification peut être
préemptive, où le système peut interrompre l’exécution d’un
thread pour en exécuter un autre, ou coopérative, où les threads
cèdent explicitement le contrôle.

2.2.3.5. Communication entre Threads :


Les threads peuvent communiquer entre eux par le biais de
mécanismes de communication tels que les files d’attente, les
sémaphores, et les signaux. Cela permet de coordonner les
activités des threads et de partager des données.
2.2.3.6. Synchronisation :
La synchronisation est essentielle pour éviter les problèmes de
concurrence. Les verrous (locks) et les sémaphores sont
couramment utilisés pour garantir qu’un seul thread accède à
une ressource partagée à la fois, évitant ainsi les conflits.

2.2.3.7. Deadlock :
Un deadlock se produit lorsque deux ou plusieurs threads se
bloquent mutuellement en attendant l’accès à des ressources.
La gestion prudente des ressources et l’ordre d’acquisition des
verrous sont cruciaux pour éviter les deadlocks.
2.2.3.8. Priorités de Thread :
Certains systèmes d’exploitation permettent d’attribuer des
priorités aux threads, influençant ainsi l’ordre dans lequel les
threads sont planifiés pour l’exécution.
Exemple d’execution d’une équation linéaire en
multithreading
Voir Notebook
2.3. Ordonnancement des Processus
L’ordonnancement des processus est une composante cruciale
des systèmes d’exploitation. Il fait référence à la manière dont
le système d’exploitation décide de l’ordre dans lequel les
processus sont exécutés sur le processeur. L’objectif principal
de l’ordonnancement est d’optimiser l’utilisation du processeur,
d’améliorer le temps de réponse et d’assurer une utilisation
équitable des ressources du système.
2.3.1. Politiques d’ordonnancement
Les politiques d’ordonnancement (ou stratégies de planification)
sont des règles qui définissent comment les processus sont
sélectionnés pour l’exécution dans un système d’exploitation.
Ces politiques influencent directement la performance globale
du système en termes de temps d’attente, de temps d’exécution,
de réactivité, etc.
2.3.1.1. FCFS (First Come First Serve)
Le principe du FCFS (First Come First Serve - Premier Arrivé,
Premier Servi) dans les systèmes d’exploitation est basé sur
l’idée simple que les processus sont exécutés dans l’ordre où ils
arrivent dans la file d’attente. C’est une politique
d’ordonnancement non préemptive, ce qui signifie qu’une fois
qu’un processus a commencé son exécution, il continue jusqu’à
sa terminaison sans être interrompu par le système
d’exploitation.
Principe de FCFS
Une approche initiale consiste à exécuter les CPU bursts des
threads dans l’ordre exact où ils ont été placés dans l’état
”Ready” (premier arrivé, premier servi). Étant donné que ce
planificateur n’est pas préemptif, chaque CPU burst s’exécute
intégralement avant de libérer le processeur pour un autre
thread. Le temps de réponse dans le cas d’un planificateur non
préemptif est toujours équivalent au temps d’attente plus la
durée du burst CPU. Ainsi, notre principal point d’intérêt sera
sur ce critère initial.
Exemple de FCFS
L’exemple ci-dessous illustre deux exécutions possibles pour
quatre threads disponibles simultanément en état ”Ready”,
mais dont l’ordre d’ajout à cet état diffère (T1, T2, T3, puis T4
dans le premier cas ; et T3, T2, T1, puis T4 dans le deuxième
cas).
Figure 7: Exemple de FCFS (First Come First Serve)
Cependant, lorsqu’on examine le temps d’attente moyen pour
chaque thread, on constate une grande disparité entre le
premier ordre d’arrivée et le second (de 7 unités de temps à 5
unités de temps). Cette différence s’explique par le fait que,
dans la première configuration, des CPU bursts courts (typiques
des applications interactives ou nécessitant de nombreuses
entrées/sorties) se retrouvent bloqués derrière un CPU burst
plus long. Ce phénomène est communément appelé l’effet
convoi (convoy effect en anglais), et il affecte principalement les
applications ayant des exigences d’interactivité.
2.3.1.2. SJF (Shortest Job First)
SJF (Shortest Job First) est un scheduler non préemptif qui a
pour objectif de prévenir l’effet convoi. Lorsque plusieurs
threads sont disponibles, le thread choisi est celui qui a le CPU
burst à venir qui est le plus court. La figure ci-dessous montre
le diagramme de Gantt où les threads obtiennent le processeur
dans l’ordre du plus courte au plus long CPU burst.
Figure 8: Exemple de SJF (Shortest Job First)

Vous aimerez peut-être aussi