Salut,
J'ai une question sur la manière dont se comporte un programme sous
Linux, en C++, quand on essaye d'allouer plus de mémoire que
disponible sur le système. À la base, l'opérateur new lance dans ce
cas-là une exception et c'est à moi de la rattraper et de la traiter,
très bien.
Mais mon problème est de savoir si, par derrière, le noyau essaye
d'allouer toute la mémoire avant de se rendre compte qu'il n'en a pas
assez de disponible, ou est-ce qu'il fait d'abord une vérification
avant de se lancer là-dedans ?
Salut,
J'ai une question sur la manière dont se comporte un programme sous
Linux, en C++, quand on essaye d'allouer plus de mémoire que
disponible sur le système. À la base, l'opérateur new lance dans ce
cas-là une exception et c'est à moi de la rattraper et de la traiter,
très bien.
Mais mon problème est de savoir si, par derrière, le noyau essaye
d'allouer toute la mémoire avant de se rendre compte qu'il n'en a pas
assez de disponible, ou est-ce qu'il fait d'abord une vérification
avant de se lancer là-dedans ?
Salut,
J'ai une question sur la manière dont se comporte un programme sous
Linux, en C++, quand on essaye d'allouer plus de mémoire que
disponible sur le système. À la base, l'opérateur new lance dans ce
cas-là une exception et c'est à moi de la rattraper et de la traiter,
très bien.
Mais mon problème est de savoir si, par derrière, le noyau essaye
d'allouer toute la mémoire avant de se rendre compte qu'il n'en a pas
assez de disponible, ou est-ce qu'il fait d'abord une vérification
avant de se lancer là-dedans ?
Salut,
J'ai une question sur la manière dont se comporte un programme sous
Linux, en C++, quand on essaye d'allouer plus de mémoire que
disponible sur le système. À la base, l'opérateur new lance dans ce
cas-là une exception et c'est à moi de la rattraper et de la traiter,
très bien.
Mais mon problème est de savoir si, par derrière, le noyau essaye
d'allouer toute la mémoire avant de se rendre compte qu'il n'en a pas
assez de disponible, ou est-ce qu'il fait d'abord une vérification
avant de se lancer là-dedans ?
Salut,
J'ai une question sur la manière dont se comporte un programme sous
Linux, en C++, quand on essaye d'allouer plus de mémoire que
disponible sur le système. À la base, l'opérateur new lance dans ce
cas-là une exception et c'est à moi de la rattraper et de la traiter,
très bien.
Mais mon problème est de savoir si, par derrière, le noyau essaye
d'allouer toute la mémoire avant de se rendre compte qu'il n'en a pas
assez de disponible, ou est-ce qu'il fait d'abord une vérification
avant de se lancer là-dedans ?
Salut,
J'ai une question sur la manière dont se comporte un programme sous
Linux, en C++, quand on essaye d'allouer plus de mémoire que
disponible sur le système. À la base, l'opérateur new lance dans ce
cas-là une exception et c'est à moi de la rattraper et de la traiter,
très bien.
Mais mon problème est de savoir si, par derrière, le noyau essaye
d'allouer toute la mémoire avant de se rendre compte qu'il n'en a pas
assez de disponible, ou est-ce qu'il fait d'abord une vérification
avant de se lancer là-dedans ?
Rémi Moyen wrote:Salut,
J'ai une question sur la manière dont se comporte un programme sous
Linux, en C++, quand on essaye d'allouer plus de mémoire que
disponible sur le système. À la base, l'opérateur new lance dans ce
cas-là une exception et c'est à moi de la rattraper et de la traite r,
très bien.
Mais mon problème est de savoir si, par derrière, le noyau essaye
d'allouer toute la mémoire avant de se rendre compte qu'il n'en a pas
assez de disponible, ou est-ce qu'il fait d'abord une vérification
avant de se lancer là-dedans ?
C'est le fameux problème de l'"overcommit". Probablement tous les
systèmes Unix modernes, et certainement Linux et FreeBSD font comme les
banquiers qui prêtent de l'argent qu'ils n'ont pas, ils allouent de la
mémoire qui n'est pas disponible, et on voit *aprés* si dès fois il y a
un problème. Il paraît que faire comme ça est indispensable pour
préserver les performances. La conclusion est que si on veut s'assurer
d'avoir rééllement la mémoire disponible, il faut aller écrire da ns
chaque page en trappant le signal SEGV. Autrement dit, ça doit
probablement dire que ce qu'on attend de l'opérateur new en C++ ne
fonctionne pas du tout. Il n'y a aucun garantie que la mémoire sera
rééllement disponible sans effectuer des opérations de plus bas niv eau
que celles que le C++ fournit en standard.
Tu peux lire l'avis d'experts ici:http://leaf.dragonflybsd.org/mailarchiv e/kernel/2005-02/msg00239.html
Rémi Moyen <rmo...@gmail.com> wrote:
Salut,
J'ai une question sur la manière dont se comporte un programme sous
Linux, en C++, quand on essaye d'allouer plus de mémoire que
disponible sur le système. À la base, l'opérateur new lance dans ce
cas-là une exception et c'est à moi de la rattraper et de la traite r,
très bien.
Mais mon problème est de savoir si, par derrière, le noyau essaye
d'allouer toute la mémoire avant de se rendre compte qu'il n'en a pas
assez de disponible, ou est-ce qu'il fait d'abord une vérification
avant de se lancer là-dedans ?
C'est le fameux problème de l'"overcommit". Probablement tous les
systèmes Unix modernes, et certainement Linux et FreeBSD font comme les
banquiers qui prêtent de l'argent qu'ils n'ont pas, ils allouent de la
mémoire qui n'est pas disponible, et on voit *aprés* si dès fois il y a
un problème. Il paraît que faire comme ça est indispensable pour
préserver les performances. La conclusion est que si on veut s'assurer
d'avoir rééllement la mémoire disponible, il faut aller écrire da ns
chaque page en trappant le signal SEGV. Autrement dit, ça doit
probablement dire que ce qu'on attend de l'opérateur new en C++ ne
fonctionne pas du tout. Il n'y a aucun garantie que la mémoire sera
rééllement disponible sans effectuer des opérations de plus bas niv eau
que celles que le C++ fournit en standard.
Tu peux lire l'avis d'experts ici:http://leaf.dragonflybsd.org/mailarchiv e/kernel/2005-02/msg00239.html
Rémi Moyen wrote:Salut,
J'ai une question sur la manière dont se comporte un programme sous
Linux, en C++, quand on essaye d'allouer plus de mémoire que
disponible sur le système. À la base, l'opérateur new lance dans ce
cas-là une exception et c'est à moi de la rattraper et de la traite r,
très bien.
Mais mon problème est de savoir si, par derrière, le noyau essaye
d'allouer toute la mémoire avant de se rendre compte qu'il n'en a pas
assez de disponible, ou est-ce qu'il fait d'abord une vérification
avant de se lancer là-dedans ?
C'est le fameux problème de l'"overcommit". Probablement tous les
systèmes Unix modernes, et certainement Linux et FreeBSD font comme les
banquiers qui prêtent de l'argent qu'ils n'ont pas, ils allouent de la
mémoire qui n'est pas disponible, et on voit *aprés* si dès fois il y a
un problème. Il paraît que faire comme ça est indispensable pour
préserver les performances. La conclusion est que si on veut s'assurer
d'avoir rééllement la mémoire disponible, il faut aller écrire da ns
chaque page en trappant le signal SEGV. Autrement dit, ça doit
probablement dire que ce qu'on attend de l'opérateur new en C++ ne
fonctionne pas du tout. Il n'y a aucun garantie que la mémoire sera
rééllement disponible sans effectuer des opérations de plus bas niv eau
que celles que le C++ fournit en standard.
Tu peux lire l'avis d'experts ici:http://leaf.dragonflybsd.org/mailarchiv e/kernel/2005-02/msg00239.html
Hmmm... Je crois que je me suis mal exprimé, ou alors que je ne
comprends pas exactement ta réponse. Si je te comprends bien, tu dis
que dans certains cas, 'new' pourrait réussir alors qu'en réalité, le
jour où j'essaierais d'écrire dans ma mémoire, ça ne marchera pas
parce qu'en réalité le noyau m'a alloué des pages qui ne sont pas
vraiment disponibles ? Si c'est le cas, c'est en effet plutôt (!)
génant. Ceci dit, dans mon cas (j'ai testé), mes 'new' me renvoient
bien une exception quand y'a plus de mémoire, donc ce problème n'a pas
l'air d'arriver. Enfin, pas jusqu'à présent...
Mais ma question était plutôt de savoir si le noyau allait passer du
temps à essayer d'allouer avant de me dire qu'il ne peut pas ou si il
était capable de me dire 'non' avant d'avoir tout essayé ?
Tu peux lire l'avis d'experts ici:http://leaf.dragonflybsd.org/mailarchive/kernel/2005-02/msg00239.html
J'ai lu rapidement et j'avoue ne pas avoir tout compris, mais il me
semble qu'une des conclusions, ça serait que c'est à mon programme de
ne pas demander plus de mémoire que ce qui est raisonnable (et qu'un
des problèmes est de définir ce "raisonnable" proprement), et que je
ne devrais jamais me reposer sur le noyau pour me dire si oui ou non
j'ai assez de mémoire. Ai-je bien compris ?
Dans ce cas, j'ai l'impression que ça veut dire qu'il faut plus ou
moins que j'implémente un micro-garbage collector pour savoir combien
de mémoire j'utilise ?? Ça me semble bizarre, j'ai dû mal
comprendre...
Hmmm... Je crois que je me suis mal exprimé, ou alors que je ne
comprends pas exactement ta réponse. Si je te comprends bien, tu dis
que dans certains cas, 'new' pourrait réussir alors qu'en réalité, le
jour où j'essaierais d'écrire dans ma mémoire, ça ne marchera pas
parce qu'en réalité le noyau m'a alloué des pages qui ne sont pas
vraiment disponibles ? Si c'est le cas, c'est en effet plutôt (!)
génant. Ceci dit, dans mon cas (j'ai testé), mes 'new' me renvoient
bien une exception quand y'a plus de mémoire, donc ce problème n'a pas
l'air d'arriver. Enfin, pas jusqu'à présent...
Mais ma question était plutôt de savoir si le noyau allait passer du
temps à essayer d'allouer avant de me dire qu'il ne peut pas ou si il
était capable de me dire 'non' avant d'avoir tout essayé ?
Tu peux lire l'avis d'experts ici:http://leaf.dragonflybsd.org/mailarchive/kernel/2005-02/msg00239.html
J'ai lu rapidement et j'avoue ne pas avoir tout compris, mais il me
semble qu'une des conclusions, ça serait que c'est à mon programme de
ne pas demander plus de mémoire que ce qui est raisonnable (et qu'un
des problèmes est de définir ce "raisonnable" proprement), et que je
ne devrais jamais me reposer sur le noyau pour me dire si oui ou non
j'ai assez de mémoire. Ai-je bien compris ?
Dans ce cas, j'ai l'impression que ça veut dire qu'il faut plus ou
moins que j'implémente un micro-garbage collector pour savoir combien
de mémoire j'utilise ?? Ça me semble bizarre, j'ai dû mal
comprendre...
Hmmm... Je crois que je me suis mal exprimé, ou alors que je ne
comprends pas exactement ta réponse. Si je te comprends bien, tu dis
que dans certains cas, 'new' pourrait réussir alors qu'en réalité, le
jour où j'essaierais d'écrire dans ma mémoire, ça ne marchera pas
parce qu'en réalité le noyau m'a alloué des pages qui ne sont pas
vraiment disponibles ? Si c'est le cas, c'est en effet plutôt (!)
génant. Ceci dit, dans mon cas (j'ai testé), mes 'new' me renvoient
bien une exception quand y'a plus de mémoire, donc ce problème n'a pas
l'air d'arriver. Enfin, pas jusqu'à présent...
Mais ma question était plutôt de savoir si le noyau allait passer du
temps à essayer d'allouer avant de me dire qu'il ne peut pas ou si il
était capable de me dire 'non' avant d'avoir tout essayé ?
Tu peux lire l'avis d'experts ici:http://leaf.dragonflybsd.org/mailarchive/kernel/2005-02/msg00239.html
J'ai lu rapidement et j'avoue ne pas avoir tout compris, mais il me
semble qu'une des conclusions, ça serait que c'est à mon programme de
ne pas demander plus de mémoire que ce qui est raisonnable (et qu'un
des problèmes est de définir ce "raisonnable" proprement), et que je
ne devrais jamais me reposer sur le noyau pour me dire si oui ou non
j'ai assez de mémoire. Ai-je bien compris ?
Dans ce cas, j'ai l'impression que ça veut dire qu'il faut plus ou
moins que j'implémente un micro-garbage collector pour savoir combien
de mémoire j'utilise ?? Ça me semble bizarre, j'ai dû mal
comprendre...
"Rémi Moyen" writes:Hmmm... Je crois que je me suis mal exprimé, ou alors que je ne
comprends pas exactement ta réponse. Si je te comprends bien, tu dis
que dans certains cas, 'new' pourrait réussir alors qu'en réalité , le
jour où j'essaierais d'écrire dans ma mémoire, ça ne marchera p as
parce qu'en réalité le noyau m'a alloué des pages qui ne sont pas
vraiment disponibles ? Si c'est le cas, c'est en effet plutôt (!)
génant. Ceci dit, dans mon cas (j'ai testé), mes 'new' me renvoient
bien une exception quand y'a plus de mémoire, donc ce problème n'a pas
l'air d'arriver. Enfin, pas jusqu'à présent...
La différence, c'est que le gestionnaire de mémoire doit écrire dans
chaque page allouée lui-même. Mais si tu appelle directement mmap ou
brk ou sbrk, sans écrire dans les pages allouées, effectivement tu
peux obtenir l'exception plus tard, quand tu accéderas à ces pages.
Mais ma question était plutôt de savoir si le noyau allait passer du
temps à essayer d'allouer avant de me dire qu'il ne peut pas ou si il
était capable de me dire 'non' avant d'avoir tout essayé ?
Quand il n'y a plus de mémoire disponible, le noyau commence à tuer
des processus un peu au hasard pour faire de la place. Alors il doit
forcémener passer un peu de temps pour essayer d'allouer... Mais ça,
c'est seulement quand on a rempli toute la mémoire RAM et swap
disponible, et seulement quand on a effectivement besoin de la place,
pas quand on "l'alloue". Sinon le noyau alloue la mémoire sans la
réserver. La seule chose qu'il fait, c'est qu'il mappe toute la
mémoire allouée sur une page mise à zéro en lecture seule. C'est
quand on essaye d'écrire dans cette page que le système va essayer
d'allouer effectivement une page de mémoire et s'il n'en reste plus de
libre en RAM, il va swapper, et s'il n'en reste plus de libre en swap
il va envoyer des signaux (ce qui peut tuer des processus).
Dans ce cas, j'ai l'impression que ça veut dire qu'il faut plus ou
moins que j'implémente un micro-garbage collector pour savoir combien
de mémoire j'utilise ?? Ça me semble bizarre, j'ai dû mal
comprendre...
Oui. Tu peux avoir une enveloppe fixe, ou évaluer la mémoire
nécessaire en fonction de la taille des données.
"Rémi Moyen" <rmo...@gmail.com> writes:
Hmmm... Je crois que je me suis mal exprimé, ou alors que je ne
comprends pas exactement ta réponse. Si je te comprends bien, tu dis
que dans certains cas, 'new' pourrait réussir alors qu'en réalité , le
jour où j'essaierais d'écrire dans ma mémoire, ça ne marchera p as
parce qu'en réalité le noyau m'a alloué des pages qui ne sont pas
vraiment disponibles ? Si c'est le cas, c'est en effet plutôt (!)
génant. Ceci dit, dans mon cas (j'ai testé), mes 'new' me renvoient
bien une exception quand y'a plus de mémoire, donc ce problème n'a pas
l'air d'arriver. Enfin, pas jusqu'à présent...
La différence, c'est que le gestionnaire de mémoire doit écrire dans
chaque page allouée lui-même. Mais si tu appelle directement mmap ou
brk ou sbrk, sans écrire dans les pages allouées, effectivement tu
peux obtenir l'exception plus tard, quand tu accéderas à ces pages.
Mais ma question était plutôt de savoir si le noyau allait passer du
temps à essayer d'allouer avant de me dire qu'il ne peut pas ou si il
était capable de me dire 'non' avant d'avoir tout essayé ?
Quand il n'y a plus de mémoire disponible, le noyau commence à tuer
des processus un peu au hasard pour faire de la place. Alors il doit
forcémener passer un peu de temps pour essayer d'allouer... Mais ça,
c'est seulement quand on a rempli toute la mémoire RAM et swap
disponible, et seulement quand on a effectivement besoin de la place,
pas quand on "l'alloue". Sinon le noyau alloue la mémoire sans la
réserver. La seule chose qu'il fait, c'est qu'il mappe toute la
mémoire allouée sur une page mise à zéro en lecture seule. C'est
quand on essaye d'écrire dans cette page que le système va essayer
d'allouer effectivement une page de mémoire et s'il n'en reste plus de
libre en RAM, il va swapper, et s'il n'en reste plus de libre en swap
il va envoyer des signaux (ce qui peut tuer des processus).
Dans ce cas, j'ai l'impression que ça veut dire qu'il faut plus ou
moins que j'implémente un micro-garbage collector pour savoir combien
de mémoire j'utilise ?? Ça me semble bizarre, j'ai dû mal
comprendre...
Oui. Tu peux avoir une enveloppe fixe, ou évaluer la mémoire
nécessaire en fonction de la taille des données.
"Rémi Moyen" writes:Hmmm... Je crois que je me suis mal exprimé, ou alors que je ne
comprends pas exactement ta réponse. Si je te comprends bien, tu dis
que dans certains cas, 'new' pourrait réussir alors qu'en réalité , le
jour où j'essaierais d'écrire dans ma mémoire, ça ne marchera p as
parce qu'en réalité le noyau m'a alloué des pages qui ne sont pas
vraiment disponibles ? Si c'est le cas, c'est en effet plutôt (!)
génant. Ceci dit, dans mon cas (j'ai testé), mes 'new' me renvoient
bien une exception quand y'a plus de mémoire, donc ce problème n'a pas
l'air d'arriver. Enfin, pas jusqu'à présent...
La différence, c'est que le gestionnaire de mémoire doit écrire dans
chaque page allouée lui-même. Mais si tu appelle directement mmap ou
brk ou sbrk, sans écrire dans les pages allouées, effectivement tu
peux obtenir l'exception plus tard, quand tu accéderas à ces pages.
Mais ma question était plutôt de savoir si le noyau allait passer du
temps à essayer d'allouer avant de me dire qu'il ne peut pas ou si il
était capable de me dire 'non' avant d'avoir tout essayé ?
Quand il n'y a plus de mémoire disponible, le noyau commence à tuer
des processus un peu au hasard pour faire de la place. Alors il doit
forcémener passer un peu de temps pour essayer d'allouer... Mais ça,
c'est seulement quand on a rempli toute la mémoire RAM et swap
disponible, et seulement quand on a effectivement besoin de la place,
pas quand on "l'alloue". Sinon le noyau alloue la mémoire sans la
réserver. La seule chose qu'il fait, c'est qu'il mappe toute la
mémoire allouée sur une page mise à zéro en lecture seule. C'est
quand on essaye d'écrire dans cette page que le système va essayer
d'allouer effectivement une page de mémoire et s'il n'en reste plus de
libre en RAM, il va swapper, et s'il n'en reste plus de libre en swap
il va envoyer des signaux (ce qui peut tuer des processus).
Dans ce cas, j'ai l'impression que ça veut dire qu'il faut plus ou
moins que j'implémente un micro-garbage collector pour savoir combien
de mémoire j'utilise ?? Ça me semble bizarre, j'ai dû mal
comprendre...
Oui. Tu peux avoir une enveloppe fixe, ou évaluer la mémoire
nécessaire en fonction de la taille des données.
["overcommit" de mémoire]Hmmm... Je crois que je me suis mal exprimé, ou alors que je ne
comprends pas exactement ta réponse. Si je te comprends bien, tu dis
que dans certains cas, 'new' pourrait réussir alors qu'en réalité , le
jour où j'essaierais d'écrire dans ma mémoire, ça ne marchera p as
parce qu'en réalité le noyau m'a alloué des pages qui ne sont pas
vraiment disponibles ? Si c'est le cas, c'est en effet plutôt (!)
génant. Ceci dit, dans mon cas (j'ai testé), mes 'new' me renvoient
bien une exception quand y'a plus de mémoire, donc ce problème n'a pas
l'air d'arriver. Enfin, pas jusqu'à présent...
Sous Linux (entre autres), c'est un paramètre de fonctionnement
configurable avec "sysctl" (ou équivalent).
Sous Linux, on peut donc utiliser la commande
"sysctl vm.overcommit_memory" pour voir si c'est activé ou pas.
["overcommit" de mémoire]
Hmmm... Je crois que je me suis mal exprimé, ou alors que je ne
comprends pas exactement ta réponse. Si je te comprends bien, tu dis
que dans certains cas, 'new' pourrait réussir alors qu'en réalité , le
jour où j'essaierais d'écrire dans ma mémoire, ça ne marchera p as
parce qu'en réalité le noyau m'a alloué des pages qui ne sont pas
vraiment disponibles ? Si c'est le cas, c'est en effet plutôt (!)
génant. Ceci dit, dans mon cas (j'ai testé), mes 'new' me renvoient
bien une exception quand y'a plus de mémoire, donc ce problème n'a pas
l'air d'arriver. Enfin, pas jusqu'à présent...
Sous Linux (entre autres), c'est un paramètre de fonctionnement
configurable avec "sysctl" (ou équivalent).
Sous Linux, on peut donc utiliser la commande
"sysctl vm.overcommit_memory" pour voir si c'est activé ou pas.
["overcommit" de mémoire]Hmmm... Je crois que je me suis mal exprimé, ou alors que je ne
comprends pas exactement ta réponse. Si je te comprends bien, tu dis
que dans certains cas, 'new' pourrait réussir alors qu'en réalité , le
jour où j'essaierais d'écrire dans ma mémoire, ça ne marchera p as
parce qu'en réalité le noyau m'a alloué des pages qui ne sont pas
vraiment disponibles ? Si c'est le cas, c'est en effet plutôt (!)
génant. Ceci dit, dans mon cas (j'ai testé), mes 'new' me renvoient
bien une exception quand y'a plus de mémoire, donc ce problème n'a pas
l'air d'arriver. Enfin, pas jusqu'à présent...
Sous Linux (entre autres), c'est un paramètre de fonctionnement
configurable avec "sysctl" (ou équivalent).
Sous Linux, on peut donc utiliser la commande
"sysctl vm.overcommit_memory" pour voir si c'est activé ou pas.
[...]Sous Linux (entre autres), c'est un paramètre de fonctionnement
configurable avec "sysctl" (ou équivalent).
Sous Linux, on peut donc utiliser la commande
"sysctl vm.overcommit_memory" pour voir si c'est activé ou pas.
D'après le fil de discussion cité par Michel Talon, il semblerait q ue
désactiver l'overcommit ne soit pas très judicieux (en plus de n' être
faisable que par root, je crois), et j'ai de toute façon l'impression
que ça ne réglera pas vraiment mon problème (à savoir éviter que 'new'
mette une heure avant de me dire que finalement il n'a pas assez de
mémoire disponible pour faire ce que je veux).
Que ce soit judicieux ou pas n'a rien à voir avec le fait que ce soit
désactivé.
Dans tous les cas, "new" ne prend une heure pour allouer de la mémoire
que si la machine est déjà surchargée (ou la mémoire libre très
morcellée).
Le système de gestion de la mémoire sait combien de place est disponi ble,
il n'avance pas à tatons.
Il est aussi possible de redéfinir l'opérateur "new" si on pense pouv oir
gérer la mémoire mieux que le système (ou la "libc").
[...]
Sous Linux (entre autres), c'est un paramètre de fonctionnement
configurable avec "sysctl" (ou équivalent).
Sous Linux, on peut donc utiliser la commande
"sysctl vm.overcommit_memory" pour voir si c'est activé ou pas.
D'après le fil de discussion cité par Michel Talon, il semblerait q ue
désactiver l'overcommit ne soit pas très judicieux (en plus de n' être
faisable que par root, je crois), et j'ai de toute façon l'impression
que ça ne réglera pas vraiment mon problème (à savoir éviter que 'new'
mette une heure avant de me dire que finalement il n'a pas assez de
mémoire disponible pour faire ce que je veux).
Que ce soit judicieux ou pas n'a rien à voir avec le fait que ce soit
désactivé.
Dans tous les cas, "new" ne prend une heure pour allouer de la mémoire
que si la machine est déjà surchargée (ou la mémoire libre très
morcellée).
Le système de gestion de la mémoire sait combien de place est disponi ble,
il n'avance pas à tatons.
Il est aussi possible de redéfinir l'opérateur "new" si on pense pouv oir
gérer la mémoire mieux que le système (ou la "libc").
[...]Sous Linux (entre autres), c'est un paramètre de fonctionnement
configurable avec "sysctl" (ou équivalent).
Sous Linux, on peut donc utiliser la commande
"sysctl vm.overcommit_memory" pour voir si c'est activé ou pas.
D'après le fil de discussion cité par Michel Talon, il semblerait q ue
désactiver l'overcommit ne soit pas très judicieux (en plus de n' être
faisable que par root, je crois), et j'ai de toute façon l'impression
que ça ne réglera pas vraiment mon problème (à savoir éviter que 'new'
mette une heure avant de me dire que finalement il n'a pas assez de
mémoire disponible pour faire ce que je veux).
Que ce soit judicieux ou pas n'a rien à voir avec le fait que ce soit
désactivé.
Dans tous les cas, "new" ne prend une heure pour allouer de la mémoire
que si la machine est déjà surchargée (ou la mémoire libre très
morcellée).
Le système de gestion de la mémoire sait combien de place est disponi ble,
il n'avance pas à tatons.
Il est aussi possible de redéfinir l'opérateur "new" si on pense pouv oir
gérer la mémoire mieux que le système (ou la "libc").
C'est le fameux problème de l'"overcommit". Probablement tous les
systèmes Unix modernes, et certainement Linux et FreeBSD font comme les
banquiers qui prêtent de l'argent qu'ils n'ont pas, ils allouent de la
mémoire qui n'est pas disponible, et on voit *aprés* si dès fois il y a
un problème. Il paraît que faire comme ça est indispensable pour
préserver les performances.
C'est le fameux problème de l'"overcommit". Probablement tous les
systèmes Unix modernes, et certainement Linux et FreeBSD font comme les
banquiers qui prêtent de l'argent qu'ils n'ont pas, ils allouent de la
mémoire qui n'est pas disponible, et on voit *aprés* si dès fois il y a
un problème. Il paraît que faire comme ça est indispensable pour
préserver les performances.
C'est le fameux problème de l'"overcommit". Probablement tous les
systèmes Unix modernes, et certainement Linux et FreeBSD font comme les
banquiers qui prêtent de l'argent qu'ils n'ont pas, ils allouent de la
mémoire qui n'est pas disponible, et on voit *aprés* si dès fois il y a
un problème. Il paraît que faire comme ça est indispensable pour
préserver les performances.
Michel Talon wrote:C'est le fameux problème de l'"overcommit". Probablement tous les
systèmes Unix modernes, et certainement Linux et FreeBSD font comme les
banquiers qui prêtent de l'argent qu'ils n'ont pas, ils allouent de la
mémoire qui n'est pas disponible, et on voit *aprés* si dès fois il y a
un problème. Il paraît que faire comme ça est indispensable pour
préserver les performances.
Tu oublies solaris qui ne fait pas d'overcommit (il n'y a aucune option
pour le permettre) et s'en sort bien quand même.
Michel Talon wrote:
C'est le fameux problème de l'"overcommit". Probablement tous les
systèmes Unix modernes, et certainement Linux et FreeBSD font comme les
banquiers qui prêtent de l'argent qu'ils n'ont pas, ils allouent de la
mémoire qui n'est pas disponible, et on voit *aprés* si dès fois il y a
un problème. Il paraît que faire comme ça est indispensable pour
préserver les performances.
Tu oublies solaris qui ne fait pas d'overcommit (il n'y a aucune option
pour le permettre) et s'en sort bien quand même.
Michel Talon wrote:C'est le fameux problème de l'"overcommit". Probablement tous les
systèmes Unix modernes, et certainement Linux et FreeBSD font comme les
banquiers qui prêtent de l'argent qu'ils n'ont pas, ils allouent de la
mémoire qui n'est pas disponible, et on voit *aprés* si dès fois il y a
un problème. Il paraît que faire comme ça est indispensable pour
préserver les performances.
Tu oublies solaris qui ne fait pas d'overcommit (il n'y a aucune option
pour le permettre) et s'en sort bien quand même.
C'est le fameux problème de l'"overcommit".
banquiers qui prêtent de l'argent qu'ils n'ont pas
C'est le fameux problème de l'"overcommit".
banquiers qui prêtent de l'argent qu'ils n'ont pas
C'est le fameux problème de l'"overcommit".
banquiers qui prêtent de l'argent qu'ils n'ont pas