【发布时间】:2012-01-20 22:30:19
【问题描述】:
我正在尝试将 tcmalloc 移植到 uclibc。 Tcmalloc 定义了 sbrk 函数,该函数又从 libc 调用 __sbrk。另一方面,uclibc 没有__sbrk 功能,但有sbrk。
关于如何从 tcmalloc sbrk 调用 uclibc sbrk 有什么想法吗?
【问题讨论】:
我正在尝试将 tcmalloc 移植到 uclibc。 Tcmalloc 定义了 sbrk 函数,该函数又从 libc 调用 __sbrk。另一方面,uclibc 没有__sbrk 功能,但有sbrk。
关于如何从 tcmalloc sbrk 调用 uclibc sbrk 有什么想法吗?
【问题讨论】:
sbrk 是(旧的)system call,但大多数内存分配器都是在mmap 之上构建的。另见this question
您应该使用系统调用,而不是模拟它。我更喜欢使用mmap,而不是sbrk
进行系统调用(通常是mmap)是从linux kernel 获取更多内存的唯一方法。
从应用程序(或库)的角度来看,system call 是原子的(它主要是一条机器指令,如 SYSCALL、SYSENTER、int 0x80 等)。
【讨论】:
sbrk 可能比mmap 更有用,因为后者可能无法就地增长。
mmap 为您提供独立的内存段。我不确定何时需要就地增长。还有MAP_GROWSDOWN,可能还有MAP_NORESERVE。另见stackoverflow.com/a/8504358/841108
mmap()。通常较小的内存请求通过sbrk() 处理,而较大的内存请求使用mmap()。
mmap。另一方面,sbrk 内存映射基地址的定位方式使其在与任何其他映射冲突之前可以增长很多。