一般来说,对于计算机中的总线,都是被多个部件共享的,也就是说A设备和B设备可以共享同一根总线。共享同一根总线,可能会引起一些问题,譬如当信息流过总线时,是应该给A还是给B呢。并且,A和B还要将总线上的信号翻译成自己能够处理的信号,否则A和B就不能处理信息咯。如下图:
对于第一种情况,通常引入一个叫做控制器(control)/桥(bridge)的部件,他负责决定将总线上的信息传递给A还是B。对于第二种情况,一般引入一个叫做控制器(control)/适配器(dapter)的部件,这个部件主要负责翻译总线上的信息,然后来让A或B来按照信息的要求运行。如下图:
关于控制器,他还有一个重要的功能,缓存。缓存对于数据传输的效率影响非常大。假如总线频率远远大于A频率,总线每秒能传输100个字节,而A每秒却只能处理50个字节的速度,换句话说即使总线每秒能传输100个字节,但是A却只给他50个,这严重的限制了系统的性能,尤其是当总线频率和A频率之间的差值越大时,性能影响愈加明显。
解决这个问题的办法涉及到了计算机领域一个非常重要的实践,局部性原理。局部性原理的大致意思就是程序频繁的访问某一范围内的数据。
通过在控制器中添加一个缓存,就能解决上面所遇到的问题。假设这个缓存的大小是50字节,那么第一次访问A的某一个字节时,控制器器会将A后面的49个字节缓存到控制器内部的缓存中。当下次想要方法A或A后面的字节时,就只需从刚才的缓存中取便可。
这里有两个问题,第一控制器的速度必须要大于A的速度,只有这样从控制器中取内容的速度才要大于从A中取内容的速度。第二个问题,就是刚才提到的局部性原理问题,因为我们假设程序会频繁的访问某一数据或者该数据附近的内容,正是因为有了该假设,控制器才能显著提高数据传输的速度。试想一下,假设程序访问了第一个字节,然后访问了第70个字节,在然后又访问了第140个字节,这时候缓存还有什么用呢?
从上幅图中也可以看出contol和dapter的区别,control一般内嵌入被控制的设备中,譬如control内嵌于A部件中。而dater一般独立于设备,通常是插入到主板的某个插槽中。关于这方法的内容,在举两个实际的例子,磁盘控制器内置于磁盘中,而网络适配器则要插到主板中。