Synthèse os
This commit is contained in:
		
							
								
								
									
										
											BIN
										
									
								
								bac2/os/synthèse/process_diag.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								bac2/os/synthèse/process_diag.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 117 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								bac2/os/synthèse/process_exe.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								bac2/os/synthèse/process_exe.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 60 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								bac2/os/synthèse/prog_components.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								bac2/os/synthèse/prog_components.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 20 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								bac2/os/synthèse/syllabus-umons-2022-12-22.pdf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								bac2/os/synthèse/syllabus-umons-2022-12-22.pdf
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										389
									
								
								bac2/os/synthèse/syntheses.tex
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										389
									
								
								bac2/os/synthèse/syntheses.tex
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,389 @@
 | 
			
		||||
\documentclass{article}
 | 
			
		||||
 | 
			
		||||
\usepackage[utf8]{inputenc}
 | 
			
		||||
\usepackage[T1]{fontenc}
 | 
			
		||||
\usepackage[french]{babel}
 | 
			
		||||
\usepackage{graphicx}
 | 
			
		||||
\usepackage{amsmath, amsfonts, amssymb, amsthm}
 | 
			
		||||
 | 
			
		||||
\title{Synthèse Système d'éxploitation}
 | 
			
		||||
\author{Debucquoy Anthony}
 | 
			
		||||
 | 
			
		||||
\begin{document}
 | 
			
		||||
 | 
			
		||||
\maketitle
 | 
			
		||||
\tableofcontents
 | 
			
		||||
\newpage
 | 
			
		||||
 | 
			
		||||
Ce document est une synthèse du cours de système d'exploitation. Il n'est pas complet et ne 
 | 
			
		||||
peut pas se substituer à une lecture du document originale. Il permet toutefois de lister les
 | 
			
		||||
diffèrents points et d'y accompagner une brève explication.
 | 
			
		||||
 | 
			
		||||
\section{Events}
 | 
			
		||||
 | 
			
		||||
Un programme est composé:
 | 
			
		||||
\begin{itemize}
 | 
			
		||||
	\item \textbf{Du code machine}: exécuté par la machine
 | 
			
		||||
	\item \textbf{D'un espace de données}: Stock les données statiques et dynamiques
 | 
			
		||||
	\item \textbf{D'une stack}: Stoque les variables locales et les appels 
 | 
			
		||||
\end{itemize}
 | 
			
		||||
Ces composants se trouvent dans un "espace d'adresssage" commun et sont liés logiquements par le
 | 
			
		||||
biais d'appels (lw, j, ...)
 | 
			
		||||
 | 
			
		||||
\begin{figure}[h]
 | 
			
		||||
	\centering
 | 
			
		||||
	\includegraphics[width=0.8\textwidth]{prog_components.png}
 | 
			
		||||
	\caption{Composents d'un programme}
 | 
			
		||||
\end{figure}
 | 
			
		||||
 | 
			
		||||
Lors de l'éxécution, les composents sont placés dans la mémoire afin d'y être accésible par le processeur.
 | 
			
		||||
L'entièretée d'un programme est alors définie par 4 éléments:
 | 
			
		||||
 | 
			
		||||
\begin{enumerate}
 | 
			
		||||
	\item La valeur des registres
 | 
			
		||||
	\item le contenu de la stack (et le pointeur vers son sommet)
 | 
			
		||||
	\item L'espaces de données utilisés
 | 
			
		||||
	\item L'IP (instruction pointer) 
 | 
			
		||||
\end{enumerate}
 | 
			
		||||
 | 
			
		||||
Nous pouvons alors sauvegarder l'état (instantané) du programme.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
\subsection{Gestion d'évènements}
 | 
			
		||||
 | 
			
		||||
Nous distingons 2 types d'évènements traités par le processeur:
 | 
			
		||||
\begin{enumerate}
 | 
			
		||||
	\item erreur / exceptions: ayant une origine \textbf{interne}  au processeur
 | 
			
		||||
		ex: division par zero, op-code invalide, right-fault, ...
 | 
			
		||||
	\item evènement / interuptions: ayant une origine \textbf{externe} au processeur
 | 
			
		||||
		ex: clavier, fichier pret, packet, clk, ...
 | 
			
		||||
\end{enumerate}
 | 
			
		||||
 | 
			
		||||
Suite à ces évènements, le programme sera mis en pause pour pouvoir traiter l'évènement. Puis 
 | 
			
		||||
le programme pourra (ou non) reprendre son cours. Dans le cas d'un évènement \textbf{récupérable},
 | 
			
		||||
le programme continue. Dans l'un cas d'un évènement \textbf{irécupérable}, le programme s'arrète.
 | 
			
		||||
Pour que le programme puisse poursuivre, il faut sauvegarder son contexte. cette "snapshot" est
 | 
			
		||||
placée sur la stack. (cette stack peut basculer vers une autre pendant l'évènement pour éviter
 | 
			
		||||
de laisser la posibilitée au programme de récupérer des informations sur l'évent sans autorisation).
 | 
			
		||||
Cette sauvegarde sert à la fois pour les programmes récupérable pour la reprise/poursuite mais également
 | 
			
		||||
pour les programmes irécupérables, ces informations sont utiles au dévelopeur pour le debug de l'app.
 | 
			
		||||
Il est également nécéssaire de libèrer les resources aloués.
 | 
			
		||||
 | 
			
		||||
\subsection{Reprise ou poursuite}
 | 
			
		||||
Lors que l'évènement à été pris en charge par le processeur, nous envisageons deux scénario.
 | 
			
		||||
\begin{enumerate}
 | 
			
		||||
	\item \textbf{reprise}: retente l'éxécution du IP
 | 
			
		||||
	\item \textbf{pouruite}: passe à l'instruction suivante
 | 
			
		||||
\end{enumerate}
 | 
			
		||||
 | 
			
		||||
En générale, les intéruptions constituent tous des évènements récupérables avec poursuite.
 | 
			
		||||
 | 
			
		||||
\subsection{Déroutement}
 | 
			
		||||
 | 
			
		||||
Chaques architectures implémente sa propre méthode de déroutement. voici quelques examples:
 | 
			
		||||
\begin{itemize}
 | 
			
		||||
	\item \textbf{Registre de cause}: C'est un registre mis à jours lors d'une exception ou d'une
 | 
			
		||||
		intéruption. au terme du cycle d'éxécution, le processeur consulte ce registre pour savoir
 | 
			
		||||
		si un déroutement est nécéssaire et dans ce cas vers quel adresse.
 | 
			
		||||
	\item \textbf{Vectorisation}: chaques évent est un numéro dans une table de descripteur(IDT). Ce
 | 
			
		||||
		descripteur est l'adresse de la fonction de gestion de l'évènement.
 | 
			
		||||
\end{itemize}
 | 
			
		||||
 | 
			
		||||
\subsection{Niveau de privilège}
 | 
			
		||||
 | 
			
		||||
Le jeu d'instruction du processeur contient des instructions "système" qui ne sont pas accésibles en
 | 
			
		||||
principe à tout les utilisateurs. Un programme typiquement fait appel à l'OS qui à son tours fait
 | 
			
		||||
les appels systèmes. on parle de ring 3/0 (0 étant le plus privilégié/OS)
 | 
			
		||||
 | 
			
		||||
\subsection{Basculement de stack}
 | 
			
		||||
 | 
			
		||||
Lors d'un déroutement, L'os utilise son propre stack. (après avoir sauvegardé le contexte du
 | 
			
		||||
programme) ainsi, le programme ne peu pas accéder a son contenu lors de la continuation.
 | 
			
		||||
 | 
			
		||||
\subsection{Multiple évènements}
 | 
			
		||||
Lorsque plusieurs évènements surviennents, la prioritée est : Abandon > Reprise > Poursuite.
 | 
			
		||||
Il est également envisageable qu'un évènement survienne pendant la gestin d'un autre évènement. Dans
 | 
			
		||||
ce cas, étant donné que nous utilisons le stack pour le stockage du contexte du programme, il est
 | 
			
		||||
tout à fait envisageable d'utiliser ce même stack pour le stockage du contexte de la gestion du dit
 | 
			
		||||
évènement. Nous avons alors une imbrication des évènement à la manière de fonctions récursives.
 | 
			
		||||
Dans le cas ou nous authorisons plusierus évènements à dérouter en même temps, il peut être
 | 
			
		||||
nécéssaire d'implémenter un ordre de priorité. Pour ce faire une solution est d'utiliser un masque
 | 
			
		||||
d'interruption. Un évènement place alors les bits de sa prioritée. un évènement postèrieur est
 | 
			
		||||
déclencher ou non selon son propre masque de priorité.
 | 
			
		||||
 | 
			
		||||
\section{Memoire}
 | 
			
		||||
 | 
			
		||||
Nous avons vu qu'un programme étais composé de trois compostantes: le code machine, l'espace de
 | 
			
		||||
données et le stack. Ces composantes sont liées logiquement au sein du programme à l'aide d'adresse.
 | 
			
		||||
(branchements, ...). Deux problèmes se posent alors:
 | 
			
		||||
 | 
			
		||||
\begin{enumerate}
 | 
			
		||||
	\item \textbf{La concurence d'adresse}: Il est possible que les adresses choisies soient déjà
 | 
			
		||||
		utilisées par un autre programme. Il est également important de vérifier quelles mémoires
 | 
			
		||||
		sont accédées pour éviter qu'un programme accède à des donnes ne lui appartenant pas. 
 | 
			
		||||
	\item \textbf{Gestion de la mémoire disponible}: L'OS doit savoir quelle partie de la mémoire
 | 
			
		||||
		est libre et quelle partie est utilisé.
 | 
			
		||||
\end{enumerate}
 | 
			
		||||
 | 
			
		||||
Il nous faut résoudre ces problèmes de manière efficace et performante. car ces opérations sont les
 | 
			
		||||
plus utilisées
 | 
			
		||||
 | 
			
		||||
\subsection{Projection et protection}
 | 
			
		||||
 | 
			
		||||
\begin{itemize}
 | 
			
		||||
	\item \textbf{Adressage absolu}: Cas de figure le plus directe. Les adresses du programmes sont
 | 
			
		||||
		copiées précisément aux adresses de la mémoire choisies au moment de la compilation.
 | 
			
		||||
		Le programme fonctionne alors parfaitement. Si certaine des adresses du programme ne sont
 | 
			
		||||
		pas libres, Nous pourions comprometre l'intègritée du système. Il n'est également pas
 | 
			
		||||
		possible de vérifier si le programme accède a des adresse qui ne sont pas autorisées.
 | 
			
		||||
	\item \textbf{Adressage relatif}: Nous définissons un décalage (offset) au démarage du
 | 
			
		||||
		programme. Cet offset sera appliqué à tout les adresse utilisées dans le programme.
 | 
			
		||||
		\begin{itemize}
 | 
			
		||||
			\item \textbf{static}: Modifie les adresse en y ajoutant l'offset (adresse de base) à la
 | 
			
		||||
				volée lors de la mise en mémoire. Pour celà, l'éxécutable doit contenir une table
 | 
			
		||||
				contenant les emplacement des adresse à modifier. Cette aproche n'empèche toujours
 | 
			
		||||
				pas l'accés à des adresse hors mémoire. De plus, les adresse générées pendant le
 | 
			
		||||
				déroulement du programme ne seront pas corigées
 | 
			
		||||
			\item \textbf{dynamique}: L'ajout de l'offset se fait à chaques accés mémoires pendant
 | 
			
		||||
				l'éxécution. nous stockong également la \textbf{limite} (la taille du programme) qui
 | 
			
		||||
				permet de vérifier, lors d'un accès mémoire, si cette addresse est inférieur à
 | 
			
		||||
				limite. si ça n'est pas le cas c'est que le programme tente de d'accèder à une
 | 
			
		||||
				adresse ne lui appartenant pas. dans le cas contraire, l'adresse est additionée à
 | 
			
		||||
				\textbf{base}. Un avantage de cette aproche est que le programme peut à tout moment
 | 
			
		||||
				être déplacer dans la mémoire en métant à jour \textbf{base} et \textbf{limit}. A
 | 
			
		||||
				contrario, chaques appel mémoire demande deux opérations (une comparaison et une
 | 
			
		||||
				addition). ajout non négligable même si ces opérations font partie des plus rapides
 | 
			
		||||
				du procésseur
 | 
			
		||||
		\end{itemize}
 | 
			
		||||
	\item \textbf{Segmentation}: Le programme est ségmenté dans la mémoire physique. chaques
 | 
			
		||||
		ségments est encodé dans un \textbf{déscripteur de ségment} à l'aide de sa \textbf{base} et
 | 
			
		||||
		\textbf{limit} (il est également possible de stocker le type, la permission, la direction,
 | 
			
		||||
		la présence et un champ pour savoir si l'adresse a été modifiée ultérieurement). ces
 | 
			
		||||
		déscripteurs sont stocké dans une \textbf{table de segments} en mémoire physique. Pour
 | 
			
		||||
		gagner du temps cette table est stocké dans un registre de sélécteur de ségment. 
 | 
			
		||||
		Ces ségments sont crées à la compilation et la table de segments est liée au programme.
 | 
			
		||||
 | 
			
		||||
		Un avantage de la ségmentation est \textbf{le partage de segment}. En effet, il est possible
 | 
			
		||||
		pour plusieurs programmes de partager un segment de mémoire physique commun (ex: librairies).
 | 
			
		||||
	\item \textbf{Pagination}: Meilleure solution pour la souplesse dans la gestion de mémoire. Nous
 | 
			
		||||
		considérons deux espaces. La pagination repose sur un découpage uniforme de ces deux espaces (e.g. 4Kib, 4Mib). 
 | 
			
		||||
		\begin{itemize}
 | 
			
		||||
			\item \textbf{espace physique} : dont la taille dépend de l'architecture du processeur
 | 
			
		||||
				(16/32/64 bits). Cet espace sera découpé en \textbf{pages} 
 | 
			
		||||
			\item \textbf{espace virtuel} : dont la taille dépend du controlleur et de la quantitée
 | 
			
		||||
				de mémoire disponible. Cet espace sera découpé en \textbf{cadre} 
 | 
			
		||||
		\end{itemize}
 | 
			
		||||
		Par conséquent, une page peut être contenue dans un cadre. Pour localiser l'endroit où une
 | 
			
		||||
		page réside en mémoire physique, nous utilisons une \textbf{table des pages} (propre à
 | 
			
		||||
		chaques programmes) \textbf{exhaustive} (contient une entrée pour chaques pages) et est
 | 
			
		||||
		stockée dans la mémoire physique. L'MMU (\textit{Memory Management Unit}) s'occupe de la
 | 
			
		||||
		traduction d'une page vers un cadre. La taille de la table des pages peut être trouvé par 
 | 
			
		||||
		\[\text{Taille} = \frac{\text{Espace virtuel}}{\text{Taille de page}} \times \text{Taille d'une
 | 
			
		||||
		entrée}\]
 | 
			
		||||
		Chaques entrées dans la table des pages contient un numéro de cadre qui identifie l'adresse
 | 
			
		||||
		du cadre occupé par la page en question.(Nous y accompagnons un bit de présence, permission,
 | 
			
		||||
		référencée, modifiée).
 | 
			
		||||
		Un accés mémoire par le procésseur sépare l'adresse virtuelle en deux parties, suivant la
 | 
			
		||||
		taille de découpage. Nous avons donc une portion qui encode le numéro de page (utilisé en
 | 
			
		||||
		indice dans la table des pages) ainsi que l'offset qui sera apliqué une fois l'adresse
 | 
			
		||||
		physique trouvée. L'utilisation du bit de présence est expliqué ci-dessous, il permet en
 | 
			
		||||
		effet l'éxécution d'un programme quelque soit la quantité de mémoire physique disponible
 | 
			
		||||
		pour le stocker.
 | 
			
		||||
\end{itemize}
 | 
			
		||||
 | 
			
		||||
Les méthodes utilisant le \textbf{bit de présence}  permetent l'éxistance partielle d'un programme en mémoire.
 | 
			
		||||
Dans le cas d'un appel vers une mémoire non présente, le processeur déclanche une \textbf{excéption}
 | 
			
		||||
de type défaut de page qui va recharger la partie concernée en mémoire physique. Si au moins un
 | 
			
		||||
cadre est disponible, il peut être pris. Si ça n'est pas le cas, un remplacmeent doit être
 | 
			
		||||
effectué \ref{sec:Eviction} Eviction de page
 | 
			
		||||
Il devra alors modifier les entrées base et limites en conséquence ainsi que mettre le bit de
 | 
			
		||||
présence à 1.
 | 
			
		||||
 | 
			
		||||
\label{sec:Eviction}
 | 
			
		||||
L'éviction d'une entrée dans la table des pages prends en compte le bit \textbf{modifié}. Celà
 | 
			
		||||
permet d'éviter de perdre du temps d'écriture car si la page n'est pas modifiée, elle est encore
 | 
			
		||||
accècible. IL existe alors plusieurs stratégies d'évicitions:
 | 
			
		||||
\begin{itemize}
 | 
			
		||||
	\item \textbf{Least Recently Used}: Eviction de la page la moins utilisée. nécéssite de
 | 
			
		||||
		connaitre le temps depuis le dernier accès 
 | 
			
		||||
	\item \textbf{Not Recently Used} permet une simplification du LRU, un simple bit est tenu à
 | 
			
		||||
		jours à la place du temps. 
 | 
			
		||||
	\item \textbf{First In First Out}: la page la plus ancienne est choisie. une structure de type
 | 
			
		||||
		\textit{FIFO} peut être utilisée. Il est également possible d'implémenter la stratégie de la
 | 
			
		||||
		\textbf{dernière change}. C'est à dire, d'implémenter l'utilisation du bit de référence
 | 
			
		||||
		(régulièrement mis à jours par l'os) pour garder les pages régulièrement chargées. Il est
 | 
			
		||||
		finalement possible d'implémenter une structure circulaire. 
 | 
			
		||||
\end{itemize}
 | 
			
		||||
 | 
			
		||||
la \textbf{Préemption} est le fait de libèrer de la mémoire d'un programme qui ne s'éxécute pas à
 | 
			
		||||
l'instant pour la donner à un autre programme en cours.
 | 
			
		||||
 | 
			
		||||
\subsection{Gestion de la mémoire physique}
 | 
			
		||||
 | 
			
		||||
Le système d'exploitation doit pouvoir, à tout moment, connaitre l'état d'occupation de la mémoire
 | 
			
		||||
physique. L'allocation de mémoire est alors plus dynamique.
 | 
			
		||||
\begin{itemize}
 | 
			
		||||
	\item \textbf{Bitmap}: tableau de bits, la mémoire physique est découpée en unités d'allocation
 | 
			
		||||
		de taille constante. on place les bits respectifs selon si l'espace est aloué ou non.
 | 
			
		||||
		\[\text{Nombres d'unités} = \frac{\text{Mémoire physique}}{\text{Taille d'une unité}}\]
 | 
			
		||||
		\[\text{Taille du bitmap} = \frac{\text{Nombres d'unités}}{8}\]
 | 
			
		||||
		Nous pouvons alors trouver le bit corespondant à une unitée en divisant l'adresse par la
 | 
			
		||||
		taille d'une unitée. Il suffit alors à l'os de trouver des suites de bits consécutifs libre
 | 
			
		||||
		pour alouer de la mémoire en conséquence.
 | 
			
		||||
	\item \textbf{Liste chainée}: chaques noed est une plage d'adresse particulière. un champ
 | 
			
		||||
		contient:
 | 
			
		||||
		\begin{itemize}
 | 
			
		||||
			\item état: libre ou aloué
 | 
			
		||||
			\item base
 | 
			
		||||
			\item longeur
 | 
			
		||||
			\item suivant
 | 
			
		||||
		\end{itemize}
 | 
			
		||||
		Nous avons finalement une chaine d'état alternant entre libre et aloué. lorsqu'un programme
 | 
			
		||||
		souhaite alouer une plage, il parcours la liste afin de trouver une plage libre dont la
 | 
			
		||||
		taille est supérieur à celle demandée. et de crée une maille de la chaine avec l'état
 | 
			
		||||
		aloué. lorsque nous avons deux états consécutifs, nous pouvons les fusioner en gardant
 | 
			
		||||
		l'adresse du premier mayon et en sommant les longeurs.
 | 
			
		||||
 | 
			
		||||
\end{itemize}
 | 
			
		||||
 | 
			
		||||
\section{Processus}
 | 
			
		||||
 | 
			
		||||
Un processus représente la mise en activité d'un programme qui réside en mémoire. (complétement ou
 | 
			
		||||
partiellement). Ce processus va occuper un processeur en utilisant le context de sa stack lorsque
 | 
			
		||||
son code sera en cours d'éxécution. Ces processus auront la capacitée de faire des appels systems
 | 
			
		||||
(syscall) qui seront transmis à l'OS pour exécution. Il est donc nécéssaire d'alterner entre
 | 
			
		||||
l'éxécution du processus et celui de l'os (notament pour les évènements/syscall).
 | 
			
		||||
 | 
			
		||||
\begin{figure}[h]
 | 
			
		||||
	\center
 | 
			
		||||
	\includegraphics[width=0.8\textwidth]{process_exe.png}
 | 
			
		||||
	\caption{Temps d'éxécution d'un processus}
 | 
			
		||||
\end{figure}
 | 
			
		||||
 | 
			
		||||
Le temps d'éxécution du programme augmente donc. Il est même souvent nécéssaire de partager le
 | 
			
		||||
processeur avec d'autre programmes en cours d'éxécution. (\textit{interleaving})
 | 
			
		||||
 | 
			
		||||
Tout les processus sont stockés dans la \textbf{table des processus} attaché à leurs état. Cet état
 | 
			
		||||
peut être: \textbf{éxécution, pret, bloqué, zombie} et chaques processus contient un context
 | 
			
		||||
nécéssaire à son fonctionnement. Il est également nécéssaire de sauvegarder l'état de la mémoire.
 | 
			
		||||
(avec sa table des segments ou la table des pages). Finalement nous devons garder les divers
 | 
			
		||||
descripteurs de resources (fichiers ouvers, ... et leurs status, décalage dans le fichiers, ...)
 | 
			
		||||
 | 
			
		||||
L'\textbf{état} est un élément éssentiel pour le processus. Celui-ci est constament dans l'un des
 | 
			
		||||
états décrits ci-dessous. Celà permet de savoir comment le processus est censé se comporter à un
 | 
			
		||||
instant t. 
 | 
			
		||||
 | 
			
		||||
\begin{itemize}
 | 
			
		||||
	\item \textbf{éxécution}: Le processus suis son éxécution courante. peut être utilisateur, où
 | 
			
		||||
		les instructions du programme s'enchainent et passe en éxécution système lors d'un
 | 
			
		||||
		évènement. Une fois cet évènement traité, le système redonne la main à l'utilisateur qui
 | 
			
		||||
		peut continuer l'éxécution du programme. Il est également possible que l'évènement soit
 | 
			
		||||
		irrécupérable. dans ce cas, le programme se termine est passe à l'état \textbf{zombie} 
 | 
			
		||||
	\item \textbf{prêt}: le processus est pret à etre éxécuté mais le processeur est actuellement
 | 
			
		||||
		occupé. une fois celui-ci libéré, il choisit (en fonction de méthodes discutés plus tard) un
 | 
			
		||||
		processus à l'état prêt et commence son éxécution.
 | 
			
		||||
	\item \textbf{bloqué}: Le processus ne peux pas continuer car il n'a pas les resources
 | 
			
		||||
		nécéssaire. Il peut par example attendre un signal réseau, une touche clavier, ... une fois
 | 
			
		||||
		cet élément reçu, le processus passe à l'état \textbf{prèt}. Le tout se fait pendant
 | 
			
		||||
		l'éxécution d'un évènement. ce qui implique que le procéssus en cours donne la main au
 | 
			
		||||
		système.
 | 
			
		||||
	\item \textbf{Zombie}: Un processus à l'état zombie ne peux plus rien faire. Il donne son état à
 | 
			
		||||
		son processus parent qui peut, une fois cet état reçu, terminer le processus.
 | 
			
		||||
\end{itemize}
 | 
			
		||||
 | 
			
		||||
Un procéssus peut créer à son tours d'autre processus (parents/enfants) Le système fonctionne alors
 | 
			
		||||
sous forme d'arborescence de processus, tous défini par leurs entrée dans la table des processus.
 | 
			
		||||
 | 
			
		||||
\begin{figure}[h]
 | 
			
		||||
	\centering
 | 
			
		||||
	\includegraphics[width=0.8\textwidth]{process_diag.png}
 | 
			
		||||
	\caption{cycles de vie des processus}
 | 
			
		||||
\end{figure}
 | 
			
		||||
 | 
			
		||||
Suite à cet agencement, il est nécéssaire de trouver des méthode d'ordonnancement. Ces méthodes
 | 
			
		||||
doivent s'assurer la bonne répartition du temps processeur qui sont pret. Nous en étudierons sous 3
 | 
			
		||||
type des systèmes différents.
 | 
			
		||||
 | 
			
		||||
Un point important à éviter est la \textbf{famine}. c'est à dire qu'une tache resterait à pret sans
 | 
			
		||||
jammais se voir éxécuter.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
\subsection{systèmes batch}
 | 
			
		||||
 | 
			
		||||
éxécute des taches de manière régulière. chaques tache est simples mais effectuée sur une quantitée
 | 
			
		||||
importante de données. Les taches sont garantie de terminer et il est possible d'estimer le temps
 | 
			
		||||
d'une tache donnée.
 | 
			
		||||
Il faut alors une équité dans les resources distribuées.
 | 
			
		||||
 | 
			
		||||
Nous regardons deux unitées. le \textit{Throughput}: nombre de taches par unité de temps, à
 | 
			
		||||
maximiser; le \textit{Turnaround}: temps moyen entre création et terminaison, à minimiser.
 | 
			
		||||
 | 
			
		||||
\begin{itemize}
 | 
			
		||||
	\item \textbf{First come first served (FCFS)}: Par ordre d'arrivé à l'état pret. Peut
 | 
			
		||||
		s'implémenter à l'aide d'une file. cette méthode est équitable et évite la famine car toutes
 | 
			
		||||
		les taches finirons par s'éxécuter. Mais ne garantis pas une utilisation optimale des
 | 
			
		||||
	\item \textbf{Shortest job first (SJF)}: Nous pouvons éstimer la durée des tache (car batch)
 | 
			
		||||
		donc nous pouvons priorisé les taches courtes. Cette stratégie minimise le turnaround mais
 | 
			
		||||
		n'est pas équitable vis à vis des tache longues. nous avons un risque de famines. 
 | 
			
		||||
	\item \textbf{Shortest Remaining Task First (SRTF)}: Nous gardons le temps restant d'éxécution
 | 
			
		||||
		de chaques processus. l'ordre d'éxécution suis alors cette liste. 
 | 
			
		||||
\end{itemize}
 | 
			
		||||
 | 
			
		||||
\subsection{Systèmes intéractifs}
 | 
			
		||||
 | 
			
		||||
Centré autours de l'utilisateur et l'intéraction. Nous voulons une équité entre les utilisateurs et
 | 
			
		||||
les resources utilisées. Nous utilisons les métriques suivantes: \textit{latence}: le temps qui
 | 
			
		||||
s'écoule entre une action de l'utilisateur et la réaction du système, \textit{Proportionalité}
 | 
			
		||||
en adéquation avec les attentes de l'utilisateur.
 | 
			
		||||
 | 
			
		||||
\begin{itemize}
 | 
			
		||||
	\item \textbf{Round-Robin}: Le temps CPU est divisé en \textit{quantum} de temps de durée fixe.
 | 
			
		||||
		Ces quantums sont distribués aux processus prets. Nous pouvons l'implémenter à l'aide d'une
 | 
			
		||||
		liste cylindrique. l'Os configure un timer pour générer une intérruption à la fin du quantum
 | 
			
		||||
		de temps pour passer à l'éxécution suivante. Cette stratégie garantit une répartition
 | 
			
		||||
		équitable du CPU entre les procéssus. Il ne faut pas que le quantum soit trop bas car au
 | 
			
		||||
		final il y aurais plus de temps nécéssaire à la commutation qu'à l'éxécution des processus.
 | 
			
		||||
	\item \textbf{Priority Schéduling}: Mise en place d'un niveau de priorité par processus.  
 | 
			
		||||
	\item \textbf{Guaranteed Scheduling}: A pour but une répartition du nombre de processs face à un
 | 
			
		||||
		délai garanti.
 | 
			
		||||
		\[\text{Délai garanti} = \frac{\text{Temps depuis sa création}}{\text{Nombre de processus}}\]
 | 
			
		||||
		L'ordonnanceur réalise un suivi du temps d'éxécution par chaque processus.
 | 
			
		||||
		\[\rho = \frac{\text{Temps reçu}}{\text{Délai garanti}}\]
 | 
			
		||||
		L'ordonnancement se base alors sur la valeur minimale.
 | 
			
		||||
	\item \textbf{Fair-share scheduling} : Deux niveau de round robin, un pour les utilisateurs et
 | 
			
		||||
		un par processus d'un utilisateur. Celà permet une répartition équitable du temps CPU par
 | 
			
		||||
		utilisateur.
 | 
			
		||||
\end{itemize}
 | 
			
		||||
 | 
			
		||||
\subsection{Systèmes temps réel}
 | 
			
		||||
 | 
			
		||||
Système nécéssitant un controle du temps (réel) critique. Il se doit de réagir dans un temps
 | 
			
		||||
déterminé. (example système de défense anti-missile scannant continuellement son périmètre.)
 | 
			
		||||
Dans ces système. chaques évènements est précisément calibré pour être traités dans un temps
 | 
			
		||||
impartis avec échéances strictes. Ce système est ordonnancable uniquement si
 | 
			
		||||
\[\sum_{i=1}^m \frac{C_i}{P_i} \leq 1\]
 | 
			
		||||
avec $P$ intervalle entre deux occurence d'évènements et $C$ Temps nécéssaire au traitement.
 | 
			
		||||
 | 
			
		||||
\vspace{1cm}Un thread (processus léger) permet un découpage des traitement qui, au sein d'un processus, peuvent
 | 
			
		||||
être effectué de mainère indépendante les uns des autres (\textbf{multi-threading} )
 | 
			
		||||
Le coup de la gestion d'un thread est moindre que celui d'un processus. car celui-ci prends toutes
 | 
			
		||||
les resources déjà alouées de son thread principal. Il suffit juste d'effectuer une allocation de
 | 
			
		||||
mémoire pour héberger le stack du thread engendré. La continuation est nest rendu également plus
 | 
			
		||||
simple.
 | 
			
		||||
L'implémentation d'un thread peut se faire à deux niveaux.
 | 
			
		||||
\begin{itemize}
 | 
			
		||||
	\item \textbf{User-level}: l'os n'a pas conscience des threads, c'est à l'application de gérer
 | 
			
		||||
		son ordonencement. Mais n'est pas très évicace faces aux évènements car un blocage
 | 
			
		||||
		(ouverture de fichiers, ...) bloquera tout les autres threads
 | 
			
		||||
	\item \textbf{Kernel-level}: la stratègie d'ordonencement apliqués aux processus est appliqué
 | 
			
		||||
		aux threads. Le blocage n'a donc pas de conséquence sur les autres threads du même
 | 
			
		||||
		processus.
 | 
			
		||||
\end{itemize}
 | 
			
		||||
 | 
			
		||||
\section{Concurence}
 | 
			
		||||
 | 
			
		||||
\section{Systèmes de fichiers}
 | 
			
		||||
 | 
			
		||||
\section{Entrées-sorties}
 | 
			
		||||
 | 
			
		||||
\end{document}
 | 
			
		||||
		Reference in New Issue
	
	Block a user