2013-12-09 24 views
14

Czy ktoś mógłby wyjaśnić, czy naprawdę istnieje przewaga przy pisaniu wielowątkowego kodu, który działa na pojedynczym procesorze z pojedynczym rdzeniem? Np. Sposób, który przetwarza strony dokumentu tak, że strony wzajemnie się wykluczają w/r/t wyżej wymienionego fragmentu kodu.Programowanie jedno- i wielowątkowe na jednostorowym procesorze

Na pierwszy rzut oka wydaje się, że nie ma przewagi, ponieważ nie jest możliwe wykonywanie wielowątkowych wierceń. Oznacza to, że system operacyjny musiałby kontekstowo przełączać wątki. Zastanawiam się, czy po prostu kodowanie czegoś w sposób jedno-gwintowy może być bardziej efektywne.

Oczywiście istnieje wiele przypadków, w których pisanie wielowątkowego kodu ma sens, ale znowu moje pytanie sprawdza, czy naprawdę jest to korzystne, gdy aplikacja działa na jednordzeniowym procesorze.

EDIT: uwaga, że ​​nie powiedziałem „wniosek”, ale raczej „fragment kodu” - spojrzeć na moim przykładzie powyżej. Najwyraźniej są korzyści z wielowątkowej aplikacji.

+3

Możesz mieć wątki oczekujące na załadowanie plików, dane sieciowe itp. Nawet jeśli tylko jeden może używać procesora naraz. – zch

+2

Jak zauważyli @zch, aplikacje związane z IO mogą korzystać z wielowątkowych nawet w jednym rdzeniu, chociaż nigdy nie uzyskasz dla nich więcej niż 2X przyspieszenia (jeśli IO stanie się zbyt dużym wąskim gardłem przyspieszenie procesora nie będzie materia według prawa Amidhala).Częstszym powodem jest projektowanie wielowątkowych aplikacji, nawet jeśli masz tylko 1 rdzeń w tym momencie, jest to łatwe do przenoszenia dla wielu rdzeni, kiedy staną się dostępne. O wiele lepiej jest zaprojektować aplikację raz, bez zakodowanych na stałe ograniczeń sprzętowych, a następnie ponownie ją zapisać, gdy pojawi się więcej zasobów sprzętowych. – Michael

+1

@Michael Zgadzam się w przypadku, gdy masz całkowitą pewność, że ostatecznie zostaniesz przeniesiony do systemu wielordzeniowego, ale teraz sprawisz, że kod będzie bardziej skomplikowany z powodu czegoś, co możesz chcieć z nim zrobić w przyszłości. nie jest tego warte. –

Odpowiedz

11

Nadal można czerpać korzyści, ale są one nieco sytuacyjne.

  • W wielu przypadkach podawanie wielu wątków pozwala na pobieranie większej ilości zasobów systemowych z innych procesów. Jest to łatwe do zrównowaŜenia, a kaŜdy wprowadzony wątek dodaje nieco narzutów, ale moŜe być przyczyną.

  • Jeśli masz do czynienia z wieloma potencjalnie blokującymi się zasobami - takimi jak interakcja między plikami IO lub GUI, to wielowątkowość może mieć kluczowe znaczenie.

+1

Nie sądzę, że są one mniej znaczące, szczególnie biorąc pod uwagę drugi element listy wypunktowanej. Mimo to, niezły anwer. +1. – Renan

+0

@ Renen dobry punkt. Edytowane. –

10

Tak, wielowątkowość jest przydatna w jednym rdzeniu. Jeśli jeden wątek w aplikacji zostanie zablokowany, czekając na coś (np. Dane z karty sieciowej lub czekając na zapis danych na dysku), CPU może przełączyć się na inny wątek, aby kontynuować pracę.

BeOS został napisany z wszechobecną wielowątkowością, nawet w czasach procesorów jednordzeniowych. Rezultatem był bardzo responsywny system operacyjny, choć raczej trudny do zaprogramowania system operacyjny.

+0

Świetny post! Ciekawe, czy wielowątkowa aplikacja może wykorzystać inne rdzenie w systemie operacyjnym? (Na przykład widelec JXcore'a NodeJS) –

2

Na jednym procesorem lokalnym aplikacja, która wykorzystuje asynchronicznym (nieblokujące) I/O zostanie nieco bardziej skuteczny niż ten, który wykorzystuje wiele nici blokujące, ponieważ unika się obciążania kontekście przełączania pomiędzy gwintami.

Asynchroniczne operacje we/wy skalują się lepiej niż blokowanie operacji we/wy w wątkach, ponieważ narzut na dodatkową operację we/wy jest minimalny w porównaniu do narzutu tworzenia nowego wątku.

Powiedziawszy to, nie powinieneś generalnie używać jednowątkowych asynchronicznych operacji we/wy w nowych aplikacjach, ponieważ prawie wszystkie nowe procesory są wielordzeniowe. Zamiast tego nadal powinieneś używać asynchronicznych operacji we/wy, ale dzielić pracę między zestaw wątków roboczych za pomocą czegoś jak pulę wątków. Twoja dokumentacja systemu powie Ci idealną liczbę wątków roboczych; zwykle jest równa liczbie dostępnych rdzeni przetwarzających.