IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Intérêt Mémory Pool


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de donkeyquote
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 195
    Par défaut Intérêt Mémory Pool
    Salut !!

    J'ai entendu parler des "mémories pools"... Aparement ils sont bien pratiques quand on aloue de gros packages de mémoire et qu'on veut accelerer l'application.

    Pouvez vous me dire quels sont les avantages, comment ça marche et comment les implémenter ?

    Merci !

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    À ma connaissance, ce n'est pas tant quand on alloue de grosses quantités, mais quand on alloue et désalloue fréquemment...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Salut donkeyquote,

    Lorsque tu utilises l'operateur "new" standard (::new) ou malloc(), tu utilises des allocateurs standards, destinés à fonctionner bien dans toutes les circonstances.

    Lorsque les circonstances sont plus spécifiques, tu peux souvent optimiser un peu les choses pour obtenir une allocation plus rapide. Les "pool allocators" sont en général des allocateurs de mémoire qui excellent dans l'allocation d'objets dont la taille est connue. Tu peux par exemple avoir un allocateur pour des objets de 16 octets. En général, on combine des allocateurs pour pouvoir être un peu plus flexible. Par exemple un allocateur général peut déléguer à des allocateurs de "pool" pour toutes les tailles entières comprises entre 1 et 32 octets, et passer ensuite à l'allocateur standard pour les plus gros objets.

    Carl

  4. #4
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Par défaut
    Salut,

    Comme l'a dit Medinoc, les pools sont plus employés lorsque tu effectues de nombreuses allocations/désallocations, ou dans certains cas où tu souhaites limiter le nombre d'objets d'un certain type.

    Il ne faut pas les confondre avec les allocateurs spécifiques, notamment ceux pour les petits objets auxquels fait allusion 5hdumatin (même si le fonctionnement peut s'en rapprocher, les allocateurs de petits objets gérant des chunks de mémoires, donc assimilables à des pools). Dans le cas d'allocateurs on gère vraiment la mémoire à bas niveau sans vraiment se soucier du type de l'objet (en tout cas pas dans la partie basse de l'allocateur) tandis que les pools se contentent de maintenir un certain nombre d'objets disponibles, de les allouer ou désallouer, mais sans se soucier réellement de comment est faite l'allocation.

    Un exemple simple (et pas forcément efficace) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    class ObjectPool
    {
     
    public:
     
        ObjectPool() { allocObject(); }
     
        Object* getObject();
        void release(Object* object);
     
    private:
     
        std::vector<Object*> m_objectList;
        static const int realloc = 10;
        std::vector<Object*> m_usedObjectList;
     
        void allocObject();
    };
     
    Object* ObjectPool::getObject() {
        Object* obj = m_objectList.back();
        m_objectList.pop_back();
        m_usedObjectList.push_back(obj);
        if(m_objectList.empty()) {
            allocObject();
        }
    }
     
    void ObjectPool::release(Object* object) {
        std::vector<Object*> iterator iter = std::find(m_usedObjectList.begin(), m_usedObjectList.end(), object);
        if(iter == m_usedObjectList.end()) {
            throw std::exception("Object not allocated by the pool");
        }
     
        m_usedObjectList.erase(iter);
        m_objectList.push_back(object);
        if(m_objectList.size() >= 2* realloc) {
            m_objectList.erase(m_objectList.begin() + realloc, m_objectList.end());
        }
    }
     
    void ObjectPool::realloc() {
        for(int i = 0; i < realloc; i++) {
            m_objectList.push_back(new Object);
        }
    }
    En gros il maintient une liste d'objets préalloués, et une list d'objets utilisés. Si la taille des objets utilisés atteint 10, il en alloue dix autres, si la taille des objets non utilisés dépasse 20, il désalloue pour retrouver une taille de 10. Le client n'alloue plus ses objest vai les opérateurs new et delete, mais par des appels à getObject et release. Voilà en gros pour le fonctionnement, après il y a différentes stratégies d'allocation/désallocation.

    Tu peux également regarder du côté de boost, ils ont implémenté une lib de memory_pool.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par bolhrak Voir le message
    Il ne faut pas les confondre avec les allocateurs spécifiques, notamment ceux pour les petits objets auxquels fait allusion 5hdumatin (même si le fonctionnement peut s'en rapprocher, les allocateurs de petits objets gérant des chunks de mémoires, donc assimilables à des pools).
    Hmmm. Bon. Note pour plus tard: tourner 7 fois sa langue autour de la touche entrée avant de répondre... Ai confondu, désolé!

    Carl

  6. #6
    screetch
    Invité(e)
    Par défaut
    mouais.

    dans le cas d'un "memoy pool" c'est plutot ce que disait 5h non ?

    un "pool memoire" est un allocateur qui au lieu d'allouer et desallouer la memoire, maintient un certain nombre d'allocations vivantes pour les ressortir plus tard. c'est la definition stricte du "memory pool", une "piscine" d'emplacements memoire disponible qu'on ne libere pas completement au cas ou on en aurait besoin.

    ensuite il y a plusieurs facons d'implementer ce memory pool

    ce que tu as créé bolhrak ca s'en rapproche, c'est un object pool, c'est la meme chose mais au niveau au dessus. au lieu de liberer les objets on les garde au cas ou on aurait besoin d'un nouvel objet un peu plus tard. le concept du recyclage quoi.

    dans le cas de 5h on parle de pool memoire; on peut placer dans cette memoire n'importe quelles données. les blocs peuvent meme etre de taille differente; mais c'est tres rare.

    dans le cas de bolhrak, on ne parle pas de pool memoire (car ce n'est pas la mémoire qui est gérée) mais de pool d'objet, car on garde les objets vivants pour les reutiliser.

    Pour completer ce que dit 5h du mat qui est fort exact, l'allocateur généraliste DougLea est constitué ainsi; pour toute les tailles multiples de 8 entre 4 et 256 (si mes souvenirs sont bons, mais reglable dans l'allocateur) il allouera via un pool (un pool de 4, un pool de 8, un pool de 16, un pool de 24, un pool de 32...)
    si on reclame 27, il prendra la taille qui convient le mieux (ici, 32) et tant pis pour les 5 octets de trop.
    Ensuite, au dela, il utilise un allocateur bien plus generaliste.

Discussions similaires

  1. [tomcat 4.1] [oracle] Pool de connexion
    Par Franco dans le forum Tomcat et TomEE
    Réponses: 6
    Dernier message: 23/09/2003, 00h42
  2. [TDataModule] Intérêt de séparer les accès aux données?
    Par Cornell dans le forum Bases de données
    Réponses: 5
    Dernier message: 05/09/2003, 16h42
  3. Quel est l'intérêt des Services Web ??
    Par silvermoon dans le forum Débats sur le développement - Le Best Of
    Réponses: 19
    Dernier message: 12/02/2003, 22h28
  4. [Concept] BD ou Gestion par fichier. Intérêt de la BD ?
    Par Cian dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 28/11/2002, 12h16
  5. [Technique] Intérêt des index
    Par ddams dans le forum Décisions SGBD
    Réponses: 10
    Dernier message: 04/11/2002, 15h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo