【发布时间】:2010-11-08 03:56:25
【问题描述】:
Linux 上的 clone() 系统调用采用指向堆栈的参数,以供新创建的线程使用。最明显的方法是简单地 malloc 一些空间并传递它,但是你必须确保你已经 malloc 的堆栈空间与该线程将使用的一样多(很难预测)。
我记得在使用 pthreads 时我不必这样做,所以我很好奇它做了什么。我遇到了this site,它解释说,“Linux pthreads 实现使用的最佳解决方案是使用 mmap 分配内存,标志指定在使用时分配的内存区域。这样,分配内存栈,如果系统无法分配额外的内存,则会发生分段冲突。”
我听说过使用 mmap 的唯一上下文是将文件映射到内存中,实际上读取 mmap 手册页需要一个文件描述符。这如何用于分配动态长度堆栈以提供给 clone()?那个网站疯了吗? ;)
在任何一种情况下,内核是否都不需要知道如何为新堆栈找到一堆空闲内存,因为这是用户启动新进程时它必须一直做的事情?如果内核已经可以解决这个问题,为什么还需要首先指定堆栈指针?
【问题讨论】:
-
相关:How is Stack memory allocated when using 'push' or 'sub' x86 instructions? 描述了主线程栈的增长机制,为什么不能用于线程栈,以及 pthreads 的作用。
标签: linux multithreading clone mmap stack-memory