POSIX rlimit:关于 RLIMIT_DATA,我们究竟可以假设什么?

2024-03-16

先决条件

POSIX.1 2008 http://pubs.opengroup.org/onlinepubs/9699919799/ 指定 http://pubs.opengroup.org/onlinepubs/9699919799/functions/setrlimit.html the setrlimit() and getrlimit()功能。提供了各种常数resource论点,其中一些内容转载如下,以便更容易理解我的问题。

定义了以下资源:

(...)

RLIMIT_数据

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

(...)

RLIMIT_STACK

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

RLIMIT_AS

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

此外,POSIX.1 2008defines http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_125 数据段像这样:

3.125 数据段

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

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

问题

我对它的语义和使用有点困惑RLIMIT_DATA资源。以下是我的具体问题:

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

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

    在 Linux 上,内存分配为mmap()不计入数据段。仅分配的内存brk() or sbrk()是数据段的一部分。最新版本的 glibc 使用malloc()分配其所有内存的实现mmap()。的价值RLIMIT_DATA因此对您可以使用此实现分配的内存量没有影响malloc().

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

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

    该标准说的是RLIMIT_AS:“如果超过此限制,则 malloc() 和 mmap() 函数将失败,并将 errno 设置为 [ENOMEM]。”由于失败mmap()没有指定用于RLIMIT_DATA,我得出结论,记忆是从mmap()不计入数据段。

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


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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

POSIX rlimit:关于 RLIMIT_DATA,我们究竟可以假设什么? 的相关文章

  • 适用于 Windows 的 NPM 包“bin”脚本

    Cucumber js 提供了一个命令行 二进制文件 这是一个简单的 js文件包含一个shebang操作说明 usr bin env node var Cucumber require lib cucumber 二进制文件在中指定packa
  • 哪些简单的改变对您的 Delphi 程序产生了最大的改进 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一个 Delphi 2009 程序 需要处理大量数据 并且需要尽可能快且不使用太多内存 What 小简单您是否对 Delphi 代
  • 额外的函数/方法定义是否会增加程序的内存占用?

    在 C 中 定义不使用的附加方法或函数是否会导致更大的内存占用或更慢的执行速度 基本上 我在一个类中有几种实用程序调试方法 这些方法对于该类的正常使用都不是必需的 如果从未使用过这些定义 是否保留这些定义会在内存占用或速度方面产生影响吗 例
  • 在自己的处理程序中捕获信号

    include
  • 获取DLL函数的内存地址

    我想知道是否有可能 使用 C 和 WindowsAPI 是否有一个函数可以让我获得 dll 中函数的 32 位 我认为 内存地址 例如 如何获取 kernel32 dll 中 Beep 的 32 位 xxxxxxxx 地址 其次 如果我在汇
  • 如何完全清除所有 matplotlib 图的内存

    我有一个数据分析模块 其中包含调用的函数matplotlib pyplotAPI 多次 每次运行最多生成 30 个数字 这些数字在生成后会立即写入磁盘 因此我需要将它们从内存中清除 目前 在每个函数结束时 我都会 import matplo
  • 在 Delphi 中使用 SecureZeroMemory

    我明白有一个SecureZeroMemoryC 中的函数 函数实现定义在
  • 用 O(1) 空间逐行读取数字

    许多编码挑战在同一行中有多个数字 通常第一行告诉多数字行中有多少个数字 4 31 415 9 26 通常我只是读整行 然后 split 并将字符串映射到数字 但有没有好的办法not一次读取整行 而不是一次读取一个数字 为了节省内存 要么因为
  • C# 位图/图形内存不足

    我正在尝试拍摄整个屏幕的快照以读取像素值 事实上我这样做没有任何问题 但在 214 个快照之后 我出现了内存不足的异常 Bitmap ScreenShot new Bitmap Screen PrimaryScreen Bounds Wid
  • 如何从 POSIXct 对象获取原点

    我有一个像这样的函数 foo function time in code here that changes POSIXct to numeric time out as POSIXct time in origin 1970 01 01
  • 无论如何,为什么要处置一个肯定很快就会被处置的物体呢?

    假设我有一个程序 例如单击按钮 我创建了一个 Graphics 对象 显然我应该处理掉它 例如 using Graphics gr this CreateGraphics 或通过调用 Dispose in the finallytry ca
  • C# 中类实例的内存使用情况[重复]

    这个问题在这里已经有答案了 可能的重复 C NET 对象使用多少内存 https stackoverflow com questions 426396 how much memory does a c net object use 就像标题
  • 适用于 Windows 的免费内存调试器? [复制]

    这个问题在这里已经有答案了 可能的重复 有 Windows 的良好 Valgrind 替代品吗 https stackoverflow com questions 413477 is there a good valgrind substi
  • 为什么MIPS中内存地址加4?

    如果某些内容存储在 0x1001 0000 处 则下一个内容将存储在 0x1001 0004 处 如果我是正确的 32 位架构中的内存块每个都是 32 位 那么0x1001 0002会指向32位的后半部分吗 首先 MIPS 架构中的内存地址
  • printf() var-arg 引用如何与堆栈内存布局交互?

    给出代码片段 int main printf Val d 5 return 0 是否有任何保证编译器会存储 Val d and 5 连续地 例如 d l a V 5 Format String
  • 读取进程的进程内存不会返回所有内容

    我正在尝试扫描第三方应用程序的内存 我已经查到地址了 现在是在0x0643FB78 问题是 从那以后我就再也爬不上去LPMODULEENTRY32 gt modBaseAddr is 0x00400000 and LPMODULEENTRY
  • Linux 中如何获取内存修改通知

    在Linux的用户空间程序中 我通过从堆中分配来获取一块内存 然后将指针分发给在其他线程中运行的许多其他组件来使用 当上述内存被修改时我想收到通知 我当然可以开发一个自定义用户空间解决方案 供其他组件在尝试修改内存时使用 我的情况的问题是这
  • RenderTargetBitmap 内存泄漏

    我正在尝试使用 RenderTargetBitmap 渲染图像 每次我从 RenderTargetBitmap 创建一个实例来渲染图像时 内存都会增加 完成后内存永远不会释放 这是代码 RenderTargetBitmap rtb new
  • 如何查找或计算Linux进程的页表大小和其他内核占用?

    我怎样才能知道 Linux 进程页表有多大 以及任何其他可变大小的进程统计 如果您真的对页表感兴趣 请执行以下操作 cat proc meminfo grep PageTables PageTables 24496 kB
  • Windows 内存映射文件

    我正在尝试研究 Windows 内核在内存映射文件 虚拟内存方面的行为 具体来说 我感兴趣的是确定内存映射文件的内容 由 Windows 刷新到磁盘的频率以及 Windows 使用什么标准来决定是时候这样做 我在网上做了一些研究 除了 MS

随机推荐