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?
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
- Estrutura de dados segura para
threads
- Exclusão mútua
- Gerenciamento e execução de
threads
- Fila bloqueante
- Sincronização condicional
- 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
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
- 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