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

标签 multithreading memory memory-management concurrency operating-system

操作系统如何决定在底层进程的地址空间中给每个线程分配多少堆栈空间?

如果一个线程使用了最初分配给它的所有堆栈空间,而同一进程的其他线程存在大量未充分利用的空间怎么办? 我知道同类型的问题 b/w a stack 和 a heap 可以通过它们在相反方向上的增长来解决。

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

最佳答案

这不是由操作系统决定的,这是程序员的工作。以Windows为例,操作系统启动的第一个线程的堆栈大小是在可执行文件头中指定的。 IMAGE_OPTIONAL_HEADER.SizeOfStackReserve设置大小。它将责任转移给生成 header 的任何工具,例如链接器,您使用它的 /STACK option设置大小。

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

这个也需要在启动线程的时候指定,类似CreateThread的winapi函数接受一个参数来设置大小。可以使用默认值,如果指定 0,则操作系统使用 EXE header 中指定的大小。这很常见,实际大小很少是关键的,因为大多数程序都会严重超大堆栈。远离灾难很重要。请注意,在按需分页操作系统上扩大堆栈不​​会产生任何成本,您只需为使用的部分付费。

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

关于multithreading - 操作系统如何确定应为每个线程分配多少堆栈空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22047121/

相关文章:

c++ - 多线程数组数组?

python - 脚本中扭曲和更多的客户

java - 从其他线程访问 View (Android)

c++ - Eigen 运算符在内部如何解释为 MKL 函数?

c - alloca 和线程安全有什么关系(如果有的话)?

c++ - 在C++中的赋值运算符重载方法中删除旧的动态分配内存

java - Netty 游戏服务器与游戏线程通信

ios - UIGraphicsGetImageFromCurrentImageContext 泄漏

c# - 带有计时器的简单应用程序正在消耗内存?

java - Matlab内存管理; java堆不足