read/fread write/fwrite 的区别
2015-10-31 17:54
525 查看
fread就是通过read来实现的,fread是C语言的库,而read是系统调用。
差别在read每次读的数据是调用者要求的大小,比如调用者要求读取10个字节数据,read就会从内核缓冲区(操作系统开辟的一段空间用来存储磁盘上的数据)读10个字节数据到数组中,所以每次调用read会涉及到用户态与內核态之间的切换从而损耗一定的性能。而fread不一样,为了加快读的速度,fread每次都会从内核缓冲区读比要求更多的数据,然后放到应用进程缓冲区(首地址存在FILE结构体中),这样下次再读数据只需要到应用进程缓冲区中去取而无需过多的系统调用。
fwrite也是通过write来实现的,fwrite是C语言的库,而write是系统调用。
差别在write每次写的数据是调用者要求的大小,比如调用者要求写入10个字节数据,write就会写10个字节数据到内核缓冲区中,所以依然涉及到用户态与內核态之间的切换,操作系统会定期地把这些存在内核缓冲区的数据写回磁盘中。而fwrite不一样,fwrite每次都会先把数据写入一个应用进程缓冲区,等到该缓冲区满了,或者调用类似调用fflush这种冲洗缓冲区的函数时,系统会调用write一次性把相应数据写进内核缓冲区中。同样减少了系统调用(即write调用)。
所以我们应该知道,实际上write和read不会直接从磁盘文件中读写数据。例如read是从磁盘所关联的一个内核缓冲区读写数据。(因为磁盘读取数据速度实在太慢了,所以操作系统往往采用预读技术读取磁盘数据)。write也是仅将数据写进内核缓冲区,操作系统通过运行一个守护进程,定期的将内核缓冲区写入磁盘。
差别在read每次读的数据是调用者要求的大小,比如调用者要求读取10个字节数据,read就会从内核缓冲区(操作系统开辟的一段空间用来存储磁盘上的数据)读10个字节数据到数组中,所以每次调用read会涉及到用户态与內核态之间的切换从而损耗一定的性能。而fread不一样,为了加快读的速度,fread每次都会从内核缓冲区读比要求更多的数据,然后放到应用进程缓冲区(首地址存在FILE结构体中),这样下次再读数据只需要到应用进程缓冲区中去取而无需过多的系统调用。
fwrite也是通过write来实现的,fwrite是C语言的库,而write是系统调用。
差别在write每次写的数据是调用者要求的大小,比如调用者要求写入10个字节数据,write就会写10个字节数据到内核缓冲区中,所以依然涉及到用户态与內核态之间的切换,操作系统会定期地把这些存在内核缓冲区的数据写回磁盘中。而fwrite不一样,fwrite每次都会先把数据写入一个应用进程缓冲区,等到该缓冲区满了,或者调用类似调用fflush这种冲洗缓冲区的函数时,系统会调用write一次性把相应数据写进内核缓冲区中。同样减少了系统调用(即write调用)。
所以我们应该知道,实际上write和read不会直接从磁盘文件中读写数据。例如read是从磁盘所关联的一个内核缓冲区读写数据。(因为磁盘读取数据速度实在太慢了,所以操作系统往往采用预读技术读取磁盘数据)。write也是仅将数据写进内核缓冲区,操作系统通过运行一个守护进程,定期的将内核缓冲区写入磁盘。
相关文章推荐
- Codeforces 400 C. Inna and Huge Candy Matrix【 Codeforces Round #234 (Div. 2)】
- Hadoop中的Hive与Hbase的理解
- PySqlite 学习笔记
- Maya mental ray 焦散
- 【从源码看Android】02MessageQueue的epoll原型
- 【LEETCODE】100-Same Tree
- HDU 1698 线段树区间更新以及lazy思想
- poj 2337 Catenyms(欧拉路径)
- The app icon set named "AppIcon" did not have any applicable content.
- 网络解析之xml
- Qt之统一的UI界面格式基调,漂亮的UI界面
- 杭电1176—免费馅饼题解
- 为什么linux内核函数出现错误,返回值是一个负数
- windows环境下用vs2012实现lua5.3.1的编译
- 陌陌科技面试题
- Android Google开源库——Volley的简单使用
- 【从源码看Android】03Android MessageQueue消息循环处理机制(epoll实现)
- Maven详解之------maven版本管理
- OC UI学习中的笔记
- 杭电1159—Common Subsequence题解