[SOS]Multi Threads et Allocation memoire...
   
    Thomas Petazzoni
     
    thomas.petazzoni at enix.org
       
    Ven 18 Nov  10:01:02 CET 2005
    
    
  
Salut,
Romain LABBE wrote:
> Cela repond en partie à ma question, mais du coup il faut donc bien
> protéger l'allocateur de memoire virtuelle.
Oui, si tu préemptes quand un processus est en mode noyau, non dans le
cas contraire.
> Par exemple dans Linux 2.6 pour protéger le kVmm on utilise quoi ? Un
> semaphore ? On désative les interruptions lors de l'allocation ? Autre ?
J'ai regardé (très) rapidement. Dans Linux 2.6, la fonction
__cache_alloc() [1] (appelée par kmem_cache_alloc()) fait la chose suivante:
 - désactive les interruptions sur le processeur courant
 - regarde dans un tableau local au processeur courant si il y a des
slots de mémoire disponible
 - si oui, il les prend, réactive les interruptions et sort.
 - sinon, il appelle cache_alloc_refill(), qui lui prend un spinlock
spécifique au cache (cachep->spinlock), car il va falloir faire des
modifications visibles par tous les CPUs.
Voilà, donc dans Linux, c'est un peu optimisé pour le multi-processeur:
afin d'éviter une contention trop forte sur le spinlock
cachep->spinlock, ils ont un petit ensemble de slots par processeur
auquel ils peuvent accéder sans prendre de spinlock global à tous les
processeurs.
Bonne journée,
Thomas
[1] http://lxr.linux.no/source/mm/slab.c#L2135
[2] http://lxr.linux.no/source/mm/slab.c#L1983
-- 
Thomas Petazzoni
thomas.petazzoni at enix.org
    
    
Plus d'informations sur la liste de diffusion Sos