磁盘预读介绍(内存和磁盘之间的交互的方式)
内存比磁盘的读写速度要快很多,但内存容量要远小于磁盘,数据,程序的执行要调入内存后才能执行,所以内存和磁盘要经常进行I/O操作,I/O操作是个费事的过程,虽然现代系统已经有了通道(I/O处理机)技术的支持,但这还不够
上面是两张磁盘的示意图 ,扇区为磁盘的最小存储单元,当需要从磁盘读取数据时,系统会将逻辑地址发给磁盘,磁盘的控制电路将逻辑地址转换为物理地址(哪个磁道,哪个扇区)这时候就会有磁头的机械运动,磁头找到相应磁道–寻道,时间成为寻道时间,磁头找到对应磁道的对应扇区,成为旋转时间。 这是很大的时间消耗,所以系统一般采取预读的方式,减少磁盘I/O。
系统是分页读取和存储的 一般一页为4KB(mysql的页的大小为16KB),每次读取和存取的最小单元为一页,预读即在读取的起始地址连续读取多个页面(现在不需要的页面也读取了,这样以后用时就不用再读取,当一个页面用到时,大多数情况下,它周围的页面也会被用到)
至于磁盘分页,参考计算机操作系统的分页,分段存储管理 逻辑地址和物理地址被分为大小相同的页面,逻辑地址中叫页,物理地址中叫块
磁盘预读在mysql的中应用
mysql中的每页大小为16KB,如下图是mysql的组合索引的B+树的结构,每次mysql读取数据都会读取一页,每页大小为16KB
缓存行Cache Line(cpu和内存之间的交互方式)
Cache是由很多个 Cache line 组成的。Cache line 是 cache 和 RAM 交换数据的最小单位,通常为 64 Byte。当 CPU 把内存的数据载入 cache 时,会把临近的共 64 Byte 的数据一同放入同一个Cache line,因为空间局部性:临近的数据在将来被访问的可能性大。
以大小为 32 KB,cache line 的大小为 64 Byte 的L1级缓存为例,对于不同存放规则,其硬件设计也不同,下图简单表示一种设计: