线程和进程的内存分配

时间:2013-05-27 05:40:54

标签: linux multithreading process

如果我有一个进程,它已在RAM中分配了一些空间。如果进程创建了一个线程(事实上它也有),那么线程也需要一些空间来执行它。不是吗? 那么它会增加已分配给该进程的空间大小,还是会在其他地方创建线程空间?如果是,在RAM中,需要它与过程所拥有的空间一致吗?

2 个答案:

答案 0 :(得分:1)

调度程序(在内核中)会有一些开销,因为它需要维护有关线程的信息。

特定于流程的区域也会有一些开销,因为每个线程都需要一个堆栈,并且当用户代码需要时,您不希望将内容放入特定于内核的空间中。得到。

答案 1 :(得分:0)

所有现代操作系统和相当长一段时间内,将进程所需的内存与RAM上物理分配的内存分开。

操作系统为每个进程创建了一个大的虚拟地址空间。该地址空间与每个进程内创建的线程数无关。

在Windows中,例如,出于优化原因,该地址空间的一部分保留给操作系统和内核库,并在所有进程之间共享以提高效率。

另一部分专门用于应用程序用户代码和库。

创建流程物流和资源后,流程现在就可以开始了,这将通过启动流程中将开始执行流程主入口点的第一个线程来实现。

对于要开始执行的线程,它需要一个堆栈以及其他要求。在Windows中,该堆栈的默认大小约为1 MB。这意味着,如果没有改变,每个线程将需要大约1 MB的内存用于自己的内务处理。 (堆栈,TLS等......)

当进程需要分配内存时,操作系统决定如何在RAM上物理分配内存。进程/应用程序在物理RAM地址中看不到。它只能看到分配给每个进程的虚拟空间中的虚拟地址。

操作系统使用位于磁盘上的页面文件来协助除RAM之外的内存请求。较少的RAM意味着页面文件的压力更大。当操作系统试图找到一块不在RAM中的内存时,它会尝试在页面文件中查找,在这种情况下,他们称之为页面未命中。

这个主题非常广泛,但我试图尽可能多地概述。