p align="left">Каталоги процессов динамически создаются и уничтожаются по мере запуска и завершения соответствующих процессов. В каждом каталоге имеются файлы, предоставляющие доступ к различной информации о процессе. Каждый каталог процесса содержит следующие файлы: · cmdline - содержит список аргументов, переданный процессу при запуске; первым аргументом является имя исполняемого файла; в случае, если процесс выгружен (например, находится в состоянии зомби), файл будет пуст; · cwd - является символической ссылкой на текущий рабочий каталог процесса; · environ - содержит переменные среды процесса; · exe - является символической ссылкой на исполняемый файл процесса; ее чтение является практически единственным способом определить каталог, содержащий исполняемый файл; · fd - подкаталог, содержащий символические ссылки на файлы, открытые процессом; · maps - содержит информацию о файлах, отображаемых в адресном пространстве процесса; к числу отображаемых файлов относится исполняемый файл процесса, а также загруженные библиотеки; · root - является символической ссылкой на корневой каталог процесса; · stat - содержит статистическую информацию о процессе; · status - содержит те же данные, что и stat, но в отформатированном виде. Из соображений безопасности права доступа к некоторым файлам каталогов процесса предоставлены только владельцу процесса или суперпользователю. В файловой системе /proc есть дополнительный элемент, позволяющий программам находить информацию о своем собственном процессе. Файл /proc/self является символической ссылкой на каталог, соответствующий текущему процессу. Разумеется, содержимое ссылки зависит от того, какой процесс к ней обращается. Информация об аппаратуре, установленной на компьютере, может быть получена из следующих файлов файловой системы /proc: · /proc/cpuinfo - содержит информацию о центральном процессоре (или процессорах, если их больше одного); файл содержит информацию в отформатированном виде; помимо указания модели процессора, файл содержит указание доступных процессорных функций, таких как расширенные инструкции MMX; · /proc/devices - содержит список старших номеров всех символьных и блочных устройств, установленных в системе; · /proc/pci - содержит информацию обо всех устройствах, подключенных к шине PCI, включая устройства, встроенные в материнскую плату; · /proc/ide - каталог, содержащий файлы, которые описывают устройства, подключенные к шинам IDE и SCSI. · /proc/net/dev - содержит информацию о сетевых платах и их конфигурации. Информация о конфигурации и состоянии ядра системы представлена в следующих файлах: · /proc/version - содержит строку, описывающую номер версии и модификации ядра; в нее также включена дополнительная информация: имя пользователя, осуществившего компиляцию, дата компиляции и версия компилятора; · /proc/meminfo - хранит сведения об использовании системной памяти; указываются данные как о физической памяти, так и об области подкачки; · /proc/modules - полный список установленных модулей ядра в текстовом виде. Информация о файловых системах представлена следующими файлами: · /proc/filesystems - список файловых систем, поддерживаемых ядром; · /proc/mounts - содержит перечень смонтированных файловых систем; каждая строка файла содержит имя устройства, имя точки монтирования, тип файловой системы и флаги монтирования. 2. Технологический раздел2.1 Выбор языка программированияВ настоящее время в UNIX-подобных операционных системах представлено большое количество самых разнообразных языков программирования, каждый из которых обладает своими преимуществами. При разработке программы был выбран язык C и соответствующий ему компилятор из пакета gcc (GNU compilers collection) по следующим причинам: · В силу того, что само ядро операционной системы написано на языке C, компилятор языка, входящий в состав пакета gcc, постоянно обновляется и исправляется, что практически исключает ошибки при компиляции с его стороны; в свою очередь, это приводит к генерации наиболее оптимизированного кода; · Язык C предполагает использование простых конструкций, что выгодно отличает его от остальных языков, особенно интерпретируемых и объектно-ориентированных, с точки зрения скорости выполнения программ; · Язык C предоставляет программисту наиболее полный доступ ко всем возможностям программного интерфейса POSIX, что позволяет наиболее эффективно организовывать взаимодействие программы с операционной системой. 2.2. Программные средства2.2.1 ПотокиРазработанная программа имеет возможность параллельной обработки запросов от нескольких клиентов. Это достигнуто за счет использования более чем одного потока управления, осуществляющих обработку запросов. Потоки в системе 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: 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, 4
|