Научная статья на тему 'Многопотоковые RPC-серверы в среде Red Hat enterprise Linux as/es 3'

Многопотоковые RPC-серверы в среде Red Hat enterprise Linux as/es 3 Текст научной статьи по специальности «Компьютерные и информационные науки»

CC BY
138
43
i Надоели баннеры? Вы всегда можете отключить рекламу.
i Надоели баннеры? Вы всегда можете отключить рекламу.
iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.

Текст научной работы на тему «Многопотоковые RPC-серверы в среде Red Hat enterprise Linux as/es 3»

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

Б.А. Державец

МНОГОПОТОКОВЫЕ RPC-СЕРВЕРЫ В СРЕДЕ RED HAT ENTERPRISE LINUX AS/ES З

Насколько известно автору, SUN RPC не был полностью портирован в среду Linux, включая Red Hat Enterprise Linux AS/ES 3. Ключ - А утилиты RPCGEN, позволяющий в среде SunOS скомпилировать многопотоковый RPC-сервер, не поддерживается в среде Red Hat Linux 9,а также и в среде RHEL AS/ES 3.

Невозможность распараллеливать вызов удаленных процедур является весьма серьезной проблемой для промышленной ОС, сравните, например, с Sun RPC для SunOS или DCE RPC для HP-UX.

Производительность Oracle Advanced Replication, использующих отложенные либо немедленные RPC-вызовы, в среде, не поддерживающей многопотоковые RPC-серверы , будет заведомо худшей чем , например, под SunOS.

В статье приводится технология изменения кода заглушки сервера, позволяющая продемонстрировать на конкретном примере из [2] , как распараллелить код square_svc.c в среде White Box Linux 3 (RHEL 3) и собрать многопотоковый RPC-сервер.

Подход никаким образом не связан с конкретным примером (шаблон square.x) - это универсальные изменения, вносимые в файл заглушки сервера sample_svc.c, для произвольного шаблона sample.x, базированные на Posix Threads API и делающие код заглушки многопотоковым.

Заметим, что откомпилировать square_svc.c из [1] в среде White Box Linux 3 не удается. Сравнение версии gcc и glibc показывает:

gcc:

3.2.2-5 (RHL9)

3.2.3-34 (RHEL AS 3)

glibc:

2.3.2-11.9 (RHL 9)

2.3.2-95.20 (RHEL AS 3)

Ниже приведен алгоритм модификации заглушки сервера из примера, рассмотренного в [2] , позволяющий откомпилировать многопотоковый RPC-сервер в среде White Box Linux 3 (RHEL 3), следуя [1]. Идея состоит в том, чтобы код стандартной процедуры square_prog_2, создаваемой утилитой rpcgen поместить в процедуру serv_request( ), выполняемую потоком, запускаемым при запросе на выполнение удаленной процедуры. Новый же код square_prog_2( ) формирует структуру с данными, указатель на которую data_ptr передается вызову :

pthread_create (&thread_id,&attr, serv_request, (void *)data_ptr)

static void

square_prog_2(struct svc_req *rqstp, register SVCXPRT *transp)

{

Компьютерные и информационные технологии в науке, инженерии и управлении

/ *

Структура, предназначенная для упаковки данных, передаваемых процедуре, выполняемой потоком

*/

struct data_str {

struct svc_req *rqstp;

SVCXPRT *transp;

} *data_ptr=(struct data_str*)malloc(sizeof(struct data_str));

{

/*

Инициализация поля структуры

*/

data_ptr->rqstp = rqstp; data_ptr->transp = transp;

pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);

/*

Запуск потока, выполняющего запрос на выполнение удаленной процедуры.

*/

pthread_create(&p_thread,&attr,serv_request,(void *)data_ptr);

pthread_attr_destroy(&attr);

free (data_ptr);

}

}

Процедура serv_request (), выполняемая потоком есть модифицированный код square_prog_2, содержащий дополнительные операторы определения структуры для распаковки данных, передаваемых указателем (struct thr_dat *)data_ptr :-

#include "square.h"

#include <stdio.h>

#include <stdlib.h>

#include <rpc/pmap_clnt.h>

#include <string.h>

#include <memory.h>

#include <sys/socket.h>

#include <netinet/in.h>

#ifndef SIG_PF

#define SIG_PF void(*)(int)

#endif

/ *

Структура, предназначенная для распаковки данных, передаваемых процедуре, выполняемой потоком

*/

struct thr_data

{

struct svc_req *rqstp;

SVCXPRT *transp;

} ;

pthread_t p_thread; pthread_attr_t attr;

/* Процедура, выполняемая потоком */ void *

serv_request(void *data) і

struct thr_data *ptr_data = (struct thr_data *)data; union і

square_in squareproc_2_arg;

} argument; union і

square_out squareproc_2_res;

} result; bool_t retval;

xdrproc_t _xdr_argument, _xdr_result; bool_t (*local)(char *, void *, struct svc_req *);

/*

Получение данных для выполнения удаленной процедуры процедурой serv_request ( )

*/

struct svc_req *rqstp = ptr_data->rqstp; register SVCXPRT *transp = ptr_data->transp;

Дальнейший код процедуры serv_request () смотри, например, в [3] или [4]. Блок main(), сгенерированный утилитой rpcgen, оставляем без измене-ний.Полностью код файла square_svc.c для среды RHEL AS 3 опубликован в [3], [4]. Детально сборка многопотокового RPC-сервера в среде RHL9/RHEL AS 3 описана в [1].

БИБЛИОГРАФИЧЕСКИЙ СПИСОК

1. http://www.linuxgazette.com/node/9005.

2. Стивенс У. UNIX: Взаимодействие процессов. -Спб.: Из-во “Питер”, 2002.

3. http://www.linuxgazette.com/node/10201.

4. http://lxer.com/module/newswire/view/36422.

А.О.Пьявченко, А.А.Литовкин, В.А.Дьяченко

ОСОБЕННОСТИ ПОСТРОЕНИЮ ВСТРОЕННЫХ ЛОГИЧЕСКИХ

АНАЛИЗАТОРОВ БОРТОВЫХ МИКРОПРОЦЕССОРНЫХ СИСТЕМ

В статье рассматриваются актуальность и необходимость создания встроенных логических анализаторов (ЛА) для диагностики цифровых блоков бортовых микропроцессорных систем (БМПС), их цифровых каналов связи в процессе проведения их отладки и комплексной регулировки системы; рассматриваются принципы построения таких устройств с применением и в составе ПЛИС, а также результаты апробации принципов на примере макета логического анализатора шины PCI персонального компьютера.

i Надоели баннеры? Вы всегда можете отключить рекламу.