标准io和系统io的辨析
标准io和系统io的辨析
基本概念
由于Linux系统下“一切皆文件”,也就是Linux系统下的数据和程序都是以文件的形式存储的,所以Linux内核会提供一组操作文件的函数接口,这组函数接口也被称为系统IO。
同时为了满足用户访问文件的需求以及提高用户程序的可移植性,标准库也提供了一组操作文件的函数接口,这组函数接口也被称为标准IO,只不过标准库提供的标准IO函数都是遵循ANSI C标准设计出来,是为了方便用户在不同的操作系统下可以调用通用的函数来实现对文件的读写访问,但其实标准IO也是基于内核提供的系统IO设计出来的。
两者区别
标准io提供了缓冲区并且函数接口 十分丰富,缓冲区的设立可以避免频繁的系统调用,且不用认为关心缓冲区的大小,整体上提高了io的效率。但相对的没有办法对某些类型的文件进行访问(套接字文件,链接文件,驱动设备文件等),因而适合访问普通文件。
系统io不具备输入输出缓冲区,因而无法高效处理文件,原因是系统io的调用需要更多的时间,系统io调用的过程中内核要执行一系列的操作:首先内核需要捕获调用,然后再检查系统调用传递的参数的有效性,最后在用户空间和内核空间之间传输数据。系统io的有点是可以针对特定的文件类型进行访问,因而适合访问数据实时刷新的硬件设备。
简单理解:标准I/O可以看成是在系统I/O的基础上封装了缓冲机制。这样可以先读写缓冲区,必要时再访问实际文件,从而减少了系统调用的次数,提高访问效率。
write() --> a.txt -->write(buf,1,1,fp); --> write() --> 100个字节要写--> 调用100次write() -->慢
fwrite() --> a.txt -->fwrite(buf,1,100,fp); -->write() -->100个字节要写-->调用001次write() -->快
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步