当前位置: 技术问答>linux和unix
fopen的缓冲区是虚拟文件系统,还是在lib层?
来源: 互联网 发布时间:2016-07-23
本文导语: google了很多fopen和open的区别,都只是讲到了fopen带缓冲区,open不带;fopen是调用open函数来实现的。 但是,我迷惑的是,open函数是虚拟文件系统提供的函数,而虚拟文件系统对每个文件都有buffer_page或者radix树来缓存管...
google了很多fopen和open的区别,都只是讲到了fopen带缓冲区,open不带;fopen是调用open函数来实现的。
但是,我迷惑的是,open函数是虚拟文件系统提供的函数,而虚拟文件系统对每个文件都有buffer_page或者radix树来缓存管理的。也就是我理解的缓存应该在open内部就存在了,为何可以说fopen才有缓存open没有呢?难道fopen在c库层还专门有另外一个功能更加健全的缓存吗?
但是,我迷惑的是,open函数是虚拟文件系统提供的函数,而虚拟文件系统对每个文件都有buffer_page或者radix树来缓存管理的。也就是我理解的缓存应该在open内部就存在了,为何可以说fopen才有缓存open没有呢?难道fopen在c库层还专门有另外一个功能更加健全的缓存吗?
|
open确实不带缓冲,每次才做都会发生内核态与用户态的切换。
而fopen是在用户态就有缓冲。所以有没有是针对用户态的。
而fopen是在用户态就有缓冲。所以有没有是针对用户态的。
|
open 是 系统调用。
fopen 是 libc 中的库函数。
接下来 read 系统调用, 从内核态的角度来说,内核中肯定是有缓冲的。 但这个缓冲 和用户态没有关系。
用户态的 read 和 write 会把数据 刷到 内核态的缓冲区中去,由内核决定下一步的动作。
而 fread 和 fwrite 不同,fwrite 会把数据写入用户态的缓冲区,等到 fflush 的时候才会调用系统调用,把数据刷入内核。
fopen 是 libc 中的库函数。
接下来 read 系统调用, 从内核态的角度来说,内核中肯定是有缓冲的。 但这个缓冲 和用户态没有关系。
用户态的 read 和 write 会把数据 刷到 内核态的缓冲区中去,由内核决定下一步的动作。
而 fread 和 fwrite 不同,fwrite 会把数据写入用户态的缓冲区,等到 fflush 的时候才会调用系统调用,把数据刷入内核。
|
如3楼所说
从内核态的角度来说,内核中肯定是有缓冲的。 但这个缓冲 和用户态没有关系。
你向内核发出了写fd的write系统调用,那还能咋地,只能祈祷内核及时响应呗,你要相信内核,相信组织
你可以想办法提高你程序的nice级别
或者打NPTL补丁提高内核实时性
从内核态的角度来说,内核中肯定是有缓冲的。 但这个缓冲 和用户态没有关系。
你向内核发出了写fd的write系统调用,那还能咋地,只能祈祷内核及时响应呗,你要相信内核,相信组织
你可以想办法提高你程序的nice级别
或者打NPTL补丁提高内核实时性
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。