Может ли файл разделить что-нибудь меньше 8 бит?

349
haelmic

Краткий вопрос:

  • Какая самая маленькая единица, сохраняемая в файл?
  • Какова наименьшая делимая единица файла?

Длинный вопрос:

Я просматривал Интернет, пытаясь выяснить, могу ли я получить доступ непосредственно к файлу. Везде, куда я смотрю, кажется, что вам нужно читать файл по одному байту или слову за раз, а затем применять битовый фильтр, чтобы получить результат.

Означает ли это, что файл в 64-битной операционной системе POSIX не может содержать размеры файлов, которые не разделяют 8 бит? Это создает вопрос, если у меня есть поврежденный файл, который сохранился только наполовину, сколько у меня буфера вокруг файла для доступа к данным? Может ли каждая часть фрагментированного файла делить только 8 бит или даже 64 бита в 64-битной ОС? Если я напишу программу для чтения двоичных файлов, будет ли какое-то неопределенное поведение, за которым я должен следить? Например, выходить за пределы до EOF или чего-то еще.

0
Хотя getc и putc существуют, они в основном иллюзия. Для эффективности жесткий диск фактически читает во всем секторе, возможно, больше, и кэширует его, предполагая, что вы захотите его позже. Чем больше у вас свободной памяти, тем выше вероятность, что она тайно кеширует весь файл. cybernard 7 лет назад 0
Более того, даже если бы вы могли заставить ОС читать по 1 биту за раз, производительность была бы настолько ужасной, что вам пришлось бы прекратить ее использовать. В linux вы можете заставить bonnie ++ читать 1 сектор за раз, но производительность намного ниже (в 10 раз), чем позволяет операционной системе справиться с этим, чем никто не использует. cybernard 7 лет назад 0

1 ответ на вопрос

3
Cliff Armstrong

Какая самая маленькая единица, сохраняемая в файл?

1 бит (но не совсем. Это зависит от вашей файловой системы и оборудования, см. Ниже.)

Какова наименьшая делимая единица файла?

1 бит

Практически ни один файл не будет предназначен для доступа таким образом, но это тема форматов файлов и их реализация в различных программных и аппаратных средствах. Но если вы откроете какой-либо файл в шестнадцатеричном редакторе, вы можете технически изменить только один бит данных (например, измените 07 на 08). Некоторые шестнадцатеричные редакторы также дают вам двоичное представление, что делает еще проще переключать отдельные биты с 1 на 0 или обратно.

Везде, где я смотрю, кажется, что вам нужно прочитать файл по одному кусочку или слову за раз, а затем применить битовый фильтр, чтобы получить результат

Это зависит от того, какой именно язык программирования вы используете, но да, большинство из них работают на уровне байтов, а не бит, потому что это проще. Не говоря уже о том, что ОС и оборудование обычно не работают на битовом уровне ... поэтому язык программирования должен это учитывать. Однако заметным исключением являются логические значения, такие как trueи false. Многие языки хранят логические значения в виде одного бита, двоичного 1для trueи двоичного 0для false. Другое известное исключение - целые числа и значения с плавающей запятой, которые считаются двоичными в большинстве языков. Но для строк каждый персонаж будет использовать, по крайней мере, целый байт. До 4 байтов для 32-битных символов в кодировке Юникод.

Однако, как правило, способ написания кода приложения на несколько шагов исключается из «ON» и «OFF», из которых он в конечном итоге сделан и будет скомпилирован. Это потому, что вся цель компилятора - позволить вам написать абстрактный, читаемый человеком код, который затем превращается в настоящие машинные инструкции. Это особенность, а не ошибка.

Везде, где я смотрю, кажется, вам нужно прочитать файл по одному байту или слову за раз, а затем применить битовый фильтр, чтобы получить результат

Файлы - это совершенно другая банка червей. Здесь ваш носитель и файловая система, которую вы используете, определяют ваш минимальный размер файла. Это зависит от размера сектора, с которым была сконфигурирована файловая система, и минимального размера сектора, поддерживаемого носителем. это может быть 64, 128, 512, 1024, 2048, 4096, 8192 или даже 16384 байта. Если вы записываете файл, содержащий 1 бит данных, в файловую систему с использованием секторов размером 4096 байт, тогда этот файл будет занимать 4096 байт (или 4 КиБ), несмотря на то, что он содержит 1/32768 тыс. Таких фактических данных.

Это сделано потому, что работа с небольшими размерами секторов создает дополнительную работу для устройства хранения и файловой системы ... но более крупные блоки менее эффективно используют пространство. Это компромисс между космической эффективностью и производительностью. Старые жесткие диски обычно имеют физический сектор размером 512 байт, что заставляет вас использовать сектора размером 512, 1024, 2048, 4069 байт (и т. Д.). Оптические носители (CD и DVD) обычно используют 2048 байтовых секторов. А современные жесткие диски физически рассчитаны на сектора размером 4096 байт. Эффективность использования пространства не так велика, как это было, когда жесткие диски могли вместить только 1 гигабайт (о памяти).

Следует отметить, что использование 64-битной ОС не влияет ни на что из этого. Под 64-битным понимается, как операционная система и приложения, работающие на ней, обращаются к памяти (т.е. к ОЗУ). Не место для хранения. См. Документацию вашего языка программирования относительно переменных и типов данных, чтобы узнать больше о том, как он по-разному обрабатывает 32-битные и 64-битные среды.

Это создает вопрос, если у меня есть поврежденный файл, который сохранился только наполовину, сколько у меня буфера вокруг файла для доступа к данным?

