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 블록 크기 중 더 큰 크기로 읽는 것으로 보입니다.

관련 정보