Dlaczego pliki tekstowe to 4kB?

47

Z jakiegoś powodu, kiedy tworzę plik tekstowy w OS X, zawsze ma on co najmniej 4kB, chyba że jest pusty. Dlaczego to? Czy może być 4000 bajtów metadanych na około 1 bajt zwykłego tekstu?

wprowadź opis zdjęcia tutaj

tkbx
źródło
16
4096 bajtów, a nie 4000.
Ślimak mechaniczny
8
@Mechanicalsnail 4095. Zapomniałeś jednego bajtu rzeczywistych danych
Tobias Kienzler,
5
@Mechanicalsnail to rok przestępny, prawda? xkcd.com/394 :P
tkbx

Odpowiedzi:

52

Rozmiar bloku systemu plików musi wynosić 4 kB. Gdy dane są zapisywane w pliku zawartym w systemie plików, system operacyjny musi przydzielić bloki pamięci, aby zawierały dane, które zostaną zapisane w pliku.

Zazwyczaj podczas tworzenia systemu plików pamięć zawarta w tym systemie plików jest dzielona na bloki o stałym rozmiarze. Artykuł w Wikipedii krótko wyjaśnia ten proces.

Podstawowy rozmiar bloku systemu plików dla tego pliku musi mieć rozmiar bloku 4 bajty. Ten plik używa 1 bloku 4K i tylko jeden bajt w tym bloku zawiera rzeczywiste dane.

Fan wentylatora John
źródło
10
Komentarz: W systemie Windows rzeczywisty rozmiar pliku jest wyświetlany domyślnie, a rozmiar na dysku jest wyświetlany w panelu Opcje.
Joe Z.
więc blok może pomieścić różne pliki?
sudeepdino008
@ sudeepdino008 nie, jeden blok (przynajmniej) dla każdego pliku (system plików ext Linuksa ma / miał (?) opcję umieszczania wielu plików w jednym bloku, ale jest to wyjątek od reguły)
Ro-ee
13

Wszystkie systemy plików mają rozmiar klastra lub bloku lub najmniejszą ilość miejsca na dysku, którą można przydzielić do przechowywania pliku. Nawet jeśli rzeczywisty rozmiar pliku jest mniejszy niż rozmiar klastra / bloku, nadal zużywa jeden klaster lub 4K w systemie plików. Rozmiar klastra zależy od systemu plików i opcji systemu plików.

Jeśli zawiera zero bajtów, jak zauważył Gilles , używa zerowych bloków / klastrów, ale jeden i-węzeł w typowych systemach plików * nix, co lepiej odpowiada zastrzeżeniu, „chyba że jest puste”.

Krzysztof
źródło
6
„Nawet jeśli rozmiar pliku wynosi zero bajtów, nadal zużywa jeden klaster.” Właściwie nie: w typowych systemach plików Unix pusty plik zużywa jeden i-węzeł i zero bloków, a klaster nie różni się od bloków.
Gilles „SO- przestań być zły”
8

Mały eksperyment, który pomoże to zilustrować:

Najpierw zobaczmy, jaki jest rzeczywisty rozmiar bloku mojej partycji root 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

Jest to 4096 (4 KiB), zgodnie z oczekiwaniami. Teraz utwórzmy trzy pliki: pierwszy to zero bajtów, drugi to tylko jeden bajt, a trzeci to 4 KiB (rozmiar bloku):

[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


Teraz mamy lskatalog. Korzystamy z -sopcji, aby zobaczyć przydzielony rozmiar (kolumna najbardziej na lewo) w liczbie 1024-bajtowych „bloków”.
(ls nie wie, że rzeczywisty rozmiar bloku to 4096 - moglibyśmy określić, --block-sizeale to wszystko skaluje o tę wartość i chcemy zobaczyć rzeczywisty rozmiar pliku również w bajtach) .

[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

Można tutaj odnotować dwie rzeczy:

  • Plik zero bajtów zajmuje zero bloków w systemie plików, potwierdzając to, co stwierdził Giles .
  • Mimo że dwa pozostałe pliki mają różne rozmiary, oba zajmują 4 * 1024 = jeden blok exti 4KiB.

Rzadkie pliki

Pliki rzadkie to pliki z dużymi blokami zer. Ponieważ wiadomo, że wszystkie dane są zerowe, nie ma sensu przechowywać ich na dysku. W ten sposób pozorny rozmiar pliku może faktycznie być większy niż rozmiar na dysku.

Dane wbudowane

Zauważ, że niektóre systemy plików pozwalają na przechowywanie bardzo małych plików w samym i- węzle . Zobacz Czy możliwe jest przechowywanie danych bezpośrednio wewnątrz i-węzła w systemie plików Unix / Linux? .

Jonathon Reinhart
źródło
Tak, masz całkowitą rację, rozmiar 4k jest używany przez system plików do przechowywania informacji dotyczących przechowywania pliku w systemie plików. Przechowywane są takie rzeczy, jak indeks pliku od początku bloku, indeks bloku i wielkość pamięci wykorzystywanej przez plik, które pochłaniają 4k. Informacje te służą do odniesienia się do pliku tekstowego z systemu plików.
pvn
2
To jest niepoprawne. Metadane plików, o których wspomniałeś, nie „pożerają” żadnego z 4KiB. Struktury te są częścią narzutu związanego z formatowaniem systemu plików. Zobacz moją odpowiedź powyżej jako dowód. Jeśli to, co powiedziałeś, było prawdą, to mój plik o długości 4096 bajtów wymagałby więcej niż jednego bloku.
Jonathon Reinhart
Wskaźniki do pliku (nr segmentu, nr blk) w systemie plików to rzeczy, które muszą być przechowywane i wymagają przypisania jednego bloku. Jeśli plik tekstowy ma bardzo mniej zawartości, która może zmieścić się w pierwszym bloku już do niego przypisanym, nie będzie wymagał przydziału drugiego bloku. Zgadzam się, że całe 4k nie jest wykorzystywane do metadanych i powstaje pewne wewnętrzne rozdrobnienie.
pvn
2
Mówię, że żaden z bloków o rozmiarze 4 KiB nie jest używany dla metadanych. Myślę, że mój przykład to potwierdza.
Jonathon Reinhart
2
@pvn: Jonathon ma rację. Metadane są przechowywane w i-węźle pliku, który jest oddzielny od bloku używanego do przechowywania danych pliku.
Ślimak mechaniczny