基于块的写入如何减少开销?
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中。
我正在阅读有关维基百科的文章 "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中。