第3章:缓冲I/O

来源:互联网 发布:mac如何禁止开机启动 编辑:程序博客网 时间:2024/05/31 11:03

  1. 1. 在内核中,所有的文件系统操作都是基于块来执行的。实际上,块是I/O中的基本概念。因此,所有I/O操作都是在块大小或者块大小的整数倍上执行。也就是说,也许你只想读取一个字节,实际上需要读取整个块。额外的系统调用所带来的开销会导致操作性能急剧下降。例如,要读取1024个字节,如果每次读一个字节需要执行1024次调用,而如果一个读取1024字节的块则只需要调用一次。对于前一种,提升性能的途径是“用户缓冲I/O”(user-buffered I/O),通过缓冲I/O,从用户角度,读写数据并没有任何变化,而实际上,只有当数据量大小达到文件系统块大小整数倍时,才会执行真正的I/O操作。  
  2. 2. 实际应用中,块大小一般是512字节、1024字节、2048字节或4096字节。内核和硬件之间的交互单元是块。标准I/O程序集并不是直接操作文件描述符。相反,他们通过唯一标识发,即文件指针来操作。在标准I/O中,打开的文件成为“流“(stream)。  
  3.   
  4. 3.  标准I/O实现了三种类型的用户缓冲:  
  5.     无缓冲(Unbuffered)  
  6. 不执行用户缓冲。数据直接提交给内核,不支持用户缓冲,通常很少使用,只有一个例外:标准错误默认是采用无缓冲模式。  
  7.     行缓冲(Line-buffered)  
  8. 缓冲是以行单位执行,每遇到换行符,缓冲区就会被提交到内核。行缓冲是终端的默认缓冲模式,比如标准输出。  
  9.     块缓冲(Block-buffered)  
  10. 缓冲以块单位执行,每个块是固定的字节数。默认情况下,和文件相关的所有流都是块缓冲模式。标准I/O称块缓冲为”完全缓冲“(full buffering)。

0 0