Dd
cat 如何“知道”要使用的最佳塊大小?
通過閱讀這篇文章,似乎在將數據複製到不同的硬碟驅動器時,cat 會自動使用最佳塊大小(或非常接近它)。
我想知道它如何確定最佳塊大小,以及 cat 使用的方法是否可以以某種方式應用於 dd 。
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)。以下是 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.)
因此,GNU cat 似乎會讀取 128KB 的塊或文件系統推薦的 I/O 塊大小,以較大者為準。