文章目录
- 1.内存管理单元(MMU)
- 1.1 MMU的作用
- 1.2 MMU相关概念
- 1.3 ARM处理器访问内存过程
- 2.内存优化之buddy伙伴算法
- 2.1 背景
- 2.2 优缺点
- 2.2 原理
最近复习Linux内存管理部分,简单将自己的理解记录一下
内存:包括随机存储器(RAM),只读存储器(ROM),以及高速缓存(CACHE)
RAM:随机存取存储器,掉电丢失,CPU直接交换数据的内部存储器,也叫主存(内存)。可以随时读写,而且速度很快
ROM:只读存储器,掉电不丢失,只读不可写,用于存放计算机的基本程序和数据
Cache:高速缓冲存储器,位于CPU与内存之间,读写速度比内存更快。当CPU向内存中写入或读出数据时,这个数据也被存储进高速缓冲存储器中
1.内存管理单元(MMU)
1.1 MMU的作用
内存管理单元MMU,辅导操作系统进行内存管理
1)提供虚拟地址和物理地址的映射,使用转换表存储(使开发者感觉程序可以访问非常大的虚拟内存空间,从而不用考虑计算机物理内存实际容量)
2)提供内存访问权限保护(例如.text和.data段,是被MMU设置为只读的)
3)提供cache缓存控制等硬件支持
1.2 MMU相关概念
1)TLB(Translation Lookaside Buffer):转换旁路缓存,也就是转换表的Cache,负责缓存少量的虚拟地址和物理地址转换关系。
2)TTW(Translation Table walk):转换表漫游,当TLB中没有对应的虚拟及物理地址转换关系,需要进行TTW转换表漫游,访问内存中转换表获得虚拟及物理地址转换关系,成功后,结果写入到TLB中。
1.3 ARM处理器访问内存过程
这是在Linux设备驱动开发详解里找到的一张图,加以自己对这张图的理解,大概过程如下:
当处理器访问一块内存时,如果已经开启了MMU,则去TLB中查找是否有对应的虚拟地址及物理地址转换关系,未找到则进行TTW操作,访问内存中的转换表获得转换关系,成功后,结果写入到TLB中。
而若一开始便在TLB就找到了转换关系,便继续检查访问权限,访问权限正确,则查看要访问的这片内存,是否已经被读取到cache中,未读取到cache则直接访问内存并更新cache,在cache中找到便直接进行访问。
2.内存优化之buddy伙伴算法
2.1 背景
嵌入式开发经常遇到的一个问题就是,频繁请求和释放不同大小的内存,会导致许多外部空闲碎片,造成空间的浪费,buddy算法以2的n次方个页面为单位管理内存,将空闲内存进行拆分或合并,能有效提高内存利用率及减少外部碎片。
而在平常使用的应用层内存池,其实也是这种类似的思想。
buddy算法管理的内存称为伙伴内存:相同大小、物理地址连续、从同一个大内存块拆分出。
2.2 优缺点
buddy算法优点:
1)快速响应内存分配请求
2)能有效提高内存利用率及减少外部碎片
buddy算法缺点:
1)在连续的一片内存中,即使有一个很小的块还没有释放,也会阻碍大的内存块合并。
2)会产生一定的内部碎片,当申请的内存不是2的幂次方申请内存时,便会有部分内存浪费
3)拆分和合并会涉及链表和位图操作,有一定的系统开销。
2.2 原理
初始化:操作系统在分配内存时,会将所有的空闲页框,分组为11块链表,每一块链表分别包含大小为1,2,4,8,16,32,64,128,256,512,1024个连续的页框。
内存块申请:假设要申请256页的块,算法会先从256页的节点中查找是否有空闲块,如果存在这个大小的空闲节点,则会直接将这个节点拿去使用,而若没有这个大小的节点,则去512页的节点中查找,如果存在这样的块,则将512页的这个空闲节点分成两等份,一份拿去用,一份则插入到256页的链表中,如果512页的节点也没有,则继续往1024页的节点中去找。如果一直没能找到,则发出错误信号,申请内存失败。
内存块释放:内存释放其实就是内存申请的逆向过程,比如要释放4页内存,首先会到链表中4页的节点寻找伙伴,如果找到并且伙伴也未在使用,则合并为一个更大的块,并不断向上查找伙伴,直到无法再找到伙伴,便插入链表对应位置,并标记内存可用。
位图操作:二进制位图的某一位对应两个互为伙伴的块,分配和释放,都是在对位图进行异或操作,异或的结果1代表其中一块已经分配,0表示两块都空闲或都已分配。
异或操作为0,则代表两个内存块此时状态一致,可进行合并,反之不能合并。
(异或:相同为0,不同为1 )
内存链表大概结构如下:
内存位图大概结构如下:
等有时间继续依据buddy算法来实现一个内存池