缓冲器( 二 )


缓冲器

文章插图
基本原理高速缓冲存储器高速缓冲存储器,即Cache 。我们知道,数据分布的集中倾向不如程式这幺明显,如果把在一段时间内一定地址範围被频繁访问的信息集合成批地从主的系统中,CPU访问数据时,在Cache中能直接找到的机率,它是Cache的一个重要指标,与Cache的大小、替换算法、程式特性等因素有关 。增加Cache后,CPU访问主存的速度是可以预算的,64KB的Cache可以缓冲4MB的主存,且命中率都在90%以上 。以主频为100MHz的CPU(时钟周期约为10ns)、20ns的Cache、70ns的RAM、命中率为90%计算,CPU访问主存的周期为:有Cache时,20×0.9+70×0.1=34ns;无Cache时,70×1=70ns 。由此可见,加了Cache后,CPU访问主存的速度大大提高了,但有一点需注意,加Cache只是加快了CPU访问主存的速度,而CPU访问主存只是计算机整个操作的一部分,所以增加Cache对系统整体速度只能提高10~20%左右 。Java语言中的缓冲器Bufferjava.nio.Buffer直接已知子类:ByteBuffer,CharBuffer,DoubleBuffer,FloatBuffer,IntBuffer,LongBuffer,ShortBufferpublic abstract classBufferextendsObject一个用于特定基本类型数据的容器 。缓冲区是特定基本类型元素的线性有限序列 。除内容外,缓冲区的基本属性还包括容量、限制和位置:缓冲区的容量是它所包含的元素的数量 。缓冲区的容量不能为负并且不能更改 。缓冲区的限制是第一个不应该读取或写入的元素的索引 。缓冲区的限制不能为负,并且不能大于其容量 。缓冲区的位置是下一个要读取或写入的元素的索引 。缓冲区的位置不能为负,并且不能大于其限制 。对于每个非 boolean 基本类型,此类都有一个子类与之对应 。传输数据此类的每个子类都定义了两种获取放置操作:相对操作读取或写入一个或多个元素,它从当前位置开始,然后将位置增加所传输的元素数 。如果请求的传输超出限制,则相对获取操作将抛出BufferUnderflowException,相对放置操作将抛出BufferOverflowException;这两种情况下,都没有数据被传输 。绝对操作採用显式元素索引,该操作不影响位置 。如果索引参数超出限制,绝对获取操作和放置操作将抛出IndexOutOfBoundsException 。当然,通过适当通道的 I/O 操作(通常与当前位置有关)也可以将数据传输到缓冲区或从缓冲区传出数据 。做标记和重置缓冲区的标记是一个索引,在调用reset方法时会将缓冲区的位置重置为该索引 。并非总是需要定义标记,但在定义标记时,不能将其定义为负数,并且不能让它大于位置 。如果定义了标记,则在将位置或限制调整为小于该标记的值时,该标记将被丢弃 。如果未定义标记,那幺调用reset方法将导致抛出InvalidMarkException 。不变式标记、位置、限制和容量值遵守以下不变式:0<=标记<=位置<=限制<=容量新创建的缓冲区总有一个 0 位置和一个未定义的标记 。初始限制可以为 0,也可以为其他值,这取决于缓冲区类型及其构建方式 。一般情况下,缓冲区的初始内容是未定义的 。清除反转重绕除了访问位置、限制、容量值的方法以及做标记和重置的方法外,此类还定义了以下可对缓冲区进行的操作:clear()使缓冲区为一系列新的通道读取或相对放置操作做好準备:它将限制设定为容量大小,将位置设定为 0 。flip()使缓冲区为一系列新的通道写入或相对获取操作做好準备:它将限制设定为当前位置,然后将位置设定为 0 。rewind()使缓冲区为重新读取已包含的数据做好準备:它使限制保持不变,将位置设定为 0 。唯读缓冲区每个缓冲区都是可读取的,但并非每个缓冲区都是可写入的 。每个缓冲区类的转变方法都被指定为