Emm*_*maV 9 dd block-device cat
通过阅读本文,似乎将数据复制到不同的硬盘驱动器时, cat 会自动使用最佳块大小(或非常接近)。
我想知道它如何确定最佳块大小,以及 cat 使用的方法是否可以以某种方式应用于 dd。
dha*_*hag 11
GNU cat 的主循环,在最简单的情况下是(函数
simple_cat
来自cat.c
):
while (true)
{
/* Read a block of input. */
n_read = safe_read (input_desc, buf, bufsize);
/* ... */
}
Run Code Online (Sandbox Code Playgroud)
那么问题就变成了“如何bufsize
设置?” 答案是它使用io_blksize
( insize = io_blksize (stat_buf)
),其定义如下:
io_blksize (struct stat sb)
{
return MAX (IO_BUFSIZE, ST_BLKSIZE (sb));
}
Run Code Online (Sandbox Code Playgroud)
其中 ST_BLKSIZE 给出了操作系统对文件系统首选 I/O 块大小(使用 访问stat
)的想法,而 IO_BUFSIZE 定义为 128*1024 (128KB)。以下是 Linuxstat
系统调用文档的摘录:
blksize_t st_blksize; /* blocksize for file system I/O */ (...)
The st_blksize field gives the "preferred" blocksize for efficient
file system I/O. (Writing to a file in smaller chunks may cause
an inefficient read-modify-rewrite.)
Run Code Online (Sandbox Code Playgroud)
因此,似乎 GNU cat 将读取 128KB 的块或文件系统推荐的 I/O 块大小,以较大者为准。
归档时间: |
|
查看次数: |
1959 次 |
最近记录: |