首页 > 解决方案 > mmap 虚拟内存 (HDD) 和主内存 (RAM) 分配

问题描述

我正在使用mmap()功能。我对标志中的某些东西感到困惑mmap

MAP_SHAREDwith fd → Usage To 分配的虚拟内存使用硬盘 (HDD) 和物理内存 (RAM) 将不会被使用。我使用此标志分配了 2 GB fd,但我的 RAM 仍未使用(如我所料)。

MAP_PRIVATE|MAP_ANONYMOUSwith (fd = -1) → Usage分配主内存,即 RAM。我使用这个标志分配了 2 GB 并用一些东西填充了它,然后我检查了我的 RAM 使用情况,是的,2 GB 正在使用中......

现在我的观点是,第一种方法 ( MAP_SHARED) 使用虚拟内存 (HDD),第二种方法 ( MAP_PRIVATE|MAP_ANONYMOUS) 使用主内存 (RAM),所以 100% 第二种方法的性能必须不同,因为 RAM 比 HDD 快太多...我是对的? 如果我是对的,那么为什么mmap函数被称为“虚拟内存分配”函数!!!???通过标志MAP_PRIVATE|MAP_ANONYMOUS也分配主内存(RAM)!!!!!!!

如果MAP_PRIVATE|MAP_ANONYMOUS不保证提供'主内存(RAM)',我应该怎么做从主内存(RAM)分配的内存?!

我从中得到的mmapmmap检查是否提供了私有标志(MAP_PRIVATE|MAP_ANONYMOUS),检查未使用的 RAM 空间并从 RAM(主内存)提供内存,如果 RAM 上有可用空间,如果没有,它使用虚拟内存(HDD )。正确的 !?

更新

我决定进行 2 次测试。一个MAP_SHARED和一个MAP_PRIVATE|MAP_ANONYMOUS

测试 1基于文件的内存分配 ( MAP_SHARED)

#include <stdio.h>
#include <sys/mman.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <fcntl.h>
#include <time.h>

int
main() {
    double time_spent = 0.0;
    int fd = open("/home/alireza/Documents/mem", O_CREAT|O_RDWR);
    ftruncate(fd, (4294967296));
    char * memory = mmap(NULL, (4294967296), PROT_WRITE|PROT_READ, MAP_SHARED, fd, 0);
    if(memory == MAP_FAILED) {
        printf("(%d)", errno);
        exit(0);
    }
    write(0, "started ...\n", sizeof("started ...\n")-1);
    clock_t begin = clock();
    for (long i = 0; i < (4294967296); i++) {
        memory[i] = 'c';
    }
    clock_t end = clock();
    write(0, "done\n", sizeof("done\n")-1);
    time_spent += (double)(end - begin) / CLOCKS_PER_SEC;
    printf("time (%f)\n", time_spent);
    exit(0);
}

结果(9 秒(因为它使用虚拟内存(HDD))!!!)

started ...
done
time (9.087634)

测试 2使用 RAM ( MAP_PRIVATE|MAP_ANONYMOUS)分配内存

#include <stdio.h>
#include <sys/mman.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <fcntl.h>
#include <time.h>

int
main() {
    double time_spent = 0.0;
    char * memory = mmap(NULL, (4294967296), PROT_WRITE|PROT_READ, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
    if(memory == MAP_FAILED) {
        printf("(%d)", errno);
        exit(0);
    }
    write(0, "started ...\n", sizeof("started ...\n")-1);
    clock_t begin = clock();
    for (long i = 0; i < (4294967296); i++) {
        memory[i] = 'c';
    }
    clock_t end = clock();
    write(0, "done\n", sizeof("done\n")-1);
    time_spent += (double)(end - begin) / CLOCKS_PER_SEC;
    printf("time (%f)\n", time_spent);
    exit(0);
}

结果(1 秒)

started ...
done
time (1.405220)

不仅仅是mmap虚拟内存分配(HDD)。它也是主内存分配,它根据标志决定它!所以使用MAP_PRIVATE|MAP_ANONYMOUSflag 使用 real memory (RAM) 与使用 SHARED flag 完全不同!

标签: c++cmemorymmap

解决方案


推荐阅读