A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Removing Unnecessary Synchronization in Java Sérgio Soares Gente.

Apresentações semelhantes


Apresentação em tema: "Removing Unnecessary Synchronization in Java Sérgio Soares Gente."— Transcrição da apresentação:

1 Removing Unnecessary Synchronization in Java Sérgio Soares Gente

2 Sincronização zMétodos/blocos onde apenas um thread executa por vez ybaseado em monitores zGarantir execuções seguras

3 Motivação zSincronizações desnecessárias yobjetos acessíveis apenas por um thread yoverhead 26-60% do tempo de execução y“remover” sincronização

4 Possíveis soluções zIdentificar objetos acessíveis apenas por um thread yverificação manual tediosa e erro-prone ymudanças futuras do programa forçam uma nova análise zDefinir versões não sincronizadas do referido objeto yduplicação de código

5 zRemover em tempo de compilação a sincronização quando a otimização for possível zPrograma de otimização (compilador) yidentifica situações passíveis da remoção de sincronização yrescreve parte do programa removendo as sincronizações desnecessárias A solução proposta

6 Identificando situações de otimização zExcluir os objetos que não podem ser thread-local yobjetos armazenados na heap xs-escaping (stack-escaping) yobjetos acessíveis apenas por variáveis locais na pilha de apenas um thread xs-local

7 s-escaping e s-local algoritmo 1 A CB Pilha do Thread 1 Pilha do Thread 2 A é s-local B é s-escape C é s-escape Heap

8 A CB Pilha do Thread 1 Pilha do Thread 2 A é s-local B é s-local C é s-escape Heap s-escaping e s-local algoritmo 2

9 Algoritmo 2 zs-escaping yobjetos armazenados na heap ou acessíveis por mais de uma pilha (thread) zs-local yobjetos acessíveis apenas por uma única pilha (thread) yobjetos acessíveis apenas por objetos s- local do heap

10 Problema zIdentificar objetos acessíveis apenas por objetos s-local do heap pode levar a algoritmos complexos ytransitividade de acessibilidade ytipos de dados recursivos zSimplificação: objetos acessíveis por mais de um nível de referência de um objeto s- local são s-escaping

11 f-escaping zObjetos referenciados por atributos de objetos s-escaping

12 A análise zEstágio 1 ydetectar objetos s-escaping zEstágio 2 ydetectar objetos f-escaping

13 Restrições da linguagem Um subconjunto de comandos/expressões x = y atribuição a variável x.f = y atribuição a atributo de objeto y = x.f acesso a atributo C.f = y atribuição a atributo de classe y = C.f acesso a atributo de classe x = new T criação de objeto foo(a 1,..., a n ) chamada de método usados para implementar construções de Java como exceções, arrays, retorno de métodos

14 Retorno de métodos o = hashtable.put(x, y) put(hashtable, x, y, o)

15 Detectando objetos s-escaping zDefine conjuntos  s-escape( x )  é vazio inicialmente (representa falso) e durante a análise pode conter o booleano true {T}, indicando que a variável é s-escaping  AS( x )  conjunto das variáveis de um métodos que referenciam o objeto referenciado por x

16  Inicia a análise pelo método main e vai analisando os métodos conforme aparecem as chamadas aos mesmos zAplicar as regras para cada tipo de comando yatribuição yacesso a atributos ychamada de métodos Detectando objetos s-escaping

17 zAtribuição yunir (merge) os Alias Set e a propriedade s- escape das variáveis x = y AS( x )  AS( y ) s-escape( x )  s-escape( y ) Detectando objetos s-escaping Análise flow-insensitive AS( x )  1 AS( y )

18 zAcesso a atributos (incluindo estáticos) ya variável passa a ser s-escaping pois indica que o heap tem uma referência para a mesma ou que a mesma tem uma referência para o heap y = x.f ou x.f = y s-escape( y )  {T} Detectando objetos s-escaping

19 zChamada de métodos ypropaga as restrições impostas aos parâmetros formais dentro do método para os parâmetros reais (depois de analisar o método) foo(a 0,..., a n )  i  [0...n] s-escape( a i )  s-escape( p i )  i tal que connected( p i, return foo ) AS( a i )  1 AS( a n ) Detectando objetos s-escaping a n é o parâmetro real que recebe o retorno do método se houver retorno

20  AS( x.f )  conjunto de variáveis que referenciam o objeto em x.f  f-escape( x )  conjunto vazio ou {T} indicando, quando true, que o objeto referenciado por x também é referenciado pelo atributo de um objeto s-escaping Detectando objetos f-escaping

