问题标签 [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.
ipc - mmap 是进程间通信的最佳方式吗?
我使用一个文件在 Python 和 Ruby 脚本之间进行通信。但是,我们有 mmap。所以这是我的问题。
- 我可以用 mmap 做同样的事情(进程之间的通信)吗?
- 与物理文件相比,mmap 能给我们带来什么优势?加速?
- 在两个进程之间进行通信的最简单方法是什么?
- 在两个进程之间进行通信的最快方式是什么?
c - mmap的对齐和粒度
我对 mmap 的规范感到困惑。
设为mmappa
的返回地址(与规范相同)
pa = mmap(addr, len, prot, flags, fildes, off);
在我看来,函数调用成功后,以下范围是有效的
[ 帕,帕 + 伦 )
我的问题是以下范围是否仍然有效?
[ round_down(pa, pagesize) , round_up(pa+len, pagesize) )
[ base, base + size ] 简称
也就是说:
- 总是
base
在页面边界上对齐? - 总是
size
页面大小的倍数(换句话说,粒度是页面大小)?
谢谢你的帮助。
我认为本段暗示了这一点:
off参数被限制为根据sysconf()在传递 _SC_PAGESIZE 或 _SC_PAGE_SIZE 时返回的值进行对齐和调整大小。当指定 MAP_FIXED 时,应用程序应确保参数addr也满足这些约束。该实现对整个页面执行映射操作。因此,虽然参数 len 不需要满足大小或对齐约束,但实现应在任何映射操作中包括由范围 [pa,pa+len) 指定的任何部分页面。
但我不确定,我对 POSIX 没有太多经验。
- 请给我一些更明确和更确定的证据
- 或者告诉我至少一个支持 POSIX 并且具有不同行为的系统
谢谢阿甘。
linux - 避免在用户和内核空间之间复制数据,反之亦然
我正在开发一种用于替代 TCP/IP 的并行计算的主动消息传递协议。我的目标是减少数据包的延迟。由于环境是局域网,我可以用更简单的协议替换 TCP/IP 以减少数据包延迟。我没有编写任何设备驱动程序,我只是想用更简单的东西替换 TCP/IP 堆栈。现在我想避免将数据包的数据从用户空间复制到内核空间,反之亦然。我听说过 mmap()。这是最好的方法吗?如果是的话,如果您能提供一些示例的链接,那就太好了。我是一个linux新手,我真的很感谢你的帮助..谢谢...
谢谢,巴拉
python - 使用 fcntl 锁共享 mmap 协调?
当mmap()
用于共享内存(来自 Linux 或其他类 UNIX 系统)时,是否可以(并且可移植)使用fcntl()
(flock()
或lockf()
函数)来协调对映射的访问?
对这个 SO question的回应似乎表明它应该起作用。
我想到的想法是使用进程/页面映射来构建共享内存,以最大限度地减少锁定争用。进程可以同时使用它们的页面,并且只需要在更新进程/页面映射时获取锁。(从无主页面读取访问将涉及检查序列号,复制所需数据,然后验证该块的序列号没有更改)。
从概念上讲,每个共享这个文件映射的进程都会执行mmap()
,在其中找到一个空闲块,获取进程/页面区域的锁,用自己的分配更新它,释放锁,然后愉快地继续它的工作。任何进程都可以搜索过时的映射(使用kill()
零作为信号)并清理进程/页表映射。
(粗略的通用术语,我正在玩弄一个生产者/消费者处理引擎,它使用来自 Linux 上的 Python 共享内存;我希望该解决方案可以移植到 BSD 和其他编程语言 --- 只要支持mmap()
以及必要的接口fcntl()
,flock()
或者lockf().
我也对显示如何测量锁争用和检测任何同步失败的伪代码感兴趣。我知道线程和多处理及其各自Queue()
的对象是实现Python 生产者/消费者处理模型)。
c - 将内存映射到文件描述符(反向 mmap)的系统调用?
我希望能够将内存映射到文件描述符,这样我就可以使用一些需要文件描述符的现有函数。这基本上是我正在寻找的东西:
我可以使用什么系统调用或调用来完成此操作?
c - Mmap和结构
我正在使用信号量处理一些代码,包括进程之间的通信。我做了这样的结构:
并以这种方式使用(在主应用程序中,在从属进程中相同)
当我使用其中一个 sem_ 函数时一切都很好,但是当我尝试做类似的事情时
它不起作用。可能我的指针有问题,但我几乎尝试了所有方法,但似乎没有任何效果。也许有更好的方法在进程之间共享变量、结构等?不幸的是,我不允许使用 boost 或类似的东西,代码用于教育目的,我打算尽可能简单。
c - 为什么 mmap() 在 1TB 稀疏文件上使用 ENOMEM 失败?
我一直在 openSUSE 11.2 x86_64 上处理大型稀疏文件。当我尝试 mmap() 一个 1TB 的稀疏文件时,它会因 ENOMEM 而失败。我原以为 64 位地址空间足以映射 TB,但似乎不是。进一步试验,一个 1GB 的文件可以正常工作,但一个 2GB 的文件(以及更大的文件)会失败。我猜可能有一个设置可以调整,但是广泛的搜索却一无所获。
这是一些显示问题的示例代码 - 任何线索?
java - Java map / nio / NFS 问题导致 VM 故障:“在最近编译的 Java 代码中的不安全内存访问操作中发生故障”
我已经为特定的二进制格式(如果有人感兴趣,可以使用nfdump )编写了一个解析器类,它使用 java.nio 的MappedByteBuffer来读取每个数 GB 的文件。二进制格式只是一系列标头和大多数固定大小的二进制记录,通过调用 nextRecord() 将其馈送到被调用方,后者会推送状态机,完成后返回 null。它表现良好。它适用于开发机器。
在我的生产主机上,它可以运行几分钟或几小时,但似乎总是抛出“java.lang.InternalError:在已编译的 Java 代码中最近发生的不安全内存访问操作中发生错误”,指涉其中一个 Map.getInt , getShort 方法,即在map中的一个读操作。
设置地图的无争议(?)代码是这样的:
然后我使用各种 map.get* 方法来读取 shorts、ints、longs 和其他字节序列,然后再点击文件末尾并关闭地图。
我从来没有见过我的开发主机上抛出的异常。但我的生产主机和开发主机之间的显着区别在于,在前者上,我通过 NFS 读取这些文件的序列(最终可能 6-8TB,仍在增长)。在我的开发机器上,我在本地选择的这些文件较少(60GB),但是当它在生产主机上炸毁时,通常早在它达到 60GB 数据之前。
两台机器都运行 java 1.6.0_20-b02,虽然生产主机运行的是 Debian/lenny,但开发主机是 Ubuntu/karmic。我不相信这会有所作为。两台机器都有 16GB 的 RAM,并且使用相同的 java 堆设置运行。
我认为,如果我的代码中存在错误,那么 JVM 中的错误就足够了,不会给我抛出适当的异常!但我认为这只是一个特定的 JVM 实现错误,由于 NFS 和 mmap 之间的交互,可能是官方修复的6244515的重现。
我已经尝试添加“加载”调用以强制 MappedByteBuffer 将其内容加载到 RAM 中 - 这似乎延迟了我完成的一次测试运行中的错误,但不能阻止它。或者它可能是巧合,这是它在崩溃之前最长的一次!
如果你已经读到这里,并且以前用 java.nio 做过这种事情,你的直觉是什么?现在我的是在没有 nio 的情况下重写它:)
c++ - 从 streambuf 派生而不重写相应的流
几天前,我决定编写一个streambuf
可以使用mmap
和预读的子类会很有趣。我查看了我的 STL (SGI) 如何实现filebuf
并意识到它basic_filebuf
包含一个FILE*
. 所以继承自是不可能basic_filebuf
的。
所以我继承自basic_streambuf
. 然后我想将我的绑定mmapbuf
到一个 fstream。
我认为我唯一要做的就是复制filebuf
...的隐式接口,但这是一个明显的错误。在 SGI 中,basic_fstream
拥有一个basic_filebuf
. 无论我是否调用basic_filestream.std::::ios::rdbuf( streambuf* )
,文件流都会完全忽略它并使用它自己的filebuf
.
所以现在我有点困惑......当然,我可以创建自己的mmfstream
,这将是精确的复制/粘贴,fstream
但听起来真的不是面向 DRY。
我无法理解的是:为什么这样fstream
做与 紧密耦合filebuf
,以至于除了 a 之外不能使用任何东西filebuf
?分离流和缓冲区的全部意义在于可以使用具有不同缓冲区的流。
解决方案:
=>filestream
应该依赖filebuf
. 也就是说, fstream 应该由 streambuf 类模板化。这将允许每个人都可以向 a 提供自己的 streambuf 子类,fstream
只要它实现了filebuf
的隐式接口。问题:我们无法添加模板参数,fstream
因为它会在fstream
用作模板模板参数时破坏模板选择器。
=>filebuf
应该是一个没有任何附加属性的纯虚拟类。这样人们就可以从它继承而不携带它所有的 FILE* 垃圾。
你对这个主题的想法?
php - PHP 脚本一直在做 mmap/munmap
我的 PHP 脚本包含一个循环,它只是回显和取消引用指针(如在 $tab[$othertab[$i]]-> stuff 中)。
直到昨天,当这个脚本开始非常慢(比以前慢 50 倍)时,它一直运行良好。
使用 strace 后,我发现 90% 的时间,脚本都会执行 mmap/munmap。这是 strace 日志的随机部分:
这是 strace -c 命令的结果:
这是php脚本:
只有这个脚本很慢,同一服务器/域/目录上的所有其他脚本都很好。在另一台服务器上,相同的脚本可以正常工作。该脚本在运行时最多占用 90% 的 CPU。
有任何想法吗?