无缓冲I/O与有缓冲I/O区别

无缓冲I/O与有缓冲I/O区别无缓冲I/O:不是内核不提供缓冲,而是对于用户层来说,没有提供缓存,而对内核来说还是有缓存的数据:数据流->内核缓存->磁盘有缓冲I/O:是指在用户层上再建立了一层缓存区(流缓存区),目的是为了减少read,write等系统调用的使用次数,降低系统开销。数据:数据流->流缓存区->内核缓存->磁盘e.g当用fwrite函数网磁盘写数据时,先把数据写入流缓冲区中,当达到一定

无缓冲I/O与有缓冲I/O区别


无缓冲I/O :不是内核不提供缓冲,而是对于用户层来说,没有提供缓存,而对内核来说还是有缓存的

数据:数据流->内核缓存->磁盘

有缓冲I/O:是指在用户层上再建立了一层缓存区(流缓存区),目的是为了减少read,write等系统调用的使用次数,降低系统开销。

数据:数据流->流缓存区->内核缓存->磁盘


e.g当用fwrite函数网磁盘写数据时,先把数据写入流缓冲区中,当达到一定条件,比如流缓冲区满了,或刷新流缓冲,这时候才会把数据一次送往内核提供的块缓冲,再经块缓冲写入磁盘。(双重缓冲)

/*http://blog.csdn.net/yusiguyuan/article/details/23358913*/


标准IO就是带缓存的IO,提供了三种类型的缓存

全缓存:当填满标准IO缓存后才执行IO操作,磁盘上的文件通常都是全缓存的

行缓存:当输入输出遇到换行符或缓存满时,才执行IO操作,stdin和stdout通常是行缓存的

无缓存:stderr通常是无缓存的,因为它必须尽快输出


是什么样的缓冲跟使用那个函数没有关系
,
而跟你读写什么类型的文件有关系
.  带
缓存的文件操作时标准C库的实现,第一次调用带缓存的文件操作函数时,标准库会自动分配内存并且读出一段固定大小的内存存储在缓存中。以后每次的读写操作并不是针对硬盘上的文件直接进行的,而是针对内存中的缓存的。

思考:为什么总是要将数据从用户缓存区弄到内核缓冲区或者相反呢?

内核缓冲存在的价值: 用户是运行在用户空间的,不能直接操作内核缓冲区的数据。用户进行到系统调用时,会由用户态变到内核态,待内核使用完后再变到用户态。

/*http://blog.csdn.net/yusiguyuan/article/details/23358913*/

摘录:

用缓冲技术能很明显的提高系统效率。内核与外围设备的数据交换,内核与用户空间的数据交换都是比较费时的,使用缓冲区就是为了优化这些费时的操作。其实核心到用户空间的操作本身是不buffer的,是由I/O库用buffer来优化了这个操作。比如read本来从内核读取数据时是比较费时的,所以一次取出一块,以避免多次陷入内核。
      应用内核缓冲区的 主要思想就是一次读入大量的数据放在缓冲区,需要的时候从缓冲区取得数据
      管理员模式和用户模式之间的切换需要消耗时间,但相比之下,磁盘的I/O操作消耗的时间更多,为了提高效率,内核也使用缓冲区技术来提高对磁盘的访问速度
磁盘是数据块 的集合,内核会对磁盘上的数据块做缓冲。内核将磁盘上的数据块复制到内核缓冲区中,当一个用户空间中的进程要从磁盘上读数据时,内核一般不直接读磁盘,而 是将内核缓冲区中的数据复制到进程的缓冲区中。当进程所要求的数据块不在内核缓冲区时,内核会把相应的数据块加入到请求队列,然后把该进程挂起,接着为其 他进程服务。一段时间之后(其实很短的时间),内核把相应的数据块从磁盘读到内核缓冲区,然后再把数据复制到进程的缓冲区中,最后唤醒被挂起的进程
      注:理解内核缓冲区技术的原理有助于更好的掌握系统调用read&write,read把数据从内核缓冲区复制到进程缓冲区,write把数据从进程缓冲区复制到内核缓冲区,它们不等价于数据在内核缓冲区和磁盘之间的交换
      从理论上讲,内核可以在任何时候写磁盘,但并不是所有的write操作都会导致内核的写动作。内核会把要写的数据暂时存在缓冲区中,积累到一定数量后再一 次写入。有时会导致意外情况,比如断电,内核还来不及把内核缓冲区中的数据写道磁盘上,这些更新的数据就会丢失。
      应用内核缓冲技术导致的结果是:提高了磁盘的I/O效率;优化了磁盘的写操作;需要及时的将缓冲数据写到磁盘。

今天的文章无缓冲I/O与有缓冲I/O区别分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/31466.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注