Rust 分配器中有什么?

主要观点:介绍了在 Rust 中使用自定义内存分配器jemalloc的方法,通过#[global_allocator]宏添加到 Rust 应用程序中,并详细展示了一个简单的内存分配器SimpleAllocator的实现。

关键信息:

  • 定义了常量ARENA_SIZE为 128kB 作为静态分配的内存区域大小,可减少与操作系统的内存分配请求和内存碎片,但有内存开销。
  • 使用repr(C, align(4096))来定义内存布局,确保内存地址对齐,方便后续内存分配和使用。
  • SimpleAllocator结构体有两个字段,arena是一个固定大小的字节数组,用UnsafeCell包装以实现内部可变性,remaining是一个偏移量,作为指向arena的指针。
  • 通过#[global_allocator]宏指定全局使用的分配器为SimpleAllocator的静态实例,并实现了GlobalAlloc trait 的allocdealloc方法。
  • alloc方法中,通过原子操作fetch_update来分配内存,确保内存分配的正确性和顺序性,同时进行地址对齐和内存可用检查。

重要细节:

  • MAX_SUPPORTED_ALIGN定义了最大支持的内存对齐值为 4096。
  • UnsafeCell是所有常规安全单元格的基础,用于在只有共享引用的情况下返回可变指针。
  • AtomicUsize用于在编译器和 CPU 之间传递内存访问顺序的重要信息,以确保正确性。
  • alloc方法中,通过位掩码align_mask_to_round_down来实现地址对齐,向下取整以确保新分配的内存对齐。
  • fetch_update方法用于原子地读取和更新remaining字段,处理内存分配的并发情况。
  • dealloc方法在当前实现中是一个空操作,实际应用中可能需要跟踪可用内存以重复使用。
阅读 11
0 条评论