Pen^2 (./31) :
Un bien bel OS inférieur
Zerosquare (./25) :C'est vrai, lorsqu'on est contraint de procéder en deux étapes, comme avec Linux. Mais l'OS connaît l'espace disponible à l'instant où il traite le malloc, car il traite une demande à la fois.
c'est foireux pour un tas de raisons :- sur un système multitâche, la situation peut avoir changé entre l'appel de la fonction qui donne la taille mémoire restante et la fonction qui alloue de la mémoire
- pour satisfaire une allocation mémoire, le système peut libérer de la mémoire précédemment utilisée en swappant ou en virant des pages allouées à des cachesIl doit pouvoir anticiper ce qui sera ainsi libéré.
- la mémoire peut être fragmentée, ce qui fait qu'on ne peut pas forcément allouer autant que prévu (c'est pas trop un problème sur les machines qui gèrent la pagination, mais sur un système ancien ou peu puissant ça peut se produire)On travaille sur Ubuntu, sur des processeurs plus récents que le 8086.
Thibaut (./36) :Ça dépend de combien tu dépasses la capacité. La gestion de la mémoire est un sujet complexe, et Windows et Linux n'ont pas fait les mêmes choix de conception (d'autant plus que sous Linux, ça peut varier d'une version de noyau à l'autre).
Windows renvoie NULL lorsque la demande dépasse la capacité ? Si oui, pourquoi Linux ne le fait pas ?
Thibaut (./36) :Il ne peut pas deviner si tu veux savoir la quantité de mémoire à titre indicatif, ou dans l'optique de faire une grosse allocation mémoire. Bien sûr, il pourrait ne pas compter du tout ce qui est potentiellement swappable/libérable, mais ça fausserait complètement les résultats...
Il sait ce qui sera ainsi libéré.
Thibaut (./36) :Rappelle-toi de quand date UNIX
On travaille sur Ubuntu, sur des processeurs plus récents que le 8086.
By default, Linux follows an optimistic memory allocation strategy. This means that when malloc() returns non-NULL there is no guarantee that the memory really is available. This is a really bad bug. In case it turns out that the system is out of memory, one or more processes will be killed by the infamous OOM killer. In case Linux is employed under circumstances where it would be less desirable to suddenly lose some randomly picked processes, and moreover the kernel version is sufficiently recent, one can switch off this overcommitting behavior using a command likeOn dirait qu'il y a une petite guerre entre les concepteurs du noyau et les programmeurs d'applications
# echo 2 > /proc/sys/vm/overcommit_memory
Thibaut (./38) :?!
This means that when malloc() returns non-NULL there is no guarantee that the memory really is available.
Thibaut (./45) :
Il me semble que là aussi, en cas de manque de mémoire, le programme va se faire tuer.
#include <stdlib.h> #include <stdio.h> #define T (20480) int main(void) { int i; char *P[T]; for (i=0 ; i<T ; i++) { P[i]= calloc(1024,1024); memset(P[i], -1, 1024*1024); } for (i=0 ; i<T ; i++) free(P[i]); return (0); }