D'accord. Donc, si je demande plus de mémoire que disponible, suivant
le comportement de 'new', il va se passer:
- soit 'new' n'écrit pas dans les pages réservées, l'appel est donc
très rapide, mais peut retourner sans échec et ça se passera mal quand
j'essaierais ensuite d'accéder pour de vrai à la mémoire (comment se
manifeste ce 'mal' ? Le noyau tuera des processus au hasard pour cause
de OOM ? Ou quelque chose de plus subtil et de récupérable ?) ;
- soit 'new' écrit dans chaque page pour vérifier sa disponibilité,
l'appel est donc potentiellement lent (parce qu'il faut aller dans
chaque page, potentiellement swapper, etc.), mais si il retourne sans
échec je suis certain que ma mémoire est dispo (bien que peut-être
partiellement sur le swap et donc lente à accéder, mais c'est un peu
un autre problème).
C'est correct ?
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.
Pffou... ça ne m'arrange pas du tout, ça. Y'a des fonctions classiques
pour faire ça facilement (en C++, toujours) ? Genre un appel système
qui fixerait la taille maxi que je veux et qui ferait en sorte que
n'importe quel 'new' allouant au-dessus de cette limite lance une
exception ? Ça devrait être le comportement par défaut, me semble-t-
il...
D'accord. Donc, si je demande plus de mémoire que disponible, suivant
le comportement de 'new', il va se passer:
- soit 'new' n'écrit pas dans les pages réservées, l'appel est donc
très rapide, mais peut retourner sans échec et ça se passera mal quand
j'essaierais ensuite d'accéder pour de vrai à la mémoire (comment se
manifeste ce 'mal' ? Le noyau tuera des processus au hasard pour cause
de OOM ? Ou quelque chose de plus subtil et de récupérable ?) ;
- soit 'new' écrit dans chaque page pour vérifier sa disponibilité,
l'appel est donc potentiellement lent (parce qu'il faut aller dans
chaque page, potentiellement swapper, etc.), mais si il retourne sans
échec je suis certain que ma mémoire est dispo (bien que peut-être
partiellement sur le swap et donc lente à accéder, mais c'est un peu
un autre problème).
C'est correct ?
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.
Pffou... ça ne m'arrange pas du tout, ça. Y'a des fonctions classiques
pour faire ça facilement (en C++, toujours) ? Genre un appel système
qui fixerait la taille maxi que je veux et qui ferait en sorte que
n'importe quel 'new' allouant au-dessus de cette limite lance une
exception ? Ça devrait être le comportement par défaut, me semble-t-
il...
D'accord. Donc, si je demande plus de mémoire que disponible, suivant
le comportement de 'new', il va se passer:
- soit 'new' n'écrit pas dans les pages réservées, l'appel est donc
très rapide, mais peut retourner sans échec et ça se passera mal quand
j'essaierais ensuite d'accéder pour de vrai à la mémoire (comment se
manifeste ce 'mal' ? Le noyau tuera des processus au hasard pour cause
de OOM ? Ou quelque chose de plus subtil et de récupérable ?) ;
- soit 'new' écrit dans chaque page pour vérifier sa disponibilité,
l'appel est donc potentiellement lent (parce qu'il faut aller dans
chaque page, potentiellement swapper, etc.), mais si il retourne sans
échec je suis certain que ma mémoire est dispo (bien que peut-être
partiellement sur le swap et donc lente à accéder, mais c'est un peu
un autre problème).
C'est correct ?
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.
Pffou... ça ne m'arrange pas du tout, ça. Y'a des fonctions classiques
pour faire ça facilement (en C++, toujours) ? Genre un appel système
qui fixerait la taille maxi que je veux et qui ferait en sorte que
n'importe quel 'new' allouant au-dessus de cette limite lance une
exception ? Ça devrait être le comportement par défaut, me semble-t-
il...
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).
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).
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).
- soit 'new' écrit dans chaque page pour vérifier sa disponibilit é,
l'appel est donc potentiellement lent (parce qu'il faut aller dans
chaque page, potentiellement swapper, etc.), mais si il retourne sans
échec je suis certain que ma mémoire est dispo (bien que peut-être
partiellement sur le swap et donc lente à accéder, mais c'est un peu
un autre problème).
C'est correct ?
Oui. Il faut voir comment est implémenté new(), mais il me semble
qu'en général (et surtout pour les petits blocs) il écrit dans tout es
les pages.
Pffou... ça ne m'arrange pas du tout, ça. Y'a des fonctions classiq ues
pour faire ça facilement (en C++, toujours) ? Genre un appel système
qui fixerait la taille maxi que je veux et qui ferait en sorte que
n'importe quel 'new' allouant au-dessus de cette limite lance une
exception ? Ça devrait être le comportement par défaut, me semble -t-
il...
Il y a ulimit, qui permet de mettre une limite (fixe ou variable) sur
la consomation de ressources d'un processus (et fils).
- soit 'new' écrit dans chaque page pour vérifier sa disponibilit é,
l'appel est donc potentiellement lent (parce qu'il faut aller dans
chaque page, potentiellement swapper, etc.), mais si il retourne sans
échec je suis certain que ma mémoire est dispo (bien que peut-être
partiellement sur le swap et donc lente à accéder, mais c'est un peu
un autre problème).
C'est correct ?
Oui. Il faut voir comment est implémenté new(), mais il me semble
qu'en général (et surtout pour les petits blocs) il écrit dans tout es
les pages.
Pffou... ça ne m'arrange pas du tout, ça. Y'a des fonctions classiq ues
pour faire ça facilement (en C++, toujours) ? Genre un appel système
qui fixerait la taille maxi que je veux et qui ferait en sorte que
n'importe quel 'new' allouant au-dessus de cette limite lance une
exception ? Ça devrait être le comportement par défaut, me semble -t-
il...
Il y a ulimit, qui permet de mettre une limite (fixe ou variable) sur
la consomation de ressources d'un processus (et fils).
- soit 'new' écrit dans chaque page pour vérifier sa disponibilit é,
l'appel est donc potentiellement lent (parce qu'il faut aller dans
chaque page, potentiellement swapper, etc.), mais si il retourne sans
échec je suis certain que ma mémoire est dispo (bien que peut-être
partiellement sur le swap et donc lente à accéder, mais c'est un peu
un autre problème).
C'est correct ?
Oui. Il faut voir comment est implémenté new(), mais il me semble
qu'en général (et surtout pour les petits blocs) il écrit dans tout es
les pages.
Pffou... ça ne m'arrange pas du tout, ça. Y'a des fonctions classiq ues
pour faire ça facilement (en C++, toujours) ? Genre un appel système
qui fixerait la taille maxi que je veux et qui ferait en sorte que
n'importe quel 'new' allouant au-dessus de cette limite lance une
exception ? Ça devrait être le comportement par défaut, me semble -t-
il...
Il y a ulimit, qui permet de mettre une limite (fixe ou variable) sur
la consomation de ressources d'un processus (et fils).
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).
Tiens, à ce sujet, pour un léger topic drift..
Avec une FreeBSD ici, j'ai récemment légèrement bourdé un script, qui a
gonflé en mémoire, et le système m'a gentiment tué le serveur DHCP du
domaine avant que je ne m'en rende compte...
Est-ce que la mécanique selon laquelle le système choisit les processus
à signaler est standard, et est-il possible d'influer dessus ? Par
exemple signaler qu'un ou deux démons (ou utilisateurs ?) devaient être
laissés en paix à part extrême nécessité ?
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).
Tiens, à ce sujet, pour un léger topic drift..
Avec une FreeBSD ici, j'ai récemment légèrement bourdé un script, qui a
gonflé en mémoire, et le système m'a gentiment tué le serveur DHCP du
domaine avant que je ne m'en rende compte...
Est-ce que la mécanique selon laquelle le système choisit les processus
à signaler est standard, et est-il possible d'influer dessus ? Par
exemple signaler qu'un ou deux démons (ou utilisateurs ?) devaient être
laissés en paix à part extrême nécessité ?
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).
Tiens, à ce sujet, pour un léger topic drift..
Avec une FreeBSD ici, j'ai récemment légèrement bourdé un script, qui a
gonflé en mémoire, et le système m'a gentiment tué le serveur DHCP du
domaine avant que je ne m'en rende compte...
Est-ce que la mécanique selon laquelle le système choisit les processus
à signaler est standard, et est-il possible d'influer dessus ? Par
exemple signaler qu'un ou deux démons (ou utilisateurs ?) devaient être
laissés en paix à part extrême nécessité ?
On Feb 16, 2:13 pm, Pascal Bourguignon wrote:- soit 'new' écrit dans chaque page pour vérifier sa disponibilité,
l'appel est donc potentiellement lent (parce qu'il faut aller dans
chaque page, potentiellement swapper, etc.), mais si il retourne sans
échec je suis certain que ma mémoire est dispo (bien que peut-être
partiellement sur le swap et donc lente à accéder, mais c'est un peu
un autre problème).
C'est correct ?
Oui. Il faut voir comment est implémenté new(), mais il me semble
qu'en général (et surtout pour les petits blocs) il écrit dans toutes
les pages.
OK. Je vais essayer de creuser ça du côté de new.Pffou... ça ne m'arrange pas du tout, ça. Y'a des fonctions classiques
pour faire ça facilement (en C++, toujours) ? Genre un appel système
qui fixerait la taille maxi que je veux et qui ferait en sorte que
n'importe quel 'new' allouant au-dessus de cette limite lance une
exception ? Ça devrait être le comportement par défaut, me semble-t-
il...
Il y a ulimit, qui permet de mettre une limite (fixe ou variable) sur
la consomation de ressources d'un processus (et fils).
Ah oui, je n'y pensais plus. Donc si je dépasse la taille fixée par
ulimit, mon appel à 'new' devrait immédiatement échouer, sans essayer
de marquer toutes les pages une par une, c'est ça ? Dans ce cas, ça
va, ça ne complique pas trop mon travail. Ouf.
On Feb 16, 2:13 pm, Pascal Bourguignon <p...@informatimago.com> wrote:
- soit 'new' écrit dans chaque page pour vérifier sa disponibilité,
l'appel est donc potentiellement lent (parce qu'il faut aller dans
chaque page, potentiellement swapper, etc.), mais si il retourne sans
échec je suis certain que ma mémoire est dispo (bien que peut-être
partiellement sur le swap et donc lente à accéder, mais c'est un peu
un autre problème).
C'est correct ?
Oui. Il faut voir comment est implémenté new(), mais il me semble
qu'en général (et surtout pour les petits blocs) il écrit dans toutes
les pages.
OK. Je vais essayer de creuser ça du côté de new.
Pffou... ça ne m'arrange pas du tout, ça. Y'a des fonctions classiques
pour faire ça facilement (en C++, toujours) ? Genre un appel système
qui fixerait la taille maxi que je veux et qui ferait en sorte que
n'importe quel 'new' allouant au-dessus de cette limite lance une
exception ? Ça devrait être le comportement par défaut, me semble-t-
il...
Il y a ulimit, qui permet de mettre une limite (fixe ou variable) sur
la consomation de ressources d'un processus (et fils).
Ah oui, je n'y pensais plus. Donc si je dépasse la taille fixée par
ulimit, mon appel à 'new' devrait immédiatement échouer, sans essayer
de marquer toutes les pages une par une, c'est ça ? Dans ce cas, ça
va, ça ne complique pas trop mon travail. Ouf.
On Feb 16, 2:13 pm, Pascal Bourguignon wrote:- soit 'new' écrit dans chaque page pour vérifier sa disponibilité,
l'appel est donc potentiellement lent (parce qu'il faut aller dans
chaque page, potentiellement swapper, etc.), mais si il retourne sans
échec je suis certain que ma mémoire est dispo (bien que peut-être
partiellement sur le swap et donc lente à accéder, mais c'est un peu
un autre problème).
C'est correct ?
Oui. Il faut voir comment est implémenté new(), mais il me semble
qu'en général (et surtout pour les petits blocs) il écrit dans toutes
les pages.
OK. Je vais essayer de creuser ça du côté de new.Pffou... ça ne m'arrange pas du tout, ça. Y'a des fonctions classiques
pour faire ça facilement (en C++, toujours) ? Genre un appel système
qui fixerait la taille maxi que je veux et qui ferait en sorte que
n'importe quel 'new' allouant au-dessus de cette limite lance une
exception ? Ça devrait être le comportement par défaut, me semble-t-
il...
Il y a ulimit, qui permet de mettre une limite (fixe ou variable) sur
la consomation de ressources d'un processus (et fils).
Ah oui, je n'y pensais plus. Donc si je dépasse la taille fixée par
ulimit, mon appel à 'new' devrait immédiatement échouer, sans essayer
de marquer toutes les pages une par une, c'est ça ? Dans ce cas, ça
va, ça ne complique pas trop mon travail. Ouf.
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 (!)
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é ? Ta réponse
me laisse supposer que c'est plutôt la première alternative que la
deuxième, c'est bien ça ?
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...
Merci pour ta réponse, en tout cas !
--
Rémi Moyen
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 (!)
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é ? Ta réponse
me laisse supposer que c'est plutôt la première alternative que la
deuxième, c'est bien ça ?
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...
Merci pour ta réponse, en tout cas !
--
Rémi Moyen
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 (!)
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é ? Ta réponse
me laisse supposer que c'est plutôt la première alternative que la
deuxième, c'est bien ça ?
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...
Merci pour ta réponse, en tout cas !
--
Rémi Moyen
Ben c'est aussi ce que je me disais au début, mais par exemple, je ne
connais pas de fonction pour accéder facilement à la quantité de
mémoire utilisable. Je peux connaître la mémoire libre, mais ce
chiffre ne tient pas compte de la mémoire utilisé pour servir de cache
et qui est disponible si nécessaire. Donc je me dis que le système n'a
pas toujours l'air de pouvoir dire clairement ce qui est réellement
dispo ou pas -- et les commentaires de Michel Talon sur l'overcommit
semblent confirmer cela. D'où ma perplexité.
Il est aussi possible de redéfinir l'opérateur "new" si on pense pouvoir
gérer la mémoire mieux que le système (ou la "libc").
Oui ben non, ça m'étonnerait beaucoup que je sois capable de gérer la
mémoire mieux.
--
Rémi Moyen
Ben c'est aussi ce que je me disais au début, mais par exemple, je ne
connais pas de fonction pour accéder facilement à la quantité de
mémoire utilisable. Je peux connaître la mémoire libre, mais ce
chiffre ne tient pas compte de la mémoire utilisé pour servir de cache
et qui est disponible si nécessaire. Donc je me dis que le système n'a
pas toujours l'air de pouvoir dire clairement ce qui est réellement
dispo ou pas -- et les commentaires de Michel Talon sur l'overcommit
semblent confirmer cela. D'où ma perplexité.
Il est aussi possible de redéfinir l'opérateur "new" si on pense pouvoir
gérer la mémoire mieux que le système (ou la "libc").
Oui ben non, ça m'étonnerait beaucoup que je sois capable de gérer la
mémoire mieux.
--
Rémi Moyen
Ben c'est aussi ce que je me disais au début, mais par exemple, je ne
connais pas de fonction pour accéder facilement à la quantité de
mémoire utilisable. Je peux connaître la mémoire libre, mais ce
chiffre ne tient pas compte de la mémoire utilisé pour servir de cache
et qui est disponible si nécessaire. Donc je me dis que le système n'a
pas toujours l'air de pouvoir dire clairement ce qui est réellement
dispo ou pas -- et les commentaires de Michel Talon sur l'overcommit
semblent confirmer cela. D'où ma perplexité.
Il est aussi possible de redéfinir l'opérateur "new" si on pense pouvoir
gérer la mémoire mieux que le système (ou la "libc").
Oui ben non, ça m'étonnerait beaucoup que je sois capable de gérer la
mémoire mieux.
--
Rémi Moyen
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.
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é ? Ta rép onse
me laisse supposer que c'est plutôt la première alternative que la
deuxième, c'est bien ça ?
Non le noyau ne va rien essayer du tout, il va allouer de la mémoire en
espérant qu'elle sera libre au moment où tu en auras besoin. Le probl ème
est que les allocations se font page par page, il y a constamment des
pages allouéee et libérées et en pratique ça ne pose pas de probl ème
tant que le programme ne grossit pas démesurément. Dans le cas contra ire
il est tué, mais avec l'overcommit tu ne peux pas savoir quand ça va
arriver ni te prémunir contre. Si tu risques de te trouver dans ce cas
il faut prévoir beaucoup d'espace de swap, le disque ne coute pas cher.
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...
Non, ça veut dire qu'il faut te dépêcher de remplir toutes les pages
que tu as demandées, une à une, si tu veux être sur de les avoir po ur
toi, et tu risques de te faire tuer s'il n'y a plus de place.
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é ? Ta rép onse
me laisse supposer que c'est plutôt la première alternative que la
deuxième, c'est bien ça ?
Non le noyau ne va rien essayer du tout, il va allouer de la mémoire en
espérant qu'elle sera libre au moment où tu en auras besoin. Le probl ème
est que les allocations se font page par page, il y a constamment des
pages allouéee et libérées et en pratique ça ne pose pas de probl ème
tant que le programme ne grossit pas démesurément. Dans le cas contra ire
il est tué, mais avec l'overcommit tu ne peux pas savoir quand ça va
arriver ni te prémunir contre. Si tu risques de te trouver dans ce cas
il faut prévoir beaucoup d'espace de swap, le disque ne coute pas cher.
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...
Non, ça veut dire qu'il faut te dépêcher de remplir toutes les pages
que tu as demandées, une à une, si tu veux être sur de les avoir po ur
toi, et tu risques de te faire tuer s'il n'y a plus de place.
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é ? Ta rép onse
me laisse supposer que c'est plutôt la première alternative que la
deuxième, c'est bien ça ?
Non le noyau ne va rien essayer du tout, il va allouer de la mémoire en
espérant qu'elle sera libre au moment où tu en auras besoin. Le probl ème
est que les allocations se font page par page, il y a constamment des
pages allouéee et libérées et en pratique ça ne pose pas de probl ème
tant que le programme ne grossit pas démesurément. Dans le cas contra ire
il est tué, mais avec l'overcommit tu ne peux pas savoir quand ça va
arriver ni te prémunir contre. Si tu risques de te trouver dans ce cas
il faut prévoir beaucoup d'espace de swap, le disque ne coute pas cher.
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...
Non, ça veut dire qu'il faut te dépêcher de remplir toutes les pages
que tu as demandées, une à une, si tu veux être sur de les avoir po ur
toi, et tu risques de te faire tuer s'il n'y a plus de place.
Rémi Moyen wrote:Ben c'est aussi ce que je me disais au début, mais par exemple, je ne
connais pas de fonction pour accéder facilement à la quantité de
mémoire utilisable. Je peux connaître la mémoire libre, mais ce
chiffre ne tient pas compte de la mémoire utilisé pour servir de ca che
Contrairement à ce qui a été dit, quand on parle de mémoire il s' agit
toujours de mémoire totale, mémoire + swap, pour tous les Unix, y
compris Linux. Donc tant qu'il reste du swap il y a de l'espoir.
Tout simplement l'allocation de mémoire est un problème dynamique et qui
fluctue au cours du temps. Ton programme n'est pas le seul à réclamer de
la mémoire, les copains aussi en réclament et en rendent. Donc il est
impossible au temps t de savoir si dans 10 minutes il sera possible
d'allouer une page supplémentaire à ton programme, à moins que tu a is
bloqué toutes tes pages en mémoire dés le départ.
La bonne stratégie
c'est d'avoir une partition de swap suffisamment gigantesque pour que le
problème ne se pose pas.
Tu peux compter sur le fait que la fontion new de C++ ne gère pas la
mémoire du tout, au delà de l'appel nécessaire à malloc() et des bidules
nécessaires pour gérer les objets. Si tu imagines qu'il fait des appe ls
à madvise(), mlock() ou autres appels systèmes nécessaires pour que ça
se passe comme tu le souhaites, je pense que tu crois au père Noel.
Rémi Moyen <rmo...@gmail.com> wrote:
Ben c'est aussi ce que je me disais au début, mais par exemple, je ne
connais pas de fonction pour accéder facilement à la quantité de
mémoire utilisable. Je peux connaître la mémoire libre, mais ce
chiffre ne tient pas compte de la mémoire utilisé pour servir de ca che
Contrairement à ce qui a été dit, quand on parle de mémoire il s' agit
toujours de mémoire totale, mémoire + swap, pour tous les Unix, y
compris Linux. Donc tant qu'il reste du swap il y a de l'espoir.
Tout simplement l'allocation de mémoire est un problème dynamique et qui
fluctue au cours du temps. Ton programme n'est pas le seul à réclamer de
la mémoire, les copains aussi en réclament et en rendent. Donc il est
impossible au temps t de savoir si dans 10 minutes il sera possible
d'allouer une page supplémentaire à ton programme, à moins que tu a is
bloqué toutes tes pages en mémoire dés le départ.
La bonne stratégie
c'est d'avoir une partition de swap suffisamment gigantesque pour que le
problème ne se pose pas.
Tu peux compter sur le fait que la fontion new de C++ ne gère pas la
mémoire du tout, au delà de l'appel nécessaire à malloc() et des bidules
nécessaires pour gérer les objets. Si tu imagines qu'il fait des appe ls
à madvise(), mlock() ou autres appels systèmes nécessaires pour que ça
se passe comme tu le souhaites, je pense que tu crois au père Noel.
Rémi Moyen wrote:Ben c'est aussi ce que je me disais au début, mais par exemple, je ne
connais pas de fonction pour accéder facilement à la quantité de
mémoire utilisable. Je peux connaître la mémoire libre, mais ce
chiffre ne tient pas compte de la mémoire utilisé pour servir de ca che
Contrairement à ce qui a été dit, quand on parle de mémoire il s' agit
toujours de mémoire totale, mémoire + swap, pour tous les Unix, y
compris Linux. Donc tant qu'il reste du swap il y a de l'espoir.
Tout simplement l'allocation de mémoire est un problème dynamique et qui
fluctue au cours du temps. Ton programme n'est pas le seul à réclamer de
la mémoire, les copains aussi en réclament et en rendent. Donc il est
impossible au temps t de savoir si dans 10 minutes il sera possible
d'allouer une page supplémentaire à ton programme, à moins que tu a is
bloqué toutes tes pages en mémoire dés le départ.
La bonne stratégie
c'est d'avoir une partition de swap suffisamment gigantesque pour que le
problème ne se pose pas.
Tu peux compter sur le fait que la fontion new de C++ ne gère pas la
mémoire du tout, au delà de l'appel nécessaire à malloc() et des bidules
nécessaires pour gérer les objets. Si tu imagines qu'il fait des appe ls
à madvise(), mlock() ou autres appels systèmes nécessaires pour que ça
se passe comme tu le souhaites, je pense que tu crois au père Noel.