Dlaczego ustalanie priorytetów procesów nie powoduje poprawy prędkości?


18

Mam 2 aplikacje, które wykorzystują dużo zasobów systemowych. Kiedy zmniejszam priorytet jednego w Menedżerze zadań, jednocześnie zwiększając drugi, nie zauważam żadnej znaczącej poprawy prędkości w aplikacji o wyższym priorytecie.

Dlaczego to? Czy dzieje się coś więcej, czy jest jeszcze coś do zrobienia?


6
To jest jak prawdziwe życie. Jeśli masz wyższy priorytet na wejście do samolotu niż inny pasażer, nie oznacza to, że lot zajmie Ci mniej czasu!
Mehrdad

Odpowiedzi:


28

Priorytet nie pomaga, gdy wąskim gardłem jest sam procesor. Rzeczywisty priorytet ma wpływ na algorytm planowania używany przez system operacyjny do określania, który proces zostanie uruchomiony w następnej kolejności, ponieważ w większości systemów nie ma wystarczającej liczby procesorów do ciągłego uruchamiania każdego procesu.

Zadanie o wyższym priorytecie szybciej dotrze na szczyt kolejki, więc pomaga to z ogólnym opóźnieniem, ale jeśli proces wyczerpuje cały przedział czasu, jest on przydzielany na faktyczne obliczenia, to harmonogram niczego tam nie zmieni. Zmiana priorytetu jest bardziej przydatna, gdy masz proces oczekujący na operacje we / wy i chcesz, aby był bardziej responsywny.


5
Priorytet pomaga, gdy wąskim gardłem jest zbyt wiele wątków, które można uruchomić. Wątki o wyższym priorytecie w systemie Windows, które mogą być uruchamiane pod koniec swojej szczeliny czasowej, otrzymają kolejną szansę na uruchomienie zamiast wątku o niższym priorytecie (Windows próbuje nie zagłodzić wątków o niskim priorytecie i czasami je zwiększa). Priorytet ma niewielki wpływ na wątki oczekujące na operacje we / wy - system Windows tymczasowo zwiększa priorytet wątku po zakończeniu operacji we / wy, w zależności od typu operacji we / wy, na którą czekał.
Mike Dimmick

4

Priorytetem jest czas pracy procesora. Czy wszystkie rdzenie są wykorzystywane w 100% przez cały czas? Jeśli nie, priorytet nie będzie miał wpływu. Dość często procesor nie stanowi wąskiego gardła, a jego zasoby pamięci, dysku lub GPU.


3

Priorytet ma znaczenie tylko wtedy, gdy jest więcej wątków wykonalnych niż dostępne rdzenie procesora. Kiedy tak się dzieje, priorytet kontroluje, które wątki mają zostać uruchomione. W większości systemów nie ma wystarczającej liczby obliczeń, aby można było rywalizować z procesorem: wszystkie wątki są blokowane , czekając na coś. Może to oznaczać, że coś napiszesz, poruszysz myszą, dotkniesz ekranu lub dane dotrą z dysku, sieci, innego podłączonego urządzenia lub inny wątek zakończy pracę na danych krytycznych Struktura. Być może program czeka na odczyt z dysku lub część pamięci, która została zamieniona na odczyt, zamiast jawnego odczytu pliku.

W systemie Windows, harmonogram utrzymuje kolejkę przypisanymi wątków na każdym poziomie priorytetu. Kiedy podejmuje decyzję dotyczącą harmonogramu - albo wątek wyczerpał swoje kwantowe (dozwolony czas, zanim coś innego musi się uruchomić), co oznacza, że ​​kolejny wątek powinien otrzymać zwrot, wątek został zablokowany i nie można go już uruchomić, lub ma wyższy priorytet wątek został odblokowany - zaplanowany zostanie następny wątek w kolejce na najwyższym poziomie priorytetu z dowolnymi działającymi wątkami. Jeśli działający wątek zużył swój kwant, jest on umieszczany na końcu kolejki. Jeśli jest to jedyny wątek na poziomie priorytetu, który można uruchomić, i nie ma innych wątków o wyższym priorytecie, ale nie działających, wątki otrzymają kolejną turę.

