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