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. 
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.