问题标签 [mmap]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 可以从用户空间找到 mmap 页面的脏污度吗?
可以从 linux 2.6.30+ 下的用户空间访问(非共享)mmap 页面的脏度吗?欢迎使用特定于平台的 hacks 和 kludges。
理想情况下,我正在寻找一个位数组,每页一个(4kB?)mmap'ed 区域,如果在该区域被 mmap'ed 后已写入该页面,则设置这些位。
(我知道,进行写入的过程可以跟踪这些信息 - 但如果内核仍然这样做,这样做似乎很愚蠢。)
谢谢,
克里斯。
c - 如何使用仅手动同步到磁盘的 mmap 获得检查点文件
我需要最快的方法来定期将文件与内存同步。
我想我想要的是有一个 mmap 文件,它只能手动同步到磁盘。我不确定如何防止发生任何自动同步。
除非我手动指定,否则无法修改该文件。关键是要有一个检查点文件,它将状态的快照保存在内存中。我想尽可能避免复制,因为这需要相当频繁地调用并且速度很重要。
c - 为什么 POSIX mmap 不返回 volatile void*?
Mmap 返回 void*,但不返回volatile void*
. 如果我使用 mmap 来映射共享内存,那么另一个进程可能正在写入该内存,这意味着从同一内存位置进行的两次后续读取可能会产生不同的值—— volatile 的确切情况。那么为什么它不返回一个 volatile void* 呢?
我最好的猜测是,如果您有一个专门写入共享内存段的进程,它不需要通过易失性指针查看共享内存,因为它总是对当前存在的内容有正确的理解;编译器为防止冗余读取所做的任何优化都无关紧要,因为没有其他东西可以写入和更改其脚下的值。还是有其他历史原因?我倾向于说返回volatile void*
将是一个更安全的默认值,那些想要这种优化的人可以手动转换为 void*。
POSIX mmap 说明: http: //opengroup.org/onlinepubs/007908775/xsh/mmap.html
python - 尝试在 Windows 下写入 mmap 时出现奇怪的错误
这个简单的python代码:
产生以下错误(在 mmap.mmap(...) 行上):
WindowsError: [Error 1006] 文件的卷已被外部更改,因此打开的文件不再有效
知道为什么吗?
posix - 32 位 FreeBSD 7.2 和 1GB mmap
我在使用 FreeBSD 和大型 mmap 时遇到了一些麻烦。Linux 没有显示相同的问题。
在程序启动时,它总是可以获得 1 GB 的地图。但是,有一个重新加载操作,文件被替换和重新映射。新地图通常每次都会稍微大一点,因此它不能整齐地融入旧的 mmap 位置。这种重映射在 FreeBSD 上经常失败,但在 Linux 上几乎没有。(它在使用 ASLR 的 Linux 上更经常失败。FreeBSD 使用ASLR吗?)
我认为这是因为库加载了其他库以及在程序运行期间完成的内存分配导致了虚拟内存空间的碎片化。FreeBSD 的 malloc 实现或库加载可能有一些特殊性导致了这种情况。
我正在寻找一些我可以做的事情,以使其更有可能发挥作用。
我正在考虑的一件事是总是映射一个完整的 1 GB 空间,即使文件大小实际上可能是 890 MB。如果我能完成这项工作,那么我将始终有一个 1 GB 的插槽来将新的 895 MB 文件重新映射到其中。
iphone - 内存映射 UIImage
我有一个UIImage
,我想把它的数据放在一个文件中,然后使用一个映射文件来节省一些内存。显然,UIImage
数据是私有的,无法访问它。你有什么建议可以解决这个问题吗?
谢谢!
linux - 从保留的堆栈空间分配的 mmap 区域?
在我们的产品中,我们使用malloc
完全依赖 mmap 进行内存分配的实现。我们也公平地使用alloca
ing。我们刚刚遇到了一个问题,mmap 将分配应该保留给堆栈空间的区域(因此,当我们的一个较大的 alloca 溢出到 malloc 的区域中时,会导致非常糟糕的事情发生)。
我们进程分配的限制是我们的VM地址空间,而不是物理内存。我们在进程运行时观察了 /proc/*/maps 文件,并观察了 malloc 占用了所有可用的地址空间。它最终诉诸于在堆栈 rlimit-set 范围内分配地址,并最终alloca
延伸到其中。
我们试图通过alloca
在启动时设置我们的整个堆栈限制来解决它,但这并没有证明跨平台稳定(它尝试访问alloca
我的 2.4 开发盒上的 d 内存时出现段错误,而它在 2.6 生产机器上工作) .
有没有办法实际保留地址空间?还有什么可以做的?
c - 达尔文真的没有mremap吗?
我正在尝试找出如何在 Mac 上重新映射内存映射文件(当我想扩展可用空间时)。
我看到我们在 Linux 世界的朋友有,mremap
但我在我的 Mac 上的标题中找不到这样的功能。/Developer/SDKs/MacOSX10.6.sdk/usr/include/sys/mman.h
具有以下内容:
mmap
mprotect
msync
munlock
munmap
- 但不是
mremap
man mremap
证实了我的恐惧。
我目前必须munmap
并且mmmap
如果我想调整映射文件的大小,这涉及使所有加载的页面无效。肯定有更好的办法。一定?
我正在尝试编写适用于 Mac OS X 和 Linux 的代码。如果必须,我可以选择一个宏来在每种情况下使用最好的功能,但我宁愿正确地做到这一点。
linux - 更改内存映射文件的文件名
是否可以更改已经打开的内存映射文件的名称,或者我是否需要关闭它,重命名它然后再次映射它?
linux - 直接 IO 的 mmap:地址错误?
我用匿名 mmap 分配了一些内存:
然后我使用用 O_DIRECT 打开的 fd 给它写信:
但得到错误的地址错误:
地址在我看来不错。
如果我在 .data 中分配缓冲区并与 512 对齐,则写入有效,因此 open() 和 write() 都可以,我拥有所有权限等。
怎么了?除了 512 对齐之外,对于直接 IO 是否还有其他要求?
更新:
例如,如果我为此更改 mmap:
有用: