繁体   English   中英

线程和进程的内存分配

[英]Memory Allocation for Threads and Processes

如果我有一个进程,该进程已在RAM中分配了一些空间。 如果该进程创建了一个线程(实际上也有),则该线程还将需要一些空间来执行它。 不是吗 那么,这会增加分配给该进程的空间的大小,还是会在其他地方创建线程空间? 如果是,在RAM上的哪个位置,它是否需要与进程已拥有的空间相邻?

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

在特定于进程的区域中也会有一些开销,因为每个线程都需要一个堆栈,并且当用户代码需要获取时,您不想将东西放到特定于内核的空间中。

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

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

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

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

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

为了使线程开始执行,除其他要求外,它还需要一个堆栈。 在Windows中,该堆栈的默认大小约为1 MB。 这意味着,如果不进行更改,则每个线程将需要大约1 MB的内存用于自己的内部管理。 (堆栈,TLS等...)

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

操作系统使用位于磁盘上的页面文件来协助除RAM外的内存请求。 较少的RAM意味着对页面文件的压力更大。 当操作系统尝试查找内存中没有的内存时,它将尝试在页面文件中查找,在这种情况下,他们称其为页面遗漏。

这个主题非常广泛,但是我会尽可能地概述一下。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM