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

How does block based write reduce overhead?

我正在阅读有关维基百科的文章 "Block(data storage)" https://en.wikipedia.org/wiki/Block_(data_storage)

文章说

"Blocking reduces the overhead and speeds up the handling of the data-stream."

阻塞如何减少开销?

假设我有一个字符数组

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

并循环这个函数

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

这样的事情如何减少开销?看起来这甚至可能会增加开销? 我给出的示例是使用阻塞的正确方法吗?

假设您要写入数据。您要写入的字节数是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 子系统必须检索两个块,一个完全填充,一个中途填充您的数据。

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

对于循环的前两次迭代,与使用 block-大小的写入(或块大小的整数倍)。如果您使用的是旋转硬盘(或磁带机),则必须等到该块物理定位在读头下方。

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

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