W systemach wielordzeniowych / wieloprocesorowych mogą obowiązywać ograniczenia dotyczące rdzeni, na których może działać wątek. Ponadto system stara się utrzymywać wątki na swoim idealnym rdzeniu i w węźle NUMA, aby dane wątku nadal mogły znajdować się w pamięci podręcznej tego rdzenia i mieć szybki dostęp do danych, które utworzył. Wątki będą nadal uruchamiane na nie idealnych rdzeniach, jeśli nie będzie wyboru, co dalej.

System wykorzystuje różne dynamiczne podbicia priorytetów i dynamiczne rozmiary kwantów, dzięki czemu aplikacja na pierwszym planie ma więcej czasu (jeśli tego potrzebuje) niż procesy w tle, a procesy mogą szybko reagować po zakończeniu operacji we / wy (w tym myszy, klawiatury i wprowadzanie za pomocą ekranu dotykowego). Ponadto zwiększanie priorytetów służy do obejścia inwersji priorytetów, w których wątek o wysokim priorytecie czeka na zasób, który obecnie przechowuje wątek o niskim priorytecie. Jeśli działa także wątek o średnim priorytecie, spowoduje to zagłębienie wątku o niskim priorytecie czasu procesora, podtrzymując wątek o wysokim priorytecie. Tak więc wątek o niskim priorytecie jest tymczasowo zwiększany do wyższego priorytetu, dzięki czemu zyskuje czas i, miejmy nadzieję, uwalnia zasoby, których potrzebuje wątek o wysokim priorytecie.

Przed Windows Vista priorytet wątku nie miał wpływu na szybkość operacji we / wy. Od systemu Windows Vista operacje wejścia / wyjścia mogą mieć również priorytet, który domyślnie pochodzi z priorytetu wątku.

Podsumowanie: w dużej mierze nie zobaczysz efektu zmiany priorytetów wątków, chyba że procesor jest mocno obciążony, a nawet wtedy efekt będzie zwykle minimalny. Jeśli proces musi czekać na operacje we / wy lub nie rywalizuje z innymi procesami o czas procesora, działa już najszybciej, jak to możliwe, a zmiana priorytetu nie przyspieszy.


0

Ogólnie rzecz biorąc, dodatkowy wysiłek wymaga, aby program używał więcej niż jednego procesora (przez dodanie wielowątkowości). Więc nawet jeśli program ma najwyższy dostępny priorytet, może używać tylko jednego rdzenia.

Inne możliwe problemy:

  • Program może być nieefektywny / źle napisany
  • Można go spowolnić z powodu „wolnego” dostępu do dysku lub powolnej sieci

0

Nawet zwiększenie priorytetu I / O procesu związanego z I / O niekoniecznie spowoduje, że będzie on działał szybciej. Na przykład, jeśli jest konsumentem danych wytworzonych przez oddzielny, być może zdalny proces, i nadąża za szybkością, z jaką dane źródło wytwarza dane, to nie może jechać szybciej ani mieć większej przepustowości.

