2012-03-01 11 views
7

Powiel możliwe:
Would a multithreaded Java application exploit a multi-core machine very well?Dwurdzeniowy wykorzystanie procesora w/pojedynczego wątku Java z systemem

mam zwykły i prosty gwint Java jak to działa na moim dwurdzeniowego maszyny (Windows XP środowisko 32-bitowe)

public static void main(String[] strs) { 

    long j = 0; 
    for(long i = 0; i<Long.MAX_VALUE; i++) 
     j++; 

    System.out.println(j); 
    } 

Spodziewałem się, że przylgnie do jednego CP U, aby w pełni wykorzystać szybką pamięć podręczną (ponieważ w pętli nadal pracujemy z lokalną zmienną j, dlatego jedno użycie procesora byłoby 100%, a drugie byłoby prawie bezczynne. Do mojego zdziwienia, oba procesory są wykorzystywane w około 40% ~ 60% po rozpoczęciu wątku, a wykorzystanie jednego procesora jest nieco wyższe od drugiego.

Moje pytanie brzmi: czy istnieje mechanizm równoważenia obciążenia OS, który uruchamia się po wykryciu niewyrównoważenia? W moim przypadku jest to możliwe, że system operacyjny Windows wykrył, że jeden procesor uderza prawie w 100%, a drugi jest niemal bezczynny, więc okresowo zmienia kolejność wątków na inny procesor?

enter image description here

# Edit1 Znalazłem możliwe wyjaśnienie: http://siber.cankaya.edu.tr/ozdogan/OperatingSystems/ceng328/node130.html

+0

Tak, system operacyjny odrzuci wątki. – Mysticial

+0

Myślę, że to pytanie zostało już odebrane. http://stackoverflow.com/questions/1649402/would-a-multithreaded-java-application-exploit-a-multi-core-machine-very-well – parion

+0

Pamiętaj, że większość programów Java spróbuje użyć jednego rdzenia i pozostanie z jednym rdzeniem, jak dowiedziałem się z Minecraft. Oto historia faceta, który to odkrył ze swoim nowym komputerem http://mlee888.wordpress.com/2006/03/31/java-performance-in-drok-coremultiprocessor-environment/ – parion

Odpowiedz

3

Gdy OS wykonuje wątki, uruchamia każdą nitkę przez pewien okres czasu (powiedzmy 10-20ms), a następnie zapisuje stan wątku, i patrzy na innych wątków biegać.

Teraz, pomimo tego, co można pomyśleć na podstawie wykresu wykorzystania procesora, system operacyjny faktycznie pracuje o wiele więcej wątków niż te z twojego programu. Istnieją wątki z uruchomionymi pętlami UI, wątki oczekujące na I/O, wątki z uruchomionymi usługami w tle itp. Większość wątków spędza większość czasu na blokowaniu czekania na coś.

Powodem, dla którego o tym mówię, jest wyjaśnienie, że z punktu widzenia OS sytuacja jest bardziej złożona, niż mogłoby się wydawać. Istnieje cała masa wątków wykonujących całą masę rzeczy, a system operacyjny próbuje przełączać się między nimi. Załóżmy, że chcesz zaimplementować heurystykę, że jeśli wątek zużył cały swój kwant po raz ostatni, system operacyjny dołoży starań, aby zaplanować go do tego samego rdzenia. OS musi śledzić i brać pod uwagę więcej informacji, a sukces optymalizacji może zależeć od wielu trudnych do przewidzenia czynników.

Ponadto korzyści polegające na powiązaniu nici z rdzeniem często są w praktyce pomijalne, więc systemy operacyjne nie próbują robić tego automatycznie. Zamiast tego eksponują funkcję, która pozwala programistom wyraźnie powiedzieć, że dany wątek powinien być powiązany z rdzeniem, a następnie system operacyjny będzie respektował tę decyzję.

To wydaje się rozsądnym kompromisem: jeśli twoja nić działa lepiej, gdy jest powiązana z rdzeniem, poproś o to OS. Ale system operacyjny nie będzie próbował rozwiązać tego problemu.

1

Jak wspomina, system operacyjny będzie odbijać wątki wokół. Poniższy kod natywny działa również zgodnie z opisem.

int main(int argc, char** argv) 
{ 
    while(true); 
    return 0; 
} 

Jeśli spojrzeć na proces, to ciągle na poziomie 25% (przy użyciu quad-core), ale Monitor zasobów w Windows 7 pokazuje, że żaden z 4 rdzeniami jest w stałym 100%, choć rdzeń 0 ma wyższy poziom wykorzystania niż pozostałe.

Pamięć podręczna między rdzeniami, więc to zachowanie nie oznacza, że ​​pamięć podręczna nie jest używana.

+1

Czy istnieje oficjalne/udokumentowane wyjaśnienie, dlaczego i w jaki sposób system operacyjny odrzuca wątki? – njzhxf

+0

@njzhxf - czy to ma znaczenie? –

+0

@StephenC chciał dowiedzieć się nieco więcej na ten temat – njzhxf

Powiązane problemy