ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

read/fread write/fwrite 的实现原理

2022-05-23 16:33:37  阅读:172  来源: 互联网

标签:调用 read fwrite fread write 内核 缓冲区 磁盘


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也是仅将数据写进内核缓冲区,操作系统通过运行一个守护进程,定期的将内核缓冲区写入磁盘。

 

说说fflush和fsync函数:
fflush是C语言的库
fsync是系统提供的系统调用。
功能:
fflush:是把C库中的缓冲调用write函数写到磁盘[其实是写到内核的缓冲区]。
fsync:是把内核缓冲刷到磁盘上。
c库缓冲-----fflush---------〉内核缓冲--------fsync-----〉磁盘

 

标签:调用,read,fwrite,fread,write,内核,缓冲区,磁盘
来源: https://www.cnblogs.com/peifx/p/16301665.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有