buffer 与cache 操作的对象就不一样。
buffer(缓冲)是为了提高内存和硬盘(或其他I/0 设备)之间的数据交换的速度而设计
的。
cache(缓存)是为了提高cpu 和内存之间的数据交换速度而设计,也就是平常见到的
一级缓存、二级缓存、三级缓存等。
cpu 在执行程序所用的指令和读数据都是针对内存的,也就是从内存中取得的。由于内
存读写速度慢,为了提高cpu 和内存之间数据交换的速度,在cpu 和内存之间增加了cache,
它的速度比内存快,但是造价高,又由于在cpu 内不能集成太多集成电路,所以一般cache
比较小,以后intel 等公司为了进一步提高速度,又增加了二级cache,甚至三级cache,它
是根据程序的局部性原理而设计的,就是cpu 执行的指令和访问的数据往往在集中的某一
块,所以把这块内容放入cache 后,cpu 就不用在访问内存了,这就提高了访问速度。当然
若cache 中没有cpu 所需要的内容,还是要访问内存的。
缓冲(buffers)是根据磁盘的读写设计的,把分散的写操作集中进行,减少磁盘碎片和
硬盘的反复寻道,从而提高系统性能。linux 有一个守护进程定期清空缓冲内容(即写入磁
盘),也可以通过sync 命令手动清空缓冲。举个例子吧:我这里有一个ext2 的U 盘,我往
里面copy 一个3M 的MP3,但U 盘的灯没有跳动,过了一会儿(或者手动输入sync)U 盘
的灯就跳动起来了。卸载设备时会清空缓冲,所以有些时候卸载一个设备时要等上几秒钟。
修改/etc/sysctl.conf 中的vm.swappiness 右边的数字可以在下次开机时调节swap 使用策
略。该数字范围是0~100,数字越大越倾向于使用swap。默认为60,可以改一下试试。--
两者都是RAM 中的数据。
简单来说,buffer 是即将要被写入磁盘的,而cache 是被从磁盘中读出来的。
buffer 是由各种进程分配的,被用在如输入队列等方面。一个简单的例子如某个进程要
求有多个字段读入,在所有字段被读入完整之前,进程把先前读入的字段放在buffer 中保存。
cache 经常被用在磁盘的I/O 请求上,如果有多个进程都要访问某个文件,于是该文件
便被做成cache 以方便下次被访问,这样可提高系统性能。
DMA(Direct Memory Access),即直接存储器存取,是一种快速传送数据的机制。数据传递
可以从适配卡到内存,从内存到适配卡或从一段内存到另一段内存。
利用它进行数据传送时不需要CPU 的参与。每台电脑主机板上都有DMA 控制器,通常
计算机对其编程,并用一个适配器上的ROM(如软盘驱动控制器上的ROM)来储存程序,这
些程序控制DMA 传送数据。一旦控制器初始化完成,数据开始传送,DMA 就可以脱离CPU,
独立完成数据传送。
在DMA 传送开始的短暂时间内,基本上有两个处理器为它工作,一个执行程序代码,
一个传送数据。利用DMA 传送数据的另一个好处是,数据直接在源地址和目的地址之间传
送,不需要中间媒介。如果通过CPU 把一个字节从适配卡传送至内存,需要两步操作。首
先,CPU 把这个字节从适配卡读到内部寄存器中,然后再从寄存器传送到内存的适当地址。
DMA 控制器将这些操作简化为一步,它操作总线上的控制信号,使写字节一次完成。这样
大大提高了计算机运行速度和工作效率。
计算机发展到今天,DMA 已不再用于内存到内存的数据传送,因为CPU 速度非常快,
做这件事,比用DMA 控制还要快,但要在适配卡和内存之间传送数据,仍然是非DMA 莫
属。要从适配卡到内存传送数据,DMA 同时触发从适配卡读数据总线(即I/O 读操作)和向
内存写数据的总线。激活I/O 读操作就是让适配卡把一个数据单位(通常是一个字节或一个
字)放到PC 数据总线上,因为此时内存写总线也被激活,数据就被同时从PC 总线上拷贝到
内存中。
直接内存访问(DMA)方式是一种完全由硬件执行I/O 交换的工作方式。DMA 控制器从CPU
完全接管对总线的控制。数据交换不经过CPU,而直接在内存和I/O 设备之间进行。DMA
控制器采用以下三种方式:
①停止CPU 访问内存:当外设要求传送一批数据时,由DMA 控制器发一个信号给CPU。
DMA 控制器获得总线控制权后,开始进行数据传送。一批数据传送完毕后,DMA 控制器
通知CPU 可以使用内存,并把总线控制权交还给CPU。
②周期挪用:当I/O 设备没有DMA 请求时,CPU 按程序要求访问内存:一旦I/O 设
备有DMA 请求,则I/O 设备挪用一个或几个周期。
③DMA 与CPU 交替访内:一个CPU 周期可分为2 个周期,一个专供DMA 控制器访
内,另一个专供CPU 访内。不需要总线使用权的申请、建立和归还过程。