Когда вы поймете это, обязательно опубликуйте статью о нем, создайте компанию по восстановлению данных и станьте грязными. Между тем, у каждого бизнеса по восстановлению данных есть мнение по этому вопросу, и ни одно из них не кажется более правильным, чем другое. «Короткий» ответ: зависит от файловой системы и носителя (плюс точное, но пока неизвестное состояние процесса чтения / записи в момент сбоя).

Как правило, магнитные запоминающие устройства, такие как жесткие диски, записывают целые сектора одновременно, поэтому теоретически каждый отдельный сектор записывается одновременно. Я не могу вспомнить, делает ли Flash Media то же самое в данный момент или нет. Должно быть, старею.

Может ли каждая часть фрагментированного файла делить только 8 бит или даже 64 бита на 64-битной ОС?

Фактически, фрагментация, по определению, - это когда секторы одного файла разбросаны по всему жесткому диску. Интересно, что эффект, который имеет место, когда файл имеет небольшие части, которые он изменил, состоит в том, что различные сектора, которые занимает файл, не будут полностью заполнены. Таким образом, вы можете получить файл размером 32 КБ, который занимает 42 КБ, поскольку многие его сектора используются только частично. Современные файловые системы, такие как NTFS и ext4fs, предпринимают шаги для предотвращения этого, но более старые, такие как FAT32, были печально известны этим (следовательно, дефрагментация раньше была такой большой проблемой). Кроме того, как я уже сказал, место для хранения больше не является редким и ценным ресурсом ... так что никому нет до этого дела.

Дефрагментация обычно означает захват всех секторов, которые занимает файл, и затем перезапись фактических данных файла в одно пустое пространство, в котором он может храниться, в процессе устранения всех, кроме одного частично используемого сектора.

И снова, сколько «битов» ОС не влияет на это.

Если я напишу программу для чтения двоичных файлов, будет ли какое-то неопределенное поведение, за которым я должен следить?

Читать бинарный файл откуда? Файл? Вы не сможете сделать это, если не обойдете операционную систему, файловую систему и все драйверы оборудования, связанные с управлением устройствами хранения данных, и не получите прямой доступ к диску. Это плохой джиу . Не делайте этого. Не говоря уже о том, что современные ОС и оборудование предназначены для того, чтобы рассматривать попытки сделать это явной угрозой безопасности. Кроме того, помните, что многие устройства хотят записывать и считывать только определенную часть минимального размера для своего хранилища одновременно ... и это всегда больше, чем один бит.

Вместо этого вы можете вежливо запросить у вашей операционной системы наименьший кусок файла, который она готова предоставить вам через свои стандартные API, а затем разбить то, что она вам дает, на кусочки. Затем он спросит файловую систему и драйверы, которые будут взаимодействовать с оборудованием, и все это будет скоординировано и выполнено без необходимости выяснять, как сделать это самостоятельно для каждого контроллера хранилища, файловой системы и ОС, когда-либо созданных. ,

Обратитесь к документации по API языка программирования и библиотек, которые вы используете, чтобы узнать, для чего это нужно.

Например, выходить за пределы до EOF или чего-то еще.

Зависит от того, что именно вы имеете в виду за пределами. Существует терминология, соответствующая таковой в программировании, но обычно она относится к превышению размера буфера памяти и записи в части памяти, в которых ваше приложение не было выделено. Это тоже плохой джуджу ... но без смелых и заглавных букв. Главным образом потому, что это происходит так часто совершенно случайно, что большинство операционных систем предпринимают шаги, чтобы защитить себя и другие приложения от этого.

Однако, опять же, когда вы пишете или читаете с носителя, вы будете использовать свои языки программирования и API соответствующих библиотек, которые, в свою очередь, будут взаимодействовать с API-интерфейсами ОС, которые, в свою очередь, будут ... yadda yadda yadda, Как правило, файловая система отвечает за то, чтобы ничего не записывалось там, где ее не должно быть, и, как правило, отправляет ошибку по цепочке в код вашего приложения, если вы пытаетесь это сделать.

Thumbs eeh голосуйте за хороший ответ +1. Приобретая ранний внешний [ST-506] (https://en.wikipedia.org/wiki/ST-506) жесткий диск для IBM-PC, «гигабайт» был бы мечтой. «10 мегабайт» были практически недоступны. LotPings 7 лет назад 0
Flash имеет тенденцию работать на страницах ... 4KiB - довольно безопасное предположение, но, конечно, оно может быть другим. Кроме того, магнитное хранилище, как правило, просто записывает данные, в то время как флэш-память должна стереть страницу (эффективно сбрасывая все, как правило, в 1), прежде чем данные могут быть записаны (обычно выбрасывая нули). По этой причине вы часто обнаруживаете, что флэш-память будет писать на «известную стертую» страницу, а затем обновлять таблицу поиска - логическое больше не соответствует физическому. Это большая часть выравнивания износа, и не стирание как часть записи повышает производительность. Attie 7 лет назад 1
Также стоит отметить, что обычно самая маленькая часть файла, которую вы можете запросить, составляет один байт. Однако, если вы сделаете это, ОС, скорее всего, будет считывать и буферизовать следующие _n_ байты, потому что это дешевле (повышает производительность), и ожидается, что вам скоро понадобится больше данных. Attie 7 лет назад 2
обратите внимание, что изменение с 07 на 08 приведет к одновременному изменению ** 4 бит **, а не только одного, если только вы не используете какой-либо шестнадцатеричный редактор серого кода phuclv 6 лет назад 0