Чому текстові файли 4 кБ?


47

Чомусь, коли я створюю текстовий файл на OS X, це завжди принаймні 4 КБ, якщо тільки він порожній. Чому це? Чи може бути 4000 байт метаданих приблизно 1 байт простого тексту?

введіть тут опис зображення


16
4096 байт, а не 4000.
Механічний равлик

8
@Mechanicalsnail 4095. Ви забули один байт фактичних даних
Tobias Kienzler

5
@Mechanicalsnail - це високосний рік, чи не так? xkcd.com/394 :P
tkbx

Відповіді:


52

Розмір блоку файлової системи повинен бути 4 кБ. Коли дані записуються у файл, який міститься у файловій системі, операційна система повинна виділити блоки зберігання, щоб містити дані, які будуть записані у файл.

Зазвичай при створенні файлової системи сховище, що міститься в цій файловій системі, сегментується на блоки фіксованого розміру. Ця стаття у Вікіпедії коротко пояснює цей процес.

Розмір основного блоку файлової системи для цього файлу повинен мати розмір блоку 4 К байт. Цей файл використовує 1 4K блок, і лише один байт всередині цього блоку містить фактичні дані.


10
Коментар: У Windows фактичний розмір файлу відображається за замовчуванням, а розмір на диску відображається на панелі «Параметри».
Джо З.

тому блок може вміщувати різні файли?
sudeepdino008

@ sudeepdino008 ні, один блок (принаймні) для кожного файлу (у файловій системі Linux ext / була (?) можливість розміщення декількох файлів в одному блоці, але це виняток із правила)
Ro-ee

13

Усі файлові системи мають розмір кластера або блоку або найменший обсяг дискового простору, який можна виділити для вміщення файлу. Навіть якщо фактичний розмір файлу менший за розмір кластера / блоку, він все одно буде споживати один кластер або 4K у вашій файловій системі. Розмір кластера залежить від файлової системи та параметрів файлової системи.

Якщо він містить нульові байти, як зазначив Гілл , він використовує нульові блоки / кластери, але один inode в типових * nix файлових системах, що краще відповідає на застереження, "якщо він не порожній".


6
"Навіть якщо розмір файлу дорівнює нулю байтів, він все одно буде споживати один кластер". Насправді, ні: у типових файлових системах unix порожній файл споживає один блок inode та zero, і немає поняття кластера, що відрізняється від блоків.
Жил "ТАК - перестань бути злим"

8

Невеликий експеримент, який допоможе проілюструвати це:

Спочатку давайте подивимось, який фактичний розмір блоку мого кореневого розділу 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), як очікувалося. Тепер давайте створимо три файли: перший - нульовий байт, другий - лише один байт, а третій - 4 KiB (розмір блоку):

[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


Тепер ми ls- каталог. Ми використовуємо -sопцію, щоб побачити розміщений розмір (найменший лівий стовпець) у кількості 1024-байтних "блоків".
(Якщо я не знаю, реальний розмір блоку - 4096 - ми могли б вказати, --block-sizeале це масштабує все за цим значенням, і ми також хочемо бачити фактичний розмір файлу в байтах) .

[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

Тут можна відзначити дві речі:

  • Файл з нульовим байтом займає нульові блоки у файловій системі, підтверджуючи те, про що заявив Джайлс .
  • Незважаючи на те, що інші два файли мають різний розмір файлів, вони обидва займають 4 * 1024 = один блок 4KiB ext4.

Рідкі файли

Рідкі файли - це файли з великими блоками нулів. Оскільки, як відомо, всі дані нульові, зберігати їх на диску немає сенсу. Таким чином, видимий розмір файлу може бути фактично більшим за розмір на диску.

Вбудовані дані

Зауважте, що деякі файлові системи дозволяють вмісту дуже невеликих файлів зберігатись у самій inode . Див. Чи можливо зберігання даних безпосередньо всередині inode у файловій системі Unix / Linux? .


Так, ви цілком правильні. 4k - це розмір, який використовує файлова система для зберігання інформації щодо зберігання файлу всередині файлової системи. Такі речі, як індекс файлу від початку блоку, індекс блоку та об'єм пам'яті, використовуваної файлом, зберігаються, які споживають 4 к. Ця інформація використовується для посилання на текстовий файл із файлової системи.
pvn

2
Це неправильно. Метадані файлів, як ви згадуєте, не "з'їдають" жоден 4KiB. Ці структури є частиною накладних форматування файлової системи. Дивіться мою відповідь вище для підтвердження. Якщо те, що ви сказали, було правдою, то для мого 4096-байтного файлу було б потрібно більше одного блоку.
Джонатан Райнхарт

Покажчики на файл (сегмент ні, blk немає) у файловій системі - це речі, які потрібно зберігати та потребують призначення одного блоку. Якщо текстовий файл містить дуже менше вмісту, який може вміститись у перший вже призначений йому блок, то він не вимагатиме виділення другого блоку. Я погоджуюся, що цілий 4k не використовується для метаданих, і виникає деяка внутрішня фрагментація.
pvn

2
Я кажу, що жоден із розмірів блоку 4 KiB не використовується для метаданих. Я думаю, що мій приклад це доводить.
Джонатан Райнхарт

2
@pvn: Джонатан має рацію. Метадані зберігаються в inode для файлу, який є окремим від блоку, який використовується для зберігання даних про файл.
Механічний равлик
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.