W przeciwieństwie do tego, co kategorycznie stwierdzono w pierwszym zdaniu obecnie akceptowanej odpowiedzi ( /superuser//a/752587/322588 ), zmiany priorytetów są najbardziej skuteczne, gdy procesor stanowi wąskie gardło, jak wyjaśniono w odpowiedzi Mike'a Dimmicka ( /superuser//a/752864/322588 ). Co więcej, stwierdzenie w drugim akapicie przyjętej odpowiedzi „jeśli twój proces wyczerpuje cały przedział czasu, który jest przydzielany na faktyczne obliczenia, wówczas planowanie niczego tam nie zmieni” jest całkowicie błędny, chyba że proces ma ogólnie najwyższy priorytet ze wszystkich uruchamialne wątki, ilekroć oczekuje na uruchomienie. Wynika to z faktu, że we wszystkich innych okolicznościach podniesienie priorytetu spowoduje zwiększenie liczby przedziałów czasowych na interwał zegara ściennego.

Mike Dimmick zwrócił uwagę na problemy z tą odpowiedzią kilka dni temu i udzielił znacznie lepszej odpowiedzi, ale pierwsza w niewytłumaczalny sposób nadal zdobywa głosy. Twierdzenie autora, że ​​on tylko głupi swoją odpowiedź dla nas, manekinów, nie jest wiarygodne, ponieważ nie jest to po prostu proste, a nawet uproszczone, jest całkowicie błędne, przynajmniej w odniesieniu do procesów związanych z procesorem.

Oświadczenie: Nie znam pana Dimmicka, choć mogę powiedzieć, że wie, o czym pisze.


Być może źle zrozumiałeś; pytanie było o procesy działa szybciej. Procesy związane z procesorem wyczerpią całą jednostkę planowania (kwantową), a następnie przejdą do kolejki gotowych procesów na końcu. W stacjonarnym systemie operacyjnym, takim jak Windows, oznacza to, że proces ma szansę 1 / kwantowo-częstotliwościową na uruchomienie co sekundę. Zmiana priorytetu (ogólnie) nie zmienia długości jego przedziałów czasowych. Wykonanie zawsze zajmie taką samą liczbę kwantów planowania. Co najważniejsze , w ten sposób system Windows faktycznie mierzy czas wykonywania procesu: liczba zaplanowanych kwantów.
Andon M. Coleman

Proces może zakończyć się wcześniej, ale nadal działał dla tej samej liczby jednostek planowania. Gdy proces związany z operacjami we / wy znajdzie się na liście oczekujących, może uzyskać drugą szansę uruchomienia i wyprzedzić działający proces o niższym priorytecie przed wygaśnięciem kwanty, jeśli operacja we / wy zakończy się. Procesy związane z procesorem nie mają tej swobody, wyczerpują cały przedział czasu, a następnie przechodzą w gotową kolejkę. Możliwe jest ich natychmiastowe uruchomienie, jeśli mają wystarczająco wysoki priorytet, ale nie ma to nic wspólnego ze sposobem, w jaki system Windows mierzy czas wykonania.
Andon M. Coleman

Priorytet oczekującego procesu związanego z operacjami we / wy jest zasadniczo inny i może mieć mierzalny wpływ na zgłaszane środowisko wykonawcze w systemie Windows. Ponownie, Windows mierzy czas działania jako liczbę wygasłych kwantów (nawet jeśli proces spędza 1 ms z 10 ms kwantu faktycznie uruchomionego, a następnie dobrowolnie czeka pozostałe 9 ms na operacje we / wy, jądro systemu Windows liczy to jako 10 ms wartości środowiska uruchomieniowego w trybie użytkownika). Prewencja może pomóc aplikacjom związanym z We / Wy zająć mniej kwantów na zakończenie. Inne jądra (np. Linux) mogą poprawnie mierzyć częściowe kwanty w czasie wykonywania procesu, ale system Windows nie.
Andon M. Coleman

@ AndonM.Coleman Począwszy od Visty, a później tak, może i robi.
Jamie Hanrahan,

@JamieHanrahan: Cóż, zawsze możesz zadzwonić timeBeginPeriod (...), co robi już wszystko interaktywne. Gra zazwyczaj ustawia to na 1, gdy się rozpocznie, i to stosuje interwał planowania 1 ms na całej planszy do wszystkiego, co działa w systemie. Nie jest odizolowany od samego procesu, który to zrobił. Jest to jeden z powodów, dla których ciężko jest brać system Windows na poważnie za wielozadaniowość.
Andon M. Coleman,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.