Como o gato 'sabe' o tamanho ideal de bloco a ser usado?

7

Da leitura isso , parece que ao copiar dados para um disco rígido diferente, o cat usa automaticamente o tamanho de bloco ideal (ou muito próximo dele).

Eu me pergunto como isso determina o tamanho ideal do bloco, e se o método cat uses pode ser aplicado ao dd de alguma forma.

    
por EmmaV 25.11.2015 / 20:37

1 resposta

9

O loop principal do GNU cat, no caso mais simples é (function simple_cat de cat.c ):

while (true)
    {
        /* Read a block of input. */
        n_read = safe_read (input_desc, buf, bufsize);

        /* ... */
    }

Em seguida, a pergunta se torna "como está bufsize set?" A resposta é que é usando io_blksize ( insize = io_blksize (stat_buf) ), que é definido da seguinte forma:

io_blksize (struct stat sb)
{
  return MAX (IO_BUFSIZE, ST_BLKSIZE (sb));
}

onde ST_BLKSIZE fornece a ideia do sistema operacional do arquivo tamanho de bloco de E / S preferido do sistema (conforme acessado usando stat ) e IO_BUFSIZE é definido como 128 * 1024 (128 KB). Aqui está um trecho do Documentação do Linux stat syscall:

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.)

Então parece que o GNU cat vai ler blocos de 128KB ou o arquivo tamanho de bloco de E / S recomendado pelo sistema, o que for maior.

    
por 25.11.2015 / 21:13