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.
Oui ça leur permet de vendre des machines avec beaucoup de gigaoctets de
mémoire et de téraoctets de disque.
J'ai trouvé une discussion de la question ici:
http://developers.sun.com/solaris/articles/subprocess/subprocess.html
sous Solaris il existe un appel système pour
permettre l'overcommit de certains buffers mmap(MAP_NORESERVE)
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.
Oui ça leur permet de vendre des machines avec beaucoup de gigaoctets de
mémoire et de téraoctets de disque.
J'ai trouvé une discussion de la question ici:
http://developers.sun.com/solaris/articles/subprocess/subprocess.html
sous Solaris il existe un appel système pour
permettre l'overcommit de certains buffers mmap(MAP_NORESERVE)
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.
Oui ça leur permet de vendre des machines avec beaucoup de gigaoctets de
mémoire et de téraoctets de disque.
J'ai trouvé une discussion de la question ici:
http://developers.sun.com/solaris/articles/subprocess/subprocess.html
sous Solaris il existe un appel système pour
permettre l'overcommit de certains buffers mmap(MAP_NORESERVE)
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 ess ayer
de marquer toutes les pages une par une, c'est ça ? Dans ce cas, ça
va, ça ne complique pas trop mon travail. Ouf.
Non.
Enfin, le problème c'est qu'il y a plusieurs couches!
Tu nous parles de new(), mais le système n'a rien à voir avec new().
La question, c'est comment se comporte new()? Comment est elle
implémentée?
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 ess ayer
de marquer toutes les pages une par une, c'est ça ? Dans ce cas, ça
va, ça ne complique pas trop mon travail. Ouf.
Non.
Enfin, le problème c'est qu'il y a plusieurs couches!
Tu nous parles de new(), mais le système n'a rien à voir avec new().
La question, c'est comment se comporte new()? Comment est elle
implémentée?
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 ess ayer
de marquer toutes les pages une par une, c'est ça ? Dans ce cas, ça
va, ça ne complique pas trop mon travail. Ouf.
Non.
Enfin, le problème c'est qu'il y a plusieurs couches!
Tu nous parles de new(), mais le système n'a rien à voir avec new().
La question, c'est comment se comporte new()? Comment est elle
implémentée?
http://developers.sun.com/solaris/articles/subprocess/subprocess.html
On y apprend que sous Linux, même quand l'overcommit est désactivé, il y
est quand même (!)
http://developers.sun.com/solaris/articles/subprocess/subprocess.html
On y apprend que sous Linux, même quand l'overcommit est désactivé, il y
est quand même (!)
http://developers.sun.com/solaris/articles/subprocess/subprocess.html
On y apprend que sous Linux, même quand l'overcommit est désactivé, il y
est quand même (!)
Oui enfin le problème du swap, c'est que je peux allouer la mémoire
par blocs de 1 Go ou 2. Dans ce cas, le temps de swapper assez pour me
faire de la place dans la RAM n'est pas négligeable et si je fais
cette opération pour rien (i.e. qu'à la fin de mon allocation de 1 Go
je me rends compte que je ne peux récupérer que 900 Mo et que mon truc
échoue), j'ai un peu gâché plein de temps.
D'où ma question initiale. Je voudrais juste être sûr que quand le
noyau commence à swapper des trucs, il ne le fait pas pour rien. Donc
Mais tant que je n'ai pas rempli la dernière page, je ne sais pas si
elle sera disponible quand j'écrirais dedans ? Et donc si elle n'est
pas disponible, j'aurais passé du temps pour rien à écrire toutes les
autres pages (et potentiellement à envoyer plein d'autres trucs sur le
swap pour me donner ces pages-là en RAM) ?
--
Rémi Moyen
Oui enfin le problème du swap, c'est que je peux allouer la mémoire
par blocs de 1 Go ou 2. Dans ce cas, le temps de swapper assez pour me
faire de la place dans la RAM n'est pas négligeable et si je fais
cette opération pour rien (i.e. qu'à la fin de mon allocation de 1 Go
je me rends compte que je ne peux récupérer que 900 Mo et que mon truc
échoue), j'ai un peu gâché plein de temps.
D'où ma question initiale. Je voudrais juste être sûr que quand le
noyau commence à swapper des trucs, il ne le fait pas pour rien. Donc
Mais tant que je n'ai pas rempli la dernière page, je ne sais pas si
elle sera disponible quand j'écrirais dedans ? Et donc si elle n'est
pas disponible, j'aurais passé du temps pour rien à écrire toutes les
autres pages (et potentiellement à envoyer plein d'autres trucs sur le
swap pour me donner ces pages-là en RAM) ?
--
Rémi Moyen
Oui enfin le problème du swap, c'est que je peux allouer la mémoire
par blocs de 1 Go ou 2. Dans ce cas, le temps de swapper assez pour me
faire de la place dans la RAM n'est pas négligeable et si je fais
cette opération pour rien (i.e. qu'à la fin de mon allocation de 1 Go
je me rends compte que je ne peux récupérer que 900 Mo et que mon truc
échoue), j'ai un peu gâché plein de temps.
D'où ma question initiale. Je voudrais juste être sûr que quand le
noyau commence à swapper des trucs, il ne le fait pas pour rien. Donc
Mais tant que je n'ai pas rempli la dernière page, je ne sais pas si
elle sera disponible quand j'écrirais dedans ? Et donc si elle n'est
pas disponible, j'aurais passé du temps pour rien à écrire toutes les
autres pages (et potentiellement à envoyer plein d'autres trucs sur le
swap pour me donner ces pages-là en RAM) ?
--
Rémi Moyen
En même temps, quand dans mon code je fais un float* toto = new
float[1000000000], je m'attends à ce que, si new() n'échoue pas, j'ai
un tableau de 1 milliard de cases et où je puisse écrire n'importe où.
Tu vas me dire, la solution est, comme tu le dis, d'aller écrire sur
toutes les pages. Mais dans ce cas, je tombe dans le problème décrit
plus haut de faire swapper 900 Mo avant de me rendre compte que j'ai
pas assez de place. D'où ma question initiale, est-ce qu'il y a un
moyen de faire ça proprement et sans que ça prenne trop de temps ?
Mais ça veut aussi dire que je prends le risque que mon 'new' marche
sans problèmes mais qu'après, à un moment quelconque et aléatoire, mon
appli crash (ou qu'un process se fasse tuer) sans que je puisse rien y
faire. Je suis censé hausser des épaules et dire "c'est normal", ou
y'a une stratégie propre pour éviter ça ???
En même temps, quand dans mon code je fais un float* toto = new
float[1000000000], je m'attends à ce que, si new() n'échoue pas, j'ai
un tableau de 1 milliard de cases et où je puisse écrire n'importe où.
Tu vas me dire, la solution est, comme tu le dis, d'aller écrire sur
toutes les pages. Mais dans ce cas, je tombe dans le problème décrit
plus haut de faire swapper 900 Mo avant de me rendre compte que j'ai
pas assez de place. D'où ma question initiale, est-ce qu'il y a un
moyen de faire ça proprement et sans que ça prenne trop de temps ?
Mais ça veut aussi dire que je prends le risque que mon 'new' marche
sans problèmes mais qu'après, à un moment quelconque et aléatoire, mon
appli crash (ou qu'un process se fasse tuer) sans que je puisse rien y
faire. Je suis censé hausser des épaules et dire "c'est normal", ou
y'a une stratégie propre pour éviter ça ???
En même temps, quand dans mon code je fais un float* toto = new
float[1000000000], je m'attends à ce que, si new() n'échoue pas, j'ai
un tableau de 1 milliard de cases et où je puisse écrire n'importe où.
Tu vas me dire, la solution est, comme tu le dis, d'aller écrire sur
toutes les pages. Mais dans ce cas, je tombe dans le problème décrit
plus haut de faire swapper 900 Mo avant de me rendre compte que j'ai
pas assez de place. D'où ma question initiale, est-ce qu'il y a un
moyen de faire ça proprement et sans que ça prenne trop de temps ?
Mais ça veut aussi dire que je prends le risque que mon 'new' marche
sans problèmes mais qu'après, à un moment quelconque et aléatoire, mon
appli crash (ou qu'un process se fasse tuer) sans que je puisse rien y
faire. Je suis censé hausser des épaules et dire "c'est normal", ou
y'a une stratégie propre pour éviter ça ???
D'où ma question initiale. Je voudrais juste être sûr que quand le
noyau commence à swapper des trucs, il ne le fait pas pour rien. Donc
que si il commence à swapper pour me donner mon Go, c'est que je
l'aurais au final. Je crois comprendre de tes explications qu'en fait,
ce que je demande est impossible, que le seul et unique moyen de
vérifier que mon bloc de mémoire est vraiment disponible, c'est
d'écrire dedans et donc potentiellement de swapper si il faut.
Ça ne m'arrange pas, mais si c'est comme ça, tant pis, les
utilisateurs devront s'y faire...
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 pour
toi, et tu risques de te faire tuer s'il n'y a plus de place.
Mais tant que je n'ai pas rempli la dernière page, je ne sais pas si
elle sera disponible quand j'écrirais dedans ? Et donc si elle n'est
pas disponible, j'aurais passé du temps pour rien à écrire toutes les
autres pages (et potentiellement à envoyer plein d'autres trucs sur le
swap pour me donner ces pages-là en RAM) ?
D'où ma question initiale. Je voudrais juste être sûr que quand le
noyau commence à swapper des trucs, il ne le fait pas pour rien. Donc
que si il commence à swapper pour me donner mon Go, c'est que je
l'aurais au final. Je crois comprendre de tes explications qu'en fait,
ce que je demande est impossible, que le seul et unique moyen de
vérifier que mon bloc de mémoire est vraiment disponible, c'est
d'écrire dedans et donc potentiellement de swapper si il faut.
Ça ne m'arrange pas, mais si c'est comme ça, tant pis, les
utilisateurs devront s'y faire...
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 pour
toi, et tu risques de te faire tuer s'il n'y a plus de place.
Mais tant que je n'ai pas rempli la dernière page, je ne sais pas si
elle sera disponible quand j'écrirais dedans ? Et donc si elle n'est
pas disponible, j'aurais passé du temps pour rien à écrire toutes les
autres pages (et potentiellement à envoyer plein d'autres trucs sur le
swap pour me donner ces pages-là en RAM) ?
D'où ma question initiale. Je voudrais juste être sûr que quand le
noyau commence à swapper des trucs, il ne le fait pas pour rien. Donc
que si il commence à swapper pour me donner mon Go, c'est que je
l'aurais au final. Je crois comprendre de tes explications qu'en fait,
ce que je demande est impossible, que le seul et unique moyen de
vérifier que mon bloc de mémoire est vraiment disponible, c'est
d'écrire dedans et donc potentiellement de swapper si il faut.
Ça ne m'arrange pas, mais si c'est comme ça, tant pis, les
utilisateurs devront s'y faire...
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 pour
toi, et tu risques de te faire tuer s'il n'y a plus de place.
Mais tant que je n'ai pas rempli la dernière page, je ne sais pas si
elle sera disponible quand j'écrirais dedans ? Et donc si elle n'est
pas disponible, j'aurais passé du temps pour rien à écrire toutes les
autres pages (et potentiellement à envoyer plein d'autres trucs sur le
swap pour me donner ces pages-là en RAM) ?
La question, c'est comment se comporte new()? Comment est elle
implémentée?
Je sais pas... c'est aussi la question que je me pose (et que je pose
aux gens ici...) !
La question, c'est comment se comporte new()? Comment est elle
implémentée?
Je sais pas... c'est aussi la question que je me pose (et que je pose
aux gens ici...) !
La question, c'est comment se comporte new()? Comment est elle
implémentée?
Je sais pas... c'est aussi la question que je me pose (et que je pose
aux gens ici...) !
Oui. Tu seras mort pour rien. Voilà pourquoi il faut *beaucoup* de
swap même si on ne compte pas en utiliser beaucoup. L'argument, le
swap est lent, si on utilise le swap on va ramer, etc. ne vaut rien.
Le swap est une sécurité pour le cas où l'overcommit partirait en
vrille. Ca ne veut pas dire qu'on va l'utiliser beaucoup dans l'usage
courant.
Oui. Tu seras mort pour rien. Voilà pourquoi il faut *beaucoup* de
swap même si on ne compte pas en utiliser beaucoup. L'argument, le
swap est lent, si on utilise le swap on va ramer, etc. ne vaut rien.
Le swap est une sécurité pour le cas où l'overcommit partirait en
vrille. Ca ne veut pas dire qu'on va l'utiliser beaucoup dans l'usage
courant.
Oui. Tu seras mort pour rien. Voilà pourquoi il faut *beaucoup* de
swap même si on ne compte pas en utiliser beaucoup. L'argument, le
swap est lent, si on utilise le swap on va ramer, etc. ne vaut rien.
Le swap est une sécurité pour le cas où l'overcommit partirait en
vrille. Ca ne veut pas dire qu'on va l'utiliser beaucoup dans l'usage
courant.
"Rémi Moyen" writes:La question, c'est comment se comporte new()? Comment est elle
implémentée?
Je sais pas... c'est aussi la question que je me pose (et que je pose
aux gens ici...) !
Oui, ça ça dépend du compilateur C++ et de la bibliothèque run-ti me utilisée.
Il peut y avoir plusieurs options différentes.
Et un programme utilisateur peut fournir sa propre version de new/delete.
Si tu utilises g++, tu peux facilement jetter un oeuil aux sources de new /delete.
"Rémi Moyen" <rmo...@gmail.com> writes:
La question, c'est comment se comporte new()? Comment est elle
implémentée?
Je sais pas... c'est aussi la question que je me pose (et que je pose
aux gens ici...) !
Oui, ça ça dépend du compilateur C++ et de la bibliothèque run-ti me utilisée.
Il peut y avoir plusieurs options différentes.
Et un programme utilisateur peut fournir sa propre version de new/delete.
Si tu utilises g++, tu peux facilement jetter un oeuil aux sources de new /delete.
"Rémi Moyen" writes:La question, c'est comment se comporte new()? Comment est elle
implémentée?
Je sais pas... c'est aussi la question que je me pose (et que je pose
aux gens ici...) !
Oui, ça ça dépend du compilateur C++ et de la bibliothèque run-ti me utilisée.
Il peut y avoir plusieurs options différentes.
Et un programme utilisateur peut fournir sa propre version de new/delete.
Si tu utilises g++, tu peux facilement jetter un oeuil aux sources de new /delete.
On Feb 16, 10:46 am, (Michel Talon) wrote:Rémi Moyen wrote:
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.
On Feb 16, 10:46 am, t...@lpthe.jussieu.fr (Michel Talon) wrote:
Rémi Moyen <rmo...@gmail.com> wrote:
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.
On Feb 16, 10:46 am, (Michel Talon) wrote:Rémi Moyen wrote:
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.