cat 如何“知道”要使用的最佳块大小?

cat 如何“知道”要使用的最佳块大小?

来自阅读,似乎当将数据复制到不同的硬盘驱动器时,cat 会自动使用最佳块大小(或非常接近它)。

我想知道它如何确定最佳块大小,以及 cat 使用的方法是否可以以某种方式应用于 dd 。

答案1

GNU cat 的主循环,在最简单的情况下是( simple_cat来自 的函数cat.c):

while (true)
    {
        /* Read a block of input. */
        n_read = safe_read (input_desc, buf, bufsize);

        /* ... */
    }

那么问题就变成了“如何bufsize设置?”答案是它使用io_blksize( insize = io_blksize (stat_buf)),其定义如下:

io_blksize (struct stat sb)
{
  return MAX (IO_BUFSIZE, ST_BLKSIZE (sb));
}

其中 ST_BLKSIZE 给出了操作系统对文件系统首选 I/O 块大小的概念(使用 访问stat),IO_BUFSIZE 定义为 128*1024 (128KB)。以下是 Linux 系统调用文档的摘录stat

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.)

因此,GNU cat 似乎将以 128KB 的块或文件系统推荐的 I/O 块大小读取,以较大者为准。

相关内容