1. Processus et ordonnancement

Un programme est une suite d'instruction dans l'ISA du processeur. Un programme est (en général) stocké dans une mémoire secondaire (disque, clé, réseau, ...)

Pour pouvoir l'exécuter, il faut :

  1. le charger en mémoire et initialiser les registres nécessaires (en particulier le PC : program counter)

  2. interpréter les instructions une par une (en particulier, incrémenter le PC)

  3. gérer les ressources (mémoire, périphériques, fichiers utilisés)

  4. libérer la mémoire lorsque le programme est terminé.

On parle de processus pour le programme en exécution (dans la RAM) avec toutes les informations annexes (registres, etc.)

Historiquement, le système d'exploitation exécutait un unique processus jusqu'au bout avant de passer au suivant. Cela posait des problèmes lorsque le processus en question plantait, ou ne terminait pas.

Les systèmes d'exploitation "récents" font de la multiprogrammation : plusieurs processus sont exécutés "en même temp". Ceci est possible, même lorsque l'ordinateur ne possède qu'un seul CPU. Mon ordinateur a actuellement 215 processus actifs !

Pour cela, chacun des processus ne s'exécute que pendant une durée très courte (quelques centièmes de secondes), puis les données nécessaires (registres, CP, etc.) sont sauvegardés dans la RAM, et un nouveau processus prend la place du premier (il faut pour cela récupérer les donnés nécessaire du nouveau processus...)

Le choix de l'ordre dans lequel exécuter les processus est important et dépend beaucoup du système d'exploitation. On parle d'algorithme d'ordonnancement. La partie du noyau qui gère ceci s'appelle l'ordonnanceur et doit se débrouiller pour :

Le choix de priorités n'est pas facile, et une mauvaise conception amène des problèmes. On parle de famine lorsque des processus n'ont jamais accès au processeur.

Les systèmes d'exploitations utilisent un mélange de

Il est important de noter qu'un processus actif (dans la mémoire) peut être en attente d'un évènement externe. L'ordonnanceur ne donne jamais le processeur à ce type de processus. C'est par exemple le cas des processus interactifs : l'appui sur une touche (et sa gestion bas niveau) est très lent par rapport au CPU. Un traitement de texte est donc bloqué la plupart du temps et n'occupe presque pas le processeur.

Remarque : chaque processus est identifié par un numéro unique appelé PID ("Process Identification"). Dans le monde Unix, les processus sont organisés en arbre : chaque processus est le "père" des processus qu'il a créé. (cf commandes ps et pstree)

Sous Windows, tous les processus sont ou même niveau...

2. Mémoire

La seconde resource essentielle pour chaque processus est la RAM :

Remarque : RAM = "Random Access Memory" Cela signifie que l'on peut accéder à n'importe quelle partie de la mémoire directement.

On peut obtenir l'utilisation de la RAM avec la commande free -h.

Ordres de grandeur des temps d'accès (lecture) à la mémoire

L'allocation de la RAM aux processus fait partie des rôles du système :

L'allocation de la RAM est complexe :

On parle de mémoire virtuelle pour l'abstraction qui permet de "faire croire" à tous les processus qu'ils sont les seuls à utiliser la RAM : chaque processus utilisera donc l'ensemble des adresses possibles (de 0x0000 à 0xffff), et chaque adresse sera traduite en une adresse concrète.

Pour simplifier cette gestion, la RAM est découpée en blocs de taille fixe (toujours 4 kio sous Linux) et des adresses virtuelles consécutives ne sont pas forcément consécutives dans la RAM. On parle de traduction d'adresses. Cette traduction est faite par le processeur, et la taille des pages est un paramètre du processeur.

Lorque la RAM est entièrement utilisé, il est possible de transférer des blocs actuellement inutilisé sur un support de stockage (disque dur par exemple). Cela permet de libérer de la RAM que le système peut donc allouer à un processus : on parle de mémoire secondaire, ou de swap.

Lorsqu'un processus essaie d'accéder à bloc de RAM du swap, il est mis en attente pendant que le système recopie le bloc dans la RAM. Chaque transfert de ce type est lent, et lorsque la RAM est pleine (ou presque pleine) la vitesse de la machine chute : l'ordinateur passe plus de temps à transférer de la RAM depuis / vers le swap qu'à exécuter les processus.

3. Fichiers

Les supports de stockage (HD, clés, SSD, bandes, CD, réseau) sont très différents. Le système doit offrir une interface commune indépendante du support concret (fonctions "open", "close", "read" et "write" de Python par exemple).

Chaque fichiers est identifié par un chemin qui donne la manière de le retrouver en parcourant l'arborescence des répertoires. On parle de chemin absolu.

Il faut bien faire la différence entre les données du fichiers (son contenu : des octets) et ses métadonnées (son nom, sa taille, sa date de modification, etc.)

Concrètement, un système de fichiers est la description précise de comment sont stockées les données et métadonnées des fichiers. Exemples : EXT-2,3,4, FAT-32, HFS, NTFS, ...

Le système d'exploitation doit offrir les appels systèmes pour chaque système de fichiers (supporté par le système).

Tous les systèmes de fichiers "interactifs" découpent les données des fichiers en blocs de taille fixe. Les octets consécutifs du fichiers ne sont donc pas forcément contenus dans des octets consécutifs du support de stockage. L'avantage principal est que l'allocation de blocs pour un nouveau fichier est beaucoup plus simple : il n'est pas nécessaire de trouver un segment consécutif du support de stockage.

Remarque : les systèmes de fichiers "statiques" (dédiés au CD-ROM, bandes magnétiques, etc.) sont souvent plus simples car ils n'ont pas besoin de découper les fichiers en blocs.

Chaque partition est initialement formatée pour un système de fichiers donné. Une partie de cette partition est réservé à un "tableau" qui permet de savoir quels sont les blocs libres et les blocs occupés. C'est pour ceci qu'une clé USB de 8 gio ne permet de stocker que 7.4 gio de données.

Remarque : lors de la suppression d'un fichier, les blocs correspondants sont simplement marqués "libres" dans ce tableau. C'est pourquoi il est parfois possible de retrouver le contenu d'un fichier supprimé... (Attention, ceci est différent de la gestion de la corbeille par le gestionnaire de fichiers.)

Parmi les métadonnées importantes d'un fichier, il y a les droit d'accès : (lecture / écriture). Sous Unix, chaque fichier a un propriétaire qui peut changer ces droits :

Sous Windows, le droit "exécutable" n'existe pas...

Les répertoires sont gérés de la même manière que les fichiers :

On distingue informellement plusieurs types de fichiers :

Il est important de réaliser que tous les fichiers sont en fait des fichiers binaires : un caractère ASCII a un code binaire (a est en fait 0b1100001 ou 0x61).

Pour la plupart des taches d'administration / configuration, les fichiers textes sont avantageux. En particulier, il existe de nombreux outils "simples" pour les analyser, modifier, etc.

Attention, on utilise un editeur de texte (nano, sublimetext, notepad, ...) pour écrire des fichiers texte. Un traitement de texte (Microsoft Word, Libreoffice, ...) génère plutôt des fichiers textes structurés ou des fichiers binaires.