Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОС_курсач.docx
Скачиваний:
0
Добавлен:
31.08.2025
Размер:
1.25 Mб
Скачать

Основная часть Постановка задачи Краткие теоретические сведения

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

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

Достоинства клиент-серверной архитектуры:

  1. Нет дублирования кода — основной код приложения хранится на сервере, что позволяет клиенту сосредоточиться только на простой валидации данных, уменьшая объем кода на клиентской стороне.

  2. Инкапсуляция процессов и данных — клиент не имеет доступа к внутренним данным и процессам сервера, что повышает уровень безопасности и защищенности информации.

  3. Легкость наращивания системы — архитектура позволяет легко модернизировать и расширять систему в ответ на изменяющиеся потребности пользователей и бизнеса.

  4. Кроссплатформенность — возможность объединять различные компьютерные платформы, адаптируя их под конкретные нужды подразделений и пользователей, что способствует гибкости в выборе технологий.

Недостатки клиент-серверной архитектуры:

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

  2. Высокие требования к вычислительным мощностям и сетевым ресурсам — сервер может стать узким местом, если его производительности недостаточно для обработки большого количества запросов одновременно, что может негативно сказаться на скорости работы системы.

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

Стандартные системные средства коммуникации в ОС Linux:

  • Каналы – это файлы особого типа (FIFO (first in, first out) – «первым вошел – первым вышел»), в которые процессы могут записывать и считывать данные как из обычного файла. Если канал заполнен, процесс записи в канал останавливается до тех пор, пока не появится свободное место, чтобы снова заполнить его данными. Если канал пуст, то читающий процесс останавливается до тех пор, пока пишущий процесс не запишет данные в этот канал. В ОС Linux различают два вида программных каналов:

  • Именованный программный канал – может служить для общения и синхронизации произвольных процессов, знающих имя данного программного канала и имеющих соответствующие права доступа. Для создания используется вызов: int mkfifo(const char *filename, mode_t mode).

  • Неименованный программный канал – им могут пользоваться только создавший процесс и его потомки. Для создания – вызов: int pipe(int fd[2]).

  • Разделяемая память – это специальная область памяти, позволяющая иметь к ней доступ нескольким процессам. Вызов shm_open() создает и открывает новый объект разделяемой памяти и возвращает соответствующий файловый дескриптор. После подключения сегмента разделяемой памяти к виртуальной памяти процесса этот процесс может обращаться к соответствующим элементам памяти с использованием обычных команд чтения и записи, не прибегая к дополнительным системным вызовов.

  • Сокет — это средство связи, позволяющее разрабатывать клиент-серверные системы для локального или сетевого использования. Константы и функции, необходимые для работы с сокетами в файловом пространстве имен, объявлены в файлах sys/types.h и sys/socket.h. Сокеты в программах представлены дескрипторами, получаемые с помощью функции socket().

  • После получения дескриптора сокета на сервере вызывается функция bind(), которая связывает сокет с заданным адресом, после чего программа-сервер становится доступна для соединения по заданному адресу. При обмене данными с дейтаграммными сокетами вместо функций write() иread() используют специальные функции recvfrom() и sendto().

  • В программе сокет открывается с помощью функции socket() и данные (тестовая строка) передаётся серверу с помощью функции sendto(). Если при работе с дейтаграммными сокетами вызвать функцию connect(), то можно указать адрес назначения лишь один раз. После окончания передачи данных сокет закрывается при помощи функции close().

Стандартные системные средства синхронизации в ОС Linux:

  • Сигналы – программные прерывания, которые посылаются процессу при каком-либо событии. Имена сигналов определены в стандартном заголовочном файле signal.h. Процесс прерывает исполнение, и управление передается функции-обработчику сигнала. По окончании обработки сигнала процесс может возобновить регулярное исполнение. Типы сигналов принято задавать специальными символьными константами. Системный вызов kill() предназначен для передачи сигнала одному или нескольким специфицированным процессам в рамках полномочий пользователя.

  • Семафоры – переменные определенного типа, которые доступна параллельным процессам для проведения над ней операций: A(S, n) – увеличить значение на n, D(S, n) – процесс блокируется при значении S < n, в противном случае – S = S – n, Z(S)– процесс блокируется до достижения S=0.

  • Семафорный механизм работает по следующей схеме: сначала исследуется состояние критического ресурса, а затем осуществляется допуск к критическому ресурсу или отказ от него на некоторое время. Достоинство семафоров – отсутствие состояния активного ожидания. :Создание и получение доступа к набору семафоров осуществляется вызовом int semget(key_t key, int nsems, int semflg).

  • Барьеры – предназначены для того, чтобы держать потоки определенной группы вместе. Наткнувшись на барьер, поток из группы не сможет продолжать выполнение, пока все члены группы не дойдут до барьера. Обычно барьеры используют для того, чтобы все потоки, выполняющие какой-то параллельный алгоритм, достигли определенной его точки прежде, чем какая-либо из них двинулась дальше. Стандарт POSIX поддерживает барьеры в качестве опции (тип pthread_barrier_t).

  • Мьютексы – экземпляр типа pthread_mutex_t – по сути является бинарным семафором: позволяет разделять доступ к ресурсу нескольким потокам. Перед использованием необходимо инициализировать мьютекс функцией pthread_mutex_init. Функция pthread_mutex_lock(), если mutex еще не занят, то занимает его, становится его обладателем и сразу же выходит. Если мьютекс занят, то блокирует дальнейшее выполнение процесса и ждет освобождения мьютекса. Освобождение должен провести поток, заблокировавший мьютекс.