| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 06/04/2006 19:38:13
|
Fabricio Cozer Martins
GUJ Ranger
![[Avatar]](/images/avatar/2ecd2bd94734e5dd392d8678bc64cdab.jpg)
Membro desde: 08/05/2004 10:22:03
Mensagens: 935
Localização: Salvador/Brasil
Offline
|
Olá,
alguém sabe ou tem alguma fonte de estudo sobre como o compilador java gera os códigos que lidam com o mecanismo de monitores ?
|
Fabrício Cozer Martins
Analista de Sistemas
Bacharel em Ciência da Computação da UFBa
Sun Certified Programmer for Java 2 Platform 1.4
Sun Certified Web Component Developer for J2EE 1.4 |
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 06/04/2006 19:39:47
|
thingol
Moderador
Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline
|
Hum, isso é coisa para o Osvaldo Doederlein. Nem vou tentar olhar no fonte do JDK que não vou achar onde é que isso é implementado em C - ou melhor, como é que o HotSpot faz isso.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 06/04/2006 19:48:05
|
louds
Moderador
![[Avatar]](/images/avatar/1e48c4420b7073bc11916c6c1de226bb.jpg)
Membro desde: 29/04/2003 23:09:15
Mensagens: 4061
Localização: São Paulo
Offline
|
Fabrício Cozer Martins wrote:Olá,
alguém sabe ou tem alguma fonte de estudo sobre como o compilador java gera os códigos que lidam com o mecanismo de monitores ?
Você se refere ao javac, gcj ou ecj? Eles simplemente geram instruções monitor enter e monitor exit no bytecode dos métodos. Os métodos wait, notify e notifyAll não recebem tratamento especial.
|
http://www.kumpera.net/blog/
http://www.mono-project.com/
"Each individual should work for himself. People will not sacrifice themselves for the company. They come to work at the company to enjoy themselves."
Soichiro Honda |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 06/04/2006 19:50:56
|
thingol
Moderador
Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline
|
Hum, estava pensando no que o HotSpot fazia com esses bytecodes monitorenter e monitorexit. Acho que mirei no problema errado.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 06/04/2006 19:57:24
|
Fabricio Cozer Martins
GUJ Ranger
![[Avatar]](/images/avatar/2ecd2bd94734e5dd392d8678bc64cdab.jpg)
Membro desde: 08/05/2004 10:22:03
Mensagens: 935
Localização: Salvador/Brasil
Offline
|
hun ... blza o monitorenter e o monitorexit ainda seriam níveis mais altos, queria saber de fato como o javac, ou outro, traduz isso em semáforos ? Queria ver se daria pra ter alguma visão do código é feito pra isso, ou se não, quem ficaria responsável pra tratar isso, a jvm ?
|
Fabrício Cozer Martins
Analista de Sistemas
Bacharel em Ciência da Computação da UFBa
Sun Certified Programmer for Java 2 Platform 1.4
Sun Certified Web Component Developer for J2EE 1.4 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 06/04/2006 20:02:22
|
thingol
Moderador
Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline
|
Conforme o Louds disse, o compilador gera apenas os bytecodes "monitorenter" e "monitorexit".
Esses bytecodes são interpretados e/ou compilados pela JVM, e ela está à vontade para gerar locks, spin locks, usar primitivas de sincronização do sistema operacional, o que for necessário para que isso funcione. Só que os detalhes exatos (para o Windows, por exemplo) eu não conheço, preciso consultar alguma referência - ou ver o fonte do JDK
Ela pode fazer otimizações à vontade com eles, por exemplo, pode simplesmente não criar um lock se isso for provado necessário. Mas se um lock é gerado usando-se WaitforSingleObject ou outra API eu não tenho a menor idéia.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 06/04/2006 20:12:35
|
thingol
Moderador
Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline
|
Nada como dar uma olhadinha no fonte - existe um fonte chamado hotspot\src\cpu\i486\vm\c1_MacroAssembler_i486.cpp (baixe os fontes do JDK completos) que contém a descrição do que o HotSpot gera. Não é muito trivial...
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 06/04/2006 20:15:05
|
louds
Moderador
![[Avatar]](/images/avatar/1e48c4420b7073bc11916c6c1de226bb.jpg)
Membro desde: 29/04/2003 23:09:15
Mensagens: 4061
Localização: São Paulo
Offline
|
As JVMs modernas usam o já comum esquema de thinlocks com fat lock upgrade.
Isso significa que para o caso comum, sem contenção, basta uma operação atomic-test-and-set para adquirir o monitor. Caso outra thread possua o lock para esse objeto então ocorre um upgrade e uma primitiva de lock do SO é associada a esse objeto.
Se você quiser uma descrição bem detalhada disso sugiro ler os papers do pessoal da Sun sobre o assunto (procura no citeseer por thinlocks) ou então leia a tese de doutorado do Etienne Gagnon sobre a SableVM.
|
http://www.kumpera.net/blog/
http://www.mono-project.com/
"Each individual should work for himself. People will not sacrifice themselves for the company. They come to work at the company to enjoy themselves."
Soichiro Honda |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 06/04/2006 20:20:54
|
thingol
Moderador
Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline
|
No caso do Pentium a JVM gera a instrução CMPXCHG para o "atomic-test-and-set", e um jump condicional para um label que ela chama de "slow_case" para essa chamada ao SO. Se a máquina for multiprocessada ela também tem de fazer a coerência dos caches.
Obrigado pela referência, Louds.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 06/04/2006 20:23:55
|
Fabricio Cozer Martins
GUJ Ranger
![[Avatar]](/images/avatar/2ecd2bd94734e5dd392d8678bc64cdab.jpg)
Membro desde: 08/05/2004 10:22:03
Mensagens: 935
Localização: Salvador/Brasil
Offline
|
valeu mestres! vou procurar sobre isso que vocês mencionaram aqui!
|
Fabrício Cozer Martins
Analista de Sistemas
Bacharel em Ciência da Computação da UFBa
Sun Certified Programmer for Java 2 Platform 1.4
Sun Certified Web Component Developer for J2EE 1.4 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 06/04/2006 21:37:51
|
louds
Moderador
![[Avatar]](/images/avatar/1e48c4420b7073bc11916c6c1de226bb.jpg)
Membro desde: 29/04/2003 23:09:15
Mensagens: 4061
Localização: São Paulo
Offline
|
thingol wrote:No caso do Pentium a JVM gera a instrução CMPXCHG para o "atomic-test-and-set", e um jump condicional para um label que ela chama de "slow_case" para essa chamada ao SO. Se a máquina for multiprocessada ela também tem de fazer a coerência dos caches.
Obrigado pela referência, Louds.
Sim, no caso do P4 e Athlon64 um read/write barrier são usados em volta dessas operações.
|
|
|
 |
|
|