两种语言的例程都很便宜:goroutine 每个 2KB,而 Elixir 进程每个 0.5KB。
我知道在BEAM中启动一个进程需要 0.5KB 的内存。这在Elixir和 Erlang的情况下是如此轻量级,而在Go的情况下在较小程度上似乎是使用这些运行时的优势,与其他依赖于它们自己的不那么便宜的进程和线程或依赖的语言相比底层 OS的进程和线程(据说也需要更多内存)。
我想知道在基于 Linux 的系统上启动进程需要多少内存。我知道内存使用情况取决于进程在做什么。但我假设只是启动一个什么都不做的进程会产生内存成本)。那费用是多少?
我在哪里可以阅读更多关于它的信息?有没有我可以检查的文件/命令?
在 Linux 上,任何线程或进程至少会产生
task_struct
内核中的 a 成本;在我的系统上,pahole task_struct
告诉我这需要 9,344 个字节。在用户空间中,线程还需要为其分配一个堆栈,但实际成本将取决于它实际使用的堆栈空间量(因为只有被触摸的页面才会被分配)。您可以使用 和 中的示例
man pthread_attr_init
程序pthread_create
。后者特别允许您控制堆栈大小和创建线程的数量,这意味着可以通过运行它并测量它使用的内存量来估计用户空间中单个线程的成本。GNUtime
对大量运行进行平均,建议在此特定场景中每个线程有 48KiB 的惩罚,堆栈为 64KiB。分叉的成本要高一些,因为这涉及为进程创建一个新的地址空间,以及内核中的相关结构和页表条目。