gpt4 book ai didi

go - 切换到新G时,P会将mcache复制到G堆栈吗?

转载 作者:行者123 更新时间:2023-12-01 22:42:43 25 4
gpt4 key购买 nike

在 Go 的 GMP(goroutine,系统线程,上下文)模型中,一个 goroutine 可能会产生许多对象并将它们放在 P(堆内存?)中,P 上的所有数据在停放时是否会复制到 G 的堆栈中?如果是这样,G 的栈可能会变得非常大,这使得 P 的设计显得毫无意义,但如果不是,调度器如何解决多个 G 的数据同时存储在 P 中的问题呢?如果 G 想在另一个 P 上执行,那是不可能的。
我的问题是

  • 当g停放时,所有数据都会复制到G'堆栈吗?
  • 为什么在执行 G 时不把所有数据都放在 G 上?
  • 最佳答案

    您的问题存在根本性的误解:mcache不是 堆栈的占位符,它是堆上小分配的捷径。它拥有预先分配的内存块,可以分配给特定的 goroutine,避免锁定。
    编译器决定是否必须在堆上分配特定变量。一旦这样做,这将永远不会被复制回堆栈 .
    现在的问题是如何尽可能有效地从堆中分配内存。这是mcache , mcentral , 和 mheap进来。

  • mcache是各种大小的预分配 block 列表,其中一个 mcache每个处理器 电话 .自 电话 运行单个 goroutine 手机 一次,分配来自 mcache不需要锁定。
  • 如果 mcache预分配 block 用完,mcentral 请求更多在 之间共享电话 s。
  • 如果 mcentral用完,从 mheap 请求更多 block 这可能反过来从操作系统请求更多内存。
  • 如果请求的 block 足够大,直接从mheap请求.

  • 所有这一切的重点是避免在小内存分配期间锁定。但是从 mcache 获得的所有内存部分, mcentralmheap 的一部分堆 ,它们可以被 使用手机 不管是哪个 电话 它正在运行,并且在不再使用时必须进行垃圾收集。
    您可以找到更多关于 的详细信息堆 内存分配如下:
  • Go: Memory Management and Allocation
  • A visual guide to Go Memory Allocator from scratch
  • Memory Management in Golang
  • 关于go - 切换到新G时,P会将mcache复制到G堆栈吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63126283/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com