読書からこれ、データを別のハードドライブにコピーすると、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ブロックサイズのうち、より大きいサイズで読み取られるようです。