Cours copiés au premier semestre

This commit is contained in:
Némunaire 2012-01-30 15:05:18 +01:00
commit 96e4f76a9c
6 changed files with 1135 additions and 0 deletions

143
OS/3-ordonnancement.tex Normal file
View file

@ -0,0 +1,143 @@
\chapter{Ordonnancement des processus}
\section{Généralités}
La durée de cycle d'un processus, c'est la durée moyenne d'un cycle de
Von-Neuman non intérompu (pour des entrées/sorties).
Globalement, pour un ordinateur grand public, la plus grande majorité
des programmes se trouvent être majoritairement tributaire des
entrées/sorties.
\subsection{Ordonnancement et réquisition}
Il existe deux familles d'ordonnanceurs : avec ou sans
réquisitions. On parle alors de système coopératifs ou préemptifs.
Pour commuter, il peut se passer deux choses :
- soit ce n'est pas un choix : le processus s'est bloqué pour une E/S
ou s'est terminé.
- un choix : par exemple lorsqu'un nouveau processus arrive ; passage
des états actifs ou bloqués à l'état prêt.
Les ordonnanceurs sans réquisition ne passe la main à d'autres
processus que dans le cas où un autre processus se bloque.
Dans un système de ce type, on demande au programmeur de placer dans
son code des yield, un appel système pour passer la main à un autre
programme.
Le problème d'un système préemptif c'est la synchronisation (il ne
faudrait pas arrêter un processus en pleine transaction réseau ou
lors d'un appel système, ...)
Pour une horloge à temps fixe est nécessaire pour ce genre de système.
\subsection{Critères d'ordonnancement}
Pour tous les systèmes, les grandes lignes sont~:
\begin{itemize}
\item \textbf{Équité~:} répartition du CPU entre processus différent
(faut-il donner autant de CPU à tous)
\item \textbf{Respect de politique~:} imposer les choix
d'ordonnacement. Regarder que tous les processus respectent bien
les règles d'ordonnancement définies.
\item \textbf{Équilibre~:} le choix de l'ordonnanceur ne doit pas
conduire à un trop grand nombre de périphériques inactifs.
\end{itemize}
Pour un système de traitement par lot, les grandes lignes sont
plutôt~:
\begin{itemize}
\item \textbf{Capacité de traitement/rendement~:} mombre de
processus exécutés par unité de temps.
\item \textbf{Temps de restitution/service~:} délai entre la
soumission d'un processus et sa terminaison (mise en mémoire,
atente en état prêt, attente E/S, exécution)
\end{itemize}
Pour des processus interactifs, les grandes lignes sont~:
\begin{itemize}
\item \textbf{Temps de réponse~:} délai entre la soumission et le
moment où l'oin commence à répondre.\\
Paradoxalement, un processus plus long à s'exécuter peut être
préféré s'il répond plus vite.
\item \textbf{Temps d'attente~:} temps passé en état prêt.\\
C'est évidemment du gachi pour l'utilisateur.
\item \textbf{Proportionnalité~:} aux attentes des utilisateurs.\\
Répondre en fonction des critères de l'utilisateur. (commande
\texttt{nice}).
\end{itemize}
Dans le cas des systèmes temps réels, les deux critères importants
sont~: le respect des dates limites (éviter la perte de données) et la
prédictibilité (pour la stabilité des applications multimédia).
\section{Algorithmes d'ordonnancement}
\subsection{Premier arrivé premier servi}
C'est le premier algorithme à avoir été implémenté, directement issue
du traitement par lot.
Il s'agit d'un algorithme sans réquistion. Il est facile à comprendre
est facile à programmer.
Il y a une file d'attente des processus « prêt ». C'est relativement
optimal et peut couteux~: des simples mises à jour de pointeurs pour
la gestion de la file.
Il est intrinsèquement équitable pour des processus équivalent.
Les problèmes de cet algo sont la grande variance dans les critères
d'ordonnancement ; mais également l'effet d'accumulation~: les petits
processus qui font de nombreux accès aux périphériques perdent
énormément de temps car les périphériques sont inactifs le temps qu'un
processus long s'exécute.
\subsection{Plus court d'abord}
Il s'agit d'un algorithme sans réquisition
C'est le meilleur algo pour avoir un temps d'attente moyen minimal.
Le problème de cet algo est que l'on est pas capable de
l'implémenter, car on est pas capable de calculer la durée du prochain
cycle :D
Cet algo n'est pas adapté pour l'ordonnancement à court terme, mais
reste valable pour les systèmes de traitement par lots.
Étant donné qu'il est optimal, on peut l'utiliser pour benchmarker les
autres types d'ordonnanceurs.
\subsection{Ordonnancement avec priorité}
\subsection{Tourniquet}
Concu spécialement pour le temps partagé.
C'est un FCFS avec réquisition sur une base de quantums (20-50ms).
Il nécesite une horloge pour permettre d'être préamptif.
Il y a quelques précautions à prendre~:
- Le quantum doit être grand par rapport au temps de commutation
- Le quantum ne doit pas être trop grand
\subsection{Files d'attentes multi-niveau}
On découpe la file d'attente des processus prêts en plusieurs files (processus système, interactifs, arrière-plan, ...)
Il est donc possible d'utiliser un algorithme d'ordonnancement différent pour chaque file. On peut également ordonnancer les files entre-elles (priorité fixes,
allocation de tranches de temps, ...)
Il est généralement utilisé conjointement avec un ordinnancement avec feedback (ou recyclage) comme algo de veillissement : il s'agit de la possibilité de
déplacer les processus d'une file d'attente à l'autre. L'implementation est légère.
\subsection{Loterie}
OVNI dans la théorie de l'ordonnancement.
Chaque processus qui arrive dans la liste se voit attribuer un numéro, puis à intervalle régulier, il va choisir un processus aléatoirement.
Il a quelques avantages :
- L'implémentation de priorité est légère : il suffit de lui donner deux tickets d'ordonnanceur ou plus !
\subsection{Ordonnancement temps-réel}

63
OS/7-memoirevirtuelle.tex Normal file
View file

@ -0,0 +1,63 @@
\subsection{Algorithme de l'ensemble de travail (WS), 1970}
\textbf{Phénomène de localisation~:} l'ensemble des pages référencées
dépend de \og phases\fg{} dans l'exécution.
\subsection{Bufferisation}
Maintenir un ensemble de cadres de pages libres en permanance.
Lorsqu'un processus demande un nouveau cadre, on sélectionne une
victime, mais on ne la supprime pas tout de suite.
On attend que le MMU soit inactif pour le faire.\\
Implémentation grâce à un \og paging daemon\fg.
\section{Problèmes liés à la conception}
\subsection{Politiques de sélection des pages}
Deux politiques sont possibles~:
\begin{itemize}
\item \textbf{Allocation globale~:} considérer toutes les pages
actuellement en mémoire.
\item \textbf{Allocation locale~:} lorsque l'on choisit une
victime, on va chercher a supprimer une page du processus
courant.
\end{itemize}
\subsection{Répartition des cadres de page}
\begin{itemize}
\item \textbf{Allocation équitable~:} chaque processus a un nombre
de cadres de pages identiques aux autres processus.
\item \textbf{Allocation proportionnelle~:} on alloue un nombre de
cadre de page en fonction de la taille du processus.
\item \textbf{Allocation mixte~:} on effectue une allocation
proportionelle, en regardant aussi la priorité du processus.
\item \textbf{Prépagination~:} on commence a allouer les premières
pages du processus (_start, main, ...) pour éviter le grand nombre
de défaut de page au lancement.
\end{itemize}
\subsection{Autres}
\textbf{Contrôle de charge~:} gérer \og l'écroulement\fg{} (la somme
des ensembles de travail dépasse la capacité
mémoire). Swapping/refuser d'en faire plus...\\
\paragraph{Pages partagées~:} en allocation locale, on peut supprimer une
page partagée non utilisé dans un processus donné, mais très utilisée
par d'autres processus.
\paragraph{Structure des programmes~:} la manière dont on organise le
code a une incidence sur le pagineur.
\paragraph{Vérouillage des E/S~:} il faut a tout prix éviter
l'éviction d'une page qui est en attente d'une E/S. Pour cela, on
utilise le bit verrou.\\
On peut aussi utiliser ce bit pour vérouiller les pages d'un programme
nouvellement chargé en mémoire.
\section{Problèmes liés à l'implémentation}

140
OS/8-FS.tex Normal file
View file

@ -0,0 +1,140 @@
\chapter{Systèmes de fichiers}
\section{Généralités}
\begin{itemize}
\item Persistande des informations
\item Partage d'informations (entre les processus, ...)
\end{itemize}
La notion de fichier apporte une espace de stockage important, un
stockage statique de l'information et une indépendance vis-à-vis des
processus qui l'utilisent ou l'ont utilisés.
\subsection{Structure}
\begin{itemize}
\item \textbf{Fichiers~:} unité logique de stockage d'information.
\item \textbf{Répertoire~:} organisation logique de l'information.
\item \textbf{Partitions~:} organisation de plus haut niveau.
\end{itemize}
On a une vision logique et uniformisée de l'information. Les
caractéristiques physiques du stockage font une abstraction des
caractéristiques physiques.
Les formats, type du système sont choisis par le créateur.
\subsection{Méthodes d'accès}
\subsubsection{Accès séquentiel}
Méthode historique, basé sur le modèle des bandes magnétiques~:
pointeur de lecteur/écriture (offset) automatiquement incrémenté. Et
des privitives de positionnement (seek).
\subsubsection{Accès direct/relatif}
\og Random access\fg, modèle des disques durs.\\
Les primitives de lecture et d'écriture sont paramétrées par un
numéro de bloc relatif. Un fichier est vu comme un enregistrement de
blocs de taille fixe.
\subsubsection{Remarques}
\begin{itemize}
\item Certains systèmes fournissent plusieurs méthodes d'accès,
comme IBM.
\item Le mode d'accès peut faire partie du type de fichier.
\item Il est trivial d'implémenter l'accès séquentiel à partir de
l'accès de l'accès direct.
\end{itemize}
\subsection{Table de fichiers (ouverts)}
Mise en cache des descripteurs de fichiers actuellement utilisés
\section{Organisation des systèmes de fichiers}
\subsection{Macro-niveaux d'organisation}
\begin{itemize}
\item \textbf{Partition~:} \og mini-disque\fg (chez IBM), \og
volume\fg (chez Mac).\\
Selon les systèmes, plusieurs partitions par disques, ou plusieurs
disques par partitions.
\item \textbf{Répertoire~:} analogue à une table des symboles.
Contient des informations sur les fichiers sous-jacents (nom,
emplacement, taille, type\ldots).
\end{itemize}
\subsection{Niveaux de répertoires}
\subsubsection{Niveau 1}
Structure simpliste d'une unique répertoire.
On a des problèmes d'unicité des noms (11 caractères pour MS-DOS et
255 pour Unix).
\subsubsection{Niveau 2}
Un répertoire principal (\og MFD\fg) contient des répertoires
utilisateurs (\og UFD\fg). Accès implicite à son propre UFD.
On voit apparaître la notion de session (login/password).
\subsubsection{Nommage}
\paragraph{MS-DOS~:} \verbatim{C:\dupont\test.exe}
\paragraph{Unix~:} \verbatim{/var/spool/mail/dupont}
\paragraph{VAX-VMS~:} \verbatim{u:[dir1.dir2]foo.com;1}
\section{Méthode d'allocation}
\subsection{Allocation contiguë}
Les fichiers sont stockés par blocs contigus sur le disque.\\
Le temps de positionnement des têtes est minimal. Accès direct et
séquentiel faciles à implémenter.
Problèmes~: fragmentation interne s'il y a trop d'espace ; pas assez
d'espace~: déplacement couteux des fichiers ; pas toujours possible.\\
Utilisé sur les CD et DVD.
\subsection{Allocation chaînée}
Chaque bloc se termine par un pointeur sur le bloc suivant.\\
Une entrée de répertoire contient un pointeur sur le premier bloc.
Pas de fragmentation externe, pas de limite de taille. Mais accès
direct inefficasse. Au niveau de la fiabilité, la perte d'un pointeur
est critique.
\subsection{File Allocation Table (FAT)}
Il y a une FAT au début de chaque partition. Il s'agit d'une table
indexée par numéros de bloc. Chaque entrée pointe sur le numéro de
bloc suivant.
Une entrée de répertoire contient un pointeur sur le premier bloc.
\subsection{Allocation indexée}
Chaque fichier possède un bloc d'index.
Une entrée de répertoire pointe sur le bloc d'index
La ie entrée du bloc d'index pointe sur le ue bloc de donnée du
fichier.
La table des i-nodes est de taille proportionnelle au nombre de
fichiers.
Par contre, la fragmentation interne est plus grande qu'avec
l'allocation chaînée et un problème de taille des inodes.
\section{Performances des systèmes de fichiers}