系统相关
首页 > 系统相关> > Go的内存分配

Go的内存分配

作者:互联网

Go内存分配

一. 背景介绍

先了解一下Linux系统内存相关的背景知识,有助于我们了解Go的内存分配

1.覆盖技术

在上古时代的内存管理中,如果程序太大,超过了空闲内存容量,就无法把全部程序装入内存中,这个时候诞生出了一种解决方案,即覆盖技术,
简而言之,就是把程序分为若干个块,只把哪些需要用到的指令和数据载入内存中,但是这种技术存在一个很严重的问题,必须由程序员手动的给程序划分块,并确定各个块之间的调用关系

2.虚拟内存技术

覆盖技术这种方法,非常耗时,而且使得编程的复杂度大大提升,这个时候就又诞生出了一种解决方案,即虚拟内存技术

2.1 虚拟内存技术的原理

即虚拟内存是对内存的一种抽象,有了这层抽象之后,程序运行进程的总大小可以超过实际可用的物理内存大小,每个进程都有自己的独立虚拟地址空间,然后通过CPU和MMU把虚拟内存地址转换为实际物理地址

2.2 虚拟内存技术的分层设计

虚拟内存体系其实是一种分层设计,总共分为四层

进程访问虚拟内存的流程:进程访问内存,其实访问的是虚拟内存,虚拟内存通过内存映射查看当前需要访问的虚拟内存是否已经加载到了物理内存,
如果已经加载到了物理内存,则取物理内存的数据,
如果没有加载到物理内存,则从磁盘加载数据到物理内存,并且把物理内存地址和虚拟内存地址更新到内存映射表中

总结

在没有虚拟内存的远古时代,物理内存对所有进程都是共享的,多进程同时访问同一块物理内存需要加锁,锁的粒度是进程级别的,
在引入虚拟内存后,每个进程都有各自的虚拟内存,这个时候是多线程访问同一个物理内存需要加锁,锁的粒度是线程级别的,
可以看到,一步步锁的粒度的降低。其实在Go的内存分配中也是这种思想:降低内存并发访问的粒度。

二.TCMalloc

1.简单介绍

2.核心思想

简单介绍一下TCMalloc中几个重要概念

TCMalloc中对不同的对象会区分其大小,不同大小的对象其内存的分配流程也不一样

三. Go的内存分配

Go的内存分配和TCMalloc非常类似,仅有少量地方不同

go的内存分类不像TCMalloc那样分成大中小对象,其只分为小对象和大对象,但其小对象又细分了一个Tiny对象

再来关注一下go是如何释放内存的

go释放内存的函数是sysUnused,它的功能是给内核提供一个建议:这个内存地址区间的内存已不再使用,可以进行回收,但内核是否进行回收,什么时候回收,都取决于内核

四.总结

总结一下内存分配中用到的两个重要思想

标签:Span,线程,内存,Go,分配,虚拟内存,TCMalloc
来源: https://www.cnblogs.com/yinbiao/p/15719691.html