带缓冲IO和不带缓冲IO

2 分钟阅读 472 字 + 116 词
参考答案
linux对IO文件的操作分为不带缓冲的IO操作和标准IO操作(即带缓冲),刚开始,要明确以下几点: 1: 不带缓冲,不是直接对磁盘文件进行读取操作,像read()和write()函数 ,它们都属于系统调用,只不过 在用户态没有缓冲 ,所以叫做无缓冲IO,但对于内核来说,还是进行了缓存,只是用户层看不到罢了。如果这一点看不懂,请看第二点; 2:带不带缓冲是相对来说的,如果你要写入数据到文件上时(就是写入磁盘上),内核先将数据写入到内核中所设的缓冲储存器,假如这个缓冲储存器的长度是100个字节,你调用系统函数:ssize_t write (int fd,const void * buf,size_t count); 写操作时,设每次写入长度count=10个字节,那么你几要调用10次这个函数才能把这个缓冲区写满,此时数据还是在缓冲区,并没有写入到磁盘,缓冲区满时才进行实际上的IO操作,把数据写入到磁盘上,所以上面说的“不带缓冲不是就没有缓冲直写进磁盘”就是这个意思。
带缓冲IO也叫标准IO,符合ANSI C 的标准IO处理,不依赖系统内核,所以移植性强,我们使用标准IO操作很多时候是为了减少对read()和write()的系统调用次数,带缓冲IO其实就是在用户态再建立一个缓冲区,这个缓冲区的分配和优化长度等细节都是标准IO库代你处理好了,不用去操心。
无缓冲IO操作数据流向路径: 数据——内核缓冲区——磁盘 标准IO操作数据流向路径: 数据——流缓冲区——内核缓冲区——磁盘
buffered I/O就是通过尽可能的少使用系统调用来提高效率的 .