【问题标题】:Does Linux gcc support coreleft function?Linux gcc 是否支持 coreleft 功能?
【发布时间】:2015-11-13 13:26:05
【问题描述】:

我在文章http://www.ousob.com/ng/borcpp/ng916c4.php 中读到关于通过调用 coreleft() 获取未使用的 brk 内存。但看起来这在 Linux 上不起作用。而且文件 alloc.h 也不存在。 我的问题是,这是 Linux 的 alloc.h 函数系列标准吗?如果没有,Linux 上的 coreleft 等功能的任何替代方案?谢谢。

【问题讨论】:

  • 你为什么要问?你为什么在乎?请编辑您的问题以激发它。
  • @BasileStarynkevitch 我不能代表 OP,但如果你很好奇,我最终通过谷歌搜索了一个出现在一个非常古老的 DOS 程序中的函数。我猜测这个函数已经过时了,它在虚拟内存系统中无法正常工作,从它的外观来看,我是对的。

标签: linux memory process


【解决方案1】:

您可能想要测量内存使用情况,这在 Linux 上非常模糊。请参阅thisthat 了解更多信息。您需要使用/proc/ 伪文件系统,请参阅proc(5)。请记住 processes 使用 virtual memory。另见http://www.linuxatemyram.com/

询问还剩多少内存(或者可以分配,例如system callsmmap(2)...)没有任何意义,因为某些其他 进程可能会释放内存资源稍后将可用于您的流程。因此 不可能有任何 可靠 coreleft 函数 - 测量可用的堆内存,例如以便将来调用malloc- 在 Linux(或 POSIX)上mmapmalloc 都可能失败(你应该经常检查)。

您可以在一个进程上限制许多资源(包括virtual memoryaddress space),请参阅setrlimit(2) 和内置的bash shell ulimit

sbrk 系统调用在 Linux 上几乎被弃用(并且不再使用)。您将使用mmap 获得新的虚拟内存段(并使用munmap 释放它)。 C standard library 通过适当地调用mmap 来实现malloc(3)(来自<stdlib.h>);它通常会尝试重用以前的free-d 内存区域。在带有 GNU glibc 的 Linux 上,另请参阅 malloc_info(3)mallinfo(3)malloc_stats(3)。您可以研究free software 标准C 库的源代码,例如GNU glibcmusl-libc,以了解更多信息。

<alloc.h> 标头是非标准的,在大多数 Linux 或 POSIX 系统上不存在。

如果您需要保留一些地址空间而不消耗内存(即交换区域),请考虑将MAP_NORESERVE 选项设置为mmap。参见例如this.

在 POSIX 系统(如 Linux)上的 C 中,通常的习惯是使用malloc(或相关的calloc)函数,并处理内存不足的情况(这在实践中不太可能发生,除非在负载非常大的系统上或设置了强大的小限制时),可能是通过退出并显示错误消息:

 size_t siz = some_size();
 void* p = malloc(siz);
 if (!p) { perror("malloc"); exit(EXIT_FAILURE); };

另见this answer(建议使用 Boehm 的 GC)。

我建议你阅读Advanced Linux Programming

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-21
    • 2013-09-16
    • 2013-09-25
    • 1970-01-01
    • 1970-01-01
    • 2019-06-10
    • 2021-10-09
    • 1970-01-01
    相关资源
    最近更新 更多