在计算机体系结构中,读写速度排序如下:CPU>CPU缓存>物理内存>物理磁盘。因此在处理物理内存时,CPU缓存往往能够起到提高速度的作用。这部分我们重点研究伙伴系统与slab机制。
一 CPU三级缓存
为了解决CPU与物理内存速度不匹配的问题,计算机系统引入了缓存,它的读写速度介于CPU与物理内存之间。主要利用程序局部性原理,采用预先读与延迟写的策略,让CPU尽可能少地访问物理内存。
一 CPU三级缓存
为了解决CPU与物理内存速度不匹配的问题,计算机系统引入了缓存,它的读写速度介于CPU与物理内存之间。主要利用程序局部性原理,采用预先读与延迟写的策略,让CPU尽可能少地访问物理内存。
目前一般采用三级缓存机制,其逻辑图如下:
一级缓存的读写速度最快,它是放在CPU内部的,二三级缓存速度比较慢放在主板上。
一般情况下,缓存的命中率能达到90%以上,这样可以大大加快CPU的访问速度。
二 伙伴系统
内存管理的关键就是如何能够分配与释放内存,而且尽量避免内存碎片。通常情况下,对待内存分配有两种方式,大对象(大的连续空间分配)、小对象(小的空间分配)。
伙伴系统主要是针对大的连续空间分配。
在常用的内存管理技术中,往往存在内部碎片与外部碎片两种无法完全利用内存的情况,其总结如下图:
内核采用伙伴系统算法来解决内部碎片的问题,该算法将内存中所有的空闲页框组成11个块链表,每个块链表大小为:1,2,4…..1024个连续页框大小,且每个块的第一个页框的物理地址是该块大小的整数倍。假设以后每次请求的内存区大小为aKB,则分配x个连续页框,x满足4x<=a<=4(x+1),(x属于1,2,4…..1024)。伙伴系统解决了外部碎片的问题,不会存在程序无法加载到内存块的情况。
因为内存存在三种不同的分区,所以对应有三种不同的伙伴系统,在struct zone中存在一个free_area数值,它用来表示该区内所有的空闲块。该数值第k各元素代表该区内大小为2^k的空闲块,同时free_area[k]中同样包含字