问题标签 [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.

0 投票
2 回答
1469 浏览

ipc - mmap 是进程间通信的最佳方式吗?

我使用一个文件在 Python 和 Ruby 脚本之间进行通信。但是,我们有 mmap。所以这是我的问题。

  • 我可以用 mmap 做同样的事情(进程之间的通信)吗?
  • 与物理文件相比,mmap 能给我们带来什么优势?加速?
  • 在两个进程之间进行通信的最简单方法是什么?
  • 在两个进程之间进行通信的最快方式是什么?
0 投票
1 回答
6658 浏览

c - mmap的对齐和粒度

对 mmap 的规范感到困惑。

设为mmappa的返回地址(与规范相同)

pa = mmap(addr, len, prot, flags, fildes, off);

在我看来,函数调用成功后,以下范围是有效的

[ 帕,帕 + 伦 )

我的问题是以下范围是否仍然有效?

[ round_down(pa, pagesize) , round_up(pa+len, pagesize) )
[ base, base + size ] 简称

也就是说:

  1. 总是base在页面边界上对齐?
  2. 总是size页面大小的倍数(换句话说,粒度是页面大小)?

谢谢你的帮助。

我认为本段暗示了这一点:

off参数被限制为根据sysconf()在传递 _SC_PAGESIZE 或 _SC_PAGE_SIZE 时返回的值进行对齐和调整大小。当指定 MAP_FIXED 时,应用程序应确保参数addr也满足这些约束。该实现对整个页面执行映射操作。因此,虽然参数 len 不需要满足大小或对齐约束,但实现应在任何映射操作中包括由范围 [pa,pa+len) 指定的任何部分页面。

但我不确定,我对 POSIX 没有太多经验。

  • 请给我一些更明确和更确定的证据
  • 或者告诉我至少一个支持 POSIX 并且具有不同行为的系统

谢谢阿甘。

0 投票
2 回答
2982 浏览

linux - 避免在用户和内核空间之间复制数据,反之亦然

我正在开发一种用于替代 TCP/IP 的并行计算的主动消息传递协议。我的目标是减少数据包的延迟。由于环境是局域网,我可以用更简单的协议替换 TCP/IP 以减少数据包延迟。我没有编写任何设备驱动程序,我只是想用更简单的东西替换 TCP/IP 堆栈。现在我想避免将数据包的数据从用户空间复制到内核空间,反之亦然。我听说过 mmap()。这是最好的方法吗?如果是的话,如果您能提供一些示例的链接,那就太好了。我是一个linux新手,我真的很感谢你的帮助..谢谢...

谢谢,巴拉

0 投票
1 回答
2493 浏览

python - 使用 fcntl 锁共享 mmap 协调?

mmap()用于共享内存(来自 Linux 或其他类 UNIX 系统)时,是否可以(并且可移植)使用fcntl()flock()lockf()函数)来协调对映射的访问?

对这个 SO question的回应似乎表明它应该起作用。

我想到的想法是使用进程/页面映射来构建共享内存,以最大限度地减少锁定争用。进程可以同时使用它们的页面,并且只需要在更新进程/页面映射时获取锁。(从无主页面读取访问将涉及检查序列号,复制所需数据,然后验证该块的序列号没有更改)。

从概念上讲,每个共享这个文件映射的进程都会执行mmap(),在其中找到一个空闲块,获取进程/页面区域的锁,用自己的分配更新它,释放锁,然后愉快地继续它的工作。任何进程都可以搜索过时的映射(使用kill()零作为信号)并清理进程/页表映射。

(粗略的通用术语,我正在玩弄一个生产者/消费者处理引擎,它使用来自 Linux 上的 Python 共享内存;我希望该解决方案可以移植到 BSD 和其他编程语言 --- 只要支持mmap()以及必要的接口fcntl()flock()或者lockf(). 我也对显示如何测量锁争用和检测任何同步失败的伪代码感兴趣。我知道线程多处理及其各自Queue()的对象是实现Python 生产者/消费者处理模型)。

0 投票
4 回答
2932 浏览

c - 将内存映射到文件描述符(反向 mmap)的系统调用?

我希望能够将内存映射到文件描述符,这样我就可以使用一些需要文件描述符的现有函数。这基本上是我正在寻找的东西:

我可以使用什么系统调用或调用来完成此操作?

0 投票
2 回答
6120 浏览

c - Mmap和结构

我正在使用信号量处理一些代码,包括进程之间的通信。我做了这样的结构:

并以这种方式使用(在主应用程序中,在从属进程中相同)

当我使用其中一个 sem_ 函数时一切都很好,但是当我尝试做类似的事情时

它不起作用。可能我的指针有问题,但我几乎尝试了所有方法,但似乎没有任何效果。也许有更好的方法在进程之间共享变量、结构等?不幸的是,我不允许使用 boost 或类似的东西,代码用于教育目的,我打算尽可能简单。

0 投票
3 回答
7422 浏览

c - 为什么 mmap() 在 1TB 稀疏文件上使用 ENOMEM 失败?

我一直在 openSUSE 11.2 x86_64 上处理大型稀疏文件。当我尝试 mmap() 一个 1TB 的稀疏文件时,它会因 ENOMEM 而失败。我原以为 64 位地址空间足以映射 TB,但似乎不是。进一步试验,一个 1GB 的文件可以正常工作,但一个 2GB 的文件(以及更大的文件)会失败。我猜可能有一个设置可以调整,但是广泛的搜索却一无所获。

这是一些显示问题的示例代码 - 任何线索?

0 投票
1 回答
4461 浏览

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 的情况下重写它:)

0 投票
4 回答
2943 浏览

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* 垃圾。

你对这个主题的想法?

0 投票
1 回答
2264 浏览

php - PHP 脚本一直在做 mmap/munmap

我的 PHP 脚本包含一个循环,它只是回显和取消引用指针(如在 $tab[$othertab[$i]]-> stuff 中)。

直到昨天,当这个脚本开始非常慢(比以前慢 50 倍)时,它一直运行良好。

使用 strace 后,我发现 90% 的时间,脚本都会执行 mmap/munmap。这是 strace 日志的随机部分:

这是 strace -c 命令的结果:

这是php脚本:

只有这个脚本很慢,同一服务器/域/目录上的所有其他脚本都很好。在另一台服务器上,相同的脚本可以正常工作。该脚本在运行时最多占用 90% 的 CPU。

有任何想法吗?