tanenbaum_seti_all.pages (525408), страница 187
Текст из файла (страница 187)
Конфликт разрешается следующим образом: программа, которая регистрируется последней, затирает своей записью существующую ассоциацию (тип М1МЕ, вспомогательное приложение) для тех типов, которые она готова обрабатывать самостоятельно. Следствием этого является то, что каждая уста- 700 Глава 7.
Прикладной уровень навливаемая программа может изменить метод отображения браузером некоторых типов. В 1)Ы1Х этот процесс обычно не является автоматическим. Пользователь должен вручную обновлять конфигурационные файлы. Такой подход приводит к уменьшению числа неожиданных сюрпризов, но при этом у пользователя появляются дополнительных заботы.
Браузеры мо>ут работать и с локальными файлами, не запрашивая информацию с удаленных серверов. Поскольку локальные файлы не сообщают свои М! МЕ- типы, браузеру нужно каки»ото хитрым образо»> определить, какой подключаемый модуль или вспомогательное приложение использовать для типов, отличных от встроенных (таких, как гехг,">>гЫ или 1тадеДред). Для поддержки локальных файлов вспомогательные модули и приложения должны быть ассоциированы как с расширениями файлов, так и с типами М1МЕ.
При стандартных настройках попытка открыть файл 1оо.рс11 приведет к его открытию в АсгоЪац а файл Ьаг>1ос будет открыт в >>>гогг1. Некоторые браузеры для определения типа М1МЕ используют не только данные о типе М1МЕ, по и расширение файла и даже данные, взятые из самого файла. В частности, 1пгсгпег Ехр1огег по возможности старается ориентироваться на расширение файла, а не на тип М1МЕ. Здесь также возможны конфликты, поскольку многие программы страстно желают поддерживать, например, лпрц. Профессиональные программы при установке обычно выводят флажки, позволяющие выбрать поддерживаемые типы М!МЕ и расширения. Таким образом, пользователь может выбрать то, что ему требуется, и таким образом избежать случайного затирания существующих ассоциаций. Программы, нацеленные на массового потребителя, пола>ают, что большинство пользователей понятия пе имеют о типах М1МЕ и просто захватывают все что могут, совершенно пе обращая внимания на ранее установленные программы.
Расширение возможностей браузера по поддержке новых типов файлов — это удобно, но может также привести к возникновению некоторых проблем. Когда 1»гегпет Ехр1огег получает файл с расширением ехе, он думает, что это исполняемая программа и никаких вспомогательных средств для нее нс требуется. Очевидно, следует просто запустить програл>му. Однако такой подход может оказаться серьезной дырой в системе защиты ипч>ормации. Злоумышленнику требуется лишь создать нехитрый сайт с фотографиями, скажем, знаменитых киноактеров или спортсменов и поставить ссылки на вирусы.
Один-единственный щелчок мышкой на фотографии может в этом случае привести к запуску непредсказуемой и, возможно, опасной программы, которая будет действовать на машине пользователя. Для предотвращения подоГ>ных нежелательных ситуаций 1пгегпет Ехр!огег можно настроить на избирательный запуск неизвестных программ, однако пе все пользователи в состоянии справиться с настройкой браузера. В г>1>11Х похожая проблема может возникнуть с основными сценариями, однако при этом требуется, чтобы пользователь сознательно стал устанавливать вспомогательную программу. К счастью, это процесс довольно сложный, и»случайно» установить что-либо практически невозможно (немпогие могут сделать атон преднамеренно). Всемирная паутина (Чд>>й») 701 Сторона сервера О стороне клиента сказано уже достаточно много.
Поговорим теперь о стороне сервера. Как мы уже знаем, когда пользователь вводит (> й1. илп щелкает на гпперссылкс, браузер производит структурный анализ ()И. и интерпретирует часть, заключенную между Ыр// и следующей косой чертой, как имя Р>ч'5. которое следует искать. Вооружившись 1Р-адресом сервера, браузср устанавливает ТСР- соединение с портом 80 этого сервера. После этого отсылается команда, содержащая оставшуюся часть () К1., в которой указывается имя файла па сервере. Сервер возвращает браузсру запрашиваемый файл для отображения. В первом приГ>лижспии веб-сервер напоминает сервер, прсдставлеппьш в листинге 6.1.
Зтому серверу, как п настоящему веб-ссрвсру, передается имя файла, который следует найти и отправить. В обоих случаях в основном цикле сервер выполняет следующие действия; 1. Принимает входящее ТСР-сослинение от клиента (браузера). 2. Получает имя запрашиваемого файла. 3.
Получает файл (с диска). 4, Возвращает файл клиенту. 5. Разрывает ТСР-соединение. Совремепныс всб-серверы обладают более широкими возможностями, однако существенными в нх работе являются именно перечисленные шаги, Проблема данного подхола заключается в том, что каждый запрос требует обращения к диску для получения файла. В результате число оГ>ращений к веГ>-серверу за секунду ограничено максимальной скоростью обращений к диску. Среднее время доступа к высокоскоростному диску типа 5С81 составляет около 5 мс, то сеть сервер может обрабатывать нс более 200 обращений в секунду.
Зто число даже меньше, если часто запрашиваются большие файлы. Для крупных веб-сайтов это слишком мало. Очевидным способом решения проблемы является кэширование в памяти п последних запрошенных файлов. Прежде чем обратиться за файлом к диску, ссрвер проверяет содержимое каша. Если файл обнаруживается в каше, сто можно сразу выдать клиенту, не обращаясь к лиску. Несмотря на то, что лля эффективного кэширования требуются большие объемы памя>и> и нскоторос дополнительное время на проверку каша п управление его содержимым, суммарный выигрыш во времени почти всегда оправдывает зти накладные расходы и стоимость.
Следующим шагом, направленным на повышение производительности, является создание многопоточных серверов. Одна из реализаций подразумевает, что сервер состоит из входного модуля, принимающего все вхолящие запросы, и я обрабатывающих модулей, как показано на рис. 7.9. Все 1> + 1 потоков принадлежат одному и тому же процессу, поэтому у обрабатывиощих модулей есть доступ к кашу в адресном пространстве процесса.
Когда приходит запрос, входящий модуль принимает его и создает краткую запись с сто описанием. Затсм запись передается одному из обрабатывающих модулей. Другая возможная реализация подразумевает отсутствие вхолного модуля; все обрабатывающие модули пыта- 702 Глава 7. Прикладной уровень ются получить запросы, однако здесь требуется блокирующий протокол, помогающий избежать конфликтов. Машина веб-сервера Обрабатывающий модуль (поток) Входящин Исходящнн запрос ответ Рис. 7.9.
Многопоточный веб-сервер с входным н обрабвтывающнмн модулями Обрабатывающий модуль вначале проверяет кэш на предмет нахождения там нужных файлов. Если они там действительно есть, он обновляет запись, включая в нее указатель на файл. Если искомого файла в каше нет, обрабатывающий модуль обращается к диску и считывает файл в кэш (при атом, возможно, затирая некоторые хранящиеся там файльд чтобы освободить место). Считанный с диска файл попадает в кэш и отсылается клиенту. Преимущество такой схемы заключается в том, что пока один или несколько обрабатываюших модулей заблокированы в ожидании окончания дисковой операции (при этом такие модули не потребляют мошности центрального процессора), другие модули могут активно обрабатывать захваченные ими запросы. Разумеется, реального повышения производительности за счет многопоточной схемы можно достичь, только если установить несколько дисков, чтобы в каждый момент времени можно было обращаться более чем к одному диску.
Имея л обрабатываюШих модулей и Й дисков, производительность можно повысить в Й раз по сравнению с однопоточным сервером и одним диском. Теоретически, однопоточный сервер с я дисками тоже должен давать прирост производительности в я раз, однако программирование и администрирование такой схемы оказывается очень сложным, так как в этом случае невозможно использование обычных блокирующих системных вызовов йода для чтения с диска. Многопоточныс серверы такого ограничения не имеют, поскольку й1АО будет блокировать только тот поток, который осуществил системный вызов, а нс весь процесс. Современные веб-серверы выполняют гораздо больше функций, чем просто прием имен файлов и отправка файлов.
На самом деле, реальная обработка каждого запроса может оказаться довольно сложной. По этой причине на многих серверах каждый обрабатывающий модуль выполняет серии действий. Входной Всемирная паутина (УУУУУ~) 703 модуль передает каждый входящий запрос первому доступному модулю, который обрабатывает его путем выполнения некоторого подмножества указанных далее шагов в зависимости от того, что именно требуется для данного запроса + вычисление имени запрашиваемой веб-страницы; + регистрация клиента; + осуществление контроля доступа для клиента; + осуществление контроля доступа для веб-страницы; + проверка кэша; + получение запрошенной страницы с диска; + определение типа М1МЕ для включения этой информации в ответ клиенту; + аккуратное выполнение различных дополнительных задач; + возвращение ответа клиенту; + добавление записи в журнал активности сервера.
Шаг 1 необходим, потому что входящий запрос может и не содержать реального имени файла в виде строкового литерала. Например, 1)КЕ может быть вот таким: Лшр:Оваа.сэ.хшпй Здесь имя файла отсутствует. Этот ()кь необходимо дополнить неким плеснем файла по умолчанию. К тому же современные браузеры могут указывать язык пользователя по умолчанию (например, итальянский или английский), что позволяет серверу выбирать веб-страницу на соответствующем языке, если таковая существует. Вообще говоря, расширение имсни— задача не такая уж тривиальная, как может показаться, поскольку существует множество соглашений об именовании файлов.
Шаг 2 состоит в проверке идентификационных данных клиента. Это нужно для отображения страниц, недоступных для широкой публики. Мы обсудим один из способов такой проверки палее в этой главе. Шаг 3 проверяет наличие каких-либо ограничений, накладываемых на данного клиента и его местоположение. На шаге 4 проверяются ограничения на доступ к запрашиваемой странице. Если определенный файл (например, .й1ассвзз) присутствует в том же каталоге, что и нужная страница, он может ограничивать доступ к файлу. Например, можно установить доступ к странице только для сотрудников компании.
Шаги 5 и 6 включают в себя получение страницы. Во время выполнения шага 6 должна быть обеспечена возможность одновременного чтения с нескольких дисков. Шаг 7 связан с определением типа М1МЕ, исходя нз расширения файла, первых нескольких байтов, конфигурационного файла или каких-то иных источников. Шаг 8 предназначен для различных задач, таких как построение профиля пользователя, сбор статистики и т.
д. На шаге 9 наконец отсылается результат, что фиксируется в журнале активности сервера на шаге 10. Последний шаг требуется для нужд алминистрирования. Из подобных журналов можно впоследствии узнать ценную информацию 704 Глава 7. Прикладной уровень Обрабапиеающий узел Маршрут"затор (отдельиый комльютер Конвейер Рио. 7.10. Серверная ферма Одна из проблем, связанных с серверными фермами, заключается в отсутствии общего каша — каждый обрабатывающий узел облалает собственной памятью.
Эта проблема может быть решспа установкой дорогостоящей мультипроцессорной системы с разделяемой памятью, одпако существует и более дешевый способ. Он заключается в том, что входной модуль запоминает, на какой узел он посылал запросы конкретных страниц, Последующие запросы тех жс страниц оп сможет тогда направлять на те же узды. Таким образом, получается, что каждый узел специализируется по своему набору страниц; и отпадает необходимость храпения одних и тех же файлов в кашах разных компьютеров. Другая проблема, возникающая при использовании серверных ферм, состоит в том, что ТСР-соединение клиента заканчивается на входном модуле, то есть ответ в любом случае должен пройти через входной модуль. Эта ситуация показана на рис.