Memory Go(lang)中的地址空间是多少?

Memory Go(lang)中的地址空间是多少?,memory,memory-management,concurrency,go,parallel-processing,Memory,Memory Management,Concurrency,Go,Parallel Processing,我试图理解Go中并发编程的基础知识。几乎所有文章都使用术语“地址空间”,例如:“所有goroutine共享相同的地址空间”。这是什么意思 我试图从wiki中理解以下主题,但没有成功: 然而目前我很难理解,因为我在内存管理和并发编程等领域的知识非常贫乏。有许多未知词,如段、页、相对/绝对地址、VAS等 谁能给我解释一下这个问题的基本原理吗?可能有一些有用的文章,我找不到。当应用程序在RAM上运行时,RAM中的地址由内存管理器分配给应用程序。这被称为地址空间 概念: 处理器(CPU)执行

我试图理解Go中并发编程的基础知识。几乎所有文章都使用术语“地址空间”,例如:“所有goroutine共享相同的地址空间”。这是什么意思

我试图从wiki中理解以下主题,但没有成功:

然而目前我很难理解,因为我在内存管理和并发编程等领域的知识非常贫乏。有许多未知词,如段、页、相对/绝对地址、VAS等


谁能给我解释一下这个问题的基本原理吗?可能有一些有用的文章,我找不到。

当应用程序在RAM上运行时,RAM中的地址由内存管理器分配给应用程序。这被称为地址空间

概念: 处理器(CPU)执行Fetch Decode Execute中的指令 周期它通过将应用程序中的指令提取到 RAM(随机存取存储器)。之所以这样做,是因为它非常重要 以高效的方式从磁盘一路获取它。有人需要保持沉默 跟踪内存使用情况,以便操作系统实现内存 经理你的应用程序,由一些程序组成,在你的例子中是这样的 是用Go编程语言编写的。执行脚本时, 操作系统以上述方式执行指令

读了你的帖子我能感同身受。随着节目越来越多,您提到的术语将变得越来越熟悉

我第一次遇到这些术语是在《操作系统》一书中,也就是《恐龙》一书中

希望这对您有所帮助。

:

go
”语句将函数调用作为独立的并发控制线程或
goroutine
在同一线程中开始执行

谁能给我解释一下这个问题的基本原理吗

“地址空间”是一个通用术语,可适用于许多上下文:

地址空间是通过组合足够多的唯一标识的限定符来创建的,以使地址明确(在特定的地址空间内)

的演示文稿“”说明了通过在同一进程地址空间中使用goroutine解决的主要问题:

Dave对“地址空间”进行了限定,首先谈到线程:

由于进程切换可以发生在进程执行的任何点上,操作系统需要存储所有这些寄存器的内容,因为它不知道当前正在使用哪些寄存器

这导致了线程的发展,线程在概念上与进程相同,但共享相同的内存空间

(这是关于记忆的)

然后,Dave演示了进程地址空间中的堆栈(由进程管理的地址):

通常在进程的地址空间内

  • 堆位于内存的底部,就在程序(文本)的上方,并向上增长
  • 堆栈位于虚拟地址空间的顶部,向下增长
另见“”

问题是:

由于堆和堆栈相互覆盖将是灾难性的,操作系统通常会安排在堆栈和堆之间放置一个不可写入内存区域,以确保如果它们发生冲突,程序将中止

对于线程,这可能导致限制进程的堆大小:

随着程序中线程数量的增加,可用地址空间的数量也会减少

goroutine使用不同的方法,但仍共享相同的进程地址空间:

那些goroutine的堆栈要求是什么

Go编译器不使用保护页,而是在每个函数调用中插入一个检查,以检查是否有足够的堆栈供函数运行。如果没有,运行时可以分配更多的堆栈空间

由于这种检查,goroutines初始堆栈可以变得更小,这反过来允许Go程序员将goroutines视为廉价资源

Go 1.3引入了一种管理这些堆栈的新方法:

如果goroutine的堆栈太小,将分配一个新的、更大的堆栈,而不是添加和删除额外的堆栈段

旧堆栈的内容复制到新堆栈,然后goroutine继续使用其新的更大堆栈

在第一次调用H之后,堆栈将足够大,以确保对可用堆栈空间的检查始终成功


当应用程序在RAM上运行时,内存管理器会将RAM中的地址分配给应用程序
,什么是“在RAM上运行”?谁在RAM中分配内存?操作系统,程序?“内存管理器”是什么?请你具体解释一下……非常感谢!特别是这个链接@VonC,一个关于不断增长的1.3堆栈的问题。如果F()需要更多堆栈,会发生什么?是将G()和H()移到左边以腾出空间,还是在末尾复制F(),留下一个可用空间?谢谢@siritinga我不确定,但是
F()
应该使用更大的堆栈进行复制(如中所示)。谢谢VonC,我想我在这里混合了一些概念。我想F()不能在图中增长,因为它没有运行,F()称为G(),G()称为H(),它们都在同一个goroutine中。如果F()位于不同的goroutine中,那么它将有自己的堆栈(每个goroutine一个堆栈)。“如果F()位于不同的goroutine中,那么它将有自己的堆栈(每个goroutine一个堆栈)”:是的。这意味着在新的“连续堆栈”(continuousstack)()中,如果其函数之一在当前堆栈中缺少空间,则会复制所有堆栈(到更大的堆栈中)。这似乎也是所描述的。