Исследование временных характеристик многопоточного приложения в ОСРВ QNX во время обработки информации от периферийных устройств

Автор работы: Пользователь скрыл имя, 30 Октября 2012 в 22:35, контрольная работа

Описание

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

Содержание

1. Расчетно-графическая работа. Исследование временных характеристик многопоточного приложения в ОСРВ QNX во время обработки информации от периферийных устройств
2. Введение
3. Алгоритм
4. Программная реализация
5. Выводы
6. Литература

Работа состоит из  1 файл

Содержание_OS.doc

— 412.00 Кб (Скачать документ)

Далее рассмотрим особенности программной  реализации алгоритмов клиента и  сервера для ОС РВ.

Программная реализация

Обзор

При разработке приложения, предполагается использовать среду разработки QNX Momentics v4.7. В качестве языка программирования будет использоваться язык C.

Тестирование приложения и эксперименты будет производиться на реальной ОС РВ QNX 6.5 Neutrino v2, развернутой на виртуальной машине VMWare.

Сервер

Предполагается передача конфигурации сервера через командную строку. server -addr:<ipaddress> -port:<port> -maxconn:<maxconn> -log:<logfilename> где

  • -addr:<ipaddress> - указывает IP адрес, на котором сервер «слушает» клиентские подключения.
  • -port:<port> - указывает номер порта, на котором сервер «слушает» клиентские подключения.
  • -maxconn:<maxconn> - указывает максимальное количество одновременных подключений клиентов к серверу.
  • -log:<logfilename> - указывает имя файла лога, куда пишется информация о пакетах, полученных от клиентов.

 

Код программы:

/*

* ResMgr and Message Server Process

*/

#include <stdio.h>

#include <unistd.h>

#include <stdlib.h>

#include <errno.h>

#include <string.h>

#include <sys/neutrino.h>

#include <sys/iofunc.h>

#include <sys/dispatch.h>

resmgr_connect_funcs_t ConnectFuncs; resmgr io funcs t IoFuncs;

iofunc_attr_t IoFuncAttr;

typedef struct {

uint16 t msg no; char msg data[255];

} server msg t;

int message callback( message context t *ctp, int type, unsigned flags,

void *handle )

{

server msg t *msg; int num;

char msg reply[255];

/* cast a pointer to the message data */ msg = (server msg t *)ctp->msg;

/* Print out some usefull information on the message */

printf( "\n\nServer Got Message:\n" );

printf( " type: %d\n" , type );

printf( " data: %s\n\n", msg->msg data );

/* Build the reply message */ num = type - _IO_MAX;

snprintf( msg reply, 254, "Server Got Message Code: IO MAX + %d", num );

/* Send a reply to the waiting (blocked) client */

MsgReply( ctp->rcvid, EOK, msg reply, strlen( msg reply ) + 1 );

return 0;

}

int main( int argc, char **argv ) {

resmgr attr t resmgr attr;

message attr t message attr;

dispatch t *dpp;

dispatch context t *ctp, *ctp ret;

int resmgr id, message id;

/* Create the Dispatch Interface */ dpp = dispatch create();

if( dpp == NULL ) {

fprintf( stderr, "dispatch create() failed: %s\n",

strerror( errno ) ); return EXIT_FAILURE;

}

memset( &resmgr attr, 0, sizeof( resmgr attr ) ); resmgr attr.nparts max = 1;

resmgr attr.msg max size = 2048;

/* Setup the default I/O functions to handle open/read/write/... */

iofunc func init( _RESMGR_CONNECT_NFUNCS, &ConnectFuncs,

_RESMGR_IO_NFUNCS, &IoFuncs );

/* Setup the attribute for the entry in the filesystem */ iofunc_attr_init( &IoFuncAttr, S_IFNAM | 0666, 0, 0 );

resmgr id = resmgr attach( dpp, &resmgr attr, "serv", FTYPE ANY,

0, &ConnectFuncs, &IoFuncs, &IoFuncAttr );

if( resmgr id == -1 ) {

fprintf( stderr, "resmgr attach() failed: %s\n", strerror( errno ) ); return EXIT_FAILURE; _

}

/* Setup our message callback */

memset( &message attr, 0, sizeof( message attr ) ); message attr.nparts max = 1; message attr.msg max size = 4096;

/* Attach a callback (handler) for two message types */ message id = message attach( dpp, &message attr, IO MAX + 1,

_IO_MAX + 2, message_callback, NULL );

if( message id == -1 ) {

fprintf( stderr, "message attach() failed: %s\n", strerror( errno ) ); return EXIT_FAILURE; _

}

/* Setup a context for the dispatch layer to use */ ctp = dispatch context alloc( dpp );

if( ctp == NULL ) {

fprintf( stderr, "dispatch context alloc() failed: %s\n",

strerror( errno ) ); return EXIT_FAILURE;

}

/* The "Data Pump" - get and process messages */

while( 1 ) {

ctp ret = dispatch block( ctp );

if( ctp ret ) {

dispatch handler( ctp );

}

else {

fprintf( stderr, "dispatch block() failed: %s\n",

strerror( errno ) ); return EXIT_FAILURE;

}

}

return EXIT_SUCCESS;

}

Клиент

Предполагается передача конфигурации клиента через командную строку.

client -saddr:<serveripaddress> -sport:<serverport> -caddr:<clientipaddress> - tp:<timeperiod> -tk:<ktimeparam> -tb:<btimeparam> -maxsize:<maxpacketsize> - pk:<kpacketparam> -pb:<bpacketparam>

где

  • -saddr:<serveripaddress> - указывает IP адрес, на котором сервер «слушает» клиентские подключения.
  • -sport:<serverport> - указывает номер порта, на котором сервер «слушает» клиентские подключения.
  • -caddr:<clientipaddress> - указывает IP адрес, с которого клиент подключается к серверу.
  • -tp:<timeperiod> - указывает период моделирования в мс, т.е. промежуток времени, в время которого клиент формирует запросы серверу.
  • -tk:<ktimeparam> - указывает параметр кдля закона изменения времени между пакетами, отправляемыми к серверу.
  • -tb:<btimeparam> - указывает параметр b для закона изменения времени между пакетами, отправляемыми к серверу.
  • -maxsize:<maxpacketsize> - максимальный размер пакета в килобайтах.
  • -pk:<kpacketparam> - указывает параметр k для закона изменения размера пакетов, отправляемым к серверу.
  • -pb:<bpacketparam> - указывает параметр b для закона изменения размера пакетов, отправляемым к серверу.

 

Код программы:

/*

* Message Client Process */

#include <stdio.h>

#include <unistd.h>

#include <stdlib.h>

#include <fcntl.h>

#include <errno.h>

#include <string.h>

#include <sys/neutrino.h>

#include <sys/iofunc.h>

#include <sys/dispatch.h>

typedef struct {

uint16_t msg_no; char msg_data[255]; } client_msg_t;

int main( int argc, char **argv ) {

int fd; int c;

client_msg_t msg; int ret; int num;

char msg_reply[2 55]; num = 1;

/* Process any command line arguments */

while( ( c = getopt( argc, argv, "n:" ) ) != -1 ) {

if( c == 'n' ) {

num = strtol( optarg, 0, 0 );

}

}

/* Open a connection to the server (fd == coid) */ fd = open( "serv", O_RDWR );

if( fd == -1 ) {

fprintf( stderr, "Unable to open server connection: %s\n",

strerror( errno ) ); return EXIT_FAILURE;

}

/* Clear the memory for the msg and the reply */

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

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

/* Setup the message data to send to the server */ msg.msg_no = _IO_MAX + num;

snprintf( msg.msg_data, 254, "client %d requesting reply.", getpid() );

printf( "client: msg_no: _IO_MAX + %d\n", num ); fflush( stdout );

/* Send the data to the server and get a reply */

ret = MsgSend( fd, &msg, sizeof( msg ), msg_reply, 255 );

if( ret == -1 ) {

fprintf( stderr, "Unable to MsgSend() to server: %s\n", strerror( errno ) ); return EXIT_FAILURE;

}

/* Print out the reply data */

printf( "client: server replied: %s\n", msg_reply ); close( fd );

return EXIT_SUCCESS;

}

 

Сетевое взаимодействие

Порядок выполнения подключения к  серверу:

  • Создание сокета, посредством системного вызова socket. Здесь указывается тип подключения: TCP|UDP.
  • Подключение к серверному сокету, посредством вызова connect.
  • Далее производится асинхронная передача информации между клиентом и сервером посредством вызовов read/write.
  • После чего закрывается соединение со стороны клиента и сервера, вызовом close.

Обработка ошибок

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

Эксперимент

Описание экспериментальной установки

По причине отсутствия необходимого количества доступных компьютеров для установки OS QNX, а также отсутствия необходимых лицензий для установки OS QNX, предполагается использование виртуальных машин VMWare, запущенных на компьютерах под управлением ОС Windows XP SP3.

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

