B-树 动机与结构 (2)

B-树 动机与结构

 

总而言之,尽管随着技术的发展,内存的绝对容量的确是在增加,但是相对于实际应用的需求而言,内存的容量实际上是在越来越小。那为什么不把内存做大一点啊?原因在于,经费你给拨么?我们必须在容量与访问速度之间做取舍,组成原理里讲过,存储器的容量越大速度就越慢,反过来,为了使得访问速度更快,就不得不在容量上做必要的牺牲。面对这个内在矛盾,我们还是可以有所作为的,运用矛盾分析法,我们想到了一种绝妙的方法——Cache!为此我们需要对不同层次存储器的性能做进一步的了解:

B-树 动机与结构

这包括两个事实

容量和类型不同的存储器,在访问速度上的差异是极其悬殊的

就以磁盘、内存这两级存储为例,他们在访问速度上的差异究竟有多大呢?就传统的旋转式磁盘而言,访问速度大致是ms级。而典型的内存呢,大致是在ns级,不要小看了mn之间的差异,以一秒为基准——前者是10-3,而后者是10-9。故二者的差异大致是在105至106。即使保守的估计也是5个数量级。就是一秒之于一天的差距。如果将内存的一次访问比作是1s,那么响应的一次外存操作则是1 day。这个差距很令人绝望了……《醒世恒言》里形象的说过:山中方七日,世上已千年。

因此在设计与实现算法的时候,为了避免一次外存访问,我们宁可访问内存十次、百次甚至千次、万次也在所不惜。这也是为什么通常存储系统都是按层次分级组织的。随着层次的深入,存储器的容量越来越大,但是反过来,访问的速度也越来越低。这样一种分级的结构之所以能够高效的运转,在于其中采用的一种策略:将最常用的数据尽可能放在更高的层次,因为尽管它的存储容量有限但速度最高,而不常用的数据会自适应的转移到更大,但是速度更慢的级别中去。

 

从磁盘读写1B,与读写1KB几乎一样快

典型的存储系统的确大多是采用批量式的方式来支持读或者写操作的。具体来说,无论我们是需要从内存向外存输出数据,还是需要从外存向内存读入数据,涉及的数据都是以页面为单位进行核算和组织的。比如在Cstdio.h中有这样一段代码:

B-树 动机与结构

其中setvbuf接口就允许设置页面缓冲区的大小,缓冲的工作模式等。因此在涉及频繁而大量数据访问的算法中,就要充分利用这个特性,也就是说我们要逐渐习惯批量式的访问。要么一次性大量读写,要么就什么也不做。就边际成本而言,这样的组织和访问方式才能够达到尽可能的优化。那么我们的主角B-树在其间又能起到一个什么样的作用呢?

那我们来探究一下B-树的内部了。 

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwxxjs.html