Jak wygląda wątek/thread od środka?

0

jest klasa std::thread i QThread - i odnośnie tych klas mam pytanie

jak wyglądają te klasy "od środka" ? Czym tak naprawdę jest wątek ? Jak go rozumieć ?

Wiem, że to jest jakiś proces tworzony przez program ale tylko tyle wiem i na tym moja wiedza się kończy. Ktoś opisze w zrozumiały sposób co to jest i jak to rozumieć ? Może być też pseudokod aby łatwiej było zrozumieć

5

@zkubinski:

Nie sądzę, aby ktoś się podjął wyjaśnić.

BTW słowo "proces" już jest zajęte. Proces jest rozumiany jako trwające wykonanie w izolowanej przestrzeni systemowej. Wątek jest o wiele lżejszym tworem, wewnątrz procesu, w tej samej przestrzeni adresowej.

1

Najprościej, to otwórz sobie plik thread w swojej bibliotece standardowej i zobacz. W skrócie, to zależy od platformy. Na linuksie to będzie pthread pod spodem, na windowsie (visual studio) - windowsowe wątki.
Do natywnej implementacji możesz się dobrać poprzez native_handle

Wiem, że to jest jakiś proces tworzony przez program

Wątek to nie proces.

3

Jest taki problem, że na poziomie języka nie wie się za wiele musisz wejść już do kernela.

Języki niskopoziomowe i wysokopoziomowe jak chcą wątek w danym systemie, odniosę się tylko do linuxa, bo windows znam gorzej, w linuxie masz clone syscall do robienia threada i fork do robienia procesa nowego, wewnątrz kernela struct_task zawiera informację o threadach, thread i process nie jest odróżnialny, różnica jest taka, że mmio (memory map input output) jest współdzielony i nie trzeba swapować page tables, ale też to wymaga przez sheduler wykonywania threadów dla tego samego procesu bardzo blisko po sobie, żeby nie trzeba było swapować bo jest to dość kosztowne czasowo.

Przez to wątki współdzielą pamięć ram, a procesy mają swoją własna wirtualną przez co nie naruszają innych.

Sama implementacja to sheduler, który co pewien czasu występuje przerwanie procesora,
Proces ma zapisany dla każdego rdzenia cpu własne dane, jest taka struktura na x86, na x64 tylko służy od przechowywania adresu do stacka kernela.
Np. gs segment zawiera adres do struktury threada.

Potem jak przechodzisz z jednego wątku na inny, to musisz zrzucić wartości wszystkich rejestrów na ten stos, zmienić na inny proces z listy, przemapować mmio jeśli przejście do innego procesu w przypadku wątków pomija się

Raz opisałem cały proces zmiany wątku, ale mogłem niecaly opisać, ale jak będziesz chciał sobie do googlujesz.

1

Na poziomie CPU.

Pojawia się okoliczność do przełączenia wątków, zwykle jest przerwanie od timera, albo z urzadzeń IO, np zakończenie operacji dyskowej.
W tabeli wątków *) jest odnotowane gdzie został czasowo zatrzymany ten, który był jeszcze przed chwilą.
Jest odszukiwany ten, który zamówił operację dyskową, jest przemieszczany stos na zapisany w jego pozycji, i wątek jest budzony.
Aż do następnego przerwania
A żeby to zadziałało (alokowanie strukr RAM potrzebnych do nowego wątku) ppotzrebne jest new Thread() lub odpowiednik.

*) tabela wątków chyba nie jest sprzętowa na żadnym procesorze - koncept w kernelu / bibliotece standardowej np rzeczonej pthresds

4

Nie ma sensu rzucać Ci umiarkowanie zaawansowanym zagadnieniem, kiedy wciąż, mimo nagabywania, nie zapoznałeś się z zaproponowaną Ci literaturą podstawową. Szczególnie, że jedną z polecanych pozycji było „C++ Concurrency in Action”, którego spis treści ma taki fragment:

