11、深入探究标准I/O与高级文件I/O技术

深入探究标准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仍然很

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值