Compare commits

...

4 commits

5 changed files with 652 additions and 5 deletions

View file

@ -1,21 +1,29 @@
baseURL = "https://lpro.epha.se"
languageCode = "fr"
defaultContentLanguage = "fr"
title = "Licence pro ADSILLH - Cours et TD"
title = "Note de cours et TD"
pygmentsCodeFences = true
pygmentsUseClasses = false
theme = "mainroad"
rssLimit = 10
paginate = 10
enableRobotsTXT = true
enableRobotsTXT = false
[Author] # Used in authorbox
name = "ephase"
bio = "Adminstrateur système, j'ai d'abord intégré la Licence Pro ADSILLH et mainrenant le Master IDI à l'Université de Bodreaux"
avatar = "assets/images/souris.svg"
[taxonomies]
category = "categories"
tag = "tags"
[Params]
description = "Licence ADSILLH et Master IDI, mes notes de cours et de TD"
toc = true
post_navigation = true
postSections = ["reseau", "progsys", "installations", "bdd", "securite"]
mainSections = ["reseau", "progsys", "installations", "bdd", "securite", "systemes_exploitation"]
post_meta = ["author", "date", "categories", "translations"]
[Params.sidebar]
home = "right" # Configure layout for home page

View file

@ -0,0 +1,340 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 11 Build 197, SVG Export Plug-In -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="128"
height="128"
viewBox="3.025 -0.229 169 237"
xml:space="preserve"
id="svg3959"
sodipodi:version="0.32"
inkscape:version="0.48.2 r9819"
sodipodi:docname="souris.svg"
inkscape:output_extension="org.inkscape.output.svg.inkscape"
version="1.0"
inkscape:export-filename="/home/ephase/Images/Ressources/icones/souris.png"
inkscape:export-xdpi="45"
inkscape:export-ydpi="45"><metadata
id="metadata4028"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><sodipodi:namedview
inkscape:window-height="749"
inkscape:window-width="1280"
inkscape:pageshadow="2"
inkscape:pageopacity="1"
guidetolerance="10.0"
gridtolerance="10.0"
objecttolerance="10.0"
borderopacity="1.0"
bordercolor="#666666"
pagecolor="#ffffff"
id="base"
showgrid="false"
inkscape:zoom="0.28857909"
inkscape:cx="3128.468"
inkscape:cy="-1115.1709"
inkscape:window-x="-1"
inkscape:window-y="26"
inkscape:current-layer="svg3959"
inkscape:window-maximized="1"
showguides="true"
inkscape:guide-bbox="true"
inkscape:snap-global="false" />
<defs
id="defs3961"><linearGradient
id="linearGradient13265"><stop
style="stop-color:#980000;stop-opacity:1;"
offset="0"
id="stop13267" /><stop
style="stop-color:#ff1010;stop-opacity:1;"
offset="1"
id="stop13269" /></linearGradient><linearGradient
id="linearGradient13232"><stop
style="stop-color:#141478;stop-opacity:1;"
offset="0"
id="stop13234" /><stop
style="stop-color:#6060e5;stop-opacity:1;"
offset="1"
id="stop13236" /></linearGradient><inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 118.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="169 : 118.5 : 1"
inkscape:persp3d-origin="84.5 : 79 : 1"
id="perspective4030" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient13232"
id="linearGradient13246"
x1="1766.8267"
y1="833.69983"
x2="1707.1578"
y2="834.82715"
gradientUnits="userSpaceOnUse" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient13232"
id="linearGradient13259"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.54008439,0,0,0.54008439,16.729114,0.12367932)"
x1="3457.6523"
y1="1294.3481"
x2="3256.5974"
y2="1574.1963" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient13232"
id="linearGradient13263"
gradientUnits="userSpaceOnUse"
x1="1754.8358"
y1="833.46924"
x2="1732.7538"
y2="833.90479" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient13265"
id="linearGradient13279"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(-1,0,0,-1,7025.4374,2738.9717)"
x1="3457.6523"
y1="1294.3481"
x2="3221.5789"
y2="1625.6942" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient13265"
id="linearGradient13281"
gradientUnits="userSpaceOnUse"
x1="1766.8267"
y1="833.69983"
x2="1707.1578"
y2="834.82715" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient13265"
id="linearGradient13283"
gradientUnits="userSpaceOnUse"
x1="1754.8358"
y1="833.46924"
x2="1732.7538"
y2="833.90479" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient13232"
id="linearGradient13294"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.54008439,0,0,0.54008439,16.729114,0.12367932)"
x1="3457.6523"
y1="1294.3481"
x2="3256.5974"
y2="1574.1963" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient13232"
id="linearGradient13297"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.6533027,0,0,1.6533027,-1542.0062,-762.90463)"
x1="3457.6523"
y1="1294.3481"
x2="3256.5974"
y2="1574.1963" /><radialGradient
inkscape:collect="always"
xlink:href="#linearGradient13265"
id="radialGradient13306"
cx="2325.457"
cy="866.42877"
fx="2325.457"
fy="866.42877"
r="183.0407"
gradientTransform="matrix(1,0,0,1.3068621,0,-265.87415)"
gradientUnits="userSpaceOnUse" /></defs>
<g
id="g3963"
transform="matrix(0.9204126,0,0,0.9204126,7.2696233,9.3176187)">
<g
id="g3965">
<defs
id="defs3967">
<rect
id="XMLID_3_"
y="45.909"
width="174.39"
height="194.13"
x="0" />
</defs>
<clipPath
id="XMLID_2_">
<use
xlink:href="#XMLID_3_"
id="use3971"
x="0"
y="0"
width="169"
height="237" />
</clipPath>
<polyline
clip-path="url(#XMLID_2_)"
clip-rule="evenodd"
points="151.357,88.684 141.486,88.684 141.486,98.555 131.615,98.555 131.615,108.426 141.486,108.426 141.486,118.297 151.357,118.297 151.357,88.684 "
id="polyline3973"
style="fill:#030200;fill-rule:evenodd" />
<polyline
clip-path="url(#XMLID_2_)"
clip-rule="evenodd"
points="141.486,88.684 141.486,78.812 111.873,78.812 111.873,68.941 102.001,68.941 102.001,78.812 72.388,78.812 72.388,68.941 62.517,68.941 62.517,78.812 32.904,78.812 32.904,88.684 141.486,88.684 "
id="polyline3975"
style="fill:#030200;fill-rule:evenodd" />
<polyline
clip-path="url(#XMLID_2_)"
clip-rule="evenodd"
points="131.615,98.555 141.486,98.555 141.486,88.684 32.904,88.684 32.904,98.555 42.775,98.555 42.775,108.426 52.646,108.426 52.646,98.555 82.259,98.555 82.259,108.426 92.13,108.426 92.13,98.555 121.744,98.555 121.744,108.426 131.615,108.426 131.615,98.555 "
id="polyline3977"
style="fill:#f1e9d9;fill-rule:evenodd" />
<polyline
clip-path="url(#XMLID_2_)"
clip-rule="evenodd"
points="141.486,108.426 131.615,108.426 131.615,118.297 121.744,118.297 121.744,138.039 131.615,138.039 131.615,197.265 141.486,197.265 141.486,207.136 151.357,207.136 151.357,217.007 161.228,217.007 161.228,177.522 151.357,177.522 151.357,118.297 141.486,118.297 141.486,108.426 "
id="polyline3979"
style="fill:#d5cfc2;fill-rule:evenodd" />
<polyline
clip-path="url(#XMLID_2_)"
clip-rule="evenodd"
points="131.615,118.297 131.615,108.426 121.744,108.426 121.744,98.555 92.13,98.555 92.13,108.426 102.001,108.426 111.873,108.426 111.873,128.168 102.001,128.168 102.001,108.426 92.13,108.426 82.259,108.426 82.259,98.555 52.646,98.555 52.646,108.426 62.517,108.426 72.388,108.426 72.388,128.168 62.517,128.168 62.517,108.426 52.646,108.426 42.775,108.426 42.775,118.297 52.646,118.297 52.646,138.039 82.259,138.039 82.259,118.297 92.13,118.297 92.13,138.039 121.744,138.039 121.744,118.297 131.615,118.297 "
id="polyline3981"
style="fill:#030200;fill-rule:evenodd" />
<polyline
clip-path="url(#XMLID_2_)"
clip-rule="evenodd"
points="62.517,108.426 62.517,128.168 72.388,128.168 72.388,108.426 62.517,108.426 "
id="polyline3983"
style="fill:#84817d;fill-rule:evenodd" />
<polyline
clip-path="url(#XMLID_2_)"
clip-rule="evenodd"
points="111.873,108.426 102.001,108.426 102.001,128.168 111.873,128.168 111.873,108.426 "
id="polyline3985"
style="fill:#84817d;fill-rule:evenodd" />
<polyline
clip-path="url(#XMLID_2_)"
clip-rule="evenodd"
points="161.228,118.297 151.357,118.297 151.357,177.522 161.228,177.522 161.228,118.297 "
id="polyline3987"
style="fill:#030200;fill-rule:evenodd" />
<polyline
clip-path="url(#XMLID_2_)"
clip-rule="evenodd"
points="131.615,197.265 131.615,138.039 121.744,138.039 121.744,197.265 52.646,197.265 52.646,138.039 42.775,138.039 42.775,197.265 32.904,197.265 32.904,207.136 141.486,207.136 141.486,197.265 131.615,197.265 "
id="polyline3989"
style="fill:#030200;fill-rule:evenodd" />
<polyline
clip-path="url(#XMLID_2_)"
clip-rule="evenodd"
points="171.099,177.522 161.228,177.522 161.228,217.007 151.357,217.007 151.357,226.878 23.033,226.878 23.033,217.007 13.162,217.007 13.162,177.522 3.291,177.522 3.291,236.749 171.099,236.749 171.099,177.522 "
id="polyline3991"
style="fill:#030200;fill-rule:evenodd" />
<polyline
clip-path="url(#XMLID_2_)"
clip-rule="evenodd"
points="151.357,207.136 141.486,207.136 141.486,217.007 151.357,217.007 151.357,207.136 "
id="polyline3993"
style="fill:#030200;fill-rule:evenodd" />
<polyline
clip-path="url(#XMLID_2_)"
clip-rule="evenodd"
points="102.001,78.812 102.001,68.941 92.13,68.941 92.13,59.07 82.259,59.07 82.259,68.941 72.388,68.941 72.388,78.812 102.001,78.812 "
id="polyline3995"
style="fill:#b0aea9;fill-rule:evenodd" />
<polyline
clip-path="url(#XMLID_2_)"
clip-rule="evenodd"
points="102.001,59.07 92.13,59.07 92.13,68.941 102.001,68.941 102.001,59.07 "
id="polyline3997"
style="fill:#030200;fill-rule:evenodd" />
<polyline
clip-path="url(#XMLID_2_)"
clip-rule="evenodd"
points="92.13,59.07 92.13,49.199 82.259,49.199 82.259,59.07 92.13,59.07 "
id="polyline3999"
style="fill:#030200;fill-rule:evenodd" />
<polyline
clip-path="url(#XMLID_2_)"
clip-rule="evenodd"
points="82.259,59.07 72.388,59.07 72.388,68.941 82.259,68.941 82.259,59.07 "
id="polyline4001"
style="fill:#030200;fill-rule:evenodd" />
<polyline
clip-path="url(#XMLID_2_)"
clip-rule="evenodd"
points="92.13,118.297 82.259,118.297 82.259,138.039 52.646,138.039 52.646,197.265 121.744,197.265 121.744,138.039 92.13,138.039 92.13,118.297 "
id="polyline4003"
style="fill:#f1e9d9;fill-rule:evenodd" />
<polyline
clip-path="url(#XMLID_2_)"
clip-rule="evenodd"
points="23.033,118.297 13.162,118.297 13.162,177.522 23.033,177.522 23.033,118.297 "
id="polyline4005"
style="fill:#030200;fill-rule:evenodd" />
<polyline
clip-path="url(#XMLID_2_)"
clip-rule="evenodd"
points="32.904,118.297 32.904,108.426 42.775,108.426 42.775,98.555 32.904,98.555 32.904,88.684 23.033,88.684 23.033,118.297 32.904,118.297 "
id="polyline4007"
style="fill:#030200;fill-rule:evenodd" />
<polyline
clip-path="url(#XMLID_2_)"
clip-rule="evenodd"
points="32.904,108.426 32.904,118.297 23.033,118.297 23.033,177.522 13.162,177.522 13.162,217.007 23.033,217.007 23.033,207.136 32.904,207.136 32.904,197.265 42.775,197.265 42.775,138.039 52.646,138.039 52.646,118.297 42.775,118.297 42.775,108.426 32.904,108.426 "
id="polyline4009"
style="fill:#f1e9d9;fill-rule:evenodd" />
<polyline
clip-path="url(#XMLID_2_)"
clip-rule="evenodd"
points="32.904,207.136 23.033,207.136 23.033,217.007 32.904,217.007 32.904,207.136 "
id="polyline4011"
style="fill:#030200;fill-rule:evenodd" />
<polyline
clip-path="url(#XMLID_2_)"
clip-rule="evenodd"
points="32.904,217.007 23.033,217.007 23.033,226.878 151.357,226.878 151.357,217.007 141.486,217.007 141.486,207.136 32.904,207.136 32.904,217.007 "
id="polyline4013"
style="fill:#d5cfc2;fill-rule:evenodd" />
</g>
<rect
x="82.286003"
y="39.331001"
width="9.8800001"
height="9.8800001"
id="rect4015" />
<rect
x="82.319"
y="29.487"
width="9.8800001"
height="9.8800001"
id="rect4017" />
<rect
x="92.184998"
y="19.643"
width="9.8809996"
height="9.8800001"
id="rect4019" />
<rect
x="102.226"
y="9.8959999"
width="9.8800001"
height="9.8800001"
id="rect4021" />
<rect
x="112.076"
width="9.8800001"
height="9.8800001"
id="rect4023"
y="0" />
<rect
x="121.951"
width="9.8789997"
height="9.8800001"
id="rect4025"
y="0" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 12 KiB

View file

@ -0,0 +1,100 @@
---
title: "Systèmes d'exploitation : Introduction"
date: 2021-09-10
tags: ["système", "appels système", "interruption"]
categories: ["Systèmes d'exploitation", "Cours"]
---
## Qu'est ce que c'est?
D'après
[Wikipedia](https://fr.wikipedia.org/wiki/Syst%C3%A8me_d%27exploitation), "un
système d'exploitation est est un ensemble de programmes qui dirige
l'utilisation des ressources d'un ordinateur par des logiciels applicatifs."
Il permet l'abstraction matérielle *(via les pilotes de périphériques)*, la
gestion des processus *(et leur séparation, permettant à un processus défectueux
de ne pas impacter les autres)*, la gestion fine des ressources...
Le systèmes d'exploitation prend en charge la gestion du processeur, de la
mémoire, des accès disques, de la pile réseau, les services et souvent aussi
l'interface graphique. Il peut-être *(rarement)* mono-utilisateur ou
multi-utilisateur.
Il est donc important de ne pas confondre **Noyau** et système d'exploitation,
le premier étant une partie du second.
## Les interruptions
D'après [Wikipedia](https://fr.wikipedia.org/wiki/Interruption_(informatique)),
"une interruption est une suspension temporaire de l'exécution d'un programme
informatique par le microprocesseur afin d'exécuter un programme prioritaire
(appelé service d'interruption)."
Les interruptions peuvent être envoyées par les périphériques ou le CPU
lui-même. Lors de l'envoi d'une interruption, aucun message n'est envoyé,
seulement son numéro, le CPU fait alors un saut vers une routine définie par
**la table d'interruption**. Cette table est mise en place par le *noyau* en
RAM. Cette table contient une entrée par interruption.
Il existe deux grand type
d'interruption:
* Celle basées sur le matériel
* Celle basée sur le temps (horloge)
La routine propre à l'interruption appellen ensuite une *iret* afin de reprendre
l'exécution précédente.
sous certaines conditions, certaines interruptions sont "masquable" *(mais elle
ne peuvent pas être ignorées)*.
### Le cas du timer
C'est une interruption déclenchée à intervalle régulier, en général toutes les
10ms. Ainsi un processus ne peut pas monopoliser indéfiniment le CPU. Ainsi le
noyau peut stopper, voire tuer un processus trop gourmand.
## Les privilèges
Nous avons besoin de contrôler ce que font les processus, seult le noyau doit
être tout-puissant. Le contrôle des instructions autorisée ou non ne peut se
faire **qu'au niveau du matériel** et donc du CPU.
Ainsi ce dernier disponse de deux modes de fonctionnement:
* **protégé**: seul un nombre restreint d'instruction sont disponibles
* **réel** (ou noyau) toutes les instructions sont disponibles.
Si une instruction privilégiée est exécutées par un processus, une exception
(sorte d'interruption) est lancée.
Pour des questions de sécurité, un processus ne doit pas pouvoir exécuter des
instructions privilegiées. En effet le rôle du noyau ets aussi de faire
abstraction du matériel, lui seul y a accès. Cependant certains processus ont
besoin d'y accéder **un affichage** avec `printf` ou la **saisie d'un texte au
clavier** ou encore **créer un processus**.
### Les appels systèmes
Pour celà le noyau dispose d'un mécanisme : **les appels systèmes**. ainsi le
noyau contient des routines pouvant être utiles aux processus. Ces routines sont
appelés par des interruptions logicielles. Le processus positionne le numéro de
l'appel un registre (`%eax` sur les processeurs Intel) et lance l'interruption.
Côté noyau, une table contenant la liste des appels systèmes est positionnée en
RAM.
L'utilisation des appels systèmes est sécurisée : les processus ne joue pas avec
des adresse mémoires contenant des routines, mais ne connaissent seulement son
numéro. Les paramètres necessaires aux appels sont eux stockés sur la pile.
### Dans les systèmes modernes.
Ils sont nombreux : on en compte environ 330 dans Linux et plus de 500 dans
MacOSX.
Sour Linux, certaines routines sont inclues dans la `libc` et ne sont donc pas
des appels système. Par exemple `printf` qui affiche des éléments à l'écran et
inclu dans la `libc` utilise l'appel système `write`.

View file

@ -0,0 +1,199 @@
---
title: "Systèmes d'exploitation : Les processus"
date: 2021-09-17
tags: ["système", "appels système", "processus"]
categories: ["Systèmes d'exploitation", "Cours"]
---
Les processus sont des instances vivants de programmes. Un programme représente
du code binaire stocké sur un support de stockage.
Un processus est un espace d'adressage en mémoire et d'un contexte d'exécution.
Plus d'information est disponible [dans les cours de prog. système]({{< ref
"../../progsys/3-processus/index.md">}} "Les processus")
## Accès à la mémoire
L'espace d'adressage contient des segments mémoire :
* le *segment de texte* / de code: les instructions optimisées par le
compilateur, souvent en lecture seule dans les systèmes modernes.
* le *segment data* contenant lui même le segment des *données initialisées* et
le BSS (données non-initialisées)
* le *tas*, zone de mémoire dynamique gérée par la `libc` par l'utilisation de
`malloc()` et `free()`. Le système ne peut détecter un accès en dehors de
la plage définie par un `malloc()`. Lorsque le tas n'a plus d'espace alors
la `libc` effectue un appel système (mais le noyau peut refuser d'allouer)
* la *pile d'exécution*, sa taille est de 8MiB maximum sous Linux. Ce segment
contient les paramètres des fonctions et leurs variables locales.
* les *librairies partagées* mappees à la demande.
Il est possible de voir les espaces de mémoire alloués pour un processus donné :
```
cat /proc/self/maps
55fee9705000-55fee9707000 r--p 00000000 fe:01 1979024 /usr/bin/cat
55fee9707000-55fee970c000 r-xp 00002000 fe:01 1979024 /usr/bin/cat
55fee970c000-55fee970f000 r--p 00007000 fe:01 1979024 /usr/bin/cat
55fee970f000-55fee9710000 r--p 00009000 fe:01 1979024 /usr/bin/cat
55fee9710000-55fee9711000 rw-p 0000a000 fe:01 1979024 /usr/bin/cat
55feead5a000-55feead7b000 rw-p 00000000 00:00 0 [heap]
7fbcfa322000-7fbcfa344000 rw-p 00000000 00:00 0
7fbcfa344000-7fbcfa62c000 r--p 00000000 fe:01 1987533 /usr/lib/locale/locale-archive
7fbcfa62c000-7fbcfa62e000 rw-p 00000000 00:00 0
7fbcfa62e000-7fbcfa654000 r--p 00000000 fe:01 1969528 /usr/lib/libc-2.33.so
7fbcfa654000-7fbcfa79f000 r-xp 00026000 fe:01 1969528 /usr/lib/libc-2.33.so
7fbcfa79f000-7fbcfa7eb000 r--p 00171000 fe:01 1969528 /usr/lib/libc-2.33.so
7fbcfa7eb000-7fbcfa7ee000 r--p 001bc000 fe:01 1969528 /usr/lib/libc-2.33.so
7fbcfa7ee000-7fbcfa7f1000 rw-p 001bf000 fe:01 1969528 /usr/lib/libc-2.33.so
7fbcfa7f1000-7fbcfa7fc000 rw-p 00000000 00:00 0
7fbcfa80f000-7fbcfa810000 r--p 00000000 fe:01 1969517 /usr/lib/ld-2.33.so
7fbcfa810000-7fbcfa834000 r-xp 00001000 fe:01 1969517 /usr/lib/ld-2.33.so
7fbcfa834000-7fbcfa83d000 r--p 00025000 fe:01 1969517 /usr/lib/ld-2.33.so
7fbcfa83d000-7fbcfa83f000 r--p 0002d000 fe:01 1969517 /usr/lib/ld-2.33.so
7fbcfa83f000-7fbcfa841000 rw-p 0002f000 fe:01 1969517 /usr/lib/ld-2.33.so
7ffccf574000-7ffccf595000 rw-p 00000000 00:00 0 [stack]
7ffccf5c8000-7ffccf5cc000 r--p 00000000 00:00 0 [vvar]
7ffccf5cc000-7ffccf5ce000 r-xp 00000000 00:00 0 [vdso]
ffffffffff600000-ffffffffff601000 --xp 00000000 00:00 0 [vsyscall]
```
On y voit biens les adresses de début, ceux de fin, les droits (`r`ead,
`w`rite, e`x`ecute, `p`rivate)
L'accès par un processus à un espace mémoire invalide donne lieu à la fameuse
`segmentation fault`. Mais il est tout à fait possible de lire et écrire vers
une zone non allouée du tas. Par exemple j'initialise un tableau de 10 éléments
et les rmpli avec une boule de 15 itérations.
## Attributs d'un processus
en plus de l'espace mémoire alloué pour le processus, le noyau stocke en mémoire
un ensemble d'attributs : son identitiants (`PID`), sa priorité, l'`UID`
(réel/effectif), la table des descripteurs de fichiers, la table des signaux, un
espace pour sauvegarder les registres (changement de contexte, reprise sur
interruption).
## Création et vie des processus
Un processus voulant en créer un autre doit faire un appel système `fork`. Lors
du changement de contexte, les registres du processus `p0` sont sauvegardés puis
remplacés par ceux de `p1`.
Les signaux sont délivrés au processus lors du passage du noyau à l'exécution.
### Processus bloquants
Lorsqu'un processus attends un appel bloquant (par exemple `read()`) il est muse
en sommeil. Lorque l'interruption est lancée, alors le noyau réveille le
processus.
## Ordonnancement
L'ordonnancement essaye définir un **fonctionnement universel** visant à
organiser l'exécution concurente de processus sur un CPU. Un fonctionnement
universel, convenant donc à tous les usages, *est impossible à obtenir*. Il
dépend en effet de l'utilisation qui en est fait : interactif, temps-réel etc.
Dans le cadre d'un système interactif, la réactivité est la caractéristique la
plus importante.
### Stratégie
Le type de système influe donc sur la stratégie à adopter. nous allons en
détailler certaines.
#### FIFO - First In First Out
Une liste chainée de processus, on exécute le premier jusquà la fin de son
exécution ou qu'il soit bloqué puis le second et ainsi de suite.
C'est une technique facile à implémenter, il est très peu couteux en temps
processeur (le noyau intervient peu, peu de changement de contexte) mais
comporte un gand risque de **famine** : un processus en boucle ne rendrai jamais
la main.
#### Round-Robin
Un **temporisateur** valable pour tous: le changent de contexte intervient toute
les 10ms par exemple. C'est une technique facile à implementer, il y a plus de
famine mais on ne **gère pas de priorité**. S'il y a beaucoup de processus,
alors notre éditeut de texte sera moind réactif.
#### Priorité stricte
Les processus sont triés par priorité et les plus important son exécutés en
premier. contrairement au *Round-Robin* on gère la priorité mais ette technique
est discriminatoire. Comment **assigner les priorités**? Au faciès?
#### Priorité dynamique
La priorité change au cours de la vie du processus car il change de
comportement.
Dans le cas d'une **opération de compilation** par exemple, le
compilateur lit les fichiers sources effectuant beaucoup de `read` et se
bloauqnt donc. Ensuite il compile et utilise beaucoup de CPU.
L'ordonnanceur observe donc les métriques du passé pour prévoir l'avenir. Dans
l'example du compilateur, le noyau observe que sur les 10ms de temporisation,
notre processus **s'est bloqué (et change de contexte) au bout de 1ms**. Puis
losqu'il compile, notre compilateur va rester sur le CPU **pour toute sa
tempotisation**.
Mais comment choisir la bonne priorité en fonction de ces métriques? Tout
simplement **en choisissant d'abord les processus les plus courts**. C'est la
stratégie utilisée en général dans les **système interactifs**.
#### La stratégie utilisée dans le noyau Linux 2.4
Cette version du noyau Linux, la gestion de l'ordonnancement se fait par
l'attribution de crédits. Un processus utilisant l'UC le fait en dépensant des
crédits, plus il l'utilise plus il en dépense.
Lorqu'un processus n'a plus de crédit, il ne peut plus utiliser l'UC jusqu'à ce
que le noyau en redistribue. Il le fait lorque aucun processus prêt n'a de
crédit.
Les processus n'ayant pas dépensé tous ses crédits se voit prélever un
"impots":
```
Crédit = Cn + (Cn-1/2) + (Cn-2/4) + (Cn-3/8) + ...
```
Dans la limite de 2C.
### Et pour les système multi-cœur
Chaque cœur exécute un ordonnanceur de façon asynchrone, la liste de processus
peut-être :
* partagée entre tous les cœurs
* distribuée par cœur
Il est bon de noter qu'une **UC peut envoyer une interruption à un autre UC**.
## Threads et processus
Un processus est un espace d'adressage plus une pile d'exécution. Un thread est
juste un **autre flow d'exécution dans le même espace d'adressage**. La création
de threads (aussi appelés processus légers) est dons plus efficace : il n'y a
pas de création d'espace d'adressage.
Dans les noyaux modernes, tout est thread.
### Accès concurents à la mémoire
Les threads partagent donc des espace commun de mémoire, il est donc important
de gérer des accès concurrent. En effet l'accès aux mêmes cases mémoires par
plusieurs threads peut conduire à des fonctionnements arbitraires.
Il est à noter que les accès à la mémoire sont de toute façon atomique: *une
opération de lecture ou écriture à la fois*. Mais ce n'est pas suffisant, un
example de code est disponible [dans les cours de prog. système]({{< ref
"../../progsys/5_les-processus_legers/index.md">}} "Les processus légers")
Le noyau doit donc mettre en place des primitive de synchronisation.

@ -1 +1 @@
Subproject commit 6167552546f60f5a22344909061afa5b62754555
Subproject commit fbd4163bd076a82adf430116ac4e5f165df86c8f