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ブロックサイズ(accessを使用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ブロックサイズのうち、より大きいサイズで読み取られるようです。

おすすめ記事