Cours - SE - Umapon Seance4
Cours - SE - Umapon Seance4
Cours - SE - Umapon Seance4
Université Mapon
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
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.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.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
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.
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.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)