Jakie zasoby są współdzielone między wątkami?

Ostatnio zadano mi pytanie w wywiadzie jaka jest różnica między procesem a wątkiem. Naprawdę, nie znałem odpowiedzi. Pomyślałem przez chwilę i dałem bardzo dziwną odpowiedź.

Wątki mają tę samą pamięć, procesy nie. Po odpowiedzi na to wywiad wywołał u mnie zły uśmiech i wystrzelił do mnie następujące pytania:

Q. czy znasz segmenty, na które program jest podzielony?

Moja odpowiedź: tak (myślałem, że to łatwy) stos, dane, Kod, sterta

P. więc powiedz mi: które segmenty dzielą wątki?

Nie mogłem na to odpowiedzieć i skończyło się na tym, że powiedziałem wszystkie.

Proszę, czy ktoś może przedstawić poprawne i imponujące odpowiedzi na różnicę między procesem a wątkiem?

Author: flow2k, 2009-11-19

12 answers

Masz rację, ale wątki dzielą wszystkie segmenty z wyjątkiem stosu. Wątki mają niezależne stosy wywołań, jednak pamięć w innych stosach wątków jest nadal dostępna i teoretycznie można trzymać wskaźnik do pamięci w lokalnej ramce stosu innego wątku (chociaż prawdopodobnie powinieneś znaleźć lepsze miejsce, aby umieścić tę pamięć!).

 133
Author: Greg Hewgill,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-19 10:48:25

Z Wikipedii (myślę, że byłaby to naprawdę dobra odpowiedź dla rozmówcy: P)

Wątki różnią się od tradycyjnych wielozadaniowy system operacyjny procesy w tym:

  • procesy są zazwyczaj niezależne, podczas gdy wątki istnieją jako podzbiory proces
  • procesy przenoszą znaczne informacje o stanie, podczas gdy wiele wątków również w ramach stanu współdzielenia procesu jako pamięć i inne zasoby
  • procesy mają oddzielne przestrzenie adresowe, natomiast wątki dzielą swoje przestrzeń adresowa
  • procesy oddziałują tylko poprzez system-dostarczone między procesami mechanizmy komunikacji.
  • przełączanie kontekstu między wątkami w tym samym procesie jest zazwyczaj szybsze niż przełączanie kontekstu między procesy.
 47
Author: Jorge Córdoba,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-30 12:31:04

Coś, co naprawdę należy podkreślić, to to, że istnieją naprawdę dwa aspekty tego pytania-aspekt teoretyczny i aspekt implementacji.

Najpierw przyjrzyjmy się aspektowi teoretycznemu. Musisz zrozumieć, czym jest proces koncepcyjnie, aby zrozumieć różnicę między procesem a wątkiem i co jest między nimi dzielone.

Mamy następujący z sekcji 2.2.2 klasyczny model wątku W nowoczesne systemy operacyjne 3e autor: Tanenbaum:

Model procesu oparty jest na dwóch niezależnych koncepcjach: zasobach grupowanie i wykonywanie. Czasami warto je oddzielić; tu wkraczają wątki....

Kontynuuje:

Jednym ze sposobów patrzenia na proces jest to, że jest to sposób na grupa powiązanych zasobów razem. Proces ma przestrzeń adresową zawierające tekst programu i dane, a także inne zasoby. Te zasób może zawierać otwarte pliki, dziecko procesy, oczekujące alarmy, obsługa sygnałów, informacje księgowe i wiele innych. Umieszczając je razem w formie procesu można nimi łatwiej zarządzać. Inną koncepcją procesu jest wątek wykonania, Zwykle skrócony do tylko wątku. Wątek posiada licznik programu, który utrzymuje śledzenie, którą instrukcję należy wykonać dalej. Posiada rejestry, które przytrzymaj jego bieżące zmienne robocze. Posiada stos, który zawiera historia wykonania, z jedną klatką dla każdej procedura wywołana, ale nie ale wrócił z. Chociaż wątek musi wykonać w jakimś procesie, wątek i jego proces są różnymi pojęciami i mogą być traktowane osobno. Procesy służą do grupowania zasobów; wątki czy jednostki są zaplanowane do wykonania na CPU.

Dalej podaje następującą tabelę:

Per process items             | Per thread items
------------------------------|-----------------
Address space                 | Program counter
Global variables              | Registers
Open files                    | Stack
Child processes               | State
Pending alarms                |
Signals and signal handlers   |
Accounting information        |