21 zAtribuição yunir (merge) os Alias Set e a propriedade f- escape das variáveis e dos seus atributos x = y AS( x )  AS( y ) f-escape( x )  f-escape( y ) se s-escape( x )  s-escape( y ) =   f  fields(x, y) AS( x.f )  2 AS( y.f ) Detectando objetos f-escaping AS( x )  2 AS( y ) *

22 zAcesso a atributos x.f = y ou y = x.f se s-escape( x ) =  AS( x.f )  2 AS( y ) se não f-escape( y )  {T} Detectando objetos f-escaping FieldAccess( x.f, y ) O que acontecerá com os Alias Set dos atributos de x.f e de y quando aplicar  2 na recursão? O mesmo código já passou pela fase 1

23 zAcesso a atributos estáticos C.f = y ou y = C.f f-escape( y )  {T} Detectando objetos f-escaping

24 zChamada de métodos Regra 1 - propagar a propriedade f-escape dos parâmetros formais e seus atributos para os parâmetros reais e seus atributos foo(a 0,..., a n )  i  [0...n] f-escape( a i )  f-escape( p i ) se s-escape( a i ) =   i fields( p i ) f-escape( a i.f )  f-escape( p i.f ) Detectando objetos f-escaping

25 zChamada de métodos Regra 2 - propagar as restrições entre parâmetros retornados e variáveis que recebem o retorno foo(a 0,..., a n )  i tal que connected( p i, return foo ) AS( a i )  2 AS( a n ) Detectando objetos f-escaping

26 zChamada de métodos Regra 3 - propagar as restrições entre parâmetros e atributos de outros parâmetros onde haja atribuição entre eles (trata-se como acesso a atributo) foo(a 0,..., a n )  f,p i,p j tal que connected( p i.f, p j ) FieldAccess ( a i.f, a j ) Detectando objetos f-escaping

27 zChamada de métodos Regra 4 - propagar propriedades entre atributos de parâmetros que referenciam um mesmo objeto foo(a 0,..., a n )  f,h,p i,p j tal que connected( p i.f, p j.h ) se s-escape( a i )  s-escape( a j ) =  AS( a i.f )  2 AS( a n.h ) se não se s-escape( a i ) =  f-escape( a i.f )  {T}

28 class Handle { private Object ref = null; synchronized void attach(Object o) { this.ref = o; } Exemplo

29 class Sample { static Handle globalHandle = null; static m() { Handle h1 = createHandle(); Handle h2 = createHandle(); Object o1 = new Object(); Object o2 = new Object(); h1.attach(o1); h2.attach(o2); globalHandle = h2; } static Handle createHandle() { return new Handle(); }

30 Exemplo  Vamos analisar o método m da classe Sample

31 h1 h2 o1 o2 Fase 1 - identificando s-escaping return this o s s s s Alias Sets do método m Alias Set do método createHandle Alias Sets do método attach

32 Fase 2 - identificando f-escaping h1 h2 o1 o2 return this o s,f s s ref Alias Sets do método m Alias Set do método createHandle Alias Sets do método attach

33 Conclusão zOtimizar o uso dos objetos que não são f- escape e que possuem métodos sincronizados yotimizar h1

34 Otimização  Definir uma nova subclasse (clone) da classe do objeto a ser otimizado sem sincronizar os métodos como na classe original ( Handle ) zSubstituir no método analisado a instanciação do objeto referenciado por h1 pela nova classe (clone) ypode ser necessário duplicar factory methods

35 Na classe clone zDefinir um construtor que invoca o construtor da superclasse (classe a ser otimizada)  Copiar os métodos da superclasse removendo o qualificador synchronized  Remover qualificadores final  Alterar os qualificadores private para protected

36 A classe clone class Handle$Unsync extends Handle{ public Handle$Unsync() { super(); } public void attach(Object o) { this.ref = o; }

37 A classe e o método otimizados class Sample { //... static m() { Handle h1 = createHandle$Clone1(); Handle h2 = createHandle(); //... } static Handle createHandle$Clone1() { return new Handle$Unsync(); } //... }

38 Bibliografia zRemoving Unnecessary Synchronization in Java. Jeff Bogda and Urs Holzle. Departament of Computer Science. University of California


Carregar ppt "Removing Unnecessary Synchronization in Java Sérgio Soares Gente."

Apresentações semelhantes


Anúncios Google