Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
KS лаба 1-2 / Kompyuternye_seti_Lab_praktikum (1).pdf
Скачиваний:
133
Добавлен:
11.05.2015
Размер:
1.64 Mб
Скачать

Лабораторная работа №6

Создание параллельного сервера с установлением логического соединения с помощью пула потоков/процессов

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

Вработе приведен пример параллельного сервера с установлением логического соединения. Для обеспечения параллельного формированияРответов на запросы клиентов сервер использует несколько (пул) заранее подготовленных потоков/процессов. И

6.1Пул потоков/процессов У

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

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

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

спользовании метода предварительного создания разработчик предусматрБвает создание в программе ведущего сервера N ведомых процессов или потоков с началом ее выполнения (рисунок 7). Каждый ведомый процесс использует средства, доступные в операционной системе, для перехода в режим ожидания поступления запроса. После появления запроса один из ожидающих ведомых процессов начинает выполнение и обрабатывает этот запрос. После завершения обработки запроса ведомый процесс не заканчивает свою работу, а возвращается к выполнению кода, предусматривающего ожидание очередного запроса.

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

69

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

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

ошибки в программе. Хотя такая проблема может появиться не сразу, со време-

нем данный ведомый процесс может исчерпать все адресное пространство.

 

 

 

 

 

 

 

 

 

 

 

Р

 

Клиент 1

 

 

 

 

Дочерний

 

 

 

 

 

 

 

 

 

 

 

процесс 1

 

 

 

И

 

 

 

 

 

 

 

 

 

fork

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

У

 

 

 

Клиент 2

 

 

 

 

Дочерний

 

 

 

 

 

 

 

 

 

 

 

процесс 2

 

fork

 

 

 

 

 

 

 

 

 

 

 

 

 

Г

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Б

 

 

 

 

 

 

 

 

 

 

 

Дочерний

 

fork

 

Родительский

 

 

 

 

 

 

 

 

процесс 3

 

 

 

процесс

 

 

 

 

 

 

 

 

а

 

 

 

 

 

 

Пул имеющихся сво-

 

 

к

 

 

 

 

 

 

 

бодных дочерних про-

 

е…….

 

 

 

 

 

 

 

 

цессов

 

 

 

 

 

 

 

 

 

 

 

 

 

т

 

 

fork

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Дочерний

 

 

 

 

 

 

 

 

 

 

о

 

 

 

 

 

 

 

 

 

 

 

 

процесс N

 

 

 

 

 

 

 

 

 

и

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

л7 – Предварительное создание сервером дочерних процессов

 

 

б

 

 

 

 

 

 

 

 

 

 

 

Рисунок

 

 

 

 

 

 

 

 

 

 

 

Б

 

 

 

 

 

 

 

 

 

 

 

 

6.2 Методические указания по созданию параллельного сервера с установлением логического соединения TCP, использующего пул потоков для обработки запросов клиента

Теперь приведем текст примера сервера TCP – параллельного сервера с установлением логического соединения с пулом потоков. Данный пример реализует прикладной протокол DAYTIME.

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

70

количество параллельных потоков, равно как и максимально допустимое количество параллельных процессов.

Серверная часть

#include <sys/types.h>

 

 

 

 

 

 

 

#include <sys/socket.h>

 

 

 

 

 

 

 

#include <netinet/in.h>

 

 

 

 

 

 

 

#include <arpa/inet.h>

 

 

 

 

 

 

 

#include <string.h>

 

 

 

 

 

 

Р

#include <time.h>

 

 

 

 

 

 

 

 

 

 

 

 

 

#include <unistd.h>

 

 

 

 

 

И

#include <stdio.h>

 

 

 

 

 

 

 

 

 

 

 

 

#include <pthread.h>

 

 

 

 

У

 

char * daytime() {

 

 

 

 

 

 

 

 

Г

 

 

 

time_t now;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

now=time(NULL);

 

 

 

Б

 

 

 

}

return ctime(&now);

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

void * udp_thread(int * p_sock) {

 

 

 

 

 

int sock=*p_sock;

 

к

 

 

 

 

 

for (;;) {

 

 

 

 

 

 

 

 

а

 

 

 

 

struct sockaddr from;

 

 

 

 

 

 

 

е

 

 

 

 

int len=sizeof(from);

 

 

 

 

 

char buf[81];

 

 

 

 

 

 

 

 

memset(buf,0,81);

 

 

 

 

 

 

 

 

recvfrom(sock,buf,80,0,&from,&len);

 

 

 

 

 

о

 

 

 

 

 

 

 

 

printf("udp incoming:%s",buf);

 

 

 

 

 

memset(buf,0,81);

 

 

 

 

 

 

 

 

strncpy(buf,daytime(),80);т

 

 

 

 

 

 

л

 

 

 

 

 

 

 

}

sendto(sock,buf,strlen(buf),0,&from,len);

 

 

б

 

 

 

 

 

 

 

 

puts("answerиudp");

 

 

 

 

 

 

 

}

 

 

 

 

 

 

 

 

 

