【问题标题】:linux - mmap SHARED maximum sizelinux - mmap SHARED 最大大小
【发布时间】:2014-11-05 03:18:54
【问题描述】:

上下文

Debian 64 位。

昨天,mmap 创建非常大文件的能力给我留下了深刻的印象。 它与 MAP_SHARED 选项有关。

事实上,我在 3Gb 内存和 120Gb 硬盘上映射了一个空的 8Tb 文件。使用 LARGEFILE 打开文件并使用 lseek64。

我知道最后,绝对最大值是硬盘驱动器可以物理获取的数据量,无论如何。

问题

这对我来说绝对没用,但是,我可以创建多少这些文件,只是为了好玩?我尝试了 10 并且没问题。没有限制吗? ulimit 显示:无限制。来吧,没有什么是无限的。

如果我在硬盘上的每个 mmap 文件中只放一个 一个字符,那么最大值会是

(可用磁盘空间/(指向文件描述符大小*4Kb))

sizeof char == 1 和 4Kb,磁盘上文件的实际大小?

谢谢

【问题讨论】:

  • 解释一下,保存文件的方式是目录节点有一个指向数据节点的指针。仅当数据节点实际包含数据时才分配数据节点。所以,一般来说,一个巨大的文件可以被映射,但直到一个节点需要包含数据时才会真正分配。

标签: c linux mmap


【解决方案1】:

创建的文件很可能带有漏洞。您可以在没有mmap 的情况下执行此操作。只需打开一个文件ftruncate,将其调整为您想要的任何大小,操作系统很可能会允许您这样做。诀窍是操作系统知道您没有写入文件的哪些部分,并且实际上不会为它分配磁盘块。读取文件的这些部分只会返回零。除非您使用的文件系统不支持该功能。但是 unix 上的大多数文件系统都可以。

要为文件实际分配磁盘上的所有块,您必须将一个字符写入每个块(或一组块,或者文件系统在内部执行此操作,这是特定于操作系统的)。您可以通过fstat 计算块大小并进行实验。

【讨论】:

  • 所以这意味着我没有限制,只有物理的硬盘吧?
  • 您可以通过 quota、ulimit 或其他一些机制来设置限制,但通常不会设置这些限制。
猜你喜欢
  • 1970-01-01
  • 2011-04-20
  • 2013-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多