Powyższe jest tym, czego potrzebujesz, aby wątki działały. Jak zauważyli inni, rzeczy takie jak segmenty są zależne od systemu operacyjnego szczegóły realizacji.

 36
Author: Robert S. Barnes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-22 07:51:07

Powiedz rozmówcy, że zależy to całkowicie od implementacji systemu operacyjnego.

Weźmy na przykład Windows x86. Są tylko 2 segmenty [1], kod i dane. I oba są mapowane do całej przestrzeni adresowej 2GB (liniowej, użytkownika). Base= 0, Limit=2GB. Zrobiliby go, ale x86 nie pozwala na odczyt/Zapis i wykonanie segmentu. Tak więc zrobili dwa i ustawili CS, aby wskazywał na deskryptor kodu, a reszta (DS, ES, SS itp.) aby wskazywała na drugi [2]. Ale oba punkty do tych samych rzeczy!

Osoba przeprowadzająca wywiad z Tobą postawiła Ukryte założenie, że nie twierdzi, a to głupia sztuczka.

Więc odnośnie

Q. więc powiedz mi, który wątek segmentu dzielić?

Segmenty są nieistotne dla pytania, przynajmniej w systemie Windows. Wątki dzielą całą przestrzeń adresową. Jest tylko 1 Segment stosu, SS, i wskazuje dokładnie to samo co DS, ES i CS [2]. cały cholerny użytkownik przestrzeń . 0-2GB. Oczywiście nie oznacza to, że wątki mają tylko 1 stos. Oczywiście każdy ma swój własny stos, ale segmenty x86 nie są używane do tego celu.

Może * nix robi coś innego. Kto wie. Przesłanka, na której opierało się pytanie, została złamana.
  1. przynajmniej dla przestrzeni użytkownika.
  2. From ntsd notepad: cs=001b ss=0023 ds=0023 es=0023
 24
Author: Alex Budovski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-19 11:54:30

Ogólnie Rzecz Biorąc, wątki nazywane są procesem lekkim. Jeśli podzielimy pamięć na trzy sekcje to będzie to: kod, Dane i stos. Każdy proces ma swój własny kod, Dane i sekcje stosu i ze względu na ten kontekst czas przełączania jest trochę wysoki. Aby skrócić czas przełączania kontekstu, ludzie wymyślili koncepcję wątku, który dzieli Dane i segment kodu z innym wątkiem / procesem i ma swój własny segment stosu.

 16
Author: Nimish Thakkar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-05 15:12:53

Proces posiada segment kodu, danych, sterty i stosu. Teraz wskaźnik instrukcji (IP) wątku lub wątków wskazuje na segment kodu procesu. Segmenty danych i sterty są współdzielone przez wszystkie wątki. A co z obszarem stosu? Co to jest właściwie obszar stosu? Jest to obszar utworzony przez proces tylko dla jego wątku do użycia... ponieważ stosy mogą być używane w znacznie szybszy sposób niż stosy itp. Obszar stosu procesu jest podzielony między wątki, tzn. jeśli są 3 wątki, to obszar stosu procesu jest podzielony na 3 części, a każda z nich jest podana do 3 wątków. Innymi słowy, gdy mówimy, że każdy wątek ma swój własny stos, stos ten jest w rzeczywistości częścią obszaru stosu procesów przydzielonego do każdego wątku. Gdy wątek kończy swoje wykonanie, stos wątku jest odzyskiwany przez proces. W rzeczywistości nie tylko stos procesu jest podzielony między wątki, ale cały zestaw rejestrów używanych przez wątek, takich jak rejestry SP, PC i state, są rejestrami proces. Tak więc, jeśli chodzi o współdzielenie, obszary kodu, danych i sterty są współdzielone, podczas gdy obszar stosu jest po prostu podzielony między wątki.

 14
Author: Dhirendra Vikash Sharma,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-20 21:52:00

Wątki dzielą segment kodu i danych oraz stertę, ale nie dzielą stosu.

 12
Author: Kevin Peterson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-19 10:48:05

Wątki udostępniają dane i Kod, podczas gdy procesy tego nie robią. Stos nie jest współdzielony dla obu.

Procesy mogą również współdzielić pamięć, dokładniej kod, np. po Fork(), ale jest to szczegół implementacji i optymalizacja (systemu operacyjnego). Kod współdzielony przez wiele procesów (miejmy nadzieję) zostanie zduplikowany przy pierwszym zapisie do kodu - jest to znane jako copy-on-write . Nie jestem pewien dokładnej semantyki kodu wątków, ale zakładam, że współdzielone kod.

           Process   Thread

   Stack   private   private
   Data    private   shared
   Code    private1  shared2

1 kod jest logicznie prywatny, ale może być udostępniony ze względu na wydajność. 2 nie jestem w 100% pewien.

 5
Author: Daniel Brückner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-19 11:22:53

Threads share everything [1]. Jest jedna przestrzeń adresowa dla całego procesu.

Każdy wątek ma swój własny stos i rejestry, ale wszystkie stosy wątków są widoczne we współdzielonej przestrzeni adresowej.

Jeśli jeden wątek przydzieli jakiś obiekt na swój stos i wyśle adres do innego wątku, oba wątki będą miały równy dostęp do tego obiektu.


Właśnie zauważyłem szerszy problem: myślę, że mylisz dwa zastosowania tego słowa segment .

Format pliku wykonywalnego (np. ELF) zawiera odrębne sekcje, które mogą być określane jako segmenty, zawierające skompilowany kod (tekst), zainicjalizowane dane, symbole linkera, informacje o debugowaniu itp. Nie ma tu segmentów sterty ani stosu, ponieważ są to konstrukcje tylko w trybie runtime.

Te segmenty plików binarnych mogą być mapowane do przestrzeni adresowej procesu oddzielnie, z różnymi uprawnieniami (np. nie-wykonywalny dla zainicjalizowanych danych).

Obszary tej przestrzeni adresowej są używane do różnych celów, takich jak alokacja sterty i stosy wątków, zgodnie z konwencją(wymuszoną przez biblioteki uruchomieniowe języka). To wszystko jest tylko pamięcią i prawdopodobnie nie jest segmentowane, chyba że działasz w trybie wirtualnym 8086. Stos każdego wątku jest kawałkiem pamięci przydzielonej w czasie tworzenia wątku, z bieżącym adresem góry stosu przechowywanym w rejestrze wskaźników stosu, a każdy wątek zachowuje swój własny stos wskaźnik wraz z innymi rejestrami.


[1] OK, wiem: maski sygnałowe, TSS / TSD itp. Przestrzeń adresowa, w tym wszystkie zmapowane segmenty programu, nadal jest jednak współdzielona.

 4
Author: Useless,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-19 11:45:13

W frameworku x86 można podzielić tyle segmentów (do 2^16-1). Dyrektywy ASM SEGMENT / ENDS pozwalają na to, a operatory seg i OFFSET umożliwiają inicjalizację rejestrów segmentu. CS: IP są zwykle inicjowane przez loader, ale dla DS, ES, SS aplikacja jest odpowiedzialna za inicjalizację. Wiele środowisk pozwala na tzw. "uproszczone definicje segmentów".kod, .data,bss,stos itp. i, w zależności od "modelu pamięci" (mały, duży, Kompaktowy itp.) the loader inicjalizuje odpowiednio rejestry segmentów. Zazwyczaj .data,bss,stack i inne zwykłe segmenty (nie robiłem tego od 20 lat, więc nie pamiętam wszystkich) są pogrupowane w jedną grupę - dlatego zwykle DS, ES I SS wskazują na ten sam obszar, ale to tylko po to, aby uprościć sprawy.

Ogólnie wszystkie rejestry segmentów mogą mieć różne wartości w czasie wykonywania. Tak więc pytanie wywiadu było słuszne: który z kodów, danych i stosu jest współdzielony między wątkami. Sterta zarządzanie to coś innego - to po prostu Sekwencja wywołań do systemu operacyjnego. Ale co jeśli w ogóle nie masz systemu operacyjnego, jak w systemie wbudowanym - czy nadal możesz mieć nowy / Usuń w kodzie?

Moja rada dla młodych ludzi-przeczytaj jakąś dobrą książkę o programowaniu montażu. Wydaje się, że programy nauczania są pod tym względem dość ubogie.

 2
Author: George,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-21 07:06:32

Thread share the heap (jest badanie dotyczące sterty specyficznej dla wątku), ale obecna implementacja współdzieli stertę. (i oczywiście kod)

 1
Author: Dani,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-19 10:50:51

W procesie wszystkie wątki współdzielą zasoby systemowe, takie jak pamięć sterty itp. while Thread ma swój własny stos

Więc twoje ans powinny być pamięcią sterty, którą wszystkie wątki dzielą dla procesu.

 0
Author: roshni,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-02 16:25:15