我使用mmap对写入了12800万个内存到使用malloc分配的内存和映射的内存文件(由磁盘上的文件支持)进行了性能测试...我原本预计结果会有点类似于它'我的理解是,当写入映射的内存文件时,数据最初写入内存,pdflush在后台写入磁盘(可以配置的频率)。使用malloc,写入128M整数需要0.55秒; mmap花了1.9秒。
所以我的问题是:为什么不同。我的首字母缩写是pdflush挤满了总线,或者当pdflush正在访问内存时,它阻止了写入...但是,第二次运行mmap版本会产生.52秒的结果(由于缓存)导致我相信mmap背后的每个页面都没有被分配,直到它被写入(尽管通过调用mmap保留它)...我也理解,malloc生成的内存直到第一次写入才真正分配。 .could最初的区别是因为在malloc初始写入内存后,整个块被分配并使用mmap,每次写入新页面时,os必须先分配它?
更新:
os :CentOS Linux 7.0.1406版(核心版)内核:3.10.0-123.el7.x86_64 gcc :4.8.2
CODE:
int* pint = malloc(128000000 * sizeof(int));
int* pint_copy = pint;
clock_t start = clock();
int i;
for(i = 0; i < 128000000; ++i)
{
*pint++ = i;
}
clock_t end = clock();
double cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC;
printf("%f\n", cpu_time_used);
free(pint_copy);
VS
int fd = open("db", O_RDWR | O_CREAT, 0666);
const size_t region_size = ((512000000 / sysconf(_SC_PAGE_SIZE)) + 1) * sysconf(_SC_PAGE_SIZE);
int return_code = ftruncate(fd, region_size);
if (return_code < 0)
printf("mapped memory file could not be truncated: %u\n", return_code);
int* pint = mmap(NULL, region_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
int* pint_copy = pint;
close(fd);
clock_t start = clock();
int i;
for(i = 0; i < 128000000; ++i)
{
*pint++ = i;
}
clock_t end = clock();
double cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC;
printf("%f\n", cpu_time_used);
fgetc(stdin);
munmap(pint_copy, region_size);
中加入:
int z = 512;
while(z < 128000000)
{
pint[z] = 0;
z += 1024;
}
在:
clock_t start = clock();
两次试验产生0.37秒,让我相信&#34;触摸&#34;每个页面都会导致操作系统分配物理内存(对于mmap和malloc)...也可能部分是因为&#34;触摸&#34;页面将一些内存移动到缓存...有没有人知道如果在重写内存期间(长时间),pdflush会阻止或减慢内存写入?
答案 0 :(得分:1)
是的,你是对的。使用mmap
获取的网页在您尝试访问之前不会填写。您无法保证这一点,但通常操作系统使用write-back(此增益不会受到惩罚)和demand-paging(您必须支付第一次访问权限)。
答案 1 :(得分:1)
我不知道答案,但这对我来说就像你在比较苹果和橘子一样。
也就是说,一方面你正在写(malloc&#39; d)记忆,另一方面你要写入记忆和到(mmap&#39; d)光盘。我希望第二个会导致设备I / O活动,比第一个慢一个数量级,不会产生任何I / O.