fwrite() 与 write() 在存在磁盘缓存的情况下
fwrite() vs write() in presence of disc caching
Idea/Fact #1我正在阅读一些关于如何缓冲流的文章,因此 fwrite() 通常是缓冲流。另一方面,write() 不会被缓冲。为什么 fwrite libc 函数比 syscall write 函数快?
想法/事实 #2我还在研究有关光盘缓存的文章,以及 Linux 如何大量使用它来大幅提高光盘性能。http://www.linuxatemyram.com/play.html
因此,在存在磁盘缓冲的情况下,Linux 默认执行 fwrite() 和 write() 不应该呈现相同的性能吗?fwrite() 正在做的是"在已经缓冲的光盘上缓冲"!这不应该带来巨大的推动力。我在这里错过了什么?
fwrite
缓冲和磁盘缓存在两个非常不同的级别上工作。
fwrite
在程序级别工作:它缓冲大量小写操作并将它们汇集在一起以进行一次系统调用,而不是对每次小写入进行单独的系统调用。这为您节省了从用户模式切换到内核模式再切换回来的重复开销。
缓存在内核级别工作,通过池化磁盘写入,允许它们延迟。硬盘可能很慢,因此,如果您必须等待磁盘驱动程序使用所有数据,那么您的程序将被延迟。通过利用缓存(通常比驱动器快得多),您可以更快地完成写入并返回到程序。当程序继续运行时,缓存将慢慢清空到磁盘上,而无需程序等待它。
相关文章:
- 在没有太多条件句的情况下,我如何避免被零除
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 在未初始化映射的情况下,将值插入到映射的映射中
- 是默认情况下分配给char数组常量的值
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- 如何在不产生任何垃圾的情况下获得C中的像素
- 在已经使用Git的情况下减少编译时间
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- 如何在没有信号的情况下从C++执行QML插槽
- 如何在不知道向量大小的情况下输入向量内部的向量?
- 为什么在某些情况下不写入此文件?
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 在没有Xcode的情况下在Mac捆绑包中嵌入框架
- UE4-如何在给定4个屏幕坐标的情况下缩放纹理或材质
- 为什么需要复制构造函数,在哪些情况下它们非常有用
- 在C++中如何在没有pow的情况下进行基础计算
- 松弛原子与无同步情况下的记忆连贯性
- 在 Windows 上,是否可以让 dll 在不使用 PATH 环境变量的情况下在另一个文件夹中查找依赖项?
- fwrite() 与 write() 在存在磁盘缓存的情况下
- 用于在不使用 RTTI 的情况下缓存不同派生类型的设计模式