内存管理
内存管理系统和模块在操作系统以及编程语言中都占有着重要的地位,任何资源的使用都离不开申请
和释放
两个动作,内存管理
中的两个重要过程就是内存分配
和垃圾回收
,内存管理系统如何利用有限的内存资源为尽可能多的程序或者模块提供服务是它的核心目标。
内存分配
内存分配器是内存管理系统中的重要组件,它的主要职责是处理用户程序的内存申请。虽然内存分配器的职责非常重要,但是内存的分配和使用其是一个增加系统中熵的过程
,所以内存分配器的设计与工作原理相对比较简单,我们在这里介绍内存分配器的两种类型。
内存分配器只包含线性内存分配器
(Sequential Allocator)和空闲链表内存分配器
(Free-list Allocator)两种,内存管理机制中的所有内存分配器其实都是上述两种不同分配器的变种,它们的设计思路完全不同,同时也有着截然不同的应用场景和特性,我们在这里依次介绍这两种内存分配器的原理。
线性分配
内存中维护一个指向内存特定位置的指针(内存分段存储原理相似
)
空闲链表分配
空闲链表分配器可以选择不同的策略在链表中的内存块中进行选择,最常见的就是以下四种方式:
首次适应(First-Fit)— 从链表头开始遍历,选择第一个大小大于申请内存的内存块;
循环首次适应(Next-Fit)— 从上次遍历的结束位置开始遍历,选择第一个大小大于申请内存的内存块;
最优适应(Best-Fit)— 从链表头遍历整个链表,选择最合适的内存块;
隔离适应(Segregated-Fit)— 将内存分割成多个链表,每个链表中的内存块大小相同,申请内存时先找到满足条件的链表,再从链表中选择合适的内存块;
Go 语言使用的内存分配策略与第四种策略有些相似,我们通过下图了解一下该策略的原理:
该策略会将内存分割成由 4、8、16、32 字节的内存块组成的链表,当我们向内存分配器申请 8 字节的内存时,我们会在上图中的第二个链表找到空闲的内存块并返回。隔离适应的分配策略减少了需要遍历的内存块数量,提高了内存分配的效率。
内存管理详情:https://lioncat.blog.csdn.net/article/details/106693511
垃圾回收
https://lioncat.blog.csdn.net/article/details/106689805