[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