对于 64 位虚拟内存,为什么预分配堆栈很昂贵?

问题描述 投票:0回答:1

正如https://without.boats/blog/why-async-rust/所说,

操作系统线程有一个大的预分配堆栈,这会增加每个线程的内存开销。

文章继续指出,现代编程语言中并发性的大部分困难和设计工作都是为了避免每线程内存开销。

但是等等。

所有现代服务器都有虚拟内存,因此不需要为线程堆栈分配物理内存,只需地址空间;最小开销仅为一页。

所有现代服务器都是 64 位的,因此虚拟地址空间本质上是取之不尽用之不竭的。

大多数现代服务器都运行 Linux,它乐于过度使用地址空间分配。

鉴于这一切,为什么每个线程几兆字节的地址空间被认为是值得努力避免的开支?

multithreading concurrency language-design virtual-memory
1个回答
0
投票

所有现代服务器都是 64 位的,因此虚拟地址空间本质上是取之不尽用之不竭的。

比尔·盖茨不是在 80 年代说过“640K 对任何人来说都应该足够了”吗? :) 我会非常小心此类声明。

无论如何,虚拟地址目前实际上是 48 位,因为原因。这留下了更少的可寻址空间:256TB。当然,这仍然允许大约 26800 万个线程,默认堆栈大小为 1MB(如果我计算正确的话)。但这个数字已经不再是天文数字了。

更糟糕的是,这个计算没有考虑堆、碎片和页面大小。如果你包括这些,那么你很快就会意识到,实际上耗尽整个虚拟地址空间并不难。

© www.soinside.com 2019 - 2024. All rights reserved.