![cat 如何“知道”要使用的最佳块大小?](https://linux22.com/image/78203/cat%20%E5%A6%82%E4%BD%95%E2%80%9C%E7%9F%A5%E9%81%93%E2%80%9D%E8%A6%81%E4%BD%BF%E7%94%A8%E7%9A%84%E6%9C%80%E4%BD%B3%E5%9D%97%E5%A4%A7%E5%B0%8F%EF%BC%9F.png)
来自阅读这,似乎当将数据复制到不同的硬盘驱动器时,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 块大小读取,以较大者为准。