【问题标题】:POSIX rlimit: What exactly can we assume about RLIMIT_DATA?POSIX rlimit:关于 RLIMIT_DATA,我们究竟可以假设什么?
【发布时间】:2014-07-09 05:37:53
【问题描述】:

先决条件

POSIX.1 2008 specifies setrlimit()getrlimit() 函数。为 resource 参数提供了各种常量,其中一些在下面复制以便更容易理解我的问题。

定义了以下资源:

(...)

RLIMIT_DATA

这是进程的数据段的最大大小,以字节为单位。如果超出此限制,malloc() 函数将失败,并将 errno 设置为 [ENOMEM]。

(...)

RLIMIT_STACK

这是初始线程堆栈的最大大小,以字节为单位。该实现不会自动将堆栈增长到超出此限制。如果超过此限制,则应为线程生成 SIGSEGV。如果线程阻塞 SIGSEGV,或者进程忽略或捕获 SIGSEGV 并且没有安排使用备用堆栈,则 SIGSEGV 的处置应在生成之前设置为 SIG_DFL。

RLIMIT_AS

这是进程总可用内存的最大大小,以字节为单位。如果超出此限制,malloc() 和 mmap() 函数将失败,并且 errno 设置为 [ENOMEM]。此外,自动堆栈增长会因上述影响而失败。

此外,POSIX.1 2008 defines 数据段如下:

3.125 数据段

与进程关联的内存,可以包含动态分配的数据。

我了解RLMIT_DATA 资源传统上用于表示可以通过brk() 函数分配给进程的最大内存量。 POSIX.1 的最新版本不再指定此函数,并且许多操作系统(例如 Mac OS X)不支持将此函数作为系统调用。相反,它使用mmap() 的变体进行模拟,这不是 POSIX.1 2008 的一部分。

问题

我对@9​​87654330@ 资源的语义和使用有点困惑。以下是我的具体问题:

  • 根据本规范,堆栈可以成为数据段的一部分吗?

  • 标准中提到RLIMIT_DATA:“如果超出此限制,malloc() 函数将失败,errno 设置为 [ENOMEM]。”这是否意味着使用malloc() 分配的内存必须是数据段的一部分?

    在 Linux 上,使用mmap() 分配的内存不计入数据段。只有使用brk()sbrk() 分配的内存是数据段的一部分。最新版本的 glibc 使用 malloc() 实现,它使用 mmap() 分配其所有内存。因此RLIMIT_DATA 的值不会影响您可以通过malloc() 的实现分配的内存量。

  • 这是否违反了 POSIX.1 2008?

  • 其他平台是否表现出类似的行为?

    标准中提到了RLIMIT_AS:“如果超出此限制,malloc() 和 mmap() 函数将失败,并且将 errno 设置为 [ENOMEM]。”由于mmap()的失败没有为RLIMIT_DATA指定,所以我推断从mmap()获得的内存不计入数据段。

  • 这个假设是真的吗?这是否仅适用于 mmap() 的非 POSIX 变体?

【问题讨论】:

    标签: memory posix setrlimit


    【解决方案1】:

    FreeBSD 也分享了 malloc(3) 在默认 malloc 实现中使用 mmap(2) 实现的问题。我在将产品从 FreeBSD 6 移植到 7 时遇到了这个问题,发生了切换。我们将每个进程的默认限制从 RLIMIT_DATA=512M 更改为 RLIMIT_VMEM=512M,即将虚拟内存分配限制为 512MB。

    至于这是否违反POSIX,我不知道。我的直觉是,很多东西都违反了 POSIX,而 100% 符合 POSIX 的系统与严格确认的 C 编译器一样罕见。

    编辑:呵呵,现在我看到 FreeBSD 的名称 RLIMIT_VMEM 是非标准的;他们将 RLIMIT_AS 定义为 RLIMIT_VMEM 以实现 POSIX 兼容性。

    【讨论】:

    • 听到这个消息很难过。请注意,RLIMIT_VMEM 也会影响不消耗 RAM 的 mmap()-ed 文件。在 64 位机器上,您可以毫无问题地 mmap() 一个多 TB 文件,它甚至不会消耗太多 RAM(尤其是在文件稀疏的情况下)。所以今天没有办法有效地限制进程消耗的实际内存量......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-13
    • 2013-08-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多