【问题标题】:Share a file in volatile memory between processes without IPC在没有 IPC 的进程之间共享易失性内存中的文件
【发布时间】:2023-03-27 19:51:01
【问题描述】:

我有一个需要由多个进程访问(只读)的大文件。我想在启动时将文件内容加载到易失性内存中,然后让进程在不相互通信的情况下访问它。

我正在考虑为此目的留出物理内存,然后在每个进程中硬编码相同的物理地址。我会让每个进程自己映射到虚拟内存,并让其中一个进程在启动时写入加载文件内容。这在 Linux (Android) 上可行吗?有没有更好的办法?

更多观点。该文件约为 0.5 GB,读取速度尽可能快很重要。然而内存是有限的(嵌入的),所以我不想在物理内存中有同一个文件的多个副本。理想情况下,我会留出一部分连续的物理内存。

根据我对 mmap 的了解,它不会将文件直接加载到内存中,而是以一种惰性的方式加载,也不允许指定分配到哪个物理内存?

我正在考虑使用 ION,因为我在 Android 上,但它似乎需要 IPC 来共享内存句柄。

【问题讨论】:

  • mmap 呢?
  • 使用mmapmlock?
  • 您能否提供更广阔的视角——真正应该做什么?无法从用户进程访问物理内存(也许用户空间驱动程序允许这样做 - tldp.org/LDP/khg/HyperNews/get/devices/fake.html)但我认为这不是一个好的解决方案。
  • @Nabuchodonozor 我给出了更多观点。我不想访问物理内存,我只想确保我访问的虚拟内存转换为相同的物理内存。
  • 一个想法让我印象深刻。也许我可以有一个小的内核驱动程序来创建共享 ION 句柄并将其导出到用户空间。

标签: android c linux memory embedded-linux


【解决方案1】:

为什么不只使用经典的 RAM 磁盘方法?使用 Linux,您可以将 mkdir /tmp/memdisk; mount -t tmpfs -o size=512m myramdisk /tmp/memdisk; cp your_file /tmp/memdisk 之类的内容添加到您的系统初始化脚本之一,然后从此处访问该文件。它唯一真正的缺点是您需要 root 访问权限,但对于自定义嵌入式设备,这应该不是问题。

【讨论】:

  • 嗯,没想到。除了 root 访问权限之外,我还应该注意哪些其他警告/风险? tmpfs 是否涉及任何开销?
  • Tmpfs 不是“经典 RAM 磁盘”。请参阅文档/文件系统/ramfs-rootfs-initramfs.txt/tmp 目录可能已经是 tmpfs 的挂载点,因此您的答案会在 tmpfs 中创建另一个 tmpfs。
  • /tmp 只是一个例子,你可以将它挂载到任何你想要的地方。唯一需要注意的是,您请求的固定内存量 + 一些开销会被磁盘缓存消耗,如果您没有足够的内存用于应用程序,那么您就不走运了。但无论您使用何种 RAM 磁盘,情况总是如此。 ramfs、tmpfs 和其他选项之间的性能差异也应该可以忽略不计。但是 tmpfs 几乎可以保证得到您平台的 Linux 内核的支持,并且它具有真实文件系统的所有功能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-03
  • 2019-02-01
  • 2021-07-28
  • 2012-10-31
  • 2013-01-08
  • 1970-01-01
相关资源
最近更新 更多