- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 Mac 上,我使用 munmap 可以看到更高的页面回收率。
我的munmap的返回值为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 时:
我做了一个测试程序,我调用 mmap 1024 次,并且 munmap 也调用了同样的次数。
当我不调用munmap时,回收的页面在1478区域内,并且该值与我调用munmap时相同。
如何检查我对该内存的使用是否正确?
最佳答案
关于mmap
需要记住的重要一点是MAP_ANONYMOUS
内存必须清零。因此,通常发生的情况是,内核将映射一个仅包含零的页框 - 并且仅当写入命中该页时,才会将读写映射的零页映射到位。
然而,这就是内核无法立即重用原始映射页面的原因 - 它不知道只有页面的第一个字节是脏的 - 相反,它必须将该页面上的所有 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 内核中不可用的原因是因为内核不跟踪先前映射页框的进程,因此该页可能会泄漏来自敏感进程的信息。
<小时/>bzero
自己对页面进行归零不会影响性能 - 内核不会知道它已被归零,因为没有硬件支持它的架构 - 然后 更便宜在页面上写入零,而不是检查页面是否充满了全零并且然后在 99.9999999 % 的情况下无论如何都在其上写入零。
关于c - 使用 munmap 时回收更高的页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57073719/
我有通过 mmap 创建的未命名进程间共享内存区域.进程是通过 clone 创建的系统调用。进程共享文件描述符表(CLONE_FILES)、文件系统信息(CLONE_FS)。进程不共享内存空间(除了先
当我尝试研究一些处理 FPGA 的代码时,我遇到了 munmap、mmap。 我仔细阅读了提供的手册 here .我仍然不明白这个功能的目的。这到底是做什么的? 最佳答案 mmap() 是一个系统调用
在 Mac 上,我使用 munmap 可以看到更高的页面回收率。 我的munmap的返回值为0,这表明请求的页面已成功取消映射。 当我使用以这种方式映射和取消映射的内存测试程序时,为什么会看到更高的页
我正在编写一个使用共享内存的函数库。我编写的用于关闭共享内存的函数每当到达 munmap() 部分时都会给我一个段错误,但如果我不使用该函数而只是让代码 munmap() 和 shm_unlink 最
我定义了一个名为 ClusterSet 的类,它只有一个字段,名为 clusters: class ClusterSet { std::map* > clusters; public:
我正在编写一个程序,并获得了一个内存位置,我将其存储为一个 unsigned int,并将映射的长度存储为一个 unsigned int,我想取消映射。 我的以下方法会生成警告: warning: p
我调用munmap没有错误,但映射仍然可见 /proc//maps当我尝试 mmap(address_overlapping_with_what_I_tried_to_munmap, ...)我没有得
如果一个进程调用 mmap(...,MAP_ANONYMOUS | MAP_SHARED,...) 并 fork N 个子进程,这些进程(父进程或后代进程)中的任何一个是否有可能 munmap() 一
例如,如果我这样做: char *pMap1; /* First mapping */ char *pReq; /* Address we would l
我想知道,为什么映射内存的大小应该作为一个参数传入,因为从同一地址开始的映射不能超过一个(可以吗?),为什么 linux 内核不记录两个起始地址, 长度在一起,但让用户空间程序记住它们。 我的意思是,
我试图优化 C 代码。当我使用 strace跟踪程序,我发现它一直在调用 mmap和 munmap .但是这段代码只是对使用 malloc() 分配的内存元素进行操作。 .有人可以解释为什么吗? 最佳
我想知道是否有必要(或建议)在通过 fork 创建的子进程中取消映射共享内存(使用 munmap),如果内存已获得在父级中,在 fork 之前,使用 mmap(..., MAP_ANONYMOUS |
我在 RHEL 5.8 上有一个多线程应用程序,它通过 mmap 读取大文件(每个文件大约 500MB)并对它们进行一些处理;一个线程执行 mmap,其他线程执行处理。当文件不再位于文件系统上时,将执
Open Group 标准规定应使用页对齐地址调用 munmap,但似乎没有任何要求 mmap 应返回页对齐地址。这是您在编写可移植代码时需要处理的事情吗? 最佳答案 mmap 只会映射整个页面,因此
我正在尝试使用辛普森规则进行数值积分,所以我认为最好的方法是在三个线程中,一个用于 2,一个用于 3,然后是结束边界。 但我是线程新手,仍在学习一些东西。但是,我真的不知道这有什么问题,我使用其属性创
有关于通过mmap分配内存的代码 void *ret = mmap(NULL, 4 * 1024, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1
如果我在内存映射区域上使用 MS_ASYNC 调用 msync,同步过程将被异步处理。 但是,如果我立即对该区域调用 munmap,我是否可以假设 msync 将安全执行?或者我必须在 munmap
我对 C++ 比较陌生,正在学习其他人的代码。他的代码从映射文件中读取,但最终没有释放任何映射内存。以我的理解, mmap() 将文件映射到虚拟内存中。难道我不需要以某种方式释放那些映射内存,比如调用
我有一个关于 Linux 中的 mmap 和 munmap 的简单问题:是否有可能 mmap 成功但 munmap 失败? 假设所有参数都正确给出,例如,请看下面的代码片段。什么情况下会打印munma
我正在尝试为无交换系统实现一个文件支持的内存分配器。 对于每个新分配,我使用 mkstemp 创建一个临时文件作为后台存储,mmap 将其作为 MAP_SHARED 以允许交换页面当系统的内存压力很高
我是一名优秀的程序员,十分优秀!