# Système d'Exploitation : Cours 6 : Mémoires partagées 

- [Système d'Exploitation : Cours 6 : Mémoires partagées](#système-dexploitation--cours-6--mémoires-partagées)
  - [Les processus et la mémoire](#les-processus-et-la-mémoire)
    - [Mono Programmation](#mono-programmation)
    - [Multi Programmation](#multi-programmation)
      - [Partitions fixes](#partitions-fixes)
      - [Partitions variables](#partitions-variables)
        - [Comment connaitre la taille d'un processus](#comment-connaitre-la-taille-dun-processus)
        - [Comment représenter les zones libres ?](#comment-représenter-les-zones-libres-)
        - [Comment sélectionner la zone à allouer ?](#comment-sélectionner-la-zone-à-allouer-)
        - [Que faire lors de la libération d'une zone occupée ?](#que-faire-lors-de-la-libération-dune-zone-occupée-)
      - [Mémoire virtuelle](#mémoire-virtuelle)
      - [Principe de pagination](#principe-de-pagination)
      - [MMU : Memory Management Unit](#mmu--memory-management-unit)
      - [Pagination](#pagination)
      - [Segmentation](#segmentation)

## Les processus et la mémoire

- Sur un PC, plusieurs processus s'exécutent à un instant T, avec chacun un espace mémoire (espace d'adressage) qui lui est propre.
- Un processus ne peut pas modifier la mémoire d'un autre (protection mémoire)
- Certaines instructions (branchements) nécessitent de connaître les adresses à la compilation
- Un processus doit pouvoir être exécuté sur plusieurs ordinateurs ayant des capacités mémoire différente &rarr; il faut une abstraction de la mémoire matérielle.
  
&rarr; Solution : mécanisme de mémoire virtuelle

### Mono Programmation

En mono programmation (un seul processus à la fois sur le CPU), la mémoire est découpée en 2 parties (partitions) : 
- Une partie réservée au SE (de taille fixe)
- Une partie réservée au programme

&rarr; Les adresses mémoires sont des adresses physiques
&rarr; Chaque case mémoire est affectée à une adresse
&rarr; L'adresse est obtenue depuis l'instruction processus en binaire, elle est contenue sur *n* bits (&rarr; processus *n* bits) et permet d'adresser *2<sup>n</sup>*

Donc en mono programmation, pas de problème de relocation de la mémoire (l'adresse de début du programme est toujours la même). Le problème de la mémoire est donc simplifié. Un *"Registre limite"* est implémenté pour connaître l'adresse du début du programme en mémoire.
&rarr; L'accès est interdit si cette adresse est inférieure au registre limite.

### Multi Programmation

#### Partitions fixes

Les premiers systèmes d'exploitation étaient à **partitions fixes** :
- La mémoire est divisée en partitions de taille fixe lors de la génération du système.
- Un programme obtient une partition entière à lui tout seul.
- On pouvait avoir autant de programme en simultané que de partitions sur le système
Implémentation : un registre de base et un registre de limite &rarr; vérification des accès mémoire dans un intervalle. Une clé de protection est attributée à chaque processus qui correspond à la partition qui lui est attribué. 

Gestion de la relocation avec une adresse de base ; le système d'exploitation corrige les adresses du programme en fonction de l'adresse de base.
Deux méthodes : 
- Correction au lancement du programme par le système d'exploitation ou automatiquement par le processus grâce au registre de base
- Position indépendant du code, effectuée par les compilateurs et les linkers

Cette méthode pose un problème de fragmentation de la mémoire :
- Fragmentation interne : la taille réelle du programme est inférieure à la taille de la partition ; la mémoire restante sur la partition est gachée le temps de l'exécution du programme.
- Fragmentation externe : Une partition libre entre deux partitions occupées

Il faut donc que le processus puisse : 
- Demander une partition d'une taille précise qui lui est adapté
- Allouer dynamiquement plus de mémoire au cours de son exécution.

#### Partitions variables

On fait une partition d'une certaine taille demandée par le programme. Cela résout le problème de la fragmentation interne mais pas celui de la fragmentation externe. Il y a toujours des trous entre les partitions, et donc faire de la relocation.

Les problématiques sont les suivantes : 
- Comment connaître la taille d'un processus ?
- Comment représenter la zone libre ?
- Comment séléctionner la zone à allouer ?
- Que faire lors de la libération d'une zone occupée ?

##### Comment connaitre la taille d'un processus

Le volume d'espace mémoire varie d'un processus à l'autre mais aussi durant l'exécution du processus (au fur et à mesure qu'il alloue dynamiquement des variables).

Les zones principales sont : 
- Text : code exécutable &rarr; taille fixe
- Data : variables statiques et globales initialisées &rarr; taille fixe
- Heap : tas, variables dynamiques &rarr; taille variable
- Stack : pile variables automatiques &rarr; taille variable

On fixe donc arbitrairement la taille pour la pile et le tas.
Si plus assez de ressource, deux possibilité : 
- Plus de mémoire : terminaison du processus
- Relocation dans une nouvelle zone plus grande

Problème lié à la relocation : les données stockées dans le tas sont référencées par leur adresse mémoire &rarr; pb de translation d'adresse. La relocation ne doit pas modifier leur emplacement.
Moins de soucis pour la pile, on y accède par le pointeur de pile (stack pointer).

Solution : la pile croit vers le haut et le tas croit vers le bas de l'espace mémoire. On fait une relocation quand les deux se rencontrent.

##### Comment représenter les zones libres ?

Le système d'exploitation maintient une table des partitions pour savoir les quelles son utilisées ou non. La gestion des blocs libres est plus ou moins complexe (table de bits ou liste chainée).

##### Comment sélectionner la zone à allouer ?

Différents algorithmes plus ou moins performants : 
- First-fit : première zone libre
- Best-fit : plus petite zone libre
- Worst-fit : plus grande zone libre

##### Que faire lors de la libération d'une zone occupée ?

Dépend de l'algorithme de gestion : par exemple fusionner des zones adjacentes. Cela dépend des performances.

#### Mémoire virtuelle

But principal : exécuter les processus sans qu'ils soient logés en RAM dans la totalité.

- Le processus possède toute la mémoire virtuelle (elle peut être supérieure à la taille de la RAM)
- Disponibilité d'une zone de va et vient (swap) sur le disque dur en remplacement de la mémoire physique manquante.

#### Principe de pagination

Découper la mémoire en blocs de taille constante (cadres de pages) et de découper ces blocs en paquets de taille constante (pages). Les pages sont affectées dans les cadres de page.

La mémoire doit être de taille *2<sup>m+n</sup>* sinon certaines zones sont non adressables (donc non utilisables) : 
- Nombre de cadres : *2<sup>n</sup>*
- Taille des cadres (en pages) : *2<sup>m</sup>*

> Par exemple sur un architecture 32bits on a une page de 4Kio &rarr; *2<sup>20</sup>* pages de *2<sup>12</sup>* (4Kio)

#### MMU : Memory Management Unit

La conversion mémoire physique (utilisé par la machine) / mémoire virtuelle (vues par les processus et allouées par le système) est assurée par un composant matériel basé sur le mécanisme de protection mémoire du processeur Intel 386/386.
La mémoire est protégé, c'est-à-dire que l'espace mémoire d'un processus n'est jamais écrasé par un autre. Cela permet d'avoir un système d'exploitation stable.
Si un programme essaye de sortir de son espace mémoire, la MMU détecte l'erreur et stop le programme. (Erreur de violation de segment : SIGSEGV).
La majorité des processeurs possèdent une MMU, mais elle rend ce dernier, plus cher, plus gourmand et complexe.

#### Pagination

Le système d'exploitation charge la table de pages du processus dans la MMU et n'a pas de calculs à faire pour lui-même.
La hiérarchisation des pages à 2 ou 3 niveaux permet de : 
- Charger uniquement les tables utiles
- Réduire la fragmentation due au pages
- Réduire l'espace mémoire utilisé par le système d'adressage
Mais pose des problèmes de sélections et de défauts de pages.

Limite des pages :
- Découpage des processus &rarr; fragmentation interne
- Chargement d'une page &rarr; données pas forcément utiles chargées
- Découper en prenant en compte la structure du processus &rarr; mémoire segmentée

#### Segmentation

Découpage du code exécutable en blocs de code / données indépendantes : programme principal, fonction, bibliothèque, pile, tas. 
Ce découpage est dépendant du langage, on a donc une table des segments ou table des descripteurs où chaque segment est référencé par un numéro.
Les segments sont gérés par la MMU.
Calculs d'adresse : 
- Numéro de segment (sélécteur) &rarr; adresse de base
- Base + décalage &rarr; adresse physique

Erreur de segmentation si inférieur à la limite : 
- Base &rarr; adresse physique de départ
- Limite &rarr; taille du segment 




