2012-10-03 8 views
5

Czy proces z większą liczbą wątków w systemie Linux ma więcej czasu procesora niż proces z jednym wątkiem?Czy proces z większą ilością wątków na Linuksie miałby więcej czasu procesora niż proces z jednym wątkiem?

W procesach i wątkach Linuksa opisana jest przez strukturę zadań oraz scheduling is based on tasks. Znalazłem również this:

Kiedy nowy proces jest tworzony, do_fork() ustawia pole licznika zarówno prądu (rodzica) i P (dziecko) procesy w następujący sposób:

current->counter >>= 1; 
p->counter = current->counter; 

W inne słowa, liczba kleszczy pozostawionych rodzicowi podzielona jest na dwie połowy, jedną dla rodzica i drugą dla dziecka. Odbywa się to, aby uniemożliwić użytkownikom uzyskanie nieograniczonej ilości czasu procesora przy użyciu następującej metody: proces macierzysty tworzy proces potomny, który uruchamia ten sam kod, a następnie zabija się; przez odpowiednie dostosowanie szybkości tworzenia, proces potomny zawsze otrzymywałby nowy kwant przed wygaśnięciem kwantu jego rodzica. Ta sztuczka programowania nie działa, ponieważ jądro nie nagradza widełek. Podobnie, użytkownik nie może nękać niesprawiedliwego udziału procesora, uruchamiając wiele procesów w tle w powłoce lub otwierając wiele okien na graficznym pulpicie. Mówiąc ogólniej, proces nie może obciążać zasobów (chyba że ma przywileje, by dawać sobie politykę w czasie rzeczywistym) poprzez rozwidlenie wielu potomków.

Właściwie nie znalazłem tego w źródłach jądra, ale może to moja wina, może zobaczyłem niewłaściwą wersję jądra.

Ale co stanie się później, czy każdy wątek będzie uczestniczył w tworzeniu harmonogramów, jak w oddzielnym procesie? Czy proces z dziesięcioma wątkami otrzyma dziesięć razy więcej tyknięć niż proces z jednym wątkiem? Co z komunikacją w tym sensie?

Odpowiedz

8

Tak, proces z większą liczbą wątków uzyskałby więcej czasu procesora niż jego konkurenci. Dobrze znanym przypadkiem byłaby kompilacja mavenów, maven używa wielu wątków wymagających dużej mocy obliczeniowej, hogging systemu.

Ale obecny program szeregujący linuksa nie bierze pod uwagę tylko zadań, bierze również pod uwagę grupy kontrolne w hierarchii cpu cgroup. Zatem czas procesora jest dzielony pomiędzy grupy kontrolne, a następnie w każdej grupie kontrolnej czas procesora jest dzielony pomiędzy zadania.

Od wersji 2.6.38 Linux automatycznie umieszcza zadania w różnych grupach cpu na podstawie ich identyfikatorów sesji. Oznacza to, że np. Oddzielne zakładki w konsole/gnome-terminal otrzymują swoją własną grupę kontrolną. Teraz twoja kompilacja maven jest ładnie odizolowana i nie obciąża już systemu. Zobacz opisy pod numerami kernelnewbies i lwn.net.

Zanim 2.6.38 uderzyło w większość systemów, Lennart Poettering pokazał, jak zrobić to ręcznie na skrypcie powłoki pod numerem this LKML message.

I rzeczywiście mają system, w którym biegnę Eclipse i Maven kompiluje, a zmiana z pre-2.6.38 do pre-2.6.38 + wiązania cgroup Lennart (który kładę na /etc/bashrci w moim skrypcie wyrzutni Eclipse) było po prostu idealne. Maven już nie ściąga systemu (nie wiedzielibyście, że istnieje kompilacja mavenów, jeśli nie jest to monitor obciążenia procesora), a Eclipse teraz po prostu ślini się, a nie reszta systemu (ja osiądę za to z Eclipse). Teraz muszę po prostu zaktualizować jądro do wersji z lepszym poziomem zapisu "dirty-page", a ten system będzie bardzo prosty w obsłudze.

+0

Dziękuję za tak szczegółową odpowiedź! Czy to naprawia, że ​​cgroups również w ten sposób ograniczają IO grup? – van

+0

Tak, chociaż nie jestem pewien aktualnego stanu programów planujących operacje we/wy dla złożonych hierarchii, zobacz: http://lwn.net/Articles/427961/ – ninjalj

+0

Próbuję zweryfikować twoje oświadczenie o cpu cgroups na sesję id . I jak mogłem zobaczyć, nie jest to prawda dla mojego laptopa Ubuntu 12.04 http://pastebin.com/0Fjp2BQy. Sytuacja na RedHat 6.3 jest jeszcze gorsza, wszystkie są przetwarzane w jednej grupie "/". Czy to jest specyficzne dla dystrybucji? Albo co robię źle? – van

Powiązane problemy