基于块的写入如何减少开销?

时间:2015-10-02 01:27:43

标签: c database io storage

我正在阅读维基百科的文章 "阻止(数据存储)" https://en.wikipedia.org/wiki/Block_(data_storage)

文章说

"阻止可以减少开销并加快数据流的处理速度。"

阻止如何减少开销?

假设我有一个字符数组

long block_size = ...;
char *buf = ...;
FILE *fp = fopen(filename, "myfile");

并循环此函数

While(everything in buf not written)
    fwrite(buf, 1, block_size, fp);
    fflush(fp);

这样的事情如何减少开销?看起来这甚至会增加开销? 我举例说明了使用阻止的正确方法吗?

1 个答案:

答案 0 :(得分:1)

让我们说你想写数据。你要写的字节数是N*block_size+C,其中N和C只是非负常数。

如果您将代码修改为

While(everything in buf not written)
    fwrite(buf, 1, not_a_multiple_of_the_block_size, fp);
    fflush(fp);

您强制执行其他IO操作。比方说吧

not_a_multiple_of_the_block_size = 1.5 * block_size

循环的第一次迭代将写入整个块以及半个数据块。在物理上,IO子系统必须检索两个块,用数据完全填充一个块。

下一次迭代将需要写入第一个半块的块从存储中检索,更新并写回存储加一个新块。

对于循环的前两次迭代,您有一个额外的获取操作,将第二个块的内容带入内存 1 ,相比之下,如果您使用了块大小的写入(或者块大小的整数倍)。如果您使用的是旋转硬盘(或磁带机),则必须等到该块物理位于读头下方。

现代硬件倾向于通过缓存最小化额外开销(注意维基百科文章通过名称提到磁带驱动器......)但是当不使用块大小的整数倍时,通常仍然会有一些额外的开销。 / p>

1 数据可能会被带入IO子系统控制器的内存中,而不一定会进入系统RAM。