Um estudo sobre a modularidade de sistemas concorrentes em Java

Trabalho de Graduação

Lucas Inojosa (licf)

Cenário

  • Estagnação do clock dos processadores
  • Domínio do multi-núcleo
  • Necessidade de paralelizar os sistemas
  • Programação concorrente
    • Exige técnicas específicas difíceis de aplicar
    • Facilidade de ocorrer bugs e comportamento não-determinístico

Como mitigar isto?

  • Modularização: uma abordagem
    • Separação de preocupações (concerns)
    • Evitar preocupações tranversais (crosscutting concerns)
    • Concorrência como um conjunto de preocupações

Objetivo

  • Construção de uma ferramenta de análise da modularidade de sistemas concorrentes orientados a objetos
  • Estudo de sistemas concorrentes utilizando esta ferramenta, coletando métricas
  • Buscar uma possível resposta à pergunta:
  • Concorrência é uma preocupação transversal?

Fundamentação

Concorrência

  • Múltiplos fluxos de execução
  • Frequentemente acessam dados em comum
  • Processos ou threads

Exemplos de técnicas

  • Exclusão mútua
  • Sincronização condicional

A dor de cabeça...

  • Deadlocks
  • Livelocks
  • Starvation
  • Condições de corrida

Paralelismo

  • Múltiplos fluxos executando em paralelo
  • Necessário um processador multi-núcleo
  • Ganho de desempenho... se bem paralelizado

Módulos de software

  • Parte de um artefato para ser construído e entendido separadamente
  • Facilita o trabalho de equipes e a separação de preocupações
  • Modularidade = estar bem dividido em módulos
  • Preocupação transversal = mal modularizada

Preocupações transversais = bugs?

  • Estudado por Eaddy et al.
  • Correlação significativa entre métricas de separação de preocupações e bugs

Programação concorrente em Java

  • Thread/Runnable
  • synchronized
  • wait/notify
  • java.util.concurrent

Ferramenta para coleta de métricas

Métricas de trabalhos anteriores

  • CDC (Concern Diffusion over Components)
  • CDO (Concern Diffusion over Operations)
  • CDLOC (Concern Diffusion over Lines of Code)

Métricas de trabalhos anteriores

  • CONT (Program Element Contribution)
  • DOSC (Degree of Scattering across Classes)
  • DOSM (Degree of Scattering across Methods)

Métricas selecionadas

  • CDC (Concern Diffusion over Components)
  • CDO (Concern Diffusion over Operations)
  • CDP (Concern Diffusion over Packages)
  • CDC/TC (Concern Diffusion over Components/Total Classes)
  • CDO/TM (Concern Diffusion over Operations/Total Methods)
  • CDP/TP (Concern Diffusion over Packages/Total Packages)

Por quê estas métricas?

  • Maior facilidade de implementação
  • Menos propenso a erros
  • Mais simples, porém precisa: maior correlação com bugs no trabalho de Eaddy et al. do que DOSC/DOSM.

Preocupações definidas

  1. Estrutura de dados segura para threads
  2. Exclusão mútua
  3. Gerenciamento e execução de threads
  4. Fila bloqueante
  5. Sincronização condicional
  6. Tipos de dados atômicos

Como detectar que um elemento implementa uma preocupação?

Quando há, no seu escopo, referência a alguma das estruturas que compõem a preocupação, através de:

  • Tipos de retorno
  • Declaração de variáveis ou atributos
  • Chamadas de método ou construtor
  • Leitura de uma variável
  • etc ...

Ferramenta

  • Modificação do compilador do OpenJDK 6
  • Varre a árvore sintática abstrata (AST) resultante da análise semântica
  • Gera arquivos de saída com uma lista de declarações
  • Script em Python lê os arquivos de saída e calcula as métricas

Sistemas avaliados

  • Apache Lucene
  • Apache Tomcat
  • Jetty

Resultados

Jetty

Lucene

Tomcat

Média e desvio padrão geral

Análises gerais

  • Analisando CDC/CDO, parece bem modularizadas
  • Analisando CDP, parece bem transversal
  • Exclusão mútua apresenta alta dispersão
  • Fila bloqueante apresenta a menor dispersão

Análises sobre o Jetty

  • Exclusão mútua: transversal
  • CDC/CDO: razoavelmente modularizadas
  • CDP: bem transversal
  • Situação semelhante à média
  • Sistema com maior índice de dispersão entre os três

Análises sobre o Lucene

  • Situação semelhante à média
  • Porém... o mais modular dos três

Análises sobre o Tomcat

  • Situação semelhante à média
  • Tão disperso quanto o Jetty
  • Possui a exclusão mútua mais dispersa de todos!

CDC por pacote: Jetty

CDC por pacote: Lucene

CDC por pacote: Tomcat

Análises

  • Exclusão mútua está mais concentrada em menos pacotes
  • Fila bloqueante está bem espalhada, porém com poucas amostras
  • Lucene novamente se mostra o menos disperso entre todos
  • Jetty e Tomcat se mostram mais transversais em quase todas as preocupações
  • Porém, o Tomcat se mostra um pouco mais modularizado em Exclusão mútua e Gerenciamento/execução de threads

Conclusões

Conclusões

  • Todos os recursos de concorrência são largamente utilizados entre estes sistemas
  • CDC/CDO parecem indicar modularidade, mas...
  • CDP sugere que concorrência, em geral, é uma preocupação transversal, assim como os gráficos
  • Exclusão mútua pode ser considerada transversal
  • Lucene apresentou maior modularidade
    • Necessidade do estudo de mais sistemas