Threads, ordem de execução e Microarquiteturas de processadores

Bom dia meus caros,

Estou com uma curiosidade!

O motivo de a ordem de execução das threads nunca ser conhecida tem alguma ligação com a execução fora de ordem que alguns processadores implementam? Tipo Tomasulo e Scoreboarding?

Ou é algo relacionado só com a JVM?

Alguém tem alguma coisa que possa sanar essa minha dúvida?

Falar que threads tem ou não tem ordem de execução não é bem correto.

Se você inicia 5 threads juntas, elas vão executar em paralelo ao mesmo tempo. Nenhuma vai esperar outra terminar para começar.

E entre elas, saber qual vai terminar primeiro também é impossível, pois isso depende de fatores como o Hardware, o OS, a linguagem, recursos e sua lógica.

Por fim, se você precisa executar threads em ordem, você pode fazer isso criando uma fila.

Falou.

Isso!

Você só repetiu o que eu tinha falado.

Minha curiosidade é saber o porque, de fato, de as threads não ter hora para serem executadas!

E se isso tem alguma coisa a ver com a execução fora de ordem de alguns processadores ou com alguma implementação da JVM.

Todo mundo que já estudou thread sabe que a resposta sobre que ordem as threads são executadas é “depende!” eu queria entender esse depende e saber se tem alguma relação com a microarquitetura do processador ou a implementação da JVM.

Sacou?

PH

Hardware, OS e a linguagem. É esse conjunto que define como que as thread vão se comportar.

Falou.

Certo, mas tem algum documento que me explique isso?

Ou alguma coisa explicando o porquê?

Thx,
PH

A execução “fora de ordem” não tem muito a ver com o sistema operacional que está executando nesse processador. Isso é um detalhe de implementação desse processador, e essa execução pode ocorrer mesmo se o sistema operacional só permitir um único processo de cada vez (além, é claro, das interrupções de hardware).

A ordem não-determinística de execução das threads de um programa é característica de sistemas onde o agendamento das threads ou processos a serem executados não é colaborativo mas sim preemptivo (como a maioria dos sistemas operacionais atuais que não são de “real-time”).

Se você precisar ter ordem determinística, é necessário usar algum outro esquema.

Cara… nunca estudei a fundo sobre isso e posso estar viajando longe… mas pode ter alguma coisa a ver com o gerenciamento de processos, comutação de processos e o quantum ( tempo de processamento )… o SO define as prioridades de execução e aí entao tudo vai sendo executado… lendo o q eu escrevi acho que não tem muito a ver, mas li algo a respeito disso… vou procurar…

O OS tem tudo a ver com as threads sim.

Por exemplo, um OS pode emular threads mesmo se o processador não suporta isso. Logico que não estou falando do Java nesse exemplo.

Agora pensando no Java, a JVM não consegue criar as threads diretamente no processador, logo ela tem que pedir para o OS fazer isso. Se fosse só isso, o OS já iria fazer parte do processo, mas tem muito mais coisas além disso.

Falou.

Hum, estou começando a entender!

A implementação de OOO feita pelo hardware independe daquilo acima dele. Faz todo sentido.

A JVM estará vinculada à ordem definida pelo SO!

Estou me satisfazendo!

Se os colegas conseguirem algum material legal explicando isso eu agradeço!

[quote=bruno.fantin]O OS tem tudo a ver com as threads sim.

Por exemplo, um OS pode emular threads mesmo se o processador não suporta isso. Logico que não estou falando do Java nesse exemplo.

Agora pensando no Java, a JVM não consegue criar as threads diretamente no processador, logo ela tem que pedir para o OS fazer isso. Se fosse só isso, o OS já iria fazer parte do processo, mas tem muito mais coisas além disso.

Falou.[/quote]

Acho que o colega estava falando de OOO e não da ordem não-determinística de execução das threads. :slight_smile:

Pelo que li sobre Threads em Java, a ordem de execução das threads vai depender do implementação do gerenciador de threads da JVM.
Há implementações que simplesmente repassam as threads pro SO, e esse faz o escalonamento de acordo com o numero de processadores, usando algoritmos próprios.
Aí vai todo aquele estudo sobre gerenciamento de tarefas dependendo da arquitetura dos processadores e dos algorimos que os Sistemas Operacionais utilizam.
Outras implementam seu proprio ambiente multithreading. Não sei exatamente o que acontece nesse caso, mas como um recurso de hardware será requerido, nao vejo como o SO nao influenciar nisso.
Dei uma olhada em várias coisas, mas esse artigo me pareceu bem completo: http://pt.scribd.com/doc/51574116/12/Forma-de-escalonamento-de-threads

Teremos que pesquisar sobre “Escalonamento de Threads” em java.