问题标签 [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 投票
1 回答
1486 浏览

linux - 为什么内存映射区域在 Linux 中会变小

考虑到这一点 ,因为这个区域像动态加载的库一样映射文件,我觉得理想情况下它应该长大。这可以通过启动 RLIMIT_STACK 和堆开始之间的 mmap 区域来实现。在这种情况下会出现什么问题。

如果它长大了,那么如何创建一个新的内存映射区域。假设我们希望将 abc.so 的代码映射到虚拟地址空间中,那么我们必须在向下方向创建 sizeof(abc.so) 空间,并从该区域的底部开始映射文件。这是它的工作原理吗?

0 投票
3 回答
476 浏览

performance - 以恒定空间使用率从磁盘流式传输数据的最有效习惯用法是什么?

问题描述

我需要从磁盘流式传输大文件。假设文件大于内存容量。此外,假设我正在对数据进行一些计算并且结果足够小以适合内存。作为一个假设的例子,假设我需要计算一个 200GB 文件的 md5sum,并且我需要保证将使用多少内存。

总之:

  • 需要恒定的空间
  • 尽可能快
  • 假设非常大的文件
  • 结果适合记忆

问题

使用常量空间从文件中读取/流式传输数据的最快方法是什么?

我有过的想法

如果文件足够小以适合内存,那么mmap在 POSIX 系统上会非常快,不幸的是这里不是这种情况。mmap使用较小的缓冲区大小来缓冲文件的连续块是否有任何性能优势?将缓冲区向下移动文件的系统调用开销会mmap占主导地位吗?或者我应该使用我读入的固定缓冲区fread吗?

0 投票
2 回答
1398 浏览

c++ - 将文件映射到内存

Platofrm - Linux, Arch - ARM 编程语言 - C/C++

目标 - 将常规(比如说文本)文件映射到 ram 中的一个预先知道的位置(物理地址),并将该物理地址传递给其他应用程序。我一次映射的块大小为 128K。

我尝试的方式是-用户空间进程发出 ioctl 调用以要求设备驱动程序获取一块内存(ram),计算物理地址并将其返回给用户空间。

用户空间进程需要将文件映射到该物理地址空间 我不知道该怎么做。任何帮助表示赞赏。???

对文件调用 mmap 然后计算物理地址的问题是,页面在有人访问它们之前不在内存中,并且分配的物理内存页面可能不连续。

实际访问该文件的另一个进程来自第三方供应商应用程序。该应用程序要求一旦我们将物理地址传递给它,文件内容就需要存在于连续的内存中。

我现在是怎么做的——

用户进程调用 mmap 到设备。设备驱动程序执行 kmalloc,计算起始物理地址并将 VMA 映射到该物理地址。现在用户进程对文件进行读取并将其复制到在 mmap 期间获得的地址空间。

问题 - 文件的副本存在于 ram 中的两个位置,一个是从磁盘读取完成,另一个是当我将其复制到使用 mmap 获得的缓冲区和相应的复制开销时。在理想的世界中,我想将文件直接从磁盘加载到已知/预定义的位置。

0 投票
2 回答
526 浏览

c++ - C 或 C++ - 动态增长/收缩磁盘支持的共享内存

我有几个应该共享数据的 fastcgi 进程。

数据绑定到一个会话(一个唯一的会话 id 字符串),并且应该能够在服务器重新启动后继续存在。根据会话的数量,共享数据可能太大而无法放入主内存。理想情况下,当共享数据超过某个阈值时,绑定到最不活跃会话的数据应该只存在于磁盘上,而最活跃的会话数据应该从主内存中可用。在会话处于非活动状态一段时间后,会话数据将被销毁。

我的问题是(作为 C/++ 的新手):

是否有任何方法或库可以帮助我解决这个非常棘手的问题?

mmap()考虑到应该销毁非活动会话数据的要求,是否可以与共享内存一起使用?

0 投票
8 回答
9988 浏览

c++ - mmap问题,分配大量内存

我有一些需要解析的大文件,人们一直在推荐 mmap,因为这样可以避免将整个文件分配到内存中。

但是看着“顶部”,看起来我正在将整个文件打开到内存中,所以我想我一定是做错了什么。'顶级节目> 2.1演出'

这是一个代码片段,显示了我在做什么。

谢谢

0 投票
4 回答
2891 浏览

python - 如何在不写入磁盘的情况下在 python 进程之间共享数据

您好,我想在 python 和进程之间共享少量数据(< 1K)。数据是物理 pc/104 IO 数据,变化迅速且经常 (24x7x365)。将有一个“服务器”写入数据,多个客户端读取数据的一部分。它将运行的系统使用闪存(CF 卡)而不是硬盘驱动器,所以我担心使用基于文件的方案会磨损闪存。我还想使用更少的电力(处理器时间),因为我们是 100% 太阳能供电的。

  • 这是一个有效的担忧吗?我们可能会将 CF 卡更改为 SSD。
  • 使用 mmap 更改值是物理地将数据写入磁盘还是虚拟文件?
  • 我们将在 Debian 上运行,所以也许 POSIX IPC for python 模块是最好的解决方案。有人用过吗?
  • 有没有人尝试过Python 对象共享 (POSH)模块?乍一看,它看起来很有希望,但它处于“Alpha”阶段,似乎并没有被积极开发。

谢谢你

更新:我们将最大数据更新速率降低到大约 10 Hz,但更常见的是 1 Hz。仅当值更改而不是恒定更新速率时才会通知客户端。我们已经进入了多服务器/多客户端模型,其中每个服务器专门处理某种类型的仪器或功能。由于事实证明大部分编程将由 Java 程序员完成,我们最终使用 JSON-RPC over TCP。服务器将用 Java 编写,但我仍然希望用 Python 编写主客户端,并且正在研究 JSON-RPC 实现。

0 投票
1 回答
829 浏览

java - Java、C++、NIO、映射缓冲区、同步

博览会:

我在 Linux / Mac 上。

我的部分代码是用 Java 编写的,我的部分代码是用 C++ 编写的。

它们都具有相同的文件映射以实现快速通信。

我想同步 Java 和 C++ 代码。

我知道以下内容:

1)给定Java中的两个线程,我可以使用锁/监视器。

2) 给定一段 Java 代码,一段 C++ 代码,我可以让它们通过 tcp/ip 同步

3) 给定两个已映射内存区域的 C++ 代码,我可以使用 gcc 的 compare_and_swap 对映射区域中的整数进行同步。

问题:

鉴于我的部分代码是用 Java 编写的,我的部分代码是用 C++ 编写的,我能以某种方式做 (3) - JVM 是否支持某种类型的原子比较和交换?那么我的 Java 和 C++ 代码都可以使用这个整数作为某种锁吗?

谢谢!

0 投票
3 回答
526 浏览

c++ - 如何在内存中映射一个 _particular_ 区域?

我有一个程序。我希望它能够在不同的运行中映射特定的内存区域。

  1. 我有程序的源代码。C/C++
  2. 我控制程序的编译方式。海合会
  3. 我控制程序的链接方式。海合会
  4. 我控制程序的运行方式(Linux)。

我只想拥有这个特定的内存区域,例如 0xabcdabcd 到 0xdeadbeef,我将其映射到特定文件。有没有办法保证这一点?(我必须以某种方式确保其他东西没有加载到这个特定区域)。

编辑:

如何确保没有其他任何东西占用内存中的这个特定区域?

0 投票
4 回答
1214 浏览

c++ - 两个 C++ 应用程序在 Linux 上共享一个只读内存区域

我有两个进程 P1 和 P2。

我有一个大型只读资源,称为“R”,我希望 P1 和 P2 都可以访问它。

R 不仅仅是一个“扁平”的字节组;它是一堆相互指向的 C++ 对象。

我希望 P1 和 P2 只共享 R 的一个副本 - 以某种方式让 P1 将 R 加载到内存中的一个区域(在 P1 和 P2 中映射到同一地址),然后 P1 和 P2 都可以访问 R 中的对象C++ 对象(没有竞争条件,因为都是只读的)。

任何熟悉如何做到这一点/陷阱的人?

0 投票
4 回答
8394 浏览

windows - mmap 的便携性如何?

我一直在考虑使用mmap文件读取,并且想知道它的便携性。我正在 Linux 平台上开发,但希望我的程序可以在 Mac OS X 和 Windows 上运行。

我可以假设mmap正在这些平台上工作吗?