среда, 11 февраля 2009 г.

Это только временно

Это перевод It's only temporary. Автор: Ларри Остерман.

У NT есть множество классных возможностей, которые далеко не очевидны, если только вы не читаете документацию ДЕЙСТВИТЕЛЬНО внимательно.

Одна из моих любимых - то, что я называю “временные” временные файлы.

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

Чтобы создать “временный” файл, вы должны вызвать CreateFile, указывая в параметре dwFlagsAndAttributes комбинацию FILE_ATTRIBUTE_TEMPORARY or FILE_FLAG_DELETE_ON_CLOSE. Эта комбинация битов работает как подсказка файловой системе, что данные файла никогда не должны сбрасываться на диск. Другими словами, такой файл может быть создан, в него могут писаться данные, из него можно читать, а система при этом ни разу даже не коснётся диска.

Зачем кому-то может понадобиться такой файл?

Ну, рассмотрите сценарий web-сервера, который создаёт контент для клиентских приложений. В этом случае возможно, что на полпути рендеринга контента, отправляемого клиенту, вы столкнётесь с ошибкой. Проблема в том, что вы уже отправили ответ 200 OK клиенту, поэтому клиент считает, что ошибок нет. Для исправления этой ситуации, вы можете рендерить контент во “временный” временный файл, и если при этом у вас возникнет ошибка - вы сможете среагировать и отправить клиенту подходящий код ошибки. Если же рендеринг пройдёт успешно, вы можете использовать TransmitFile (если ваш сервер написан на raw-сокетах) или HttpSendHttpResponse (если ваш сервер написан на HTTP API) для отправки данных ответа напрямую из файла.

Есть много других причин для использования этого механизма. Например, POP, IMAP и NNTP сервера в Exchange 5.5 используют эту технику для рендеринга контента сообщений RFC822. Сервер Exchange рендерит e-mail сообщение во временный файл, а затем использует TransmitFile для отправки ответа клиенту. Мы использовали этот механизм по двум причинам – мы хотели обрабатывать упоминаемые выше сценарии с ошибками, а также мы хотели уметь обращаться с потенциально большими e-mail сообщениями.

Видите ли, другим большим плюсом “временных” временных файлов по сравнению с буферами в памяти является то, что их размер ограничен доступным свободным местом на диске, а НЕ в памяти. Поэтому, если рендеринг в памяти может обломаться с данными в 1 Гб (потому что вы не смогли выделить непрерывный кусок памяти в 1 Гб), то у рендеринга во “временный” временный файл таких проблем нет (в предположении, что у вас есть свободное дисковое пространство). Если у вас закончится память - менеджер памяти будет сбрасывать ваш файл на диск. Конечно же, это повлияет на производительность, но, по-крайней мере, ваша операция будет успешна.

2 комментария:

  1. Можно ли как-то писать в такой файл в середину, переписывая символы, как если бы была нажата кнопка INS на клаве? Если да, что навряд ли, как обычно, то что будет в случае файла с многобайтной кодировкой символов переменной длины? - есть ли для этого специальный символ-заполнитель, затыкающий в файле полустёртые символы?

    ОтветитьУдалить
    Ответы
    1. Какой "такой"? Это же обычный файл. Можно ли писать в середину файлы с перезаписью? Можно, конечно. В чём проблема-то?

      Удалить

Можно использовать некоторые HTML-теги, например:

<b>Жирный</b>
<i>Курсив</i>
<a href="http://www.example.com/">Ссылка</a>

Вам необязательно регистрироваться для комментирования - для этого просто выберите из списка "Анонимный" (для анонимного комментария) или "Имя/URL" (для указания вашего имени и ссылки на сайт). Все прочие варианты потребуют от вас входа в вашу учётку.

Пожалуйста, по возможности используйте "Имя/URL" вместо "Анонимный". URL можно просто не указывать.

Ваше сообщение может быть помечено как спам спам-фильтром - не волнуйтесь, оно появится после проверки администратором.

Примечание. Отправлять комментарии могут только участники этого блога.