【问题标题】:Where is my shared memory object saved?我的共享内存对象保存在哪里?
【发布时间】:2018-02-23 14:02:03
【问题描述】:

我是编程新手,我的 beaglebone black 上有一些程序员共享内存,它在 Linux 上运行。

我需要确保内存保存在 Beaglebone blacks ram 上,而不是闪存。

文件路径是:

#define FILEPATH "/tmp/mmapped.bin"

fd = open(FILEPATH, O_RDWR | O_CREAT | O_TRUNC, (mode_t)0600);
    if (fd == -1) {
    perror("Error opening file for writing");
    exit(EXIT_FAILURE);
    }

用 C++ 编码

如果需要任何其他问题,请告诉我。

【问题讨论】:

  • #define FILEPATH "/tmp/mmapped.bin" 不回答你的问题吗?

标签: c++ memory ram shared flash-memory


【解决方案1】:

文件路径/tmp/whatever 不保证任何东西。您需要做的是登录到您的 Beaglebone 并查看哪些文件系统安装在哪里。

要将文件存储在 RAM 中,您需要将它们存储在 tmpfsramfs 文件系统中。

在我的 Fedora Linux 笔记本电脑上,如果我输入 mountcat /proc/mounts,我会看到已安装的所有内容。这些是您正在寻找的线路类型:

$ grep tmpfs /proc/mounts
tmpfs /dev/shm tmpfs rw,seclabel,nosuid,nodev 0 0
tmpfs /run tmpfs rw,seclabel,nosuid,nodev,mode=755 0 0
tmpfs /sys/fs/cgroup tmpfs ro,seclabel,nosuid,nodev,noexec,mode=755 0 0
tmpfs /tmp tmpfs rw,seclabel,nosuid,nodev 0 0

所以无论如何你都可以在 Fedora 上看到,/tmp/ 目录是 tmpfs/tmp/ 中的文件将在 RAM 中。

tmpfs 需要注意的一点是,默认的最大大小是 RAM 的一半。如果 tmpfs 中的文件以及使用 RAM 的程序超过 RAM 大小,tmpfs 数据将进入交换区,交换区将在闪存上,如果 Beaglebone 甚至有交换区,我目前不记得了。

如果没有交换或者它很小,那么对大文件使用 tmpfs 会导致 OOM(内存不足)并破坏很多东西,所以要小心你使用了多少。

【讨论】:

  • 您好 Zan,非常感谢您的回答。我将在星期一在我的办公室,并会尝试。如何确保没有使用所有 ram 并因此发生 OOM?我怎样才能使用我的所有内存而不是一半?谢谢
  • @user9401895:您可以通过使用size=1G 挂载选项来控制 tmpfs 可以增长的大小。这将使它成为 1 GB。阅读man mount 并搜索Mount options for tmpfs
  • @user9401895:如果您将 tmpfs 设置为使用所有 RAM,那么您的程序将使用什么?这会导致 OOM 错误。
猜你喜欢
  • 1970-01-01
  • 2020-08-08
  • 1970-01-01
  • 2020-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-14
  • 2011-10-14
相关资源
最近更新 更多