48421 (Протокол HTTP), страница 3

2016-07-30СтудИзба

Описание файла

Документ из архива "Протокол HTTP", который расположен в категории "". Всё это находится в предмете "информатика" из 1 семестр, которые можно найти в файловом архиве . Не смотря на прямую связь этого архива с , его также можно найти и в других разделах. Архив можно найти в разделе "курсовые/домашние работы", в предмете "информатика, программирование" в общих файлах.

Онлайн просмотр документа "48421"

Текст 3 страницы из документа "48421"

Потоки в системе Linux реализуются посредством программного интерфейса, предоставляемого входящей в состав Linux библиотеки потоков libpthread.

Создание потока разбивается на несколько этапов:

  1. Описание функции, которая будет выполняться в рамках потока. Эта функция не должна содержать статических переменных.

  2. Создание экземпляра описателя атрибутов потока – структуры типа pthread_attr_t, – и заполнение ее полей в соответствии с необходимыми свойствами создаваемого потока.

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

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

После создания поток выполняется параллельно с остальными потоками процесса и завершает свою работу при выполнении в поточной функции оператора return или принудительном завершении извне.

2.2.2 Семафоры и мьютексы

Для обеспечения безопасности доступа выполняющихся потоков к разделяемым переменным, коими являются, например, переменные состояния систем журналирования и безопасности, используется механизм взаимоблокировки потоков с помощью объекта ядра – мьютекса.

Мьютекс представляет собой переменную типа pthread_mutex_t, к которой применимы две операции:

  • pthread_mutex_lock – захват мьютекса; при применении этой операции к захваченному другим потоком мьютексу вызвавший поток блокируется до освобождения мьютекса.

  • pthread_mutex_unlock – освобождение мьютекса.

Для контроля числа одновременно обслуживаемых запросов в серверном модуле применяется объект ядра – семафор.

Семафор представляет собой переменную типа sem_t, к которой применимы две основных операции:

  • sem_wait – уменьшает на 1 текущее значение семафора; если текущее значение равно 0, поток блокируется;

  • sem_post – увеличивает на 1 значение семафора.

Начальное значение семафора задается при его инициализации с помощью функции sem_init().

2.2.3 Сокеты

Сокет представляет собой объект, предоставляющий программный интерфейс к протоколу TCP/IP и являющийся конечной точкой подключения. Использование сокета ничем не отличается от использования операций ввода-вывода применительно к файловому дескриптору – к сокету применяются те же функции read() и write(), что и при файловом вводе-выводе. Существуют, однако, специфические функции send() и recv(), расширяющие функциональность стандартных read() и write(), но их использование не является обязательным.

Перед началом процесса передачи данных через сокет необходимо совершить ряд действий:

  1. Создать переменную типа int, которая будет выступать в качестве дескриптора сокета.

  2. Создать описатель адреса сокета – структуру типа sockaddr_in, – и заполнить ее поля в соответствии с адресом и портом, через которые планируется устанавливать соединение.

  3. Создать объект «сокет» с помощью функции socket(). Значение, возвращенное функцией, присваивается дескриптору сокета.

  4. Привязать сокет к адресу и порту с помощью функции bind().

  5. Начать прослушивание адреса и порта на предмет входящих соединений с помощью функции listen().

  6. Принимать соединения с помощью функции accept().

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

2.2.4 Сигналы

Контроль сигналов используется в программе для прекращения работы сервера. При поступлении определенного сигнала обнуляется переменная-условие, в результате чего цикл приема сообщений прерывается.

Установка некоторой функции в качестве обработчика сигнала производится следующим образом:

  1. Определение функции – обработчика сигнала.

  2. Создание и заполнение описателя параметров обработчика – структуры типа sigaction. Одно из полей описателя содержит адрес функции-обработчика.

  3. Назначение обработчика сигнала с помощью функции sigaction().

2.3 Структура модулей программы

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

Все модули программы можно разделить на несколько групп:

  • Система инициализации – обеспечивает настройку всех систем и запуск сервера.

  • Сервер – обеспечивает настройку сетевых средств, принятие входящих подключений и передачу данных.

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

  • Система журналирования – предоставляет всем модулям интерфейс для записи событий во внешний файл (журнал).

  • Система безопасности – обеспечивает управление учетными записями и проверку авторизации пользователя.

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

  • Дополнительные модули – содержат вспомогательные функции.

Системы и их взаимодействие представлены на рисунке 3.1:

Рис. 3.1


2.3.1 Система инициализации

Система инициализации предназначена для конфигурирования программы и запуска сервера. С нее начинается выполнение программы в силу того, что она включает в себя функцию main().

При разработке программы были определены следующие параметры:

  • LogMode – режим журналирования, может принимать значения short (краткий режим журналирования) и verbose (вывод расширенных сообщений).

  • LogDir – каталог, в который будет осуществляться запись журнальных файлов.

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

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

  • MaxClients – максимальное число одновременно обслуживаемых клиентов.

  • AccountFile – путь к файлу, содержащему учетные записи пользователя.

  • ModulesDir – каталог, содержащий подключаемые модули (в виде динамических библиотек).

Система инициализации производит трехшаговую установку параметров:

    1. Устанавливаются значения по умолчанию.

    2. Загружаются значения из файла конфигурации.

    3. Загружаются значения из аргументов командной строки.

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

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

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

2.3.2 Сервер и система управления динамическими библиотеками

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

Действия, выполняемые сервером, можно описать следующим образом:

  1. Создание и настройка серверного сокета.

  2. Прием входящего подключения.

  3. Создание потока, который будет обрабатывать запрос.

Пункты 2 и 3 повторяются в течение всего времени работы сервера.

Поток, обрабатывающий запрос, выполняет следующие действия:

  1. Принимает запрос от клиента.

  2. Проверяет корректность запроса.

  3. В случае корректного запроса обращается к системе безопасности для подтверждения доступа.

  4. В случае разрешения доступа обращается к системе управления динамическими библиотеками, передав ей имя запрошенного модуля.

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

Работа сервера продолжается до тех пор, пока не равна нулю переменная, адрес которой был передан серверному модулю при старте. Эта переменная обнуляется при получении процессом сигнала SIGINT (соответствующего комбинации Ctrl+C на клавиатуре). Использование сигналов описано в п. 3.2.4.

2.3.3 Система журналирования

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

  • Старт сервера – с указанием адреса и порта привязки.

  • Входящее подключение – с указанием адреса клиента.

  • Авторизация клиента.

  • Запрос модуля.

  • Сообщения о разнообразных ошибках в работе сервера.

Система журналирования самостоятельно генерирует имя файла на основании текущей даты: журнальные файлы имеют имена вида dd-mm-yyyy.log.

Для защиты своих статических данных система использует мьютекс (см. п. 3.2.2), что приводит к монополизации доступа потоков к системе. Это может несколько замедлить работу, однако разработанное приложение не является критичным ко времени, поэтому возникающие задержки вполне допустимы.

Система безопасности служит для проверки возможности доступа клиента к каким-либо модулям сервера.

Система безопасности может функционировать в двух режимах:

  • Режим проверки доступа – сервер передает системе имя пользователя и пароль, которые она пытается найти в файле учетных записей. В случае нахождения совпадения доступ предоставляется, в противном – не предоставляется.

  • Режим предоставления доступа – в этом случае доступ предоставляется для всех клиентов независимо от указанных имени и пароля. Используется только для тестирования сервера.

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

Система безопасности, как и система журналирования, использует мьютекс (см. п. 3.2.2) для защиты доступа к своим статическим переменным.

2.4 Динамические библиотеки

Динамические библиотеки, подключаемые серверным модулем во время работы программы, реализуют функциональные возможности программы. Функции, содержащиеся в этих библиотеках, служат для получения разнообразной системной информации и выдачи ее в HTML-формате клиенту (браузеру).

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

2.4.1 PROCESSES – информация о процессах

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

  • Идентификатор (PID) процесса – получается путем чтения списка каталогов файловой системы /proc и выбора тех из них, название которых состоит только из цифр. В этом случае имя каталога и будет являться идентификатором процесса.

  • Имя исполняемого файла – считывается из файла stat каталога процесса в /proc.

  • Состояние процесса – считывается из файла status каталога процесса.

  • Имя владельца процесса – получается с помощью функции stat(), примененной к каталогу процесса. Имя владельца процесса совпадает с именем владельца каталога процесса.

  • Имя группы владельца процесса – аналогично имени владельца процесса, получается с помощью функции stat().

  • Размер резидентной части процесса – считывается из файла statm из каталога процесса.

Результаты работы динамической библиотеки отображаются в клиентском браузере в виде таблицы.

2.4.2 MEMINFO – информация о системной памяти

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

  • Общее количество доступной физической памяти.

  • Размер свободной части памяти.

  • Размер памяти, разделяемой между процессами.

  • Количество буферов ввода-вывода.

  • Информация об области подкачки.

Предоставляемая информация извлекается из файла /proc/meminfo.


2.4.3 DISKFREE – информация о свободном месте на дисках

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

Информация получается с помощью команды оболочки fd (файл /bin/fd). Для того, чтобы перенаправить данные, выдаваемые при выполнении команды, используется дублирование процесса с помощью функции fork() и загрузка в адресное пространство порожденного процесса данных программы fd с помощью функции execv(). Вывод информации в дескриптор сокета вместо вывода на консоль осуществляется отображением потока данных, выводимых в стандартный поток вывода, на дескриптор сокета с помощью функции dup2().

2.4.4 NETWORK – информация о сетевых устройствах

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

  • Количество принятых и отправленных байтов и пакетов.

  • Количество возникших за время приема и передачи ошибок.

  • Количество потерянных при приеме и передаче пакетов.

  • Количество коллизий при передаче.

Информация получается посредством анализа файла /proc/net/dev, содержащего подробную статистическую информацию о сетевых устройствах. Некоторая информация, полученная из файла, не учитывалась, так как не представляет большой ценности для системного администратора.

2.4.5 VERSION – версия операционной системы

Данная динамическая библиотека отображает в окне браузера версию операционной системы, под управлением которой работает сервер. Информация о версии системы получается из файла /etc/issue.

Свежие статьи
Популярно сейчас
Как Вы думаете, сколько людей до Вас делали точно такое же задание? 99% студентов выполняют точно такие же задания, как и их предшественники год назад. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Нет! Мы не выполняем работы на заказ, однако Вы можете попросить что-то выложить в наших социальных сетях.
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
4125
Авторов
на СтудИзбе
667
Средний доход
с одного платного файла
Обучение Подробнее