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

Linux Discussion :

Question sur l'allocation de mémoire


Sujet :

Linux

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 32
    Points : 26
    Points
    26
    Par défaut Question sur l'allocation de mémoire
    Bonjour,
    J'écris en ce moment un programme qui crée une large zône de mémoire (800 000 bits -> 100 000 bytes).

    Pour des raisons de performance, je souhaiterais que cette zône de mémoire reste en ram et ne puisse pas être swappée. Cmt faire?

    De plus, je souhaiterais créer des zônes mémoire qui ne puissent pas être à cheval sur deux pages. A nouveau, cmt faire?

    Je programme sous Linux avec la dernière version de gcc.

    J'espère que vous avez des idées

    ++ Fonzy

  2. #2
    Membre expérimenté

    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mars 2004
    Messages
    1 060
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 060
    Points : 1 609
    Points
    1 609
    Par défaut
    Bonjour.
    La gestion de la mémoire est gérée par linux, et je ne connais pas de mécanisme pour empecher un OS de swapper quoi que ce soit...
    Une alternative (a tester) serait de faire un ramdisk, et d'écrire des données dedans... ca restera en ram, et tu n'auras pas de "fragmentation" de cases mémoire

    En espérant pour toi qu'il y ait d'autres solutions...
    Chaval
    __________________
    "Monsieur le chat voudriez-vous, s'il vous plait, demanda Alice, me dire de quel côté dois-je aller ?
    Ca dépend de l'endroit où vous voulez vous rendre, répondit le chat"
    Lewis Carrol

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 32
    Points : 26
    Points
    26
    Par défaut
    en fait, faire un disque en ram n'est pas possible dans mon cas. Le programme que j'implémente doit s'intégrer dans un serveur.

    ++

  4. #4
    Expert éminent sénior Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Points : 12 264
    Points
    12 264
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    struct {
      /* liste de tes variables */
     } NOM ;
     NOM *p; /* pointeur*/

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    if (p= malloc(sizeof(NOM) * 1024)) == NULL)
    {
     /* plus de mémoire */
    }
    else
    {
    /*traitement*/
    }
    de même pour changer la taille de la reserve

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    p=ralloc(p, sizeof(NOM) * 4096);
    par exemple

    Quand au swap : c'est l'OS qui gere et pas ton programme !
    quand aux pages : c'est l'OS qui gere et pas ton programme !

    la seule autre solution est d'écrire ton propre OS.

  5. #5
    Expert éminent sénior Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Points : 12 264
    Points
    12 264
    Par défaut
    Citation Envoyé par Fonzy007
    en fait, faire un disque en ram n'est pas possible dans mon cas. Le programme que j'implémente doit s'intégrer dans un serveur.

    ++
    ça ne change rien au comportement swap/memoire de l'OS.

    si tu as peur de perdre des données en RAM au cours du traitement en cas de panne matérielle sur le disque la seule solution consiste à installer ta distrib sans créer de partition swap.
    mais là bonjour les ralentissements en particulier lors des accès disques.

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 32
    Points : 26
    Points
    26
    Par défaut
    Bonjour,
    Pour le moment, je fais effectivement des simples malloc.

    J'ai déjà trouver comment faire des alignement de la mémoire sur une page

    La fonction posix_memalign() alloue size octets et place l’adresse de
    la mémoire allouée dans *memptr. L’adresse de la mémoire allouée est
    un multiple de alignment, qui doit lui même être une puissance de deux
    et un multiple de sizeof(void *).

    int posix_memalign(void **memptr, size_t alignment, size_t size);
    Le block suivant permet alors simplement de mettre ma zone mémoire en début de page et donc si la zone est plus petite que ma taille de page, je n'ai pas de soucis à me faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    char *mazone;
    posix_memalign(&(mazone), sysconf(_SC_PAGESIZE),sizeof(char)*x)
    x = le nombre de caractères souhaités
    sysconf(_SC_PAGESIZE) permet d'obtenir la taille d'une page.

    ++

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 32
    Points : 26
    Points
    26
    Par défaut
    Re-bonjour,
    je viens de trouver comment résoudre mon dernier problème, c'est à dire, cmt éviter que ma zone mémoire passe en swap.

    Il faut utiliser la fonction mlock(all) dont voici la description:
    mlock() et mlockall() verrouillent respectivement une partie et l’ensemble de l’espace d’adressage du processus appelant dans la mémoire physique,
    pour empêcher cette mémoire d’être évincée dans l’espace d’échange (swap). munlock() et munlockall() ont l’effet inverse, respectivement déver‐
    rouillant une partie ou l’ensemble de l’espace d’adressage du processus appelant, afin que les pages dans la zone indiquée puissent à nouveau être
    évincées dans le swap si le gestionnaire de mémoire du noyau l’exige. Le verrouillage et le déverrouillage de mémoire se font par multiples d’une
    page.

    int mlock(const void *addr, size_t len);
    int mlockall(int flags);
    ++

  8. #8
    Nouveau membre du Club
    Profil pro
    responsable de développement
    Inscrit en
    Février 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : responsable de développement

    Informations forums :
    Inscription : Février 2006
    Messages : 26
    Points : 34
    Points
    34
    Par défaut
    pour ta propre réponse qui rempli un peu notre (a TOUS, si si) ignorance sur le sujet ...

    [Troll]Suivant l’OS sur lequel on tombe, c’est bien de ne pas le laisser faire ce qu’il veut[/Troll].

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 32
    Points : 26
    Points
    26
    Par défaut
    Pas de problème
    D'autant plus que je suis sûr que certains auront un jour les mêmes problèmes que moi si les performances et la sécurité sont des points importants. (Problème des attaques par pagination)

    ++

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [malloc] questions sur l'allocation dynamique
    Par dahtah dans le forum POSIX
    Réponses: 4
    Dernier message: 21/10/2011, 01h24
  2. question sur l'allocation de char
    Par deubelte dans le forum C++
    Réponses: 2
    Dernier message: 01/10/2010, 11h43
  3. question sur l'allocation sur le tas
    Par deubelte dans le forum C++
    Réponses: 7
    Dernier message: 03/04/2010, 10h56
  4. Question sur la libération de mémoire
    Par adaneels dans le forum C#
    Réponses: 16
    Dernier message: 17/06/2009, 18h47
  5. question sur l'allocation dynamique
    Par velociraptor5679 dans le forum C++
    Réponses: 12
    Dernier message: 29/04/2006, 23h41

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