使用 munmap 时更高的页面回收率

higher page reclaims when using munmap

在 Mac 我使用 munmap 导致页面回收率更高。

我的 munmap 的 return 值为 0,表示请求的页面已成功取消映射。

当我使用以这种方式映射和取消映射的内存测试程序时,为什么我会看到更高的页面回收率?

有没有办法调试 munmap 并查看我对该函数的调用是否未对传递给它的映射内存执行任何操作。

我使用“/usr/bin/time -l”查看我从 运行 我的程序中获得的页面回收量。每当我使用 munmap 时,我的页面回收率都会比不使用时高。

int           main(void)          
{                                                           
        int i = 0; char *addr;
        while (i < 1024)
        {
            addr = mmap(0, getpagesize(), PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
            addr[0] = 23;
            if (!munmap(addr, getpagesize()))
                print("Success\n");
            i++;
        }


        return (NULL);                                      
}

关于分配

当我调用 munmap 时:

我做了一个测试程序,我调用了 1024 次 mmap 和 munmap 那个次数。

当我不调用 munmap 时,回收的页面在 1478 区域内,当我调用 munmap 时,该值是相同的。

如何检查我对该内存的使用是否正确?

关于 mmap 要记住的重要一点是 MAP_ANONYMOUS 内存必须归零。所以通常发生的情况是,内核将映射一个页面框架,其中只有零 - 并且只有当写入命中该页面时, read-write 映射的零页面才会映射到位。

然而,这就是内核不能立即重用最初映射页面的原因——它不知道只有页面的第一个字节是脏的——相反,它必须将该页面上的所有 4 kiB 字节清零在它可以在新的匿名映射中返回给进程之前。因此,在这两个示例中,至少发生了 1024 个页面错误。

如果内存不需要清零,例如 Linux 有一个名为 MAP_UNINITIALIZED 的额外标志告诉内核页面不需要清零,但它仅在嵌入式中可用设备:

MAP_UNINITIALIZED (since Linux 2.6.33)

Don't clear anonymous pages. This flag is intended to improve performance on embedded devices. This flag is honored only if the kernel was configured with the
CONFIG_MMAP_ALLOW_UNINITIALIZED option. Because of the security implications, that option is normally enabled only on embedded devices (i.e., devices where one has complete control of the contents of user memory).

我猜它在通用 Linux 内核中 non-availability 的原因是因为内核不跟踪以前映射页面框架的进程,因此页面可能会从中泄漏信息一个敏感的过程。


bzero 自己编辑页面不会影响性能 - 内核不会知道它已被清零,因为没有硬件支持它的架构 - 而且 write 在页面上清零而不是 check 如果页面全是零 and 那么在 99.9999999 % 的情况下要写无论如何都要归零。