Por que os arquivos de texto são 4kB?

47

Por alguma razão, quando eu faço um arquivo de texto no OS X, ele sempre é de pelo menos 4kB, a menos que esteja em branco. Por que é isso? Poderia haver 4.000 bytes de metadados sobre 1 byte de texto sem formatação?

insira a descrição da imagem aqui

tkbx
fonte
16
4096 bytes, não 4000.
Caracol mecânico
8
@Mechanicalsnail 4095. Você esqueceu a um byte de dados reais
Tobias KIENZLER
5
@Mechanicalsnail é um ano bissexto, não é? xkcd.com/394 :P
tkbx

Respostas:

52

O tamanho do bloco do sistema de arquivos deve ser 4 kB. Quando os dados são gravados em um arquivo contido em um sistema de arquivos, o sistema operacional deve alocar blocos de armazenamento para conter os dados que serão gravados no arquivo.

Normalmente, quando um sistema de arquivos é criado, o armazenamento contido nesse sistema de arquivos é segmentado em blocos de tamanho fixo. Este artigo da Wikipedia explica brevemente esse processo.

O tamanho do bloco subjacente do sistema de arquivos para esse arquivo deve ter um tamanho de bloco de 4K bytes. Este arquivo está usando 1 bloco de 4K e apenas um byte dentro desse bloco contém dados reais.

HeatfanJohn
fonte
10
Um comentário: no Windows, o tamanho real do arquivo é exibido por padrão e o tamanho do disco é exibido no painel Opções.
Joe Z.
então um bloco pode acomodar arquivos diferentes?
Sudeepdino008 27/02
@ sudeepdino008 não, um bloco (pelo menos) para cada arquivo (o sistema de arquivos ext do Linux tem / teve (?) uma opção para colocar vários arquivos em um bloco, mas isso é uma exceção à regra)
Ro-ee
13

Todos os sistemas de arquivos têm um tamanho de cluster ou bloco ou a menor quantidade de espaço em disco que pode ser alocada para manter um arquivo. Mesmo que o tamanho real do arquivo seja menor que o tamanho do cluster / bloco, ele ainda consumirá um cluster ou 4K no seu sistema de arquivos. O tamanho do cluster depende do sistema de arquivos e das opções do sistema de arquivos.

Se ele contiver zero bytes, como Gilles apontou , usa zero blocos / clusters, mas um inode em sistemas de arquivos * nix típicos, o que responde melhor à ressalva, "a menos que esteja em branco".

Christopher
fonte
6
“Mesmo que o tamanho de um arquivo seja zero bytes, ele ainda consumirá um cluster.” Na verdade, não: nos sistemas de arquivos unix típicos, um arquivo vazio consome um inode e zero blocos, e não há noção de cluster que seja diferente dos blocos.
Gilles 'SO- stop be evil'
8

Um pequeno experimento para ajudar a ilustrar isso:

Primeiro, vamos ver qual é o tamanho real do bloco da minha partição raiz ext4 (LVM):

[root@fedora17 blocksize]# dumpe2fs /dev/mapper/vg_fedora17-lv_root | grep -i "block size"
dumpe2fs 1.42.3 (14-May-2012)
Block size:               4096

É 4096 (4 KiB), conforme o esperado. Agora, vamos criar três arquivos: O primeiro tem zero bytes, o segundo tem apenas um byte e o terceiro tem 4 KiB (o tamanho do bloco):

[root@fedora17 blocksize]# touch 0_bytes.bin
[root@fedora17 blocksize]# dd if=/dev/zero of=1_byte.bin bs=1 count=1
[root@fedora17 blocksize]# dd if=/dev/zero of=4096_bytes.bin bs=1 count=4096


Agora, nós lso diretório. Usamos a -sopção para ver o tamanho alocado (a coluna mais à esquerda), em número de "blocos" de 1024 bytes.
(ls não sabe que o tamanho real do bloco é 4096 - poderíamos especificar, --block-sizemas isso dimensiona tudo por esse valor, e também queremos ver o tamanho real do arquivo em bytes) .

[root@fedora17 blocksize]# ls -ls
total 8
0 -rw-r--r--. 1 root root    0 Jan 21 23:56 0_bytes.bin
4 -rw-r--r--. 1 root root    1 Jan 21 23:38 1_byte.bin
4 -rw-r--r--. 1 root root 4096 Jan 21 23:38 4096_bytes.bin

Duas coisas podem ser observadas aqui:

  • O arquivo de zero byte ocupa zero blocos no sistema de arquivos, confirmando o que Giles declarou .
  • Mesmo que os outros dois arquivos tenham tamanhos diferentes, ambos ocupam 4 * 1024 = um bloco ext4 de 4KiB.

Arquivos esparsos

Arquivos esparsos são arquivos com grandes blocos de zeros. Como os dados são conhecidos como zero, não há sentido em armazená-los no disco. Dessa maneira, o tamanho aparente de um arquivo pode realmente ser maior que o tamanho do disco.

Dados embutidos

Observe que alguns sistemas de arquivos permitem que arquivos muito pequenos sejam armazenados no próprio inode . Consulte É possível armazenar dados diretamente dentro de um inode em um sistema de arquivos Unix / Linux? .

Jonathon Reinhart
fonte
Sim, você está certo: 4k é o tamanho que o sistema de arquivos usa para armazenar informações sobre o armazenamento do arquivo dentro do sistema de arquivos. Coisas como o índice do arquivo desde o início de um bloco, o índice do bloco e o tamanho da memória utilizada pelo arquivo são armazenados e consomem até 4k. Esta informação é usada para referenciar o arquivo de texto do sistema de arquivos.
PVN
2
Isto está incorreto. Os metadados do arquivo, como você mencionou, não "consomem" nenhum 4KiB. Essas estruturas fazem parte da sobrecarga de formatação do sistema de arquivos. Veja minha resposta acima para prova. Se o que você disse era verdade, meu arquivo de 4096 bytes precisaria de mais de um bloco.
Jonathon Reinhart
Ponteiros para o arquivo (número do segmento, número preto) no sistema de arquivos são os itens que precisam ser armazenados e exigem que um bloco seja atribuído. Se o arquivo de texto tiver muito menos conteúdo que possa caber no primeiro bloco já atribuído a ele, não será necessário alocar o segundo bloco. Concordo que o total de 4k não é usado para os metadados e surge alguma fragmentação interna.
pvn 22/01
2
Estou dizendo que nenhum tamanho de bloco de 4 KiB é usado para metadados. Eu acho que meu exemplo prova isso.
Jonathon Reinhart
2
@pvn: Jonathon está certo. Os metadados são armazenados no inode para o arquivo, que é separado do bloco usado para armazenar dados do arquivo.
Caracol mecânico