0%

2024-秋冬季开源操作系统集训营第三阶段总结-nomodeset

2024秋冬季OS2EDU第三阶段总结报告

概述

在2024秋冬季开源操作系统训练营的第三阶段中,我深入研究并实现了一个高效的内存分配器,该分配器结合了Slab分配器和TLSF(Two-Level Segregated Fit)分配器的优势。本报告将详细分析每个链接中的源码,并探讨我实现的新调度器的优势。

Slab分配器

源码分析

Slab分配器的核心思想是将内存分割成固定大小的块,并将这些块组织成一个或多个列表,以便于快速分配和释放。每个Slab结构体维护了一个特定大小的块列表。

1
2
3
4
pub struct Slab<const BLK_SIZE: usize> {
free_block_list: FreeBlockList<BLK_SIZE>,
total_blocks: usize,
}

Slab结构体包含一个free_block_list,这是一个双向链表,用于存储可用的块,以及total_blocks,记录总块数。Slab的实现提供了newgrowallocatedeallocate等方法,用于初始化、扩展、分配和释放内存块。

优势分析

  • 固定大小的块:由于每个Slab只管理固定大小的块,因此分配和释放操作可以非常快速。
  • 缓存局部性Slab分配器倾向于将最近释放的块重新分配给请求,这有助于提高缓存局部性。
  • 减少外部碎片:通过固定大小的块分配,Slab分配器可以减少外部碎片。

TLSF分配器

源码分析

TLSF分配器实现了一种动态内存分配算法,它通过维护多个空闲块列表来优化内存分配。TLSF分配器的关键特点是其二级索引结构,它允许快速找到合适的空闲块。

1
2
3
4
5
pub struct TlsfByteAllocator {
inner: Tlsf<'static, u32, u32, 16, 2>,
total_bytes: usize,
used_bytes: usize,
}

TlsfByteAllocator结构体封装了rlsf::Tlsf,并提供了initadd_memoryallocdealloc等方法,用于初始化、添加内存、分配和释放内存。

优势分析

  • 高内存利用率:TLSF通过低粒度(SLLEN为2)的索引结构,可以更有效地利用内存,减少内部碎片。
  • 快速分配和释放:TLSF的二级索引结构允许快速定位空闲块,从而加快分配和释放速度。

新调度器实现

设计理念

在我的新调度器设计中,我结合了SlabTLSF的优点,将较小的块分配任务交给Slab分配器,而将较大的块分配任务交给TLSF分配器。这种设计允许我复用已经分配的指定大小的块,从而提高内存分配的效率。

优势分析

  • 灵活性:新调度器可以根据请求的大小灵活选择使用SlabTLSF,这使得它可以适应不同的内存分配需求。
  • 内存利用率:通过将较大的块分配给TLSF,我可以利用其高内存利用率的优势,同时Slab分配器可以快速处理小规模的分配请求。
  • 性能优化:新调度器通过复用已经分配的块,减少了分配和释放操作的开销,提高了整体性能。

学习感想

通过参与2024秋冬季开源操作系统训练营,我对内存管理有了更深入的理解。实现SlabTLSF分配器的过程让我体会到了操作系统中内存管理的复杂性和重要性。我学到了如何设计和实现高效的内存分配策略,这对于我未来的职业生涯和学术研究都是非常宝贵的经验。此外,我也认识到了团队合作的重要性,因为在实现过程中,我与队友们进行了深入的讨论和协作,共同解决了遇到的技术难题。总的来说,这次训练营不仅提升了我的技术能力,也锻炼了我的团队合作能力。

结论

通过实现基于SlabTLSF的内存分配器,我成功地提高了内存分配的效率和内存利用率。新调度器的设计不仅灵活,而且能够根据请求的大小选择合适的分配器,这在操作系统的内存管理中是非常重要的。我的实现展示了如何在保证性能的同时,优化内存使用,这对于任何需要高效内存管理的系统都是至关重要的。