Question

Est-il possible (sur un OS raisonnable, de préférence Linux) pour échanger le contenu de deux pages de mémoire que par la modification de la table des pages et ne bouge pas réellement de données?

La motivation est une matrice dense transposée. Si les données ont été bloquées par la taille de la page, il serait possible de transposer les données dans une page (en cache) fits puis pages d'échange pour déplacer les blocs dans leur dernière. Une grande matrice aurait beaucoup de nombreuses pages déplacées, bouffées de chaleur alors, espérons-le TLB ne causeront pas de problèmes.

Était-ce utile?

La solution

Je pense que la mémoire des fichiers mappés peuvent faire l'affaire, mais je pense que je ne ai jamais essayé moi-même. Utilisez mmap avec MAP_ANONYMOUS à la carte plus pur adresse virtuelle (pas de support de fichier physique). Ensuite, vous pouvez remapper votre « dossier » dans divers domaines de l'obtention VA en effet sémantique zéro copie. Sous Windows vous utiliseriez MapViewOfFile avec une poignée de mappage de fichier créé avec CreateMapOfFile (INVALID_HANDLE_VALUE, ...), mais notez que sur NT vous ne pouvez pas contrôler la cible de votre remappage (ie. l'adresse VA récemment cartographiée est le sortie de l'appel de fonction), et sur Linux l'adresse souhaitée est prise comme indice .

Si cela ne fonctionne pas, alors vous auriez probablement besoin de créer un module de gestion de la mémoire dans le noyau, ce qui est impossible pour tout projet pratique.

Autres conseils

#include <stdio.h>
#include <string.h>

#define __USE_GNU
#include <unistd.h>
#include <sys/mman.h>

int main() {
    int PAGE_SIZE = getpagesize();
    char* m = NULL;
    void* temp;

    printf("page size = %d\n", PAGE_SIZE);

    m = (char*)mmap(0, PAGE_SIZE*3, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
    temp = m+PAGE_SIZE*2;

    memset(m, '0', PAGE_SIZE);
    memset(m+PAGE_SIZE, '1', PAGE_SIZE);

    printf("before %c %c\n", m[0], m[PAGE_SIZE]);

    mremap(m + PAGE_SIZE, PAGE_SIZE, PAGE_SIZE, MREMAP_FIXED | MREMAP_MAYMOVE, temp); 
    mremap(m, PAGE_SIZE, PAGE_SIZE, MREMAP_FIXED | MREMAP_MAYMOVE, m+PAGE_SIZE); 
    mremap(temp, PAGE_SIZE, PAGE_SIZE, MREMAP_FIXED | MREMAP_MAYMOVE, m); 


    printf("after %c %c\n", m[0], m[PAGE_SIZE]);
    return 0;
}

En théorie, certainement. Dans la pratique, je pense vous pouvez utiliser mmap () pour déplacer les blocs système de mémoire partagée V style de cette façon.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top