Geração de código dos monitores do java  XML
Índice dos Fóruns » Java Avançado
Autor Mensagem
Fabricio Cozer Martins
GUJ Ranger
[Avatar]

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
[MSN] [ICQ]
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.
[WWW]
louds
Moderador
[Avatar]

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
[ICQ]
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.
[WWW]
Fabricio Cozer Martins
GUJ Ranger
[Avatar]

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
[MSN] [ICQ]
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.
[WWW]
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...
[WWW]
louds
Moderador
[Avatar]

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
[ICQ]
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.
[WWW]
Fabricio Cozer Martins
GUJ Ranger
[Avatar]

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
[MSN] [ICQ]
louds
Moderador
[Avatar]

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.
[ICQ]
 
Índice dos Fóruns » Java Avançado
Ir para:   
Powered by JForum 2.1.8 © JForum Team