RAMCloud源码分析(三)

本文深入剖析RAMCloud的内存管理机制,涵盖mmap原理、HashTable、Segment、内存管理和清洁策略,展示了如何通过日志结构的内存管理实现高效、无碎片的内存利用,以及避免清洁器死锁的技术细节。
摘要由CSDN通过智能技术生成

作者:tuyunshan
RAMCloud技术交流QQ群:295905581


RAMCloud源码分析(三)


1. 概述

这一部分主要是针对RAMCloud系统中Server进行分析,而本节的侧重点是内存管理,对应其FAST’14上Log-structured Memory for DRAM-based Storage的那篇论文。首先,基于日志结构的内存管理属于copying allocators。主要是为了实现两个方面的需求:第一,通过copy object能够消除碎片;第二,不需要全局的扫描,就可以实现垃圾回收。第一个需求,很容实现,仅仅通过copy就可以实现,而第二需求的实现,则需要利用到index structure来快速定位segment(在RAMCloud有天然的index,那就是HashTable)。因此,接下的将从HashTable与Segment两方面阐述一下内存管理机制。

2. mmap系统调用

在讲HashTable与Segment之前想先说一下mmap函数,因为在RAMCloud系统中所有的内存申请,都是通过它来实现的。

2.1 mmap原理

首先,为了有效地使用机器中的物理内存,在系统初始化阶段内存被划分为几个功能区域,如图1所示。其中,Linux内核程序占据在物理内存的开始部分,接下来是供硬盘或软盘等块设备使用的高速缓冲区部分(其中要扣除显示卡内存和ROM BIOS所占用的内存地址范围640K—1MB)。当一个进程需要读取块设备中的数据时,系统会首先把数据读到高速缓冲区中;当有数据需要写到块设备上去时,系统也是先将数据放到高速缓冲区中,然后由块设备驱动程序程序写到相应的设备上。内存的最后部分是供所有程序可以随时申请和使用的主内存区。内核程序在使用主内存区时,也同样首先要向内核内存管理模块提出申请,并在申请成功后方能使用。对于含有RAM虚拟盘的系统,主内存头部还要划去一部分,供虚拟盘存放数据。

这里写图片描述

其次,mmap是一种内存映射文件的方法,即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系。相反,内核空间对这段区域的修改也直接反映用户空间,从而可以实现不同进程间的文件共享。如图2所示,可以看出,进程的虚拟地址空间,由多个虚拟内存区域构成。图中所示的text数据段(代码段)、初始数据段、BSS数据段、堆、栈和内存映射,都是一个独立的虚拟内存区域。而为内存映射服务的地址空间处在堆栈之间的空余部分。如图3所示,linux内核使用vm_area_struct结构来表示一个独立的虚拟内存区域,由于每个不同质的虚拟内存区域功能和内部机制都不同,因此一个进程使用多个vm_area_struct结构来分别表示不同类型的虚拟内存区域。各个vm_area_struct结构使用链表或者树形结构链接,方便进程快速访问。vm_area_struct结构中包含区域起始和终止地址以及其他相关信息,同时也包含一个vm_ops指针,其内部可引出所有针对这个区域可以使用的系统调用函数。这样,进程对某一虚拟内存区域的任何操

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值