J'ai donné cette réponse à un autre post sur le même sujet:
Certains d'allocateurs de paresseux?
Cela commence un peu hors sujet ( et puis je vais l'attacher à votre question ), mais ce qui se passe est similaire à ce qui se passe quand vous la fourche d'un processus dans Linux. Lorsque la fourche il y a un mécanisme appelé la copie sur écriture qui ne copie que la mémoire de l'espace pour le nouveau processus lorsque la mémoire est écrit trop. De cette façon, si la fourche processus exec est un nouveau programme tout de suite, alors vous avez sauvé la surcharge de la copie de l'original des programmes de la mémoire.
Pour en revenir à votre question, l'idée est similaire. Comme d'autres l'ont souligné, demandant à la mémoire vous fait de l'espace de mémoire virtuelle immédiatement, mais les pages ne sont attribués lors de leur écrire.
Quel est le but de tout cela? Il rend fondamentalement mallocing de la mémoire plus ou moins constante de temps de l'opération Big O(1) au lieu d'un Grand O(n) opération ( similaire à la façon dont le Linux planificateur de spreads, c'est le travail au lieu de le faire dans un gros morceau ).
Pour démontrer ce que je veux dire j'ai fait l'expérience suivante:
rbarnes@rbarnes-desktop:~/test_code$ time ./bigmalloc
real 0m0.005s
user 0m0.000s
sys 0m0.004s
rbarnes@rbarnes-desktop:~/test_code$ time ./deadbeef
real 0m0.558s
user 0m0.000s
sys 0m0.492s
rbarnes@rbarnes-desktop:~/test_code$ time ./justwrites
real 0m0.006s
user 0m0.000s
sys 0m0.008s
Le bigmalloc programme alloue 20 millions d'entiers, mais ne pas faire n'importe quoi avec eux. deadbeef écrit un int à chaque page, résultant dans 19531 écrit et justwrites alloue 19531 ints et de zéros. Comme vous pouvez le voir deadbeef prend 100 fois plus de temps pour exécuter que bigmalloc et environ 50 fois plus longtemps que justwrites.
#include <stdlib.h>
int main(int argc, char **argv) {
int *big = malloc(sizeof(int)*20000000); // allocate 80 million bytes
return 0;
}
.
#include <stdlib.h>
int main(int argc, char **argv) {
int *big = malloc(sizeof(int)*20000000); // allocate 80 million bytes
// immediately write to each page to simulate all at once allocation
// assuming 4k page size on 32bit machine
for ( int* end = big + 20000000; big < end; big+=1024 ) *big = 0xDEADBEEF;
return 0;
}
.
#include <stdlib.h>
int main(int argc, char **argv) {
int *big = calloc(sizeof(int),19531); // number of writes
return 0;
}