2024秋冬季OS2EDU第三阶段总结报告
概述
在2024秋冬季开源操作系统训练营的第三阶段中,我深入研究并实现了一个高效的内存分配器,该分配器结合了Slab
分配器和TLSF
(Two-Level Segregated Fit)分配器的优势。本报告将详细分析每个链接中的源码,并探讨我实现的新调度器的优势。
Slab分配器
源码分析
Slab分配器的核心思想是将内存分割成固定大小的块,并将这些块组织成一个或多个列表,以便于快速分配和释放。每个Slab
结构体维护了一个特定大小的块列表。
1 | pub struct Slab<const BLK_SIZE: usize> { |
Slab
结构体包含一个free_block_list
,这是一个双向链表,用于存储可用的块,以及total_blocks
,记录总块数。Slab
的实现提供了new
、grow
、allocate
和deallocate
等方法,用于初始化、扩展、分配和释放内存块。
优势分析
- 固定大小的块:由于每个
Slab
只管理固定大小的块,因此分配和释放操作可以非常快速。 - 缓存局部性:
Slab
分配器倾向于将最近释放的块重新分配给请求,这有助于提高缓存局部性。 - 减少外部碎片:通过固定大小的块分配,
Slab
分配器可以减少外部碎片。
TLSF分配器
源码分析
TLSF分配器实现了一种动态内存分配算法,它通过维护多个空闲块列表来优化内存分配。TLSF分配器的关键特点是其二级索引结构,它允许快速找到合适的空闲块。
1 | pub struct TlsfByteAllocator { |
TlsfByteAllocator
结构体封装了rlsf::Tlsf
,并提供了init
、add_memory
、alloc
和dealloc
等方法,用于初始化、添加内存、分配和释放内存。
优势分析
- 高内存利用率:TLSF通过低粒度(
SLLEN
为2)的索引结构,可以更有效地利用内存,减少内部碎片。 - 快速分配和释放:TLSF的二级索引结构允许快速定位空闲块,从而加快分配和释放速度。
新调度器实现
设计理念
在我的新调度器设计中,我结合了Slab
和TLSF
的优点,将较小的块分配任务交给Slab
分配器,而将较大的块分配任务交给TLSF
分配器。这种设计允许我复用已经分配的指定大小的块,从而提高内存分配的效率。
优势分析
- 灵活性:新调度器可以根据请求的大小灵活选择使用
Slab
或TLSF
,这使得它可以适应不同的内存分配需求。 - 内存利用率:通过将较大的块分配给
TLSF
,我可以利用其高内存利用率的优势,同时Slab
分配器可以快速处理小规模的分配请求。 - 性能优化:新调度器通过复用已经分配的块,减少了分配和释放操作的开销,提高了整体性能。
学习感想
通过参与2024秋冬季开源操作系统训练营,我对内存管理有了更深入的理解。实现Slab
和TLSF
分配器的过程让我体会到了操作系统中内存管理的复杂性和重要性。我学到了如何设计和实现高效的内存分配策略,这对于我未来的职业生涯和学术研究都是非常宝贵的经验。此外,我也认识到了团队合作的重要性,因为在实现过程中,我与队友们进行了深入的讨论和协作,共同解决了遇到的技术难题。总的来说,这次训练营不仅提升了我的技术能力,也锻炼了我的团队合作能力。
结论
通过实现基于Slab
和TLSF
的内存分配器,我成功地提高了内存分配的效率和内存利用率。新调度器的设计不仅灵活,而且能够根据请求的大小选择合适的分配器,这在操作系统的内存管理中是非常重要的。我的实现展示了如何在保证性能的同时,优化内存使用,这对于任何需要高效内存管理的系统都是至关重要的。