深入探究标准I/O与高级文件I/O技术
标准I/O的批判与分析
标准I/O虽然被广泛使用,但一些专家指出了它存在的缺陷。部分函数,如 fgets() 有时并不够用,而像 gets() 这类函数问题严重,几乎已被标准弃用。
标准I/O最大的问题在于双重复制带来的性能影响。读取数据时,标准I/O会向内核发出 read() 系统调用,将数据从内核复制到标准I/O缓冲区。之后应用程序通过标准I/O发出读取请求(如使用 fgetc() )时,数据会再次被复制,这次是从标准I/O缓冲区复制到提供的缓冲区。写入请求则相反:数据先从提供的缓冲区复制到标准I/O缓冲区,然后通过 write() 从标准I/O缓冲区复制到内核。
不过,有另一种实现方式可以避免双重复制。每个读取请求返回一个指向标准I/O缓冲区的指针,这样就可以直接在标准I/O缓冲区中读取数据,无需额外复制。如果应用程序想把数据放到自己的本地缓冲区(比如要进行写入操作),可以手动进行复制。这种实现方式提供了一个“自由”的接口,允许应用程序在处理完读取缓冲区的某一块数据后发出信号。
写入操作会稍微复杂一些,但也能避免双重复制。发出写入请求时,实现方式会记录指针。最终,当准备将数据刷新到内核时,实现方式会遍历存储的指针列表并写出数据。这可以通过 writev() 使用分散 - 聚集I/O来完成,只需一次系统调用。
虽然有高度优化的用户缓冲库可以解决双重复制问题,一些开发者也会选择实现自己的用户缓冲解决方案,但标准I/O仍然很
超级会员免费看
订阅专栏 解锁全文

被折叠的 条评论
为什么被折叠?



