磁盘IO原理

来源:互联网 发布:unity 房卡 麻将源码 编辑:程序博客网 时间:2024/06/11 03:24

一般咱们所说的数据结构都是存放在内存之中的,因为CPU的运算速度是非常快的,而存储器当中只有内存的速度足够快能跟上CPU的处理速度,所以一般情况下数据机构都是存在内存中的,
内存速度跟上CPU速度,解释:CPU每次从磁盘获取一批数据进行处理,每次获取时间假设为10秒,但是CPU每次处理完一批数据用时1秒,那么CPU有很长时间处于等待状态,当然,实际速度差别更大,这时候需要一个中间存储,能够缩小与CPU处理数据的差距,假设CPU能存储1K数据,内存能存储1G,磁盘存储100G,那么如果CPU每次从磁盘取数据,每次最多1K,处理10M数据的话需要取10000次,每次浪费很长时间,所以这时候需要提前把10M数据从磁盘存入内存,然后CPU从内存获取数据进行处理。


但是没办法,当数据量大于内存的时候我们只能把它放在硬盘,无法直接从内存读取,那么就只能先从磁盘读取到内存,然后再交给CPU处理,然而磁盘的读取速度相比于内存来说是非常非常非常慢的,。

 

问题:既然从磁盘获取数据给CPU已经够慢了,为啥还要从磁盘获取数据到内存,再给CPU,中间为啥要加一个环节?

其实CPU存储量极小,如果存在处理极小的数据,那么可以跟磁盘直接交互,但是实际中。处理的数据量都比较大,所以要把一批数据放入内存,再与CPU进行交互

 

上次讲了磁盘IO的原理(参考群文件),这个IO过程是需要时间的,想要降低从磁盘中读取数据的时间只能通过减少磁盘的访问次数来实现。

假设咱们用树来存储数据那么怎么才能降低磁盘的读写次数呢?

办法:降低树的高度,以二叉树为例子,假如一个2叉树的高度是10,存放n个节点,那么我如何才能在不改变节点数的情况下把树的高度降低到10以下

把二叉树改进一下,二叉树要求每个节点最多只能有2个子节点,但现在在硬盘中,不受内存限制,

这样增加了每个节点的孩子树,在总数不变的情况下就降低了高度了

这就是今天要讲的B树,定义:

假设这个树是m阶的(每个节点最多有m个孩子),那么这个树中的每个节点最多含有m个孩子,当然了m不小于2,其次,除了根节点和叶子结点外,其他每个节点至少有m/2个孩子,(向上取整,比如2.1向上取整就是3)

还有,如果这个树不是空的,那么它的根节点至少有2个孩子

再次,所有的叶子节点都在同一层中,对就是最后一层

每个非叶子节点,中都包含有两种元素

第一是关键字,关键字的个数最多为m-1个,第二是指针,,指针的个数和孩子个数一致,也就是说最多有m个

关键字的大小是递增的,指针所指的子孩子中的关键字的大小是介于关键字之间的,上图:

这是个m阶的B树,m=3

他的每个节点的孩子最多只有3个,看节点中的东西,有一条虚线,虚线上面是关键字,下面是指针,关键字最多为m-1也就是2个,指针和孩子数量相同,最多为m个即3个

关键字和指针的配合,解释:看2楼最左边的节点,关键字是8和12,指针P1所指的孩子中的元素是3,5全部小于8,指针p2所指的孩子中的元素分别是9,10,这个是介于8和12之间的,指针p3所指的孩子中所有的元素分别为13,15,这个是全部大于12的。

理解下面这句话:

 


先标个号,首先找到1这个节点,将其中的信息读出来(磁盘操作一次),然后呢,发现29在17和35之间,那我知道去找p2这个指针,然后通过p2找到了3号节点,再把信息读入到内存(第二次磁盘操作)发现29在26和30之间,,我又知道了该去找p2指针
通过3节点的P2指针找到8节点。然后 再把8节点的信息导入到内存(第三次磁盘 操作)发现29就在这里。完成 

原创粉丝点击