Аппаратное обеспечение





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

Результаты эксперимента

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

Порядок выполнения эксперимента:

    1. Запуск монитора виртуальных машин VMWare Workstation 7.1.
    2. Запуск виртуальной машины сервера и запуск серверного приложения.

server -addr:192.168.1.67 -port:8099 -maxconn:4 -log:log.svr где

  • команда -addr:192.168.1.67 указывает адрес, на котором сервер «слушает» клиентские подключения.
  • команда -port:8099 указывает номер порта, на котором сервер «слушает» клиентские подключения.
  • команда -maxconn:4 указывает максимальное количество одновременных подключений клиентов к серверу.
  • команда -log:log.svr указывает имя файла лога, куда пишется информация о пакетах, полученных от клиентов.
  1. Запуск виртуальной машины клиента 1.
  1. Запуск виртуальной машины клиента 2.
  2. Запуск виртуальной машины клиента 3.
  3. Запуск виртуальной машины клиента 4.
  4. Последовательный запуск клиентов 1-4 для подключения к серверу.

client -saddr:192.168.1.67 -sport:8099 -caddr:192.168.1.69 -tp:15 -tk:25 - tb:70 -maxsize:3072 -pk:1600 -pb:128

где

  • -saddr:192.168.1.67 - указывает IP адрес, на котором сервер «слушает» клиентские подключения.
  • -sport:8099 - указывает номер порта, на котором сервер «слушает» клиентские подключения.
  • -caddr:192.168.1.69 - указывает IP адрес, с которого клиент подключается к серверу.
  • -tp:15 - указывает период моделирования в мс, т.е. промежуток времени, в время которого клиент формируетзапросы серверу.
  • -tk:25 - указывает параметр k для закона изменения времени между пакетами, отправляемыми к серверу.
  • -tb:70 - указывает параметр b для закона изменения времени между пакетами, отправляемыми к серверу.
  • -maxsize:3072 - максимальный размер пакета в килобайтах.
  • -pk:1600 - указывает параметр k для закона изменения размера пакетов, отправляемым к серверу.
  • -pb:128 - указывает параметр b для закона изменения размера пакетов, отправляемым к серверу.

client -saddr:192.168.1.67 -sport:8099 -caddr:192.168.1.70 -tp:15 -tk:25 - tb:70 -maxsize:3072 -pk:1600 -pb:128

client -saddr:192.168.1.67 -sport:8099 -caddr:192.168.1.71 -tp:15 -tk:25 - tb:70 -maxsize:3072 -pk:1600 -pb:128

client -saddr:192.168.1.67 -sport:8099 -caddr:192.168.1.72 -tp:15 -tk:25 - tb:70 -maxsize:3072 -pk:1600 -pb:128

Управление клиентами, проводилось  через удаленное соединение, посредством  IDE QNX Momentics через вкладку Target Navigator. Отметим, что для этого на каждой удаленной машине, необходимо запустить qconn. Узнать IP адрес каждого клиента можно посредством выполнения команды ifconfig.

Выводы

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

    1. Во время выполнения расчетно-графической работы «Разработка серверного и консольного клиентского приложения для обмена сообщения с ним для QNX в среде QNX Mnemonics IDE».
    2. Разработано клиент-серверное приложение на языке C для управления в реальном времени сложным технологическим процессом.
    3. Проведен эксперимент, в котором использовались технологии виртуализации VMWare, для моделирования распределенной системой управления сложным технологическим процессом в реальном времени.

Литература

1. Microsoft Developer Network. URL: http://www.msdn.com

      1. Общие сведения о работе с сетями Ethernet. URL: http://docstore.mik.ua/manuals/ru/linux parallel/node77.html
      2. Стивенс Р., Раго С. Unix. Професиональное программирование, 2-е издание. -СПб.: Символ-Плюс, 2007. -1040 с.
      3. Стивенс У.Р., Феннер Б., Рудофф Э.М. Unix: разработка сетевых приложений. 3-е издание. - СПб.: Питер, 2007. -1039 с.
      4. Алексеев Д., Ведревич Е., Волков А., и др. Практика работы с QNX. -М.: Издательский Дом «КомБук», 2004. -432с.
      5. Кёртен Р. Введение в QNX Neutrino 2. Руководство по программированию приложений реального времени в QNX Realtime Platform. -Издательство «Петрополис», 2001.

Информация о работе Исследование временных характеристик многопоточного приложения в ОСРВ QNX во время обработки информации от периферийных устройств