projetando servidores concorrentes genéricos em c++0x

Download Projetando Servidores Concorrentes Genéricos em C++0x

Post on 25-Jun-2015

119 views

Category:

Documents

0 download

Embed Size (px)

DESCRIPTION

Monografia apresentada para conclusão do curso de Bacharelado em Informática e Ciência da Computação no Instituto de Matemática e Estatística da Universidade do Estado do Rio de Janeiro.

TRANSCRIPT

Universidade do Estado do Rio de Janeiro Instituto de Matemtica e Estatstica Departamento de Informtica e Cincia da Computao

Projetando Servidores Concorrentes Genricos em C++0x

Aluno: Pedro LamaroOrientador: Alexandre Sztajnberg Abril 2009

Roteiro

Introduo Objetivos Interface de Programao de Sockets POSIX Mecanismos de Projeto e Implementao do C++0x Um Binding POSIX/C++ para a Interface de Sockets Projetando Servidores Concorrentes em C++ Exemplo Consideraes Finais

Introduo

Estratgias de Concorrncia para Servidores como atender a mltiplos clientes simultaneamente Mecanismos de Concorrncia em POSIX como ler e escrever de/para mltiplos dispositivos de I/O simultaneamente Mecanismos de Abstrao em C++0x podemos utilizar abstraes mais confortveis para tratar os problemas acima

Objetivos

Desenvolver um binding POSIX/C++ para sockets

Interface mais limpa:

orientao a objetos programao genrica uma implementao de referncia

Propor um padro para projeto de servidores concorrentes em C++

Estratgias de concorrncia Servidores concorrentes genricos Handlers genricos Implementao de referncia

POSIX/C Sockets

POSIX uma norma que especifica a interface de programao entre sistema operacional e programas de usurio POSIX/C POSIX na linguagem C Sockets so dispositivos para comunicao entre processos A programao de servidores concorrentes utilizando sockets em C possui limitaes:

verificao tediosa de erros informao com mnima tipagem ..?

POSIX/C Socketsstruct addrinfo hint = { AI_PASSIVE, AF_INET, SOCK_STREAM, 0, 0, 0, 0, 0 }; struct addrinfo* ai; int st = getaddrinfo("", "echo", &hint, &ai); if (st != 0) { fprintf(stderr, "%s\n", gai_strerror(status)); exit(1); } sockaddr_storage addr; memcpy(&addr, ai->ai_addr, ai->ai_addrlen); socklen_t addrlen = ai->ai_addrlen; freeaddrinfo(ai);

POSIX/C Sockets

sockaddr_in addr; addr.sin_family = AF_INET; addr.sin_port = htons(7); addr.sin_addr.s_addr = htonl(IPADDR_ANY); socklen_t addrlen = sizeof(sockaddr_in);

POSIX/C Socketsint listener = socket(AF_INET, SOCK_STREAM, 0); if (listener == -1) { perror(NULL); exit(1); } st = bind(listener, (struct sockaddr*)&addr, addrlen); if (status == -1) { perror(NULL); exit(1); } st = listen(listener, SOMAXCONN); if (status == -1) { perror(NULL); exit(1); }

POSIX/C Socketsis_running = 1; while (is_running) { int client = accept(listener, NULL, 0); if (client == -1) { perror(NULL); exit(1); } echo_handler(client); } close(listener);

C++0xC++ C com melhores mecanismos de abstrao C++ e C so normas ISO C++0x a nova reviso da norma C++ Provavelmente ser C++1x quando terminar...

C++0x

Vantagens do C++0x

excees para propagao de erros classes para representao de recursos templates para programao genrica

Como posso utilizar estas vantagens para fazer melhores programas concorrentes utilizando sockets?

excees para evitar o tdio classes para gerncia de recursos funes parametrizadas no tipo do endereo listas de objetos adequadas aos algoritmos genricos

C++0xclass socket { public: socket (); socket (int family, int socktype, int protocol = 0); socket (socket const& x) = delete; socket (socket&& x); ~socket (); socket& operator= (socket const& x) = delete; socket& operator= (socket&& x); // etc. };

C++0xclass socket { template requires SocketAddress void bind (AddressType const& address); void listen (int backlog = SOMAXCONN); socket accept (); };

POSIX/C++ SocketsO mesmo exemplo anterior, reescrito em C++0xaddrinfo hint = { AI_PASSIVE, AF_INET, SOCK_STREAM, 0, 0, 0, 0, 0 }; auto result = posix::getaddrinfo("", "echo", hint); addrinfo const& ai = *(result.begin()); sockaddr_storage addr; memcpy(&addr, ai.ai_addr, ai.ai_addrlen);

POSIX/C++ Sockets

sockaddr_in addr; addr.sin_family = AF_INET; addr.sin_port = htons(7); addr.sin_addr.s_addr = htonl(IPADDR_ANY);

POSIX/C++ Socketsposix::socket listener(AF_INET, SOCK_STREAM); listener.bind(addr); listener.listen(); is_running = 1; while (is_running) { posix::socket client = listener.accept(); echo_handler(std::move(client)); }

POSIX/C++ Sockets

O que ganhei com o Binding? Excees propagam erros automaticamente; o responsvel que capture e trate Notao mais elegante economiza argumentos em chamadas Gerncia de recursos evita vazamentos Programao Genrica sugere reuso...

agora com uma classe socket reusvel, o que seria uma classe servidor reusvel?

Servidor Genrico

Um template de classes uma regra para gerao mecnica de classes Uma classe genrica uma meta-classe, especializvel por outras classes, que definem seu comportamento Uma estratgia reaplicvel, assim como uma meta-classe... ...em tempo de compilao, no de execuo.

Servidor Genrico: Modelo

Servidor Genrico: Modelo

server encapsula o modo de uso de um

mecanismo de concorrncia qualquer

StrategyServer especifica a relao entre server e StrategyHandlers foo_handler implementa o protocolo de aplicao foo, obedecendo a StrategyHandler server gera mecanicamente

classes servidor-do-protocolo-foo

Servidor Genrico: Estratgia

Inicialmente, um loop: uma iterao, um cliente Concorrncia com threads ou processos: iterao/cliente inicia novo

thread processo

Concorrncia com notificao de disponibilidade: um demultiplexador mantm mltiplos clientes

select poll

Servidor Genrico: Aplicaotypedef echo_threaded_handler handler; threaded_server server; addrinfo hint = { AI_PASSIVE, AF_INET, SOCK_STREAM, 0, 0, 0, 0, 0 }; auto result = posix::getaddrinfo("", "echo", hint); server.configure(*result.begin()); server.start(); server(); // main loop

Concluso

POSIX/C possui mecanismos adequados para implementar a concorrncia C++0x possui mecanismos adequados para tornar a implementao mais... confortvel possvel escrever estratgias de concorrncia como meta-classes em C++0x

Trabalhos Futuros

Estratgia: concorrncia com notificao de finalizao de operao Avaliao de Desempenho Handlers para protocolos de aplicao mais complexos Proposta formal no grupo de trabalho