return NULL;

 

 

 

 

 

 

 

voidи* tcp_thread(int *p_sock) {

 

 

 

 

 

int sock=*p_sock;

 

 

 

 

 

 

 

Бfor (;;) {

 

 

 

 

 

 

 

int c_sock=accept(sock,NULL,NULL); char buf[81];

memset(buf,0,81);

strncpy(buf,daytime(),80); write(c_sock,buf,strlen(buf)); shutdown(c_sock,0); close(c_sock);

71

memset(&addr,0,sizeof(addr));

puts("answer tcp");

}

return NULL;

}

int main() {

struct sockaddr_in addr;

addr.sin_family=AF_INET; addr.sin_port=htons(1212); addr.sin_addr.s_addr=INADDR_ANY;

 

int sock;

 

 

 

 

 

 

 

Р

 

const int threads=10;

 

 

 

 

 

pthread_t tid;

 

 

 

 

И

 

if ( fork() ) {

 

 

 

 

 

 

 

 

У

 

 

sock=socket(PF_INET,SOCK_STREAM,0);

 

 

bind(sock,(struct sockaddr *)&addr,sizeof(addr));

 

listen(sock,5);

 

 

Г

 

 

 

for (int i=0; i<threads; i++)/*создаем 10 потоков*/

 

pthread_create(&tid,NULL,&tcp thread,&sock);

 

}

 

 

 

 

Б

 

 

 

 

else {

 

 

 

 

 

 

 

 

 

sock=socket(PF_INET,SOCKаDGRAM,0);

 

 

 

 

bind(sock,(struct sockaddr *)&addr,sizeof(addr));

 

 

 

 

 

к

 

 

 

 

 

for (int i=0; i<threads; i++)/*создаем 10 потоков*/

 

pthread_create(&tid,NULL,&udp_thread,&sock);

 

}

 

 

е

 

 

 

 

 

 

 

 

 

 

 

 

 

 

pthread join(tid,NULL); //возобновление работы потока

 

 

 

т

 

 

 

 

 

}

return 0;

о

 

 

 

 

 

 

и

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

6.3 Индивидуа ьные задания

 

 

 

 

 

л

 

 

 

 

 

 

 

 

Разра отать приложение, реализующее архитектуру «клиент-сервер». Не-

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

1. Разработать приложение-генератор случайных чисел. На клиентской части вводится целое положительное число N и передается серверу, а тот в свою очередь возвращает клиенту массив случайных чисел от 1 до N.

2. Разработать приложение-поисковик слов. На сервере хранится определенный текст. На клиентской части вводится слово для поиска и передается серверу, а тот в свою очередь осуществляет поиск этого слова в тексте и возвращает клиенту все предложения, в которых встречается это слово.

72

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

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

5. Разработать приложение для нахождения обратной матрицы размером

3х3. Исходная матрица вводится на клиентской части и передается серверу, а

тот в свою очередь возвращает клиенту обратную матрицу.

Р

 

6. Разработать приложение для определения счастливчика лотереи. На

 

И

сервере хранятся номера билетов. На каждом билете имеются 10 случайных чи-

сел от 1 до 100. На клиентской части вводятся 10 чисел от 1 до 100, и сервер

 

 

У

должен определить номер билета, в котором имеется больше всего совпадений

с введенными числами.

Г

7. Разработать приложение для определения призовых мест на соревнова-

 

Б

 

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

прыжков по каждому идентификационному номеру, а сервер возвращает фами-

лии спортсменов, занявших 1, 2 и 3 места.

 

8. Разработать приложение по

кв ртиры для покупки. Стоимости

квартир и их адреса хранятся на сервере.

клиентской части вводится пре-

На

квартир с такой или меньшей стоимостью.

поиску дельная сумма для покупки квартирые, а с рвер возвращает клиенту адреса всех

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

вить следующие

: заказ на покупку журналов или газет, просмотр не-

проданных журналов

т

газет, в зможность редактирования информации о жур-

налах и газетах.

о

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

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

зина. На сервере хранится информация о наличии некоторых товаров. Клиент вводит с клавиатуры запрос на покупку того или иного товара. Назад он полу-

нованиеБитоваров, исходное количество, проданное количество, остаток на кладе), также может ее редактировать, добавлять и удалять.

11. Разработать программу учета сдачи экзаменов студентами. На сервере хранится информация о номерах групп студентов, ФИО студентов, сдаваемых студентами предметах. Клиент имеет возможность заполнения ведомостей студентов по тому или иному предмету, редактирования ведомостей, их просмотра.

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

73

Соседние файлы в папке KS лаба 1-2