c++ - mmap 虚拟内存 (HDD) 和主内存 (RAM) 分配
问题描述
我正在使用mmap()
功能。我对标志中的某些东西感到困惑mmap
。
MAP_SHARED
with fd → Usage To 分配的虚拟内存使用硬盘 (HDD) 和物理内存 (RAM) 将不会被使用。我使用此标志分配了 2 GB fd
,但我的 RAM 仍未使用(如我所料)。
MAP_PRIVATE|MAP_ANONYMOUS
with (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)分配的内存?!
我从中得到的mmap
,mmap
检查是否提供了私有标志(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_ANONYMOUS
flag 使用 real memory (RAM) 与使用 SHARED flag 完全不同!
解决方案
推荐阅读
- c# - 使用 Process.Start 打开 PowerBI 文件时访问被拒绝错误
- google-chrome - 如何在开发者工具的 html 查看器中搜索双引号?
- python - (Python) 将浮点数转换为日期时间
- reactjs - 如何在 Eslint 中配置样式化的 jsx
- c++ - Scade Suite中的折叠让我感到困惑
- c# - Azure 函数适用于 Postman,但不适用于 Web 浏览器和 javascript
- visual-studio-code - 等待启动前任务
- typo3 - TYPO3 v10:从站点配置覆盖区域设置
- php - 我如何在 Laravel Blade 中的循环中重写 PHP
- reactjs - 使用反应重定向将道具传递给另一个组件