Page suivante Page précédente Table des matières

10. Trucs utiles

10.1 Pile et tas (Stack and Heap)

Vue d'ensemble

Ici nous regardons comment la "pile" et le "tas" sont alloués en mémoire

Allocation mémoire


FF..        |                 | <-- bas de la pile
       /|\  |                 |   | 
 valeurs|   |                 |   |   pile
 élevées|   |                 |  \|/  grandit
            |                 |
XX..        |                 | <-- haut de la pile [Pointeur de pile]
            |                 |
            |                 |
            |                 |
00..        |_________________| <-- fin de pile [Segment de pile]
                 
                   Pile

Les valeurs d'adresse de mémoire commencent à 00. (qui est aussi là où le Segment de Pile commence) et ils vont jusqu'à la valeur FF..

XX.. est la valeur réelle du pointeur de pile.

La pile est utilisée par les fonctions pour:

  1. les variables globales
  2. les variables locales
  3. l'adresse de retour

Par exemple, pour une fonction classique:


 |int foo_function (parameter_1, parameter_2, ..., parameter_n) {
    |variable_1 declaration;
    |variable_2 declaration;
      ..
    |variable_n declaration;
   
    |// Body function
    |dynamic variable_1 declaration;
    |dynamic variable_2 declaration;
     ..
    |dynamic variable_n declaration;
   
    |// Le code est à l'intérieur du Segment Code, pas le segment Donnée/Pile!
    
    |return (ret-type) value; // souvent c'est à l'intérieur d'un registre, pour l'i386 le registre eax est utilisé.
 |}
nous avons

          |                       |
          | 1. parameter_1 pushed | \
    P     | 2. parameter_2 pushed |  | Avant  
    I     | ...................   |  | l'appel
    L     | n. parameter_n pushed | /
    E     | ** Return address **  | -- Appel
          | 1. local variable_1   | \ 
          | 2. local variable_2   |  | Après
          | .................     |  | l'appel
          | n. local variable_n   | /
          |                       | 
         ...                     ...   Pile
         ...                     ...   libre
          |                       |
    T     | n. dynamic variable_n | \
    A     | ...................   |  | Alloué par
    S     | 2. dynamic variable_2 |  | malloc & kmalloc
          | 1. dynamic variable_1 | /
          |_______________________|
        
           Usage typique de la pile
 
Note: l'ordre des variables peut être différent selon l'architecture du matériel. 

10.2 Application vs Processus

Définition basse

Nous devons distinguer 2 concepts:

Souvent le Processus s'appelle également Tâche ou Fil.

10.3 Bloquages (Locks)

Vue d'ensemble

2 genre de serrures:

  1. intraCPU
  2. interCPU

10.4 Copy_on_write

Copy_on_write est un mécanisme utilisé pour réduire l'utilisation de mémoire. Il remet l'allocation mémoire à plus tard de mémoire jusqu'à ce que la mémoire soit vraiment nécessaire.

Par exemple, quand une Tâche exécute l'Appel Système "fork()" (pour créer une autre Tâche), nous utilisons toujours les mêmes pages de mémoire que le parent, en mode lecture seule. Quand une Tâche ÉCRIT dans la page, elle cause une exception et la page est copiée et marquée "rw" (lecture, écriture).

 
1-) la page X est partagée entre la Tâche parent et la Tâche enfant
 Tâche Parent
 |         | Accès RO   ______
 |         |---------->|Page X|    
 |_________|           |______|
                          /|\
                           |
 Têche Enfant              | 
 |         | Accès RO      |  
 |         |----------------                
 |_________| 
 
 
2-) Write request
 Task Parent
 |         | Accès RO   ______
 |         |---------->|Page X|    Trying to write
 |_________|           |______|
                          /|\
                           |
 Task Child                | 
 |         | Accès RO      |  
 |         |----------------                
 |_________| 
 
 
3-) Final Configuration: Either Task Parent and Task Child have an independent copy of the Page, X and Y
 Task Parent
 |         | Accès RW   ______
 |         |---------->|Page X|    
 |_________|           |______|
              
              
 Task Child
 |         | Accès RW   ______
 |         |---------->|Page Y|    
 |_________|           |______|

Page suivante Page précédente Table des matières