• Nenhum resultado encontrado

2.6 Ferramentas para o Desenvolvimento de Programas Concorrentes

2.6.4 Memória Distribuída/Passagem de Mensagem

2.6.4.1 Sockets TCP

Sockets TCP possuem duas classes:Socket e ServerSocket. A comunicação via TCP é formada por um canal de duas vias em que cada extremidade é identificada por um endereço ou um número de porta. Neste tipo de comunicação, antes do envio e recebimento de mensagens as extremidades devem estabelecer uma conexão, ou seja, a máquina cliente deve solicitar uma conexão com a máquina servidora. Esta conexão entre as extremidades permite garantir a entrega das mensagens, inclusive na ordem correta. Abaixo podem ser vistos dois tipos de construtores (CALVERT; DONAHOO,2008;ORACLE,2014):

Socket(InetAddress remoteAddr, int remotePort)

Socket(InetAddress remoteAddr, int remotePort, InetAddress localAddr, int localPort) Estes construtores permitem criar um socket TCP conectado ao endereço e à porta remota especificados pelos parâmetros remoteAddr e remotePort, respectivamente. O primeiro exemplo de construtor não especifica o endereço e a porta local, entretanto esses dados são atribuídos pelo sistema. O programador pode utilizar o segundo exemplo de construtor caso queira especificar o endereço e a porta local (CALVERT; DONAHOO,2008).

ServerSocket() ServerSocket(int localPort)

ServerSocket(int localPort, int queueLimit)

ServerSocket(int localPort, int queueLimit, InetAddress localAddr)

O construtor ServerSocket TCP é responsável por aceitar conexões de entrada em uma porta local especificada. Existem também construtores que permitem especificar o tamanho da fila de conexão e o endereço local. Algumas das operações mais importantes são:

accept() close()

A operaçãoaccept() é usada do lado servidor para esperar que uma conexão seja feita neste socket realizando sua aceitação e a operação close() fecha o socket (CALVERT; DO- NAHOO,2008;ORACLE,2014).

2.6.4.2 Sockets UDP

Sockets UDP realizam uma comunicação sem conexão prévia, ou seja, não é necessário estabelecer um canal de comunicação entre transmissor e receptor. O transmissor apenas envia o datagrama com a mensagem especificando o endereço de destino. Com isso não se tem nenhuma garantia de que o receptor receba a mensagem, ou as receba na ordem correta; porém esta é uma estratégia muito usada em aplicações Voip ou de streaming de vídeo, em que o tempo de resposta é mais importante do que a chegada de todas as mensagens e a manutenção da ordem das mesmas. Os construtores do socket UDP em Java são (CALVERT; DONAHOO,2008;ORACLE,2014):

DatagramSocket() DatagramSocket(int localPort)

DatagramSocket(int localPort, InetAddress localAddr)

Na primeira forma, sem parâmetros, uma porta qualquer disponível no momento é vinculada ao socket, porém, tanto a porta quanto o endereço local podem ser especificados, como mostram a segunda e a terceira opções de construtores. Algumas das operações que podem ser executadas são (CALVERT; DONAHOO,2008):

void close()

void send(DatagramPacket packet) void receive(DatagramPacket packet)

A operação close() impede que datagramas possam ser enviados e recebidos a partir deste socket. As operaçõessend e receive enviam e recebem datagramas, respectivamente. A

2.6. Ferramentas para o Desenvolvimento de Programas Concorrentes 23

comunicação via UDP também utiliza instâncias do construtor DatagramPacket para enviar e receber mensagens. Abaixo seguem exemplos de construtores (CALVERT; DONAHOO,2008;

ORACLE,2014):

DatagramPacket(byte[ ] data, int length) DatagramPacket(byte[ ] data, int offset, int length)

2.6.4.3 Comunicação Coletiva

Em Java existem dois tipos de comunicação coletiva:broadcast e multicast. Com o broadcast todas as máquinas que estão em uma mesma rede local recebem a mesma mensagem. Com o multicast apenas grupos de máquinas associadas a um mesmo endereço multicast recebem a mensagem (CALVERT; DONAHOO,2008;ORACLE,2014).

• Broadcast: utiliza o endereço broadcast local para enviar mensagens para cada máquina. Qualquer máquina da rede local pode enviar uma mensagem para as outras máquinas pertencentes à mesma rede, entretanto esta mensagem não é repassada para fora do roteador (rede externa).

• Multicast: utiliza um endereço multicast (de 224.0.0.0 a 239.255.255.255) que identifica um conjunto de máquinas receptoras. Uma máquina ao enviar uma mensagem para um endereço multicast atingirá um grupo de máquinas que se associaram a este endereço formando um grupo. Os construtores da comunicação multicast em Java são:

MulticastSocket() MulticastSocket(int localPort)

A forma MulticastSocket(int localPort) do construtor especifica um parâmetro localPort que corresponde à porta local. Se a porta local não é especificada, o socket é vinculado a qualquer porta local disponível. Algumas das operações que podem ser executadas são (CALVERT; DONAHOO,2008;ORACLE,2014):

void joinGroup(InetAddress groupAddress) void leaveGroup(InetAddress groupAddress)

As operações joinGroup e leaveGroup são usadas para que uma máquina junte-se ou deixe um grupo, respectivamente.

2.7 Considerações Finais

Neste capítulo foram explorados os principais conceitos que envolvem o desenvolvimento de programas concorrentes.

A programação concorrente tem o potencial para criar programas aptos a realizar com- putações mais rapidamente, minimizando a ociosidade dos recursos. Programas concorrentes também adicionam algumas questões que os tornam mais difíceis de serem desenvolvidos, as quais induzem, muitas vezes, a ocorrência de enganos por parte do programador, resultando em defeitos nas aplicações desenvolvidas. Para contornar esta situação, o teste de programas concorrentes é essencial para a manutenção da qualidade dos softwares. Para tanto, modelos, critérios e ferramentas de teste de programas concorrentes auxiliam os testadores na tarefa de verificar os pontos onde os defeitos estão presentes.

O desenvolvimento de modelos, critérios e ferramentas para este tipo de teste não é uma atividade trivial e desta forma a validação dos mesmos é necessária. Esta validação pode ser feita através da técnica de aferição por benchmarks, em que programas conhecidos como benchmarks podem colocar à prova os modelos, critérios e ferramentas.

25

CAPÍTULO

3

TESTE DE SOFTWARE

3.1 Considerações Iniciais

Considerando que este projeto propõe o desenvolvimento de benchmarks voltados princi- palmente à avaliação do teste estrutural de programas concorrentes, este capítulo apresenta os principais conceitos relacionados ao teste de softwares sequenciais e concorrentes, permitindo uma visão geral sobre seus desafios, limitações e características. A técnica de teste estrutural será vista com mais detalhes, apresentando mais brevemente as demais técnicas e critérios de teste.

O capítulo está estruturado do seguinte modo: na Seção3.2é apresentada a terminologia utilizada na área de teste de software, as fases e etapas que compreendem a atividade de teste e uma breve descrição das técnicas que podem ser utilizadas durante essa atividade. Na Seção

3.3a técnica de teste estrutural para programas sequenciais é detalhada expondo-se algumas definições e conceitos básicos, destacando-se os critérios usados nessa atividade. Na Seção3.4é abordado o teste estrutural no contexto de programas concorrentes especificando-se os desafios existentes e os principais critérios utilizados. Na Seção3.5a arquitetura da ferramenta ValiPar é apresentada e detalhada, visto que a mesma é utilizada neste trabalho para validar os benchmarks desenvolvidos.