1.1. What is concurrency?
1.1.1. Concurrency in computer systems
1.1.2. Approaches to concurrency
1.2. Why use concurrency?
1.2.1. Using concurrency for separation of concerns
1.2.2. Using concurrency for performance
1.2.3. When not to use concurrency

Więc, no, ten tego… Poddaję w wątpliwość zadawanie kolejnych pytań, jeśli nie interesują Cię odpowiedzi — a to, że nie interesują Cię odpowiedzi widać po tym, jak podszedłeś do poprzednich odpowiedzi, w szczególności tej, do której piję, która wyszczególniła literaturę i sugerowaną kolejność uczenia się. Nie mówię, że powinieneś już teraz te książki znać na pamięć, ale to, że nawet nie wiesz z grubsza co w nich jest tyle czasu po otrzymaniu tej odpowiedzi w połączeniu z tym, że zadajesz pytania, na które udzieliłyby Ci znacznie rozwleglejszej i bardziej szczegółowej odpowiedzi, niż da się praktycznie osiągnąć na forum internetowym, bardzo mocno sugeruje, że pytasz, by pytać — a nie po to, by wiedzieć.

0

nie znam się na tym ale znalazłem coś takiego -> https://livebook.manning.com/book/c-plus-plus-concurrency-in-action/table-of-contents/

dobre to będzie ? Chodzi o treść tam zawartą.

2
zkubinski napisał(a):

nie znam się na tym ale znalazłem coś takiego -> https://livebook.manning.com/book/c-plus-plus-concurrency-in-action/table-of-contents/

dobre to będzie ? Chodzi o treść tam zawartą.

Będzie. Gdyby nie było, to bym tego nie polecał.

chyba akurat to znalazłem, moja odpowiedź niżej :> - ja myślałem, że dałeś mi literaturę gdzie będę się kręcił przy podstawach non stop... dlatego to olałem

Nie sprawdziłeś (wyszukanie spisu treści w Internecie to może minuta roboty, jak nie mniej), nie zapytałeś, tylko zdecydowałeś się z góry olać, nie dając odpowiadającym znać. OK, Twoja sprawa. Też Cię w takim razie oleję, bo po co mam się produkować, skoro efekt zostanie olany… Skutek dla Ciebie taki sam, a dla mnie mniej roboty.

1

@CloudPro:

BTW dla mnie wspólczesne programowanie asynchroniczne to nie wątki (ok, są w fundamentach, nie neguję) tylko obiekty w rodzaju Future (objaśnienie: generujemy obiekt, który ma coś wykonać, (może posiadać jakieś indywidualne dane) z góry planując, że to nie nastąpi teraz, a w pewnym punkcie czasu / po zajściu jakiś asercji)

2

@ZrobieDobrze: Powiem więcej on to powinien zacząć od lektury systemów operacyjnych stallinga czy innego autora. Żeby zrozumieć co to na poziomie SO wątek, proces itd. Ale obaj wiemy jak będzie :D

0

Poczytaj w internecie. Tu nie jest miejsce na tłumaczenie rzeczy, które łatwo możesz wygooglowac. Temat do zamknięcia.

0

Wątek w C++ jest obiektem, na podstawie którego kompilator produkuje kod, który po uruchomieniu przekaże do systemu operacyjnego:

  • wskaźnik do ciągu instrukcji, które mają się wykonać (konkretniej - do pierwszej instrukcji)
  • rozmiar pamięci, która jest potrzebna dla wątku (obliczone przez kompilator)
  • priorytet wątku
  • różne inne parametry wątku (zależy od systemu operacyjnego)

Do zrozumienia tego wszystkiego potrzebujesz wiedzieć czym są i jak działają:

  • scheduler systemu operacyjnego
  • rejestry procesora
  • stos

Obejrzyj sobie na przykład to: , w systemach mikroprocesorowych systemy operacyjne są znacznie prostsze i łatwiejsze do ogarnięcia.

1 użytkowników online, w tym zalogowanych: 0, gości: 1