内存管理笔记十一、CPU三级缓存、冷热页及自旋锁概念

内存管理笔记十一、CPU三级缓存、冷热页及自旋锁概念

引言:在上一篇笔记中,介绍了buddy 伙伴系统其适用于大内存的物理地址分配,在查阅相关资料的过程中,看到了冷热页,进而接触到CPU三级缓存和自旋锁的概念。这里仅对其概念做一个简单的记录。


一、CPU的三级缓存

1.1、缓存简介:

  CPU缓存(Cache Memory)是位于CPU与内存之间的临时存储器,它的容量比内存小的多但是交换速度却比内存要快得多。高速缓存的出现主要是为了解决CPU运算速度与内存读写速度不匹配的矛盾(CPU运算速度要比内存读写速度快很多,这样会使CPU花费很长时间等待数据到来或把数据写入内存)。在缓存中的数据是内存中的一小部分,但这一小部分是短时间内CPU即将访问的,当CPU调用大量数据时,就可先缓存中调用,从而加快读取速度。

1.2、L1、L2、L3三级缓存概念:

  L1Cache(一级缓存)是CPU第一层高速缓存,分为数据缓存和指令缓存。内置的L1高速缓存的容量和结构对CPU的性能影响较大,不过高速缓冲存储器均由静态RAM组成,结构较复杂,在CPU管芯面积不能太大的情况下,L1级高速缓存的容量不可能做得太大。一般服务器CPU的L1缓存的容量通常在32—256KB。

  L2 Cache(二级缓存)是CPU的第二层高速缓存,分内部和外部两种芯片。内部的芯片二级缓存运行速度与主频相同,而外部的二级缓存则只有主频的一半。L2高速缓存容量也会影响CPU的性能,原则是越大越好,现在家庭用CPU容量最大的是4MB,而服务器和工作站上用CPU的L2高速缓存普遍大于4MB,有的高达8MB或者19MB。

  L3为三级缓存是为读取二级缓存后未命中的数据设计的—种缓存,在拥有三级缓存的CPU中,只有约5%的数据需要从内存中调用,这进一步提高了CPU的效率。

1.3、工作原理:

  CPU要读取一个数据时,首先从Cache中查找,如果找到就立即读取并送给CPU处理;如果没有找到,就用相对慢的速度从内存中读取并送给CPU处理,同时把这个数据所在的数据块调入Cache中,可以使得以后对整块数据的读取都从Cache中进行,不必再调用内存。
  正是这样的读取机制使CPU读取Cache的命中率非常高(大多数CPU可达90%左右),也就是说CPU下一次要读取的数据90%都在Cache中,只有大约10%需要从内存读取。这大大节省了CPU直接读取内存的时间,也使CPU读取数据时基本无需等待。总的来说,CPU读取数据的顺序是先Cache后内存

1.4、缓存技术发展:

  在传输速度有较大差异的设备间都可以利用Cache作为匹配来调节差距,或者说是这些设备的传输通道。在显示系统、硬盘和光驱、网络通讯中,都 需要使用Cache技术。但Cache均由静态RAM组成,结构复杂,成本不菲,使用现有工艺在有限的面积内不可能做得很大,不过,这也正是技术前进的源动力。


二、冷热页的概念

2.1、什么是冷热页?

  在Linux Kernel的物理内存管理的buddy system中,引入了冷热页的概念。冷页表示该空闲页已经不再高速缓存中了(一般是指L2 Cache),热页表示该空闲页仍然在高速缓存中。冷热页是针对于CPU缓存而言的,每个zone中,都会针对于所有的CPU初始化一个冷热页的per-cpu-pageset.

2.2、冷热页的积极作用?

1)、发挥三级缓存作用:Buddy Allocator在分配order为0的空闲页的时候,如果分配一个热页,由于该页已经存在于L2 缓存中,CPU可以直接写。如果分配一个冷页,说明该页不在L2 Cache中,需访问内存。一般情况下,尽可能分配热页,但如果是DMA请求,需要连续的页码,要分配冷页。

2)、降低了CPU间的页面竞争:Buddy System在给某个进程分配某个zone中空闲页的时候,首先需要用自旋锁锁住该zone,然后分配页。这样,如果多个CPU上的进程同时进行分配页,便会竞争。引入了per-cpu-set后,当多个CPU上的进程同时分配页的时候,竞争便不会发生,提高了效率。另外当释放单个页面时,空闲页面首先放回到per-cpu-pageset中,以减少zone中自旋锁的使用。当页面缓存中的页面数量超过阀值时,再将页面放回到伙伴系统中。

3)、使用每个CPU独立冷热页,能保证某个页一直黏在1个CPU上,这有助于提高Cache的命中率。

2.3、内核如何管理冷热页?

  在Linux中,对于UMA的架构,冷热页是在一条链表上进行管理。热页在前,冷页在后。CPU每释放一个order为0的页,如果per-cpu-pageset中的页数少于其指定的阈值,便会将释放的页插入到冷热页链表的开始处。这样,之前插入的热页便会随着其后热页源源不断的插入向后移动,其页由热变冷的几率便大大增加。对于链表适宜长度,参考热页变冷需要维护一个多大数量的链表


三、自旋锁

3.1、自旋锁的概念

  自旋锁与互斥锁有点类似,只是自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元保持,调用者就一直循环在那里看是否该自旋锁的保持者已经释放了锁,”自旋”一词就是因此而得名。由于自旋锁使用者一般保持锁时间非常短,因此选择自旋而不是睡眠是非常必要的,自旋锁的效率远高于互斥锁。

3.2、适用情况

  自旋锁只有在内核可抢占或SMP情况下才真正需要,在单CPU且不可抢占的内核下,自旋锁的所有操作都是空操作。与互斥锁一样,一个执行单元要想访问被自旋锁保护的共享资源,必须先得到锁,在访问完共享资源后,必须释放锁。如果在获取自旋锁时,没有任何执行单元保持该锁,那么将立即得到锁;如果在获取自旋锁时锁已经有保持者,那么获取锁操作将自旋在那里,直到该自旋锁的保持者释放了锁。
  无论是互斥锁,还是自旋锁,在任何时刻,最多只能有一个保持者,也就说,在任何时刻最多只能有一个执行单元获得锁。

3.3、相关API:

  可点击参考博客链接


参考内容:

三级缓存:
1、百度百科:CPU缓存
2、网易博客:CPU的缓存L1,L2,L3

linux中冷热页参考:
认识Linux/ARM 中的冷热页

自旋锁的概念:自旋锁(spinlock) 解释得经典,透彻

纠错与建议
邮箱:[email protected]


猜你喜欢

转载自blog.csdn.net/xd_hebuters/article/details/79521350