问题标签 [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.
free - malloc 实现会将释放的内存返回给系统吗?
我有一个长期存在的应用程序,经常进行内存分配释放。任何malloc
实现都会将释放的内存返回给系统吗?
在这方面,以下行为是什么:
- ptmalloc 1、2(glibc 默认)或 3
- dlmalloc
- tcmalloc(谷歌线程 malloc)
- solaris 10-11 默认 malloc 和 mtmalloc
- FreeBSD 8 默认 malloc (jemalloc)
- 囤积malloc?
更新
如果我有一个应用程序的内存消耗在白天和夜间(例如)可能非常不同,我可以强制任何一个malloc
将释放的内存返回给系统吗?
如果没有这样的返回,释放的内存将被多次换出,但这样的内存只包含垃圾。
c - 为什么 remap_file_pages() 在这个例子中失败了?
以下 C 代码说明了我在 Linux 2.6.30.5-43.fc11.x86_64 上看到的问题:
这总是失败,remap_file_pages() 返回 -1 并且 errno 设置为 EINVAL。查看内核源代码,我可以看到 remap_file_pages() 中可能失败的所有条件,但它们似乎都不适用于我的示例。这是怎么回事?
mmap - mmap 写入磁盘上的文件(同步/异步)
我有一个关于 mmap 功能的问题。当 mmap 在内核负责将数据持久保存到磁盘上的映射文件的异步模式下使用时,是否可以让以前的更新覆盖以后的更新?
假设在时间 T,我们修改内存中的一个位置,该位置是内存映射到磁盘上的文件,然后在时间 T+1 我们再次修改内存中的相同位置。由于对文件的写入不是同步的,内核是否有可能首先在时间 T+1 获取修改,然后在时间 T 获取修改,从而导致内存映射文件不一致?
mmap - 内存映射和文件 I/O
如果我在 1GB 机器上内存映射了一个大小为 10GB 的文件,并且如果我触发了文件 i/o,在确保请求的数据不在物理内存中之后,获取的数据是否会映射到 mmap 中的相应虚拟地址?
当我使用 mmap 访问同一位置时,它会再次执行 i/o(还是会使用使用文件 i/o 获取的数据)
提前致谢,
古库尔。
multithreading - 是否可以在不使用偏移量的情况下将指针存储在共享内存中?
当使用共享内存时,每个进程可以将共享区域映射到其各自地址空间的不同区域。这意味着当在共享区域中存储指针时,您需要将它们存储为共享区域开始的偏移量。不幸的是,这使原子指令的使用变得复杂(例如,如果您正在尝试编写无锁算法)。例如,假设您在共享内存中有一堆引用计数节点,由单个作者创建。编写器定期自动更新指针“p”以指向具有正引用计数的有效节点。读者希望以原子方式写入“p”,因为它指向一个节点(结构)的开头,该节点的第一个元素是引用计数。由于 p 总是指向一个有效的节点,增加 ref 计数是安全的,并且可以安全地取消引用 'p' 并访问其他成员。然而,这一切只有在所有东西都在同一个地址空间中时才有效。如果节点和“p”指针存储在共享内存中,则客户端会遇到竞争条件:
- x = 读取 p
- y = x + 偏移量
- 在 y 处增加引用计数
在第 2 步期间,p 可能会发生变化,并且 x 可能不再指向有效节点。我能想到的唯一解决方法是以某种方式强制所有进程就映射共享内存的位置达成一致,以便可以将真正的指针而不是偏移量存储在 mmap'd 区域中。有没有办法做到这一点?我在 mmap 文档中看到 MAP_FIXED,但我不知道如何选择一个安全的地址。
编辑:在 x86 上使用内联汇编和“锁定”前缀也许可以构建一个“增量 ptr X,偏移量 Y 值 Z”?其他架构上的等效选项?没有写很多汇编,不知道有没有需要的指令。
c - 检查mmap的地址是否正确
我正在编写一个应该在 FreeBSD 8.0 和 Linux 上运行的高负载守护程序。守护进程的主要目的是传递由其标识符请求的文件。标识符通过对 db 的请求转换为本地文件名/文件大小。然后我使用顺序mmap()
调用来传递带有send()
.
但是,有时 db 中的文件大小和文件系统上的文件大小不匹配(realsize < db 中的大小)。在这种情况下,我已经发送了所有真实的数据块,并且当映射下一个数据块时——mmap 没有返回错误,只是通常的地址(我也检查了 errno 变量,它在 mmap 之后等于零)。当守护进程试图发送这个块时,它会得到分段错误。(此行为保证在 FreeBSD 8.0 amd64 上发布)
我在打开前使用安全检查以确保尺寸与stat()
通话。然而,现实生活向我表明,在极少数情况下仍然可以引发段错误。
所以,我的问题是有没有办法在取消引用之前检查指针是否可以访问?当我在 gdb 中打开核心时,gdb 说给定地址超出范围。可能有人可以提出另一种解决方案。
python - Python 的搁置模块是否使用内存映射 IO?
有谁知道 Python 的shelve
模块是否使用内存映射 IO?
也许这个问题有点误导。我意识到shelve
使用底层 dbm 样式的模块来完成其肮脏的工作。底层模块使用的机会是什么mmap
?
我正在对数据存储进行原型设计,虽然我意识到过早的优化通常是不受欢迎的,但这确实可以帮助我理解设计中涉及的权衡。
c++ - 如何使用 mmap 指向 STL 类型?
我有一个到 char 指针的 mmap 类型转换
字符 *ptr;
ptr = (char *)mmap(0, FILESIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
这是我之前的代码。但是现在我想使用地图而不是 char * 因为要求发生了变化。
现在,我的地图被声明为 map < int, string > i_s_map;
如何更改我的 mmap 调用以指向地图?
c++ - 在 mmap 中缓存
我正在使用 mmap 调用使用 C++ 中的简单指针算法从一个非常大的文件中读取。问题是,当我多次读取小块数据(以 KB 为单位)时,每次读取所花费的时间与前一次读取的时间相同。我如何知道是否正在访问磁盘以完成我的请求,或者在第一个请求之后的调用中是否正在从主内存(页面缓存)完成请求。
python - 在 python 2.6 中运行 mmap 相关函数时出错
我尝试从http://docs.python.org/library/mmap.html运行以下代码
但是,我得到了一个错误。
这有什么问题?我在 Snow Leopard/Mac 上使用 python 2.6。