Jaka jest różnica między procesem a wątkiem?


1640

Jaka jest różnica techniczna między procesem a wątkiem?

Mam wrażenie, że słowo „proces” jest nadużywane, a są też wątki sprzętowe i programowe. A co z lekkimi procesami w językach takich jak Erlang ? Czy istnieje definitywny powód, aby używać jednego terminu nad drugim?



4
Prawdopodobnie gwarantuje, że każdy system operacyjny ma inne pojęcie o tym, co to jest „wątek” lub „proces”. Niektóre systemy operacyjne głównego nurtu nie mają pojęcia „wątku”, są też wbudowane systemy operacyjne, które mają tylko „wątki”.
Neil

Odpowiedzi:


1456

Zarówno procesy, jak i wątki są niezależnymi sekwencjami wykonania. Typowa różnica polega na tym, że wątki (tego samego procesu) działają w przestrzeni pamięci współużytkowanej, podczas gdy procesy działają w osobnych przestrzeniach pamięci.

Nie jestem pewien, do jakich wątków „sprzętowych” a „programowych” możesz się odnosić. Wątki to funkcja środowiska operacyjnego, a nie funkcja procesora (chociaż procesor zazwyczaj wykonuje operacje, dzięki którym wątki są wydajne).

Erlang używa terminu „proces”, ponieważ nie ujawnia modelu wieloprogramowania z pamięcią współużytkowaną. Nazwanie ich „wątkami” oznaczałoby, że mają wspólną pamięć.


56
Wątki sprzętowe prawdopodobnie odnoszą się do wielu kontekstów wątków w rdzeniu (np. HyperThreading, SMT, Sun's Niagara / Rock). Oznacza to między innymi zduplikowane pliki rejestru, dodatkowe bity przenoszone wraz z instrukcją przez potoki i bardziej złożoną logikę omijania / przesyłania.
Matt J

4
@greg, jedna wątpliwość mam w wątkach. rozważmy, że mam proces A, który ma trochę miejsca w pamięci RAM. Jeśli proces A tworzy wątek, wątek potrzebuje również miejsca do wykonania. Czy zwiększy to rozmiar przestrzeni utworzonej dla procesu A, czy przestrzeni dla wątku utworzonego gdzie indziej? więc co tworzy ten proces przestrzeni wirtualnej? Proszę mnie poprawić, jeśli moje pytanie jest błędne. Dzięki
duslabo,

9
@JeshwanthKumarNK: Utworzenie nowego wątku przydziela co najmniej wystarczającą ilość pamięci dla nowego stosu. Ta pamięć jest przydzielana przez system operacyjny w procesie A.
Greg Hewgill

24
Ta odpowiedź wydaje się błędna. Gdyby zarówno procesy, jak i wątki były niezależnymi sekwencjami wykonania, wówczas proces zawierający dwa wątki musiałby mieć trzy sekwencje wykonania, a to nie może być właściwe. Tylko wątek jest sekwencją wykonania - proces jest pojemnikiem, który może pomieścić jedną lub więcej sekwencji wykonania.
David Schwartz

8
„Wątki sprzętowe” to wątki, które otrzymują indywidualne zasoby sprzętowe (oddzielny rdzeń, procesor lub hyperthread). „Wątki oprogramowania” to wątki, które muszą konkurować o tę samą moc przetwarzania.
jpmc26

811

Proces
Każdy proces zapewnia zasoby potrzebne do uruchomienia programu. Proces ma wirtualną przestrzeń adresową, kod wykonywalny, otwarte uchwyty do obiektów systemowych, kontekst bezpieczeństwa, unikalny identyfikator procesu, zmienne środowiskowe, klasę priorytetu, minimalne i maksymalne rozmiary zestawu roboczego oraz co najmniej jeden wątek wykonania. Każdy proces rozpoczyna się od jednego wątku, często nazywanego wątkiem podstawowym, ale może tworzyć dodatkowe wątki z dowolnego z jego wątków.

Wątek
Wątek to jednostka w procesie, którą można zaplanować do wykonania. Wszystkie wątki procesu współużytkują swoją wirtualną przestrzeń adresową i zasoby systemowe. Ponadto każdy wątek obsługuje procedury obsługi wyjątków, priorytet planowania, lokalną pamięć wątków, unikalny identyfikator wątku i zestaw struktur, których system będzie używał do zapisywania kontekstu wątków, dopóki nie zostanie zaplanowane. Kontekst wątku obejmuje zestaw rejestrów maszynowych wątku, stos jądra, blok środowiska wątku i stos użytkownika w przestrzeni adresowej procesu wątku. Wątki mogą mieć również własny kontekst zabezpieczeń, który może być wykorzystywany do podszywania się pod klientów.


Informacje te znaleziono w Dokumentach Microsoft tutaj: O procesach i wątkach

Microsoft Windows obsługuje zapobiegawczą wielozadaniowość, która tworzy efekt jednoczesnego wykonywania wielu wątków z wielu procesów. Na komputerze wieloprocesorowym system może jednocześnie wykonywać tyle wątków, ile jest procesorów na komputerze.


18
Dla osób, które chcą wiedzieć, dlaczego nie można jednocześnie sformatować dyskietki: stackoverflow.com/questions/20708707/…
Computernerd

7
@LuisVasconcellos - Gdyby nie było wątków, proces nic by nie zrobił. Proces ten stanowiłby tylko część kodu i stanu programu załadowanego do pamięci. Nie ma większego zastosowania. To byłoby jak droga bez poruszających się pojazdów.
Scott Langham

4
@LuisVasconcellos - Dobrze. Tak, możesz myśleć o wątku jako czymś, co porusza się po kodzie procesu i wykonuje instrukcje w tym kodzie.
Scott Langham

9
Ta odpowiedź jest znacznie lepsza niż odpowiedź zaakceptowana, ponieważ mówi o ideale procesów i wątków: powinny to być osobne rzeczy z odrębnymi obawami. Faktem jest, że większość systemów operacyjnych ma historię sięgającą dalej niż wynalezienie wątków, w związku z czym w większości systemów operacyjnych obawy te są nadal w pewien sposób uwikłane, nawet jeśli z czasem powoli się poprawiają.
Solomon Slow

4
@BKSpurgeon Z każdym wyjaśnieniem musisz przenieść czytelnika z jednego poziomu zrozumienia na następny poziom. Niestety nie mogę dopasować odpowiedzi do każdego czytelnika, dlatego muszę przyjąć poziom wiedzy. Dla tych, którzy nie wiedzą, mogą dokonywać dalszych wyszukiwań terminów, których używam, których nie rozumieją, prawda, dopóki nie osiągną punktu, który rozumieją. Chciałem zasugerować, że zaproponujesz własną odpowiedź, ale cieszę się, że już ją masz.
Scott Langham,

301

Proces:

  • Wykonująca się instancja programu nazywa się procesem.
  • Niektóre systemy operacyjne używają terminu „zadanie” w odniesieniu do wykonywanego programu.
  • Proces jest zawsze przechowywany w pamięci głównej, zwanej również pamięcią podstawową lub pamięcią o dostępie swobodnym.
  • Dlatego proces jest określany jako aktywny podmiot. Znika, jeśli komputer zostanie ponownie uruchomiony.
  • Kilka procesów może być powiązanych z tym samym programem.
  • W systemie wieloprocesorowym wiele procesów może być wykonywanych równolegle.
  • W systemie jednoprocesorowym, chociaż nie osiągnięto prawdziwej równoległości, stosuje się algorytm szeregowania procesów, a procesor zaplanuje wykonywanie każdego procesu pojedynczo, co daje złudzenie współbieżności.
  • Przykład: Wykonywanie wielu wystąpień programu „Kalkulator”. Każda z instancji jest określana jako proces.

Wątek:

  • Wątek jest podzbiorem procesu.
  • Jest określany jako „lekki proces”, ponieważ jest podobny do rzeczywistego procesu, ale wykonuje się go w kontekście procesu i dzieli te same zasoby, które zostały przydzielone procesowi przez jądro.
  • Zwykle proces ma tylko jeden wątek kontroli - jeden zestaw instrukcji maszyny wykonywanych jednocześnie.
  • Proces może również składać się z wielu wątków wykonania, które wykonują instrukcje jednocześnie.
  • Wiele wątków kontroli może wykorzystać prawdziwą równoległość możliwą w systemach wieloprocesorowych.
  • W systemie jednoprocesorowym stosowany jest algorytm szeregowania wątków, a procesor ma uruchamiać każdy wątek jeden po drugim.
  • Wszystkie wątki uruchomione w procesie mają tę samą przestrzeń adresową, deskryptory plików, stos i inne atrybuty związane z procesem.
  • Ponieważ wątki procesu współużytkują tę samą pamięć, synchronizacja dostępu do współdzielonych danych w procesie zyskuje niespotykane znaczenie.

Pożyczyłem powyższe informacje z zadania Quest wiedzy! blog .


90
Kumar: Z mojej wiedzy nici nie mają tego samego stosu. W przeciwnym razie nie byłoby możliwe uruchomienie innego kodu na każdym z nich.
Mihai Neacsu,

27
Tak, myślę, że @ MihaiNeacsu ma rację. Wątki współużytkują „kod, dane i pliki” i mają własne „rejestry i stos”. Slajd z mojego kursu OS: i.imgur.com/Iq1Qprv.png
Shehaaz

Jest to bardzo przydatne, ponieważ rozwija się na temat wątków i procesów oraz ich wzajemnych relacji. Sugeruję dodanie przykładu Wątku, zwłaszcza, że ​​istnieje jeden dla Procesu. Dobry towar!
Smithers,

1
Linki do Kquest.co.cc są martwe.
Elijah Lynn

1
@ Rndp13 Problem polega jedynie na użyciu słowa „stos” zamiast „stosy”. Wątki dzielą stosy, ponieważ stos jest tylko częścią pamięci wirtualnej, a wątki dzielą całą pamięć wirtualną. Wątki mogą nawet ukrywać swoje wskaźniki stosu, a wykonywanie może zostać wznowione przez inny wątek bez żadnych problemów. To, że jeden wątek wykonuje jeden stos jednocześnie, nie oznacza, że ​​wątki nie współużytkują stosów, podobnie jak fakt, że jeden wątek działa na deskryptorze pliku jednocześnie, nie oznacza, że ​​wątki nie współużytkują deskryptorów plików .
David Schwartz

127

Najpierw spójrzmy na aspekt teoretyczny. Musisz zrozumieć, czym jest proces, aby zrozumieć różnicę między procesem a wątkiem i co jest między nimi wspólne.

W sekcji 2.2.2 Klasyczny model wątku w nowoczesnych systemach operacyjnych 3e autorstwa Tanenbaum:

Model procesu opiera się na dwóch niezależnych koncepcjach: grupowaniu zasobów i wykonywaniu. Czasami warto je rozdzielić; tutaj pojawiają się wątki ....

On kontynuuje:

Jednym ze sposobów patrzenia na proces jest to, że jest to sposób grupowania powiązanych zasobów. Proces ma przestrzeń adresową zawierającą tekst i dane programu, a także inne zasoby. Zasoby te mogą obejmować otwarte pliki, procesy potomne, oczekujące alarmy, procedury obsługi sygnałów, informacje księgowe i inne. Łącząc je w formie procesu, można nimi łatwiej zarządzać. Inną koncepcją procesu jest wątek wykonania, zwykle skracany do samego wątku. Wątek ma licznik programu, który śledzi, która instrukcja ma zostać wykonana w następnej kolejności. Posiada rejestry, które przechowują bieżące zmienne robocze. Ma stos, który zawiera historię wykonania, z jedną ramką dla każdej procedury wywoływanej, ale jeszcze nie zwróconej. Chociaż wątek musi zostać wykonany w pewnym procesie, wątek i jego proces są różnymi koncepcjami i mogą być traktowane osobno. Procesy są używane do grupowania zasobów; wątki to jednostki zaplanowane do wykonania na CPU.

Dalej znajduje się następująca tabela:

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        |

Zajmijmy się kwestią wielowątkowości sprzętowej . Klasycznie procesor obsługiwałby pojedynczy wątek wykonania, utrzymując stan wątku za pomocą jednego licznika programu i zestawu rejestrów. Ale co się stanie, jeśli wystąpi błąd w pamięci podręcznej? Pobieranie danych z pamięci głównej zajmuje dużo czasu, a procesor po prostu siedzi bezczynnie. Więc ktoś wpadł na pomysł, aby w zasadzie mieć dwa zestawy stanu wątku (PC + rejestry), aby inny wątek (może w tym samym procesie, może w innym procesie) mógł wykonać pracę, podczas gdy drugi wątek czeka na głównej pamięci. Istnieje wiele nazw i implementacji tej koncepcji, takich jak HyperThreading i Simultaneous Multithreading (w skrócie SMT).

Teraz spójrzmy na stronę oprogramowania. Istnieją zasadniczo trzy sposoby implementacji wątków po stronie oprogramowania.

  1. Wątki w przestrzeni użytkownika
  2. Wątki jądra
  3. Połączenie tych dwóch

Wszystko, czego potrzebujesz do wdrożenia wątków, to możliwość zapisania stanu procesora i utrzymania wielu stosów, co w wielu przypadkach można zrobić w przestrzeni użytkownika. Zaletą wątków przestrzeni użytkownika jest super szybkie przełączanie wątków, ponieważ nie trzeba pułapkować do jądra i możliwość planowania wątków w dowolny sposób. Największą wadą jest niemożność blokowania operacji we / wy (która blokowałaby cały proces i wszystkie jego wątki użytkownika), co jest jednym z głównych powodów, dla których używamy wątków w pierwszej kolejności. Blokowanie We / Wy za pomocą wątków znacznie upraszcza projektowanie programów w wielu przypadkach.

Wątki jądra mają tę zaletę, że mogą korzystać z blokowania we / wy, pozostawiając wszystkie problemy z planowaniem systemowi operacyjnemu. Ale każdy przełącznik wątku wymaga pułapkowania w jądrze, co jest potencjalnie względnie wolne. Jeśli jednak przełączasz wątki z powodu zablokowanych operacji we / wy, nie jest to tak naprawdę problemem, ponieważ operacja we / wy prawdopodobnie uwięziła cię już w jądrze.

Innym podejściem jest połączenie tych dwóch, z wieloma wątkami jądra, z których każdy ma wiele wątków użytkownika.

Wracając do pytania o terminologię, możesz zobaczyć, że proces i wątek wykonania to dwie różne koncepcje, a wybór tego terminu zależy od tego, o czym mówisz. Jeśli chodzi o termin „lekki proces”, nie widzę w tym sensu, ponieważ tak naprawdę nie oddaje tego, co się dzieje, ani terminu „wątek wykonania”.


4
Znakomita odpowiedź! Rozbija wiele żargonu i założeń. To sprawia, że ​​ta linia wyróżnia się jako niezręczna: „Więc ktoś wpadł na pomysł, aby w zasadzie mieć dwa zestawy stanu wątku (PC + rejestry)” - o czym jest tutaj mowa „PC”?
Smithers,

2
@Smithers PC to licznik programu lub wskaźnik instrukcji, który podaje adres następnej instrukcji do wykonania: en.wikipedia.org/wiki/Program_counter
Robert S. Barnes


Dlaczego „Stosu” nie ma na liście „Pozycje na proces”? Zarówno procesy, jak i wątki mają swój własny stos.
stackoverflowuser2010

1
@ stackoverflowuser2010 nie tylko wątki mają stosy. To, co nazywasz procesem, to proces z jednym wątkiem wykonania i to wątek ma stos, a nie proces.
Robert S. Barnes

100

Aby wyjaśnić więcej na temat programowania współbieżnego

  1. Proces ma niezależne środowisko wykonawcze. Proces na ogół ma pełny, prywatny zestaw podstawowych zasobów w czasie wykonywania; w szczególności każdy proces ma własną przestrzeń pamięci.

  2. Wątki istnieją w ramach procesu - każdy proces ma co najmniej jeden. Wątki współużytkują zasoby procesu, w tym pamięć i otwarte pliki. To sprawia, że ​​komunikacja jest wydajna, ale potencjalnie problematyczna.

Pamiętając o przeciętnej osobie,

Na komputerze otwórz program Microsoft Word i przeglądarkę internetową. Te dwa procesy nazywamy .

W Microsoft Word wpiszesz coś, co zostanie automatycznie zapisane. Teraz zauważyłeś, że edycja i zapisywanie odbywa się równolegle - edycja w jednym wątku i zapisywanie w drugim wątku.


14
Znakomita odpowiedź, sprawia, że ​​wszystko jest proste i stanowi przykład, do którego może odnosić się każdy użytkownik nawet oglądający pytanie.
Smithers,

7
edycja / zapisywanie było dobrym przykładem dla wielu wątków w procesie!

53

Aplikacja składa się z jednego lub więcej procesów. Najprościej mówiąc, proces jest programem wykonawczym. Jeden lub więcej wątków jest uruchamianych w kontekście procesu. Wątek jest podstawową jednostką, do której system operacyjny przydziela czas procesora. Wątek może wykonać dowolną część kodu procesu, w tym części aktualnie wykonywane przez inny wątek. Fibre to jednostka wykonawcza, którą aplikacja musi ręcznie zaplanować. Włókna są uruchamiane w kontekście wątków, które je planują.

Skradziony stąd .


W innych systemach operacyjnych, takich jak Linux, nie ma praktycznej różnicy między tymi dwoma na poziomie systemu operacyjnego, z tym wyjątkiem, że wątki zwykle dzielą tę samą przestrzeń pamięci, co proces macierzysty. (Stąd moja opinia)
Arafangion

1
Dobra odpowiedź (szczególnie w przypadku zaliczania), ponieważ pokazuje związek między nimi i prowadzi do łatwo oczekiwanego „następnego pytania” (dotyczącego włókien).
Smithers,

29

Proces to zbiór kodu, pamięci, danych i innych zasobów. Wątek to sekwencja kodu wykonywana w ramach procesu. Możesz (zwykle) mieć wiele wątków działających jednocześnie w ramach tego samego procesu.


27

Przykład procesu i wątku w świecie rzeczywistym To daje podstawowe pojęcie o wątku i procesie wprowadź opis zdjęcia tutaj

Pożyczyłem powyższe informacje od odpowiedzi Scotta Langhama - dzięki


25

Proces:

  1. Proces jest procesem ciężkim.
  2. Proces to osobny program, który ma osobną pamięć, dane i zasoby ect.
  3. Proces jest tworzony za pomocą metody fork ().
  4. Przełączanie kontekstu między procesem jest czasochłonne.

Przykład:
powiedzmy, otwierając dowolną przeglądarkę (mozilla, Chrome, IE). W tym momencie rozpocznie się nowy proces.

Wątki:

  1. Wątki są procesami lekkimi. Gwinty są wiązane w procesie.
  2. Wątki mają wspólną pamięć, dane, zasoby, pliki itp.
  3. Wątki są tworzone za pomocą metody clone ().
  4. Przełączanie kontekstu między wątkami nie zajmuje dużo czasu jako proces.

Przykład:
otwieranie wielu kart w przeglądarce.


W świecie Windows masz rację, ale w Linuksie każdy „wątek” jest procesem i jest równie „ciężki” (lub lekki).
Neil

22
  • Każdy proces jest wątkiem (wątek główny).
  • Ale każdy wątek nie jest procesem. Jest to część (byt) procesu.

3
Czy możesz wyjaśnić to nieco dalej i / lub podać jakieś dowody?
Zim84

15

Zarówno wątki, jak i procesy są atomowymi jednostkami alokacji zasobów systemu operacyjnego (tzn. Istnieje model współbieżności opisujący podział czasu procesora między nimi oraz model posiadania innych zasobów systemu operacyjnego). Istnieje różnica w:

  • Współużytkowane zasoby (wątki z definicji współużytkują pamięć, nie są właścicielami niczego oprócz stosu i zmiennych lokalnych; procesy mogą również współużytkować pamięć, ale istnieje oddzielny mechanizm utrzymywany przez system operacyjny)
  • Przestrzeń alokacji (przestrzeń jądra dla procesów vs. przestrzeń użytkownika dla wątków)

Greg Hewgill powyżej miał rację co do znaczenia słowa „proces” w języku Erlang, a tutaj jest dyskusja na temat tego, dlaczego Erlang mógł wykonywać procesy lekkie.


13

Zarówno procesy, jak i wątki są niezależnymi sekwencjami wykonania. Typowa różnica polega na tym, że wątki (tego samego procesu) działają w przestrzeni pamięci współużytkowanej, podczas gdy procesy działają w osobnych przestrzeniach pamięci.

Proces

Jest programem w trakcie wykonywania. ma sekcję tekstową, tj. kod programu, bieżącą aktywność reprezentowaną przez wartość licznika programu i zawartość rejestru procesorów. Zawiera także stos procesów, który zawiera dane tymczasowe (takie jak parametry funkcji, zmienne adresowane i lokalne) oraz sekcję danych, która zawiera zmienne globalne. Proces może również zawierać stertę, która jest pamięcią dynamicznie przydzielaną w czasie wykonywania procesu.

Wątek

Wątek jest podstawową jednostką wykorzystania procesora; zawiera identyfikator wątku, licznik programu, zestaw rejestrów i stos. dzielił się z innymi wątkami należącymi do tego samego procesu, jego sekcję kodu, sekcję danych i inne zasoby systemu operacyjnego, takie jak otwarte pliki i sygnały.

- Zaczerpnięte z systemu operacyjnego przez Galvina


13

http://lkml.iu.edu/hypermail/linux/kernel/9608/0191.html

Linus Torvalds (torvalds@cs.helsinki.fi)

Wt, 6 sierpnia 1996 12:47:31 +0300 (EET DST)

Wiadomości posortowane według: [data] [wątek] [temat] [autor]

Następna wiadomość: Bernd P. Ziller: „Re: Ups w get_hash_table”

Poprzednia wiadomość: Linus Torvalds: „Re: Zamawianie żądań we / wy”

W poniedziałek, 5 sierpnia 1996 r. Peter P. Eiserloh napisał:

Musimy zachować jasną koncepcję wątków. Zbyt wielu ludzi myli wątek z procesem. Poniższa dyskusja nie odzwierciedla obecnego stanu linuksa, ale jest raczej próbą pozostania na dyskusji na wysokim poziomie.

NIE!

Nie ma powodu, aby sądzić, że „wątki” i „procesy” są odrębnymi bytami. Tak to się tradycyjnie robi, ale osobiście uważam, że myślenie w ten sposób jest poważnym błędem. Jedynym powodem, aby myśleć w ten sposób, jest bagaż historyczny.

Zarówno wątki, jak i procesy to tak naprawdę tylko jedna rzecz: „kontekst wykonania”. Próba sztucznego rozróżnienia różnych przypadków jest po prostu samoograniczająca.

„Kontekst wykonania”, zwany niniejszym COE, jest tylko zlepkiem całego stanu tego COE. Ten stan obejmuje takie rzeczy, jak stan procesora (rejestry itp.), Stan MMU (odwzorowania stron), stan uprawnień (uid, gid) i różne „stany komunikacji” (otwarte pliki, procedury obsługi sygnałów itp.). Tradycyjnie różnica między „wątkiem” a „procesem” polegała głównie na tym, że wątki mają stan procesora (+ prawdopodobnie jakiś inny stan minimalny), podczas gdy cały inny kontekst pochodzi z procesu. Jest to jednak tylko jeden sposób na podzielenie całkowitego stanu COE i nic nie wskazuje na to, aby był to właściwy sposób. Ograniczanie się do tego rodzaju obrazu jest po prostu głupie.

Sposób Linux myśli na ten temat (i sposób chcę rzeczy do pracy) jest to, że nie ma czegoś takiego jak „proces” lub „nici”. Istnieje tylko suma COE (nazywana przez Linux „zadaniem”). Różni COE mogą współdzielić ze sobą części swojego kontekstu, a jednym podzbiorem tego współdzielenia jest tradycyjna konfiguracja „wątku” / „procesu”, ale tak naprawdę należy to postrzegać TYLKO jako podzbiór (jest to ważny podzbiór, ale znaczenie to przychodzi nie z projektu, ale ze standardów: oczywiście chcemy uruchamiać programy wątkowe zgodne ze standardami również na Linuksie).

W skrócie: NIE projektuj wokół sposobu myślenia w wątku / procesie. Jądro powinno być zaprojektowane w oparciu o sposób myślenia COE, a następnie biblioteka pthreads może eksportować ograniczony interfejs pthreads do użytkowników, którzy chcą korzystać z tego sposobu patrzenia na COE.

Tylko jako przykład tego, co staje się możliwe, gdy myślisz o COE w przeciwieństwie do wątku / procesu:

  • Możesz zrobić zewnętrzny program „cd”, co jest tradycyjnie niemożliwe w UNIX i / lub proces / wątek (głupi przykład, ale pomysł jest taki, że możesz mieć tego rodzaju „moduły”, które nie są ograniczone do tradycyjnego UNIXa / konfiguracja wątków). Wykonaj:

klon (CLONE_VM | CLONE_FS);

child: execve („external-cd”);

/ * „execve ()” rozdzieli maszynę wirtualną, więc jedynym powodem, dla którego użyliśmy CLONE_VM, było przyspieszenie procesu klonowania * /

  • Możesz zrobić "vfork ()" w naturalny sposób (obsługuje minimalną obsługę jądra, ale ta obsługa idealnie pasuje do sposobu myślenia CUA):

klon (CLONE_VM);

child: kontynuuj uruchamianie, ewentualnie execve ()

matka: poczekaj na wykonanie

  • możesz wykonać zewnętrzne „diamony we / wy”:

klon (CLONE_FILES);

dziecko: otwórz deskryptory pliku itp

matka: użyj fd's dziecko otwarte i vv.

Wszystkie powyższe prace działają, ponieważ nie jesteś przywiązany do sposobu myślenia w wątku / procesie. Pomyślmy na przykład o serwerze WWW, w którym skrypty CGI są wykonywane jako „wątki wykonania”. Nie możesz tego zrobić z tradycyjnymi wątkami, ponieważ tradycyjne wątki zawsze muszą współużytkować całą przestrzeń adresową, więc musisz połączyć wszystko, co kiedykolwiek chciałeś zrobić na samym serwerze internetowym („wątek” nie może zostać uruchomiony inny plik wykonywalny).

Myśląc o tym jako o „kontekście realizacji” problemu zamiast Twoje zadania mogą teraz wybrał do realizacji programów zewnętrznych (= oddzielić przestrzeń adresową od rodzica) etc, czy chcą, czy mogą one na przykład wszystkiego zakładowego z rodzicem , z wyjątkiem dla deskryptory plików (aby pod-„wątki” mogły otwierać wiele plików bez potrzeby, aby rodzic musiał się nimi martwić: zamykają się automatycznie po wyjściu pod-„wątku” i nie zużywają plików fd w rodzicu) .

Pomyśl na przykład o wątku „inetd”. Chcesz niskiego narzutu fork + exec, więc w systemie Linux zamiast zamiast „fork ()” piszesz inetd wielowątkowy, w którym każdy wątek jest tworzony za pomocą CLONE_VM (współdziel przestrzeń adresową, ale nie udostępniaj pliku deskryptory itp.). Następnie dziecko może wykonać, jeśli była to usługa zewnętrzna (na przykład rlogind), a może była to jedna z wewnętrznych usług inetd (echo, timeofday), w którym to przypadku po prostu robi to i wychodzi.

Nie możesz tego zrobić za pomocą „wątku” / „procesu”.

Linus


12

Próbuję odpowiedzieć na to pytanie z widoku systemu operacyjnego jądra Linux

Program staje się procesem po uruchomieniu w pamięci. Proces ma własną przestrzeń adresową, co oznacza, że ​​ma różne segmenty w pamięci, takie jak segmentacja .textdo przechowywania skompilowanego kodu, .bssdo przechowywania niezainicjowanych zmiennych statycznych lub globalnych itp.
Każdy proces miałby swój własny licznik programów i stos przestrzeni użytkownika .

Wewnątrz jądra każdy proces miałby swój własny stos jądra (który jest oddzielony od stosu przestrzeni użytkownika ze względów bezpieczeństwa) i nazwaną strukturę, task_structktóra jest na ogół abstrakcyjna jako blok sterowania procesem, przechowujący wszystkie informacje dotyczące procesu, takie jak jego priorytet, stan , (i wiele innych części).
Proces może mieć wiele wątków wykonania.

Przechodząc do wątków, znajdują się w procesie i współużytkują przestrzeń adresową procesu nadrzędnego wraz z innymi zasobami, które można przekazać podczas tworzenia wątku, takimi jak zasoby systemu plików, współdzielenie oczekujących sygnałów, udostępnianie danych (zmiennych i instrukcji), dzięki czemu wątki są lekkie i co pozwala na szybsze przełączanie kontekstu.

Wewnątrz jądra każdy wątek ma własny stos jądra wraz ze task_structstrukturą, która definiuje wątek. Dlatego jądro wyświetla wątki tego samego procesu co różne podmioty i same w sobie są planowalne. Wątki w tym samym procesie mają wspólny identyfikator o nazwie id grupy wątków ( tgid), mają także unikalny identyfikator o nazwie id procesu ( pid).


11

Próbuję odpowiedzieć na to pytanie dotyczące świata Java.

Proces jest wykonaniem programu, ale wątek jest pojedynczą sekwencją wykonania w ramach procesu. Proces może zawierać wiele wątków. Wątek jest czasem nazywany lekkim procesem .

Na przykład:

Przykład 1: JVM działa w jednym procesie, a wątki w JVM współużytkują stertę należącą do tego procesu. Dlatego kilka wątków może uzyskać dostęp do tego samego obiektu. Wątki współużytkują stertę i mają własne miejsce na stosie. W ten sposób wywołanie metody przez jeden wątek i jego lokalne zmienne są zabezpieczone przed innymi wątkami. Ale stos nie jest bezpieczny dla wątków i musi być zsynchronizowany dla bezpieczeństwa wątków.

Przykład 2: Program może nie być w stanie rysować obrazów po odczytaniu naciśnięć klawiszy. Program musi zwracać pełną uwagę na klawiaturę, a brak możliwości obsługi więcej niż jednego zdarzenia naraz spowoduje problemy. Idealnym rozwiązaniem tego problemu jest płynne wykonanie dwóch lub więcej sekcji programu w tym samym czasie. Wątki pozwalają nam to zrobić. Tutaj Rysowanie obrazu jest procesem, a odczytanie klawisza jest procesem podrzędnym (wątkiem).


1
Dobra odpowiedź, podoba mi się, że określa jego zakres (świat Java) i podaje kilka odpowiednich przykładów - w tym jeden (# 2), do którego może odnieść się każdy, kto musi zadać oryginalne pytanie.
Smithers,

9

Różnica między wątkiem a procesem?

Proces jest instancją wykonawczą aplikacji, a Wątek jest ścieżką wykonania w ramach procesu. Ponadto proces może zawierać wiele wątków. Ważne jest, aby pamiętać, że wątek może zrobić wszystko, co może zrobić proces. Ponieważ jednak proces może składać się z wielu wątków, wątek można uznać za „lekki”. Tak więc zasadniczą różnicą między wątkiem a procesem jest praca, którą każdy z nich wykorzystuje. Wątki są używane do małych zadań, podczas gdy procesy są wykorzystywane do zadań o większej wadze - w zasadzie do wykonywania aplikacji.

Inną różnicą między wątkiem a procesem jest to, że wątki w tym samym procesie dzielą tę samą przestrzeń adresową, podczas gdy różne procesy nie. Umożliwia to wątkom odczytywanie i zapisywanie tych samych struktur danych i zmiennych, a także ułatwia komunikację między wątkami. Komunikacja między procesami - zwana także IPC lub komunikacja między procesami - jest dość trudna i wymaga dużych zasobów.

Oto podsumowanie różnic między wątkami i procesami:

  1. Wątki są łatwiejsze do utworzenia niż procesy, ponieważ nie wymagają osobnej przestrzeni adresowej.

  2. Wielowątkowość wymaga starannego programowania, ponieważ wątki współużytkują struktury danych, które powinny być modyfikowane tylko przez jeden wątek na raz. W przeciwieństwie do wątków procesy nie współużytkują tej samej przestrzeni adresowej.

  3. Wątki są uważane za lekkie, ponieważ zużywają znacznie mniej zasobów niż procesy.

  4. Procesy są od siebie niezależne. Wątki, ponieważ współużytkują tę samą przestrzeń adresową, są od siebie zależne, dlatego należy zachować ostrożność, aby różne wątki nie stawały na sobie.
    To naprawdę inny sposób stwierdzenia nr 2 powyżej.

  5. Proces może składać się z wielu wątków.


9

Oto, co otrzymałem z jednego z artykułów na temat The Code Project . Myślę, że to wyjaśnia wszystko, co potrzebne.

Wątek to kolejny mechanizm podziału obciążenia na osobne strumienie wykonawcze. Nić ma mniejszą wagę niż proces. Oznacza to, że oferuje mniejszą elastyczność niż proces pełnego wdmuchiwania, ale można go zainicjować szybciej, ponieważ systemu operacyjnego jest mniej do skonfigurowania. Gdy program składa się z dwóch lub więcej wątków, wszystkie wątki mają wspólną przestrzeń pamięci. Procesom nadano osobne przestrzenie adresowe. wszystkie wątki mają tę samą stertę. Ale każdy wątek ma własny stos.


1
Nie jestem pewien, czy jest to jasne, chyba że pochodzi z perspektywy, która już rozumie wątki vs. procesy. Przydatne może być dodanie ich wzajemnych relacji.
Smithers,

Nie jasne. Czy to oznacza tylko jeden proces i jego wątki? Co jeśli jest wiele procesów z wieloma wątkami w każdym? Czy wszystkie te wątki mają jedną przestrzeń pamięci? Z tych wszystkich procesów?
Zielony,

9

Proces:

Proces jest w zasadzie programem w trakcie wykonywania. To jest aktywny byt. Niektóre systemy operacyjne używają terminu „zadanie” w odniesieniu do wykonywanego programu. Proces jest zawsze przechowywany w pamięci głównej, zwanej również pamięcią podstawową lub pamięcią o dostępie swobodnym. Dlatego proces jest określany jako aktywny podmiot. Znika, jeśli komputer zostanie ponownie uruchomiony. Kilka procesów może być powiązanych z tym samym programem. W systemie wieloprocesorowym wiele procesów może być wykonywanych równolegle. W systemie jednoprocesorowym, chociaż nie osiągnięto prawdziwej równoległości, stosuje się algorytm szeregowania procesów, a procesor zaplanuje wykonywanie każdego procesu pojedynczo, co daje złudzenie współbieżności. Przykład: Wykonywanie wielu wystąpień programu „Kalkulator”. Każda z instancji jest określana jako proces.

Wątek:

Wątek jest podzbiorem procesu. Jest określany jako „lekki proces”, ponieważ jest podobny do rzeczywistego procesu, ale wykonuje się go w kontekście procesu i dzieli te same zasoby, które zostały przydzielone procesowi przez jądro. Zwykle proces ma tylko jeden wątek kontroli - jeden zestaw instrukcji maszyny wykonywanych jednocześnie. Proces może również składać się z wielu wątków wykonania, które wykonują instrukcje jednocześnie. Wiele wątków kontroli może wykorzystać prawdziwą równoległość możliwą w systemach wieloprocesorowych. W systemie jednoprocesorowym stosowany jest algorytm szeregowania wątków, a procesor ma uruchamiać każdy wątek jeden po drugim. Wszystkie wątki uruchomione w procesie mają tę samą przestrzeń adresową, deskryptory plików, stos i inne atrybuty związane z procesem. Ponieważ wątki procesu mają tę samą pamięć,

ref- https://practice.geeksforgeeks.org/problems/difference-between-process-and-thread


Brzmi jak współbieżność węzłów w jednym procesie VS równoległość
wielowątkowa

Jest to dosłownie skopiowane z odpowiedzi poniżej z 2010 roku ...
mc01,

8

Z punktu widzenia ankietera, są w zasadzie tylko 3 główne rzeczy, które chcę usłyszeć, poza oczywistymi rzeczami, takimi jak proces może mieć wiele wątków:

  1. Wątki dzielą tę samą przestrzeń pamięci, co oznacza, że ​​wątek może uzyskać dostęp do pamięci z pamięci wątku innej osoby. Procesy zwykle nie mogą.
  2. Zasoby. Zasoby (pamięć, uchwyty, gniazda itp.) Są zwalniane po zakończeniu procesu, a nie po zakończeniu wątku.
  3. Bezpieczeństwo. Proces ma ustalony token bezpieczeństwa. Z drugiej strony wątek może podszywać się pod różnych użytkowników / tokeny.

Jeśli chcesz więcej, odpowiedź Scotta Langhama obejmuje prawie wszystko. Wszystko to z perspektywy systemu operacyjnego. Różne języki mogą implementować różne koncepcje, takie jak zadania, wątki lekkie i tak dalej, ale są to tylko sposoby używania wątków (włókien w systemie Windows). Brak wątków dotyczących sprzętu i oprogramowania. Istnieją wyjątki i przerwania dotyczące sprzętu i oprogramowania oraz wątki trybu użytkownika i jądra .


Kiedy mówisz token bezpieczeństwa, masz na myśli dane uwierzytelniające użytkownika (nazwę użytkownika / hasło), takie jak na przykład w systemie Linux?

W systemie Windows jest to złożony temat, token bezpieczeństwa (faktycznie nazywany tokenem dostępu) jest dużą strukturą, zawierającą wszystkie informacje wymagane do kontroli dostępu. Struktura jest tworzona po autoryzacji, co oznacza, że ​​nie ma nazwy użytkownika / hasła, ale lista identyfikatorów SID / praw na podstawie nazwy użytkownika / hasła. Więcej informacji tutaj: msdn.microsoft.com/en-us/library/windows/desktop/…
AndreiM

8
  1. Wątek działa w przestrzeni pamięci współużytkowanej, ale proces działa w osobnej przestrzeni pamięci
  2. Wątek jest procesem lekkim, ale proces jest procesem ciężkim.
  3. Wątek jest podtypem procesu.

To wydaje się bardzo rekurencyjne. Lepszą odpowiedzią byłoby być może rozwinięcie relacji między wątkiem a procesem.
Smithers,

7

Dla tych, którzy czują się bardziej komfortowo w nauce poprzez wizualizację, oto przydatny schemat, który stworzyłem w celu wyjaśnienia procesu i wątków.
Użyłem informacji z MSDN - O procesach i wątkach

Procesy i wątki


1
Interesujące może być dodanie innego procesu, aby zobaczyć, jak wielowątkowość wypada w porównaniu z wieloprocesowością.
Bram Vanroy

6

Pochodząc z wbudowanego świata, chciałbym dodać, że koncepcja procesów istnieje tylko w „dużych” procesorach (procesory stacjonarne, ARM Cortex A-9 ), które mają MMU (jednostka zarządzania pamięcią) oraz systemy operacyjne, które obsługują używanie MMU ( takich jak Linux ). W przypadku małych / starych procesorów i mikrokontrolerów oraz małego systemu operacyjnego RTOS (system operacyjny w czasie rzeczywistym ), takiego jak freeRTOS, nie ma obsługi MMU, a zatem nie ma procesów, a jedynie wątki.

Wątki mogą uzyskiwać dostęp do pamięci i są one planowane przez system operacyjny w sposób przeplatany, więc wydają się działać równolegle (lub z wielordzeniowymi naprawdę działają równolegle).

Procesy z kolei żyją w prywatnej piaskownicy pamięci wirtualnej, udostępnianej i strzeżonej przez MMU. Jest to przydatne, ponieważ umożliwia:

  1. zapobiegając awariom całego procesu.
  2. Utrzymanie bezpieczeństwa poprzez uczynienie danych innych procesów niewidocznymi i nieosiągalnymi. Rzeczywistą pracę wewnątrz procesu nadzoruje jeden lub więcej wątków.

6
  1. Zasadniczo wątek jest częścią procesu bez wątku procesowego, który nie byłby w stanie działać.
  2. Nić jest lekka, a proces ciężki.
  3. komunikacja między procesem wymaga trochę czasu, podczas gdy wątek wymaga mniej czasu.
  4. Wątki mogą współdzielić ten sam obszar pamięci, podczas gdy proces żyje osobno.

6

Proces : program w trakcie wykonywania jest znany jako proces

Wątek : Wątek jest funkcją, która jest wykonywana z drugą częścią programu w oparciu o koncepcję „jeden z drugim”, więc wątek jest częścią procesu.


Nieźle, choć wprowadza nową koncepcję („jedna z drugą”), która prawdopodobnie jest obca dla kogoś, kto zadaje pytanie.
Smithers,

Post jest sformatowany jako kod, ale powinien być zwykłym tekstem.
Heinrich,

6

Przeczytałem tam prawie wszystkie odpowiedzi, niestety, jako student pierwszego stopnia biorący udział w kursie OS nie mogę obecnie dokładnie zrozumieć tych dwóch pojęć. Mam na myśli, że większość facetów czyta z niektórych książek na temat systemu operacyjnego różnice, tzn. Wątki mają dostęp do zmiennych globalnych w jednostce transakcyjnej, ponieważ wykorzystują przestrzeń adresową swojego procesu. Jednak powstaje nowe pytanie, dlaczego istnieją procesy, o czym wiemy, że już wątki są lżejsze w stosunku do procesów. Rzućmy okiem na poniższy przykład, wykorzystując obraz fragmentu jednej z wcześniejszych odpowiedzi ,

Mamy 3 wątki pracujące jednocześnie na dokumencie Word, np. Libre Office . Pierwszy wykonuje sprawdzanie pisowni, podkreślając, czy słowo jest źle napisane. Drugi bierze i drukuje litery z klawiatury. A ostatni zapisuje dokument w każdym krótkim czasie, aby nie stracić dokumentu, w którym pracował, jeśli coś pójdzie nie tak. W tym przypadku 3 wątki nie mogą być 3 procesami, ponieważ dzielą wspólną pamięć, która jest przestrzenią adresową ich procesu, a zatem wszystkie mają dostęp do edytowanego dokumentu. Tak więc droga jest dokumentem słownym wraz z dwoma buldożerami, które są wątkami, chociaż jednym z nich jest brak obrazu.

wprowadź opis zdjęcia tutaj


5

Podczas budowania algorytmu w języku Python (język interpretowany), który obejmował wielowątkowość, zdziwiłem się, widząc, że czas wykonania nie był lepszy w porównaniu z algorytmem sekwencyjnym, który wcześniej zbudowałem. Aby zrozumieć przyczynę tego wyniku, przeczytałem trochę i wierzę, że to, czego się nauczyłem, oferuje interesujący kontekst, z którego można lepiej zrozumieć różnice między wielowątkowością a wieloprocesowością.

Systemy wielordzeniowe mogą wykonywać wiele wątków wykonania, dlatego Python powinien obsługiwać wiele wątków. Ale Python nie jest językiem skompilowanym, a zamiast tego jest językiem interpretowanym 1 . Oznacza to, że program musi zostać zinterpretowany w celu uruchomienia, a tłumacz nie jest świadomy programu przed rozpoczęciem jego wykonywania. Wie jednak, jakie są reguły Pythona, a następnie dynamicznie je stosuje. Optymalizacje w Pythonie muszą zatem być głównie optymalizacjami samego interpretera, a nie kodu, który ma zostać uruchomiony. Jest to w przeciwieństwie do skompilowanych języków, takich jak C ++, i ma konsekwencje dla wielowątkowości w Pythonie. W szczególności Python używa globalnej blokady interpretera do zarządzania wielowątkowością.

Z drugiej strony skompilowany język jest dobrze skompilowany. Program jest przetwarzany „całkowicie”, gdzie najpierw jest interpretowany zgodnie ze swoimi składniowymi definicjami, a następnie odwzorowywany na pośrednią reprezentację języka niezależną od języka, a na końcu łączony z kodem wykonywalnym. Ten proces pozwala wysoce zoptymalizować kod, ponieważ jest on dostępny w momencie kompilacji. Różne interakcje i relacje programu są definiowane w momencie tworzenia pliku wykonywalnego i można podejmować solidne decyzje dotyczące optymalizacji.

W nowoczesnych środowiskach interpreter Pythona musi umożliwiać wielowątkowość, a to musi być zarówno bezpieczne, jak i wydajne. Tutaj pojawia się różnica między byciem językiem interpretowanym a językiem skompilowanym. Tłumacz nie może zakłócać wewnętrznego udostępniania danych z różnych wątków, jednocześnie optymalizując wykorzystanie procesorów do obliczeń.

Jak zauważono w poprzednich postach, zarówno proces, jak i wątek są niezależnymi sekwencjalnymi wykonaniami, przy czym podstawową różnicą jest to, że pamięć jest dzielona na wiele wątków procesu, podczas gdy procesy izolują ich przestrzenie pamięci.

W Pythonie dane są chronione przed jednoczesnym dostępem przez różne wątki przez Globalną Blokadę Tłumacza. Wymaga to, aby w dowolnym programie Python w danym momencie można wykonać tylko jeden wątek. Z drugiej strony możliwe jest uruchamianie wielu procesów, ponieważ pamięć dla każdego procesu jest izolowana od dowolnego innego procesu, a procesy mogą działać na wielu rdzeniach.


1 Donald Knuth ma dobre wyjaśnienie procedur interpretacyjnych w sztuce programowania komputerowego: podstawowe algorytmy.


4

Wątki w tym samym procesie współużytkują pamięć, ale każdy wątek ma swój własny stos i rejestry, a wątki przechowują dane specyficzne dla wątku w stercie. Wątki nigdy nie są wykonywane niezależnie, więc komunikacja między wątkami jest znacznie szybsza w porównaniu do komunikacji między procesami.

Procesy nigdy nie współużytkują tej samej pamięci. Kiedy proces potomny tworzy, duplikuje lokalizację pamięci procesu macierzystego. Komunikacja procesowa odbywa się za pomocą potoku, pamięci współużytkowanej i parsowania wiadomości. Przełączanie kontekstu między wątkami jest bardzo wolne.


4

Najlepsza odpowiedź, jaką do tej pory znalazłem, to „Interfejs programowania Linuksa” Michaela Kerriska :

We współczesnych implementacjach UNIX każdy proces może mieć wiele wątków wykonania. Jednym ze sposobów przewidywania wątków jest zestaw procesów dzielących tę samą pamięć wirtualną, a także szereg innych atrybutów. Każdy wątek wykonuje ten sam kod programu i współdzieli ten sam obszar danych i stertę. Jednak każdy wątek ma własny stos zawierający zmienne lokalne i informacje o połączeniu wywołania funkcji. [LPI 2.12]

Ta książka jest źródłem wielkiej przejrzystości; W tym artykule Julia Evans wspomniała o swojej pomocy w wyjaśnieniu, jak naprawdę działają grupy Linux .


Wydaje się to wprost sprzeczne ze sobą. Jedna część mówi, że proces może mieć więcej niż jeden wątek. Następna część mówi, że wątek to zestaw procesów współużytkujących pamięć wirtualną. Nie rozumiem, jak obie te rzeczy mogą być prawdą.
David Schwartz

Oto jak to czytam: wyrzuć słowo „mieć” w pierwszym zdaniu. Pod względem terminologicznym pozostaje Ci 1) pojedynczy wątek i 2) grupa wątków, co dla wygody jest znane jako proces. To jest moje zdanie na temat tego, o co tu Kerrisk.
Zach Valenta

Myślę, że on próbuje powiedzieć, że jeśli jesteś przyzwyczajony do starego widoku UNIX, że procesy są takie, jak planuje system operacyjny, to zestaw wątków jest jak zestaw procesów, z tą różnicą, że dzielą wiele rzeczy.
David Schwartz

Dobrze! Dobry sposób, aby to ująć.
Zach Valenta

3

Przykład 1: JVM działa w jednym procesie, a wątki w JVM współużytkują stertę należącą do tego procesu. Dlatego kilka wątków może uzyskać dostęp do tego samego obiektu. Wątki współużytkują stertę i mają własne miejsce na stosie. W ten sposób wywołanie metody przez jeden wątek i jego lokalne zmienne są zabezpieczone przed innymi wątkami. Ale stos nie jest bezpieczny dla wątków i musi być zsynchronizowany dla bezpieczeństwa wątków.


3

Są prawie takie same ... Ale kluczową różnicą jest to, że wątek jest lekki, a proces jest ciężki pod względem przełączania kontekstu, obciążenia roboczego i tak dalej.


Czy mógłbyś rozwinąć swoją odpowiedź?
Fiver

3
Wątek jest podprocesem, współużytkują wspólne zasoby, takie jak kod, dane, pliki w ramach procesu. Tam, gdzie dwa procesy nie mogą współużytkować zasobów (wyjątki stanowią przypadki, gdy proces (rodzic) rozwiąże inny proces (dziecko), wówczas domyślnie mogą współdziel zasoby)), wymaga dużego obciążenia zasobów procesora, podczas gdy wątki są znacznie lżejsze w tym kontekście. Chociaż oba mają te same rzeczy. Scenariusz, rozważ pojedynczy proces wątkowy jest zablokowany z powodu I / 0, wtedy cała 1 przejdzie do stan oczekiwania, ale gdy proces wielowątkowy jest blokowany przez operacje we / wy, wówczas jego jedyny 1 wątek dotyczący operacji we / wy zostanie zablokowany.
Nasir Ul Islam Butt
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.