标准I/O的buffer

  标准I/O库提供buffer机制的原因就是为了减少调用底层系统调用I/O的次数。

  buffered I/O库函数(fread, fwrite等,用户空 间) <----call--->  unbuffered I/O系统调用(read,write等,内核空 间)<-------> 读写磁盘          buffered I/O库函数都是调用相关的unbuffered I/O系统调用来实现的,他们并不直接读写磁盘.

  它的基本方法是,在用户进程空间维护一块缓冲区,第一次读(库函数)的时候用read(系统调用)多从内核读出一些数据, 下次在要读(库函数)数据的时候,先从该缓冲区读,而不用进行再次read(系统调用)了. 同样,写的时候,先将数据写入(库函数)一个缓冲区,多次以后,在集中进行一次write(系统调用),写入内核空间.

  有三种buffer的类型:

  • Fully Buffer:只有当标准I/O的buffer 满的时候,实际I/O操作才发生。磁盘上的文件一般都采用FullyBuffer的形式。这里提到一个函数flush,这个函数用来执行标准I/O buffer的写操作,比如当buffer满的时候。
  • Line buffered:这种情况下,是标准I/O遇到换行符或者buffer满的的时候,执行底层系统I/O操作。一般标准输入和标准输出都采用这种buffer。
  • Unbuffered:这种情况下标准I/O库不对字符进行缓存。unbuffered I/O只是相对于buffered I/O,即标准I/O来说的. 而不是说unbuffered I/O读写磁盘时不用缓冲.实际上,内核是存在高速缓冲区来进行 真正的磁盘读写的,不过这里要讨论的buffer跟内核中的缓冲区无关. 

 

在这里我也想提出个问题,如果是buffered I/O库函数 调用的是相关的系统函数也是buffered,那该如何处理呢?

 

posted @ 2012-07-03 19:14  鼻子很帅的猪  阅读(826)  评论(0编辑  收藏  举报