操作系统中的缓冲(buffer)

来源:互联网 发布:各国语言翻译软件 编辑:程序博客网 时间:2024/06/06 00:29




缓冲最常见于IO系统,例如:当希望向屏幕输出数据的时候,由于程序逻辑的关系,可能要多次调用printf函数,每次写入的数据只有几个字符,如果每次写数据都要

进行一次系统调用,让内核向屏幕写数据,这样效率很低下。因为系统调用的开销很大,它要进行上下文切换、内核参数检查、复制等,如果频繁进行系统调用,会严重影响程序和系统性能。


一种可行的方案是:对控制台连续的多次写入放在一个数组里,等到数组被填满之后再一次性完成系统调用的写入,实际上这就是缓冲最基本的想法。


读文件的时候,缓冲一样存在,可以在CRT中为文件建立一个缓冲,当要读取数据的时候,首先看看这个文件的缓冲里有没有数据,如果有数据就直接从缓冲中取。如果缓冲为空

,CRT就通过操作系统一次性读取文件一块较大的内容填充缓冲,这样,如果每次读取都是一些尺寸较小的数据,那么这些读取操作大多都直接从缓冲中获得,可以避免大量的实际文件访问。


写文件同样存在这样的问题,因为当我们通过fwrite向文件写入一段数据时,此时这些数据不一定被真正地写入到文件中,而是有可能还存在于文件的写缓冲中,那么如果此时系统崩溃或进程意外退出,有可能导致数据丢失,于是CRT还提供了一系列与缓冲相关的操作用于弥补缓冲所带来的问题。


所谓flush一个缓冲,是指对写缓冲而言,将缓冲内的数据全部写入实际的文件,并将缓冲清空,这样可以保证文件处于最新的状态。之所以需要flush,是因为写缓冲使得文件处于一种不同步的状态,逻辑上一些数据已经写入文件,实际上这些数据仍然在缓冲中,如果此时程序意外退出(异常或断电),那么缓冲里的数据将没有就会写入到文件。

flush可以在一定程度上避免这样的情况发生。





0 0