操作系统如何确定应为每个线程分配多少堆栈空间?

时间:2014-02-26 16:19:19

标签: multithreading memory memory-management concurrency operating-system

操作系统如何确定为底层进程的地址空间中的每个线程提供多少堆栈空间?

如果一个线程最初利用分配给它的所有堆栈空间并且同一进程的其他线程存在大量未充分利用的空间,该怎么办? 我理解,同一种类型的问题,无论是堆栈还是堆,它们都会在相反的方向上生长。

操作系统是否在内存中的其他位置为线程分配了更多空间,还是会导致堆栈溢出?

1 个答案:

答案 0 :(得分:4)

由操作系统来决定,这是程序员的工作。以Windows为例,可执行文件头中指定了第一个线程(操作系统启动的线程)的堆栈大小。 IMAGE_OPTIONAL_HEADER.SizeOfStackReserve设置大小。它将降压传递给生成标题的任何工具,如链接器,您使用其/STACK option来设置大小。

大多数构建工具将使用合理的默认大小,一个兆字节用于保留大小是非常常见的,4096(一页)用于初始提交大小。或者不那么合理的默认值,.NET程序臭名昭着地预先提交整个堆栈空间。

这也需要在启动线程时指定,像CreateThread这样的winapi函数接受参数来设置大小。默认值可用,如果指定0,则OS使用EXE标头中指定的大小。这是非常常见的,实际大小很少是关键的,因为大多数程序将大大超大堆栈。保持远离灾难的重要性。请注意,在需求分页的操作系统上,超大堆栈不需要任何费用,您只需支付使用的费用。

在许多情况下,用尽堆栈空间是一个不可恢复的错误,处理器无法再进行调用。这个网站名称的原因。有其他线程没有消耗他们的整个堆栈是无关紧要的,切换堆栈通常不起作用。程序使用指针来堆栈空间,你找不到它们来更新值。