malloc.c中sbrk是如何使用的?它在哪里用到了?

7
我在《Advanced Unix Programming》(以及其他几本书)中读到Linux的malloc()使用Linux系统调用sbrk()来请求操作系统的内存。
我正在查看glibc的malloc.c代码,可以看到注释中有很多提到sbrk(),但在代码中没有直接引用。
malloc()请求内存时,sbrk()在哪里被引用/使用?
(这可能是我对从C运行时库进行系统调用的理解上的一般误解。如果是这样,我很想知道它们是如何进行的?)

虽然我不确定sbrk的实际位置,但在C语言中,系统调用和函数之间没有任何区别,唯一的例外是在系统调用完成之前,控制权完全由操作系统管理。 - millinon
sbrk(2) 往往会变得过时和陈旧。使用 mmap(2) 是有充分的理由(多线程)的。 - Basile Starynkevitch
@BasileStarynkevitch,您能简要阐述一下这些原因吗? - user997112
阅读手册页。sbrk已从最新的Posix标准中删除。 - Basile Starynkevitch
1个回答

8
Glibc的malloc.c通过调用存储在__morecore全局函数指针中的函数来请求更多内存(实际调用使用宏MORECORE,该宏扩展为__morecore)。默认情况下,这个指针包含函数__default_morecore的地址,该函数在morecore.c中定义。此函数调用sbrk
请注意,一些malloc实现可能使用mmap而不是sbrk来获取更多内存。

酷 - 找到了。morecore.c 中的注释说:“分配增量字节数的数据空间,并返回数据空间的起始位置”。因此,如果我想要100个字节的数据,我调用malloc(),它最终调用morecore.c中的函数,该函数调用sbrk(),并返回指向100个字节开头的指针?还是sbrk()在调用main()之前被用于为进程分配整个堆? - user997112
1
堆大小事先未知,因此 malloc 将调用 sbrk。但是这不会一对一翻译,因为 malloc 可能会从 sbrk 请求更大的内存块,然后将它们分割,并且它还可以返回之前释放的内存给调用者,而不需要使用 sbrk - interjay
1
所以sbrk所做的就是接受一个内存请求,给定一个大小并提供指向它的指针。这难道不非常类似于malloc()所做的吗?换句话说,如果sbrk已经实现了这个功能,malloc()的目的是什么?只是为了增加错误处理的负担吗? - user997112
1
sbrk() дёҚзҹҘйҒ“е“ӘдәӣеҶ…еӯҳйғЁеҲҶд»ҚеңЁдҪҝз”ЁпјҢеӣ дёәжІЎжңүдёҺ free зӣёеҪ“зҡ„дёңиҘҝпјӣmalloc еӨ„зҗҶе·Із»Ҹиў« malloc() е’Ң free() зҡ„еҶ…еӯҳеқ—зҡ„еӣһ收гҖӮ - Guntram Blohm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接