Noyau et appels systèmes§

Systèmes d’exploitation

auteur:Pierre-Antoine Champin
adresse:Département Informatique - IUT - Lyon1
licence:Ce travail est sous license Creative Commons Attribution-ShareAlike 3.0 France
1

Problématique et rappels§

2

Contexte§

3

Pré-requis§

4

Rappel 1 : modes d’exécution§

5

Rappel 1 : modes d’exécution (2)§

Mode superviseur (également appelé mode noyau) :

Mode utilisateur

6

Rappel 2 : interruptions§

Certains événements (interruption) entrainent un comportement particulier du processeur.

Ces événèmenets peuvent être de différents types:

7

Rappel 2 : interruptions (2)§

Lorsqu’une interruption se produit :

8

Rappel 2 : interruptions (exemple)§

_images/interruption_anim_1.svg_images/interruption_anim_2.svg_images/interruption_anim_3.svg_images/interruption_anim_4.svg
9

Aparté : programmation événementielle§

→ les gestionnaires d’interruption fonctionnnent selon ce prinipe

10

Fonctionnement général§

11

Principe§

12

Démarrage du sysème§

13

Déroulement d’un appel système§

14

Bibliothèque système§

15

Discussion§

Ce mécanisme permet bien au SE de remplir ses fonctions d’arbitrage et d’autorisation :

16

Illustration : Entrées/sorties§

17

Entrées/sorties simples§

fd = open("mon_fichier.txt", O_WRONLY);
write(fd, "hello world\n", 12);
close(fd);
18

Gestion des erreurs§

fd = open("mon_fichier.txt", O_WONLY);
if (fd == -1) exit(-1);
status = write(fd, "hello world\n", 12);
if (status == -1) exit(-1);
status = close(fd);
if (status == -1) exit(-1);
return 0

Au minimum, interrompre le programme en cas d’erreur inattendue.

19

Gestion des erreurs (2)§

fd = open("fichier.txt", O_WRONLY);
if (fd == -1) {
    if      (errno == EACCES) exit(-1); // accès interdit
    else if (errno == ENOENT) exit(-2); // fichier inexistant
    else                      exit(-3); // autre problème
}
status = write(fd, "hello world\n", 12);
if (status == -1) exit(-4); // problème d'écriture
status = close(fd);
if (status == -1) {
    printf("Attention: problème à la fermeture\n");
} // mais on termine normalement malgré tout
return 0;
20

Discussion§

21

Gestion des erreurs (3)§

try:
    f = open("fichier.txt", "w")
    f.write("hello world\n")
    f.close()
except IOError, e:
    print(e.message, file=stderr)
    exit(-1)
except ValueError, e:
    print(e.message, file=stderr)
    exit(-2)
22

Discussion (2)§

23

Temps partagé§

Le principe du temps partagé consiste à mettre à profit les temps de latences liés aux entrées/sorties pour exécuter plusieurs programmes en parallèle.

24

Principe§

_images/temps_partage.png
25

Rappel 3 : interruption matérielle§

Les périphériques utilisent des interuptions matérielles pour notifier le processeur d’un événement

→ Le noyau a donc la main au début et à la fin de chaque opération d’entrées/sorties.

26

Mise en œuvre du temps partagé§

_images/interruption_io.png

À la fin de chaque gestionnaire d’interruption, le système d’exploitation décide à quel processus il va rendre la main.

27

Ordonnanceur§

28

Définitions§

Équité
propriété d’un ordonnanceur garantissant à tous les processus les même chances d’obtenir le processeur
Famine (en anglais starvation)
situation dans laquelle un processus attend indéfiniment le processeur

NB : les performances d’un ordonnanceur se mesurent différemment selon le type de système (système batch, système interactif)

29

Préemtion§

Un périphérique dédié, l”horloge, émet une interruption à intervalle régulier.

Avantage
garantit un arbitrage régulier par préemption
Inconvénient
surcoût en temps de calcul
_images/surcout_preemption.png
30

En résumé§

Contrôle sur les ressources

  • Obligation matérielle pour les applications de passer par le SE (mode utilisateur)
  • Noyau, Appel système

Arbitrage du processeur

  • Ordonnanceur
  • Interuption d’horloges pour permettre la préemption par le SE
31

Pour aller plus loin§

32

Micro-noyau§

33