OVH Cloud OVH Cloud

Allouer plus de mémoire que disponible

76 réponses
Avatar
Rémi Moyen
Salut,

J'ai une question sur la mani=E8re dont se comporte un programme sous
Linux, en C++, quand on essaye d'allouer plus de m=E9moire que
disponible sur le syst=E8me. =C0 la base, l'op=E9rateur new lance dans ce
cas-l=E0 une exception et c'est =E0 moi de la rattraper et de la traiter,
tr=E8s bien.

Mais mon probl=E8me est de savoir si, par derri=E8re, le noyau essaye
d'allouer toute la m=E9moire avant de se rendre compte qu'il n'en a pas
assez de disponible, ou est-ce qu'il fait d'abord une v=E9rification
avant de se lancer l=E0-dedans ?

Dans le cas o=F9 la m=E9moire est sur de la RAM, =E7a ne change probablement
pas grand chose (en perception par l'utilisateur), mais si il y a du
swap, est-ce que le noyau va faire swapper tout ce qu'il peut pendant
une heure avant de se rendre compte qu'il lui manque 42 octets ?

Si c'est le cas, alors j'imagine que j'ai int=E9r=EAt =E0 impl=E9menter
quelques checks rapides sur la m=E9moire disponible avant de commencer =E0
allouer des blocs de 1 Go (=E7a m'arrive...), sinon mes utilisateurs
risquent de ne pas trop aimer devoir attendre longtemps, et swapper
tout les autres programmes, avant de s'entendre dire qu'il n'y a pas
assez de m=E9moire pour faire ce qu'ils veulent ! Et dans ce cas-l=E0
encore, y'a-t-il une mani=E8re plus ou moins "standard" de v=E9rifier "=E0
la main" la m=E9moire disponible ?

Et accessoirement, j'imagine que diff=E9rents OS peuvent se comporter
diff=E9remment de ce point de vue, donc est-ce pareil pour SunOS ?
IRIX ? (les deux autres syst=E8mes que je suis susceptible d'utiliser)

Merci d'avance !
--
R=E9mi Moyen

6 réponses

4 5 6 7 8
Avatar
Nicolas George
Jean-Louis Liagre wrote in message
<45e0c7ad$0$17519$:
Je peux encore essayer d'identifier puis tuer le process à partir de la
console, si ps (ou ls) et kill passent encore.


S'il n'y a plus de mémoire disponible, non, ça ne passera pas.

Retourner un pointeur vers une zone partiellement, voire presque
totalement inutilisable me parait un grande liberté avec le standard.


Le standard C ne précise pas du tout ce que peut être un SIGSEGV, donc il
n'y a aucune liberté prise.

Avatar
Jean-Louis Liagre
Nicolas George wrote:
Jean-Louis Liagre wrote in message
<45e0c7ad$0$17519$:
Je peux encore essayer d'identifier puis tuer le process à partir de la
console, si ps (ou ls) et kill passent encore.


S'il n'y a plus de mémoire disponible, non, ça ne passera pas.


En effet, et c'est pour ça que j'ai mis "si ps ...". Ce n'est pas parce
qu'il reste trop peu de mémoire pour qu'un sshd démarre qu'un kill,
beaucoup moins gourmand, ne passera pas.

Suivant le profil d'utilisation du système, la probabilité d'avoir
*exactement* la totalité de la mémoire utilisée peut-etre faible.


Retourner un pointeur vers une zone partiellement, voire presque
totalement inutilisable me parait un grande liberté avec le standard.


Le standard C ne précise pas du tout ce que peut être un SIGSEGV, donc il
n'y a aucune liberté prise.


Comment écrire un programme fiable si on ne peut plus faire confiance à
la valeur retournée par une fonction ?


Avatar
Nicolas George
Jean-Louis Liagre wrote in message
<45e267a2$0$20943$:
Comment écrire un programme fiable si on ne peut plus faire confiance à
la valeur retournée par une fonction ?


Tu ne peux jamais écrire de programmes absolument fiables. Même

#include <stdio.h>
int main(void) {
printf("Hello world!n");
return(0);
}

ne l'est pas, si tu cherches bien.

Avatar
Jean-Louis Liagre
Nicolas George wrote:
Jean-Louis Liagre wrote in message
<45e267a2$0$20943$:
Comment écrire un programme fiable si on ne peut plus faire confiance à
la valeur retournée par une fonction ?


Tu ne peux jamais écrire de programmes absolument fiables. Même

#include <stdio.h>
int main(void) {
printf("Hello world!n");
return(0);
}

ne l'est pas, si tu cherches bien.


Le programme ne teste pas le retour de printf, donc il est possible que
rien ne soit écrit en sortie sans que ce soit détecté, mais je ne vois
pas de SIGSEGV possible.


Avatar
Nicolas George
Jean-Louis Liagre wrote in message
<45e2c86a$0$8993$:
Le programme ne teste pas le retour de printf, donc il est possible que
rien ne soit écrit en sortie sans que ce soit détecté, mais je ne vois
pas de SIGSEGV possible.


Il y a un SIGPIPE possible.

Avatar
lhabert
Nicolas George :

Il y a un SIGPIPE possible.


Et un SIGXFSZ.

4 5 6 7 8