Bonjour encore a vous,
Je up mon topic un an apres pour poser une autre question. Je cherche a allouer un gros bout de memoire virtuelle (disons 1TB) et faire de l'allocation de blocs a (disons 1MB) l'interieur de ce morceau de memoire virtuelle ainsi que de la desallocation.
J'ai essaye d'abors de faire du mprotect(2) en me disnt que si un bloc de memoire avait pour protection "pas d'access" alors la memoire physique serait libere. Cependant l'execution du code suivant m'a fait obtenir un out of memory.
- include <sys/mman.h>
int main ()
{
size_t sizetotal = 0x0100000000;
char* result = (char*)mmap(((void*)NULL), sizetotal, PROT_NONE, MAP_PRIVATE | MAP_ANON, -1, 0);
size_t sizeb = 0x100000;
for (size_t offset = 0; offset < sizetotal; offset += sizeb)
{
mprotect (result+offset, sizeb, PROT_READ|PROT_WRITE);
for (size_t inb = 0; inb < sizeb; inb++)
*(result + offset + inb) = 0;
mprotect (result+offset, sizeb, PROT_NONE);
}
return 0;
}
Une facon de forcer le noyau a liberer la memoire est d'appeller munmap. Une facon de faire pour regler mon probleme serait de faire un premier appel a mmap pour reserver 1TB de memoire virtuelle. Ensuite faire un appel a munmap pour liberer cette memoire virtuelle. Ensuite allouer tous les blocs de 1MB dans l'espace qui vient d'etre libere avec mmap et le flag MAP_FIXED. du fait, je peux allouer la memoire physique automatiquement quand j'ecris dessus et je peux la desalloue en appelant munmap et mmap sur le meme bloc de memoire virtuelle.
Ca devrait faire ce que je veux... a moins qu'un autre thread ne fasse joujou avec mmap lui aussi...
Un peu de contexte pour finir. J'ai des donnees tres grosses, mais je sais quelle ne seront pas utiliser toute d'un coup et j'ai un moyen de stockage (basiquement a travers le reseau) pour stocker toutes mes donnees. Je cherche a etablir un cache local de cette donnee qui conserve la contiguite de pointeur en memoire virtuelle. Les intentions d'access a la memoire me sont declarees et je suis averti quand la memoire n'est plus utile (ce qui me permet d'avoir du refcounting par bloc). Si je relaxe la propriete de contiguite alors c'est beaucoup plus simple pour moi mais les utilisateurs de la lib vont devoir gerer eux meme les problemes d'access d'un bloc a l'autre (ce qui pourrait etre abstrait, mais c'est fatiguant)
des idees? du petrole?