- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我在文章中读到http://www.ousob.com/ng/borcpp/ng916c4.php关于通过调用 coreleft() 获取未使用的 brk 内存。但看起来这在 Linux 上不起作用。而且文件 alloc.h 不存在。我的问题是 alloc.h 是 Linux 的函数族标准吗?如果没有,Linux 上是否有类似 coreleft 功能的替代方案?谢谢。
最佳答案
您可能想要测量内存使用情况,这在 Linux 上非常模糊。参见 this & that更多。你会想要使用 /proc/
伪文件系统,参见 proc(5) .请记住 processes使用 virtual memory .另见 http://www.linuxatemyram.com/
询问剩余多少内存(或可以分配多少内存,例如 system calls 像 mmap(2) ...)没有任何意义,因为某些其他进程可能会释放内存资源,这稍后将可用于您的过程。因此不可能有任何可靠 coreleft
函数 - 测量可用的堆内存,例如以便将来调用 malloc
- 在 Linux(或 POSIX)上。两者 mmap
& malloc
可能会失败(你应该经常检查)。
您可以在进程上限制许多资源(包括 virtual memory 或 address space ),请参阅 setrlimit(2)和 bash shell ulimit
内置。
sbrk
syscall 在 Linux 上几乎被弃用(并且不再使用)。您将使用 mmap
获得新的虚拟内存段(然后您使用 munmap
发布它)。 C standard library工具 malloc(3) (来自 <stdlib.h>
)通过调用 mmap
适本地;它通常会尝试重用以前的 free
-d 内存区域。在 Linux 上使用 GNU glibc ,另见 malloc_info(3) , mallinfo(3) , malloc_stats(3) .您可能会研究 free software 的源代码标准 C 库,如 GNU glibc或 musl-libc了解更多关于他们的信息。
<alloc.h>
header 是非标准的,在大多数 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)。
关于linux - Linux gcc 是否支持 coreleft 功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32109168/
我在文章中读到http://www.ousob.com/ng/borcpp/ng916c4.php关于通过调用 coreleft() 获取未使用的 brk 内存。但看起来这在 Linux 上不起作用。
我是一名优秀的程序员,十分优秀!