| Концепция "черных дыр" |
|
Начнем сразу с эксперимента. Для этого создадим программу, которая необычным образом использует системный вызов lseek(). Программа biackhole.с #include <fcntl.h> Эта программа записывает в файл myfile три байта информации, затем выводит текущую позицию ввода-вывода за границы файла, после чего записывает еще три байта. В результате получился файл длиной в 11 байт: $ Is -1 myfile Возникает вопрос: что же содержится в промежутке между первой и второй триадами записанных байтов? В этом случае каждый текстовый редактор будет отображать данный промежуток по-своему. Например, текстовый процессор OpenOffice.org Writer, в котором, кстати, написана эта книга, выстроил цепочку из пяти решеток (#). Но если воспользоваться программой cat, то никаких промежуточных символов мы не обнаружим: $ cat myfile АААВВВ Выход только один — написать еще одну программу, которая выведет ASCII-код каждого символа, содержащегося в myfile. Программа showhole.с #include <fcntl.h>
Оказалось, что наш файл содержит в промежутке нулевые байты: S ./showhole myfile На первый взгляд— ничего особенного. Но давайте попробуем увеличить нашу "черную дыру" до 20 Мбайт. Для этого изменим значение константы hole_size в файле blackhole.c: #define HOLE_SIZE (1024*1024*20) Не торопитесь запускать полученную программу. Давайте сначала удалим прежний файл myfile и проверим, сколько мегабайт памяти занято в файловой системе: $ rm myfile
Утилита df служит для просмотра информации об использовании файловой системы и дисков. Теперь запустим программу и проверим, что получилось: $ ./blackhole $ Is -lh myfile Итак, несмотря на то, что в файловой системе появился файл размером более 20 Мбайт, это никак не отразилось на статистике использования дискового пространства. В приведенном примере опция -т программы df была указана не просто так. Оказывается, "продвинутые" файловые системы, наподобие ext3, реагируют на "черные дыры" в файлах особенным образом: нули, которыми заполнена "черная дыра", на самом деле не записываются в файл. Каждый раз, когда программа посредством системного вызова read() обращается к ядру с запросом на чтение данных из "пустого" промежутка, файловая система просто генерирует нулевые байты. Флаг -т заставляет утилиту df выводить тип файловой системы. Следует помнить, что такое поведение характерно не для всех типов файловых систем. Если, например, поместить файл myfile в файловую систему ОС Windows, то диск реально заполнится 20-ю мегабайтами нулей.
Related Articles
Set as favorite
Bookmark
Email This
Hits: 155 Комментарии (0)RSS feed CommentsНаписать комментарий |