Dd

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

  • November 25, 2015

通過閱讀這篇文章,似乎在將數據複製到不同的硬碟驅動器時,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 塊大小,以較大者為準。

引用自:https://unix.stackexchange.com/questions/245499