我在阅读有关维基百科的文章
“块(数据存储)”
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);


这样的事情如何减少开销?看来这甚至可能增加开销?
我为示例提供了使用阻塞的正确方法吗?

最佳答案

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

下一次迭代将需要从存储中检索写入了前半个块的块,并进行更新,然后再写回存储以及一个新块。

对于循环的前两次迭代,与使用块大小的写操作(或块大小的整数倍)相比,您还有一个附加的提取操作将第二个块的内容带入memory1中。如果您正在使用旋转的硬盘(或磁带驱动器),则必须等到该块实际位于读取头下方。

现代硬件倾向于通过缓存来减少额外的开销(请注意,Wikipedia文章按名称提到了磁带驱动器...),但是当不使用块大小的整数倍时,通常总会有一些额外的开销。

1数据很可能会带入IO子系统控制器上的内存中,而不必带入系统RAM中。

关于c - 基于块的写入如何减少开销?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32899217/

10-11 08:35