5

Программист на моей работе, который всю жизнь использовал Linux, ругал Windows за наличие файловой системы без учета регистра (среди прочего), что, по его словам, является наихудшей возможной идеей и никогда не принесет пользы. Я сказал, что это только потому, что он привык к файловым системам, чувствительным к регистру, и что гораздо более разумно иметь файловую систему без учета регистра (часть моего рассуждения состоит в том, что меня зовут David , но если вы упомянули меня david Я бы все равно знал, что вы имели в виду меня, и то же самое должно относиться к файлам). Затем он объяснил свою позицию, заявив, что файловая система без учета регистра должна подвергаться снижению производительности.

Так вот мне интересно ... как же регистронезависимом доступ к файлам файловой системы? Позвольте мне попытаться объяснить, что я думаю:

Скажем, у вас есть чувствительная к регистру файловая система (и ядро ОС и т.д.), Так что на практике, если каталог существует с именем exampleDir , я должен в точности ввести cd exampleDir для cd. Если я cd exampledir , я получу сообщение об ошибке, что каталог не существует. Мне кажется, это простой случай. Когда я набираю команду, файловая система может просто взять введенные мной точные символы (игнорируя то, что может сделать ядро, чтобы добавить текущий путь к рабочему каталогу в строку и т.д.) И начать просматривать список доступных имен файлов, выполняя прямой сравнить по каждому имени; например:

for(var i=0;i<files.length;i++) {
    if(filename == files[i]) return true;
}

Теперь интересная часть, нечувствительная к регистру файловая система (при условии сохранения регистра, как в Windows). С практической точки зрения, если существует каталог с именем exampleDir , я могу набрать cd exampleDir или cd eXamPleDIr и мне все равно удастся попасть в эту папку. То, что я действительно хочу знать, - то, на что похож код, чтобы достигнуть этого. Для сохранения регистра имя каталога должно храниться вместе с регистром. Значит ли это, что вам нужно делать два преобразования в нижний или верхний регистр каждый раз, когда вы хотите получить доступ к файлу по имени файла? Насколько сильно это сказывается на производительности? Существуют ли уловки, используемые для уменьшения снижения производительности при использовании файловой системы без учета регистра? Вот как я представляю, что код файловой системы должен выглядеть так:

for(var i=0;i<files.length;i++) {
    if(toLowercase(filename) == toLowercase(files[i])) return true;
}

Пожалуйста, обратите внимание: так как кажется, что это не было ясно из моего вопроса, я абсолютно не спрашиваю, какой тип лучше, и при этом я не спрашиваю, каковы преимущества и недостатки. Я только спрашиваю, как (с технической точки зрения) файловая система без учета регистра учитывает тот факт, что люди могут вводить имя файла в случайном регистре.

2 ответа2

3

Операционные системы обычно работают с ручками. Вызывается "открытая" функция, которая задает имя файла, и возвращается дескриптор. Дальнейшие вызовы ввода / вывода принимают дескриптор, а не имя файла.

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

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

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

Однако непроизводительные затраты на выполнение двух сравнений вместо одного, вероятно, связаны с несколькими дополнительными инструкциями на языке ассемблера. Значение менее 50 или около того циклов. Может быть, 500 или 5000, если в игру вступят промахи.

Это действительно, действительно, не стоит беспокоиться, если вы буквально не беспокоитесь о производительности создания / удаления миллиардов файлов за короткий промежуток времени. Приложения с высоким дисковым вводом / выводом включают в себя такие вещи, как базы данных, и базы данных обычно открывают несколько очень больших файлов и оставляют их открытыми во время использования базы данных. Таким образом, приложения такого типа, для которых обычно требуется весь дисковый ввод-вывод, не выполняют много вызовов, когда необходимо проанализировать имя файла.

Скорость среды станет узким местом задолго до того, как время обращения с именами файлов приблизится к ней.

0

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

Например, скажем, у вас есть файл foobar.txt а затем вы указываете своей программе сохранить его как fooBar.txt не проверяя себя, существует ли он уже.

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

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

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

За чтение имен файлов система получает гораздо меньше штрафов, почти во всех случаях драйвер файловой системы просто передает список файлов программе, которая ее запросила. Я уверен, что я видел, как люди упоминали, что вы можете создавать "дубликаты" имен файлов в файловой системе NTFS, используя систему без учета регистра, такую ​​как Linux, и Windows просто справляется с этим.

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

Например, я вижу проблему в чувствительных к регистру системах для ошибок программирования, зависящих от регистра при чтении файлов. Если ваша программа жестко закодировала запрос на /etc/fish и кто-то переименовал его в /etc/Fish (или вы забыли удерживать shift для "f"), то вы получите ошибку, которую в противном случае не было бы в регистронезависимом система.

Все дело в том, куда вы вкладываете свои усилия, и есть компромиссы в обоих направлениях.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .