독서에서이것, 데이터를 다른 하드 드라이브에 복사할 때 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 블록 크기 중 더 큰 크기로 읽는 것으로 보입니다.