Файл: Принципы построения и основные задачи, выполняемые серверными программами и работа с ними.pdf

ВУЗ: Не указан

Категория: Курсовая работа

Дисциплина: Не указана

Добавлен: 05.04.2023

Просмотров: 193

Скачиваний: 2

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

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

Задания представляют собой отдельные исполняемые модули в системе. Каждая выполняемая команда является заданием. В общей концепции многозадачности выделяют два основных понятия: процессы и потоки. Они представляют два различных способа совместного использования данных. У процессов и потоков свои, редко пересекающиеся, задачи. К примеру, процесс создается для выполнения внешней программы и получения от неё данных. Отдельный поток можно использовать для отображения графического файла по мере его загрузки. Так, выбор между потоком и процессом делается на основании простого правила: при необходимости совместного доступа к данным используется поток.

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

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

Когда программа запущена, она либо выполняется, либо чего-то ожидает (блокирована). Блокирование может возникать в двух случаях: в ходе операций ввода-вывода (программа тратит больше времени на осуществление ввода-вывода) и при доступе к процессору (программой больше времени тратится на вычисления). В случае блокировки в ходе операций ввода-вывода другие задания получают возможность выполнить свои собственные действия. Таким образом большинство заданий кооперируется при доступе к ограниченным ресурсам процессора. Когда одно из заданий блокируется в ходе операций ввода-вывода, активизируется другое задание. Но не всегда требуется завершение операций ввода-вывода для того, чтобы продолжить выполнение задания.

Вместо блокирования программы иногда можно заставить программу выполнять другие действия, пока не завершится обработка системного запроса. Программа может:


- проверить целостность данных;

- инициировать другие запросы или отслеживать их появление;

- обслуживать несколько других соединений;

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

Избежать блокирования можно использовав одну из трех методик: опрос каналов, тайм-ауты и асинхронный ввод-вывод.

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

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

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

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


1.3. Объектно-ориентированные сокеты

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

Особенность объектно-ориентированного программирования (ООП) в том, что его можно применять везде, даже в обычных процедурных языках. Все сводится к пониманию методики и дисциплине программирования.

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

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

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

Четвертой базовой концепцией ООП является полиморфизм. Полиморфизм – это возможность объектов с одинаковой спецификацией иметь разную реализацию. Полиморфизм позволяет писать более абстрактные программы и помогает чаще повторно использовать раннее написанный код.


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

Java – хороший пример объектно-ориентированного языка программирования, который позволяет создавать многократно используемые, переносимые компоненты. Java обладает большой библиотекой сетевых классов. В пакет Network входят классы, позволяющие создавать потоковые (TCP), дейтаграммные (UDP) и групповые (UDP) сокеты. Возможности сокетов расширяются благодаря мощному набору классов ввода-вывода. Хоть этот набор и сложен, но он позволяет существенно упростить сетевое программирование. Благодаря средствам работы с потоками, которые предоставляет Java, проще проектировать серверные программы.

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

ООП предоставляет множество возможностей, но также имеет и ряд недостатков. При использовании ООП подхода можно столкнутся с избыточным наследованием. Как правило достаточно построить естественную иерархию классов и добавить к ним пользовательский интерфейс. Порождать новый класс от другого стоит только в том случае, когда в нем изменяется модель поведения или, добавляются новые функции. Избыточное наследование возникает при неправильном моделировании обязанностей объектов. Когда все классы связанны между собой отношениями наследования, возникает сложная структура отношений. Такой проект достаточно сложно поддерживать, даже при наличии подробной документации.

Так же весомой проблемой при использовании ООП является разрастание исходно кода программы. Увеличение объемов объектов не существенно, когда в системе много памяти, но при увеличении объема исходного кода растет вероятность ошибок. Обычно размер классов значительно превышает размер их функциональных аналогов, написанных средствами модульного программирования. Однако, несмотря на повышение сложности программы, так же растут ее возможности и контроль над типами данных.


1.4. Сложные сетевые методики

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

RPC достигает прозрачности следующим образом. Когда вызываемая процедура в действительности является удаленной, в библиотеку помещается вместо локальной процедуры другая версия процедуры, клиентский стаб (stub - заглушка). Стаб вызывается аналогично оригинальной функции, так же происходит прерывание при обращении к ядру. Но в отличии от оригинальной функции, вместо помещения параметров в регистры и запрашивания данных у ядра, стаб формирует сообщение для отправки ядру удаленного компьютера.

RPC обладает следующими характерными чертами:

- асимметричность (одна из взаимодействующих сторон является инициатором);

- синхронность (выполнение вызывающей процедуры приостанавливается с момента выдачи запроса и возобновляется после возврата из вызываемой процедуры).

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

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

Важной частью процесса создания безопасной системы является определение уровней идентификации пользователя. Простейшая форма – аутентификация – обычная проверка регистрационной информации. Примером является сеанс удаленной регистрации, когда у пользователя запрашиваются имя и пароль. Следующий уровень – авторизация – предполагает ограничение доступа к тем или иным ресурсам системы. Оба эти уровня имеют недостаток, заключающийся в том, что клиент не может определить, является ли сервер «троянским конем». Данную проблему можно решить с помощью сертификации. Сертификация обеспечивает достаточно высокий уровень безопасности. Она требует, чтобы доверенное третье лицо (сервер сертификатов) гарантировало подлинность как клиента, так и сервера.