kos*_*tix 5

看来你应该完善你对当代计算机系统如何工作的知识 - 这可能有助于使用Go等语言,这些语言比其他主流解决方案更接近"金属".

问题是,当前Go运行的商品平台(除了WebAssembly - 它运行在通常由Web浏览器提供的高级VM上)执行与问题相关的两件事:完全"包含"他们的流程执行,并向他们提供所谓的 虚拟内存管理.

前者意味着由商品操作系统(基于Linux或*BSD,Windows,Mac OS X等)的内核运行的进程无法在不要求底层内核代表该进程执行此操作的情况下执行任何有用的操作 .也就是说,该进程实际上并不分配内存或打开文件或通过TCP套接字发送字节 - 它要求内核这样做.

因此,内核可以完整而准确地记录分配给它管理的每个进程的所有资源.因此,当进程由于某种原因完成执行时,内核会在它之后清除:关闭仍处于打开状态的文件和套接字描述符,释放其他资源并回收提交给进程的内存.

因此,对您的问题的直接回答是:当然,是的,这并不以任何方式取决于流程的实现方式(即,它是用C语言编写的,还是用Go语言编写的,还是用Java编写的 - 因此是由Java VM并且从字节代码到实际CPU指令,在JavaScript中编译并由Node.js或在Python中执行 - 因此内核实际上并不是在执行Python代码,而是实际上是Python解释器的代码,等等) - 内核甚至没有"看到"所有这些差异,因为它执行CPU指令并执行 进程发出的系统调用(同样,使用CPU指令).

剩下的部分,只是与你的问题的本质相关,但无论如何可能有助于思考内存管理.

问题是,如果我们考虑执行一个用Go编写的程序的进程,它在一个操作系统Go支持上运行,那么存在两个级别的内存管理:

  1. 低级,由内核提供,和
  2. 高级别,由Go运行时提供(链接到用Go编写的任何正在运行的程序).

Go程序要求Go运行时为其提供动力,以便在需要时分配内存,而垃圾收集器又是Go运行时的一部分,不时将未使用的内存回收到由内存池维护的内存池中.运行.本质上,在Go程序运行时"释放"的内存保留在程序中,当再次需要时,Go运行时将尝试从其池中分配它.

只有当Go运行时的内存管理器没有足够的可用内存时,它才会到达操作系统并在那里分配内存 - 从而引入另一层内存管理.

当然,内存不仅仅是从内核流向Go运行时:后者有一种机制来标记内存页面,这些内存页面可以保持自由状态的时间过长,这样内核可以在它认为合适时自由地回收它们(通常是系统受到内存压力).

我会说,你应该阅读一两本关于典型操作系统如何工作的书.