- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
如果我在内存映射区域上使用 MS_ASYNC 调用 msync,同步过程将被异步处理。
但是,如果我立即对该区域调用 munmap,我是否可以假设 msync 将安全执行?或者我必须在 munmap 之前调用 msync 吗?
最佳答案
简短的回答是肯定的——即使您从不调用msync
,对内容的更改最终(并且安全地)进入文件。来自 man 2 mmap
:
MAP_SHARED
Share this mapping. Updates to the mapping are visible to other
processes that map this file, and are carried through to the
underlying file. (To precisely control when updates are carried
through to the underlying file requires the use of msync(2).)
也许更重要的是,man 2 msync
有这个注释:
Since Linux 2.6.19,
MS_ASYNC
is in fact a no-op, since the kernel properly tracks dirty pages and flushes them to storage as necessary.
请记住:mmap
将文件系统缓存的页面直接暴露给用户空间,就像任何其他缓存系统一样,更改将在将来的某个时间传播到后备存储。即使您的程序崩溃了,您对页面所做的更改最终也会得到传播。 msync
的使用是为了保护您免受断电之类的影响。
关于ios - mmap、msync(MS_ASYNC) 和 munmap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26097316/
我有通过 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 以允许交换页面当系统的内存压力很高
我是一名优秀的程序员,十分优秀!