🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.os.linux.programowanie
4 messages
4 total messages Started by Marcin Laszewski Tue, 27 Dec 2011 19:31
Wielowatki - jak to jest zrobione?
#72403
Author: Marcin Laszewski
Date: Tue, 27 Dec 2011 19:31
19 lines
1613 bytes
Czy ktos moze wie jak sa zrealizowane wewnetrznie watki w procesach Linux-a?
Czy jest to zrobione tylko przez glibc czy tez musialo byc dodane jakies
wsparcie w jadrze?

Pewne elementy wieloatkowosci mozna zrobic w oparciu o setjmp/longjmp. Jak
yo sie ma to pthreads? Nijak, czy moze watki to wykorzystuja?

Gdzie mozna sobie poczytac o zaletach i wadach programowania wielowatkowego
pod Linux-em? Czytalem juz w gogolach - generalnie to sa tam glownie strony
man-a (w roznych wersjach jezykowacyh), przezentacja typu 'wprowadzenie do
watkow', ale brak jakis fajnych opracowan porowanania praktycznego apliakcji
robiacych to samo w watkach i roznych procesach. No, poza standardowa
informacja, ze 'procesy w unix-ach' sa z definicji 'lekkie', wiec watki nie
sa takie popularne.

-- 
ml

http://www.archimedes.eu.org/
Re: Wielowatki - jak to jest zrobione?
#72404
Author: Wojciech Jaczewski
Date: Tue, 27 Dec 2011 20:50
13 lines
1242 bytes
Marcin Laszewski wrote:

> Czy ktos moze wie jak sa zrealizowane wewnetrznie watki w procesach
> Linux-a? Czy jest to zrobione tylko przez glibc czy tez musialo byc dodane
> jakies wsparcie w jadrze?

Jest wsparcie w jądrze.

> Gdzie mozna sobie poczytac o zaletach i wadach programowania
> wielowatkowego pod Linux-em?

Odrobinę o wadach:
http://catb.org/~esr/writings/taoup/html/ch07s03.html#id2923889
Re: Wielowatki - jak to jest zrobione?
#72405
Author: Adam Osuchowski
Date: Fri, 30 Dec 2011 23:57
54 lines
4053 bytes
Marcin Laszewski wrote:
> Czy ktos moze wie jak sa zrealizowane wewnetrznie watki w procesach Linux-a?
> Czy jest to zrobione tylko przez glibc czy tez musialo byc dodane jakies
> wsparcie w jadrze?

To zależy o jakich wątkach mówisz. Są wątki kernelspace'owe, userspace'owe
(nazywane czasami włóknami z ang. fibers) i mieszane. Najpopularniejsza
obecnie linuksowa implementacja wątków to NPTL, o którą Ci zapewne chodzi,
zaimplementowana jest w jądrze, głównie w postaci syscalla clone() i paru
innych funkcjonalności dotyczących synchronizacji zasobów i obsługi
sygnałów. Do tego dochodzi jeszcze userspace'owa biblioteka libpthreads
umożliwiająca łatwiejsze i jednolite zarządzanie wątkami, ale ściśle
rzecz biorąc nie jest konieczna bo można mieć wątki wołając bezpośrednio
syscalle.
 
> Pewne elementy wieloatkowosci mozna zrobic w oparciu o setjmp/longjmp. Jak
> yo sie ma to pthreads? Nijak, czy moze watki to wykorzystuja?

Pthreads to jest tylko i wyłącznie ustandaryzowane API i semantyka wątków.
Chodzi o to, żeby programy wykorzystujące wątki były przenośne pomiędzy
różnymi uniksami zgodnymi z POSIX. Jest wiele różnych implementacji
pthreads. Na Linuksie obecnie dominuje wspomniany już przeze mnie NPTL.

> Gdzie mozna sobie poczytac o zaletach i wadach programowania wielowatkowego
> pod Linux-em? Czytalem juz w gogolach - generalnie to sa tam glownie strony
> man-a (w roznych wersjach jezykowacyh), przezentacja typu 'wprowadzenie do
> watkow', ale brak jakis fajnych opracowan porowanania praktycznego apliakcji
> robiacych to samo w watkach i roznych procesach.

O wadach, np. http://www.eecs.berkeley.edu/Pubs/TechRpts/2006/EECS-2006-1.pdf
O zaletach można zgooglać wiele informacji, chociaż główną z nich jest
oczywiście minimalny czas tworzenia/niszczenia wątku i współdzielenie
zasobów.

> No, poza standardowa informacja, ze 'procesy w unix-ach' sa z definicji
> 'lekkie', wiec watki nie sa takie popularne.

Co znaczy ,,lekkie''? Tworzenie procesu przez fork() zawsze będzie trwało
zdecydowanie dłużej od stworzenia wątku przez pthread_create(). Pomagają
tu trochę czary optymalizacyjne w postaci vfork(), CoW czy wstrzymywanie
parenta dopóki potomek nie zawoła execve() ale zawsze wątki się szybciej
tworzy niż osobne procesy bo nie trzeba robić tylu rzeczy co przy forku 
i na tym polega ich siła. A to, że w jądrze w zasadzie nie ma podziału
na procesy i wątki to jest już kwestią tej konkretnej implementacji.

Co do popularności wątków, to się nie zgodzę. Wątki są wykorzystywane
w aplikacjach, które wymagają częstego tworzenia/niszczenia równoległych
instancji i po prostu osobne procesy zabijały by wydajność. Myślę, że 
jeśli już, to powodem ew. braku popularności wątków jest większa
komplikacja kodu (chociaż biblioteki to upraszczają) i wymóg większej
dyscypliny programistycznej (żeby sobie wątki nawzajem nie zrobiły kuku).
To powoduje, że np. programiści bibliotek nie chcą tworzyć ich w wersji
thread-safe, a to z kolei powoduje, że inne biblioteki i aplikacje, które
taką bibliotekę wykorzystują, też muszą być jednowątkowe i problem narasta.
Re: Wielowatki - jak to jest zrobione?
#72406
Author: orcus
Date: Sat, 31 Dec 2011 10:15
31 lines
2671 bytes
On 30.12.2011, Adam Osuchowski <someone@somewhere.com> wrote:
> Co znaczy ,,lekkie''? Tworzenie procesu przez fork() zawsze będzie trwało
> zdecydowanie dłużej od stworzenia wątku przez pthread_create(). Pomagają
> tu trochę czary optymalizacyjne w postaci vfork(), CoW czy wstrzymywanie
> parenta dopóki potomek nie zawoła execve() ale zawsze wątki się szybciej
> tworzy niż osobne procesy bo nie trzeba robić tylu rzeczy co przy forku 
> i na tym polega ich siła. A to, że w jądrze w zasadzie nie ma podziału
> na procesy i wątki to jest już kwestią tej konkretnej implementacji.
>
> Co do popularności wątków, to się nie zgodzę. Wątki są wykorzystywane
> w aplikacjach, które wymagają częstego tworzenia/niszczenia równoległych
> instancji i po prostu osobne procesy zabijały by wydajność. Myślę, że 
> jeśli już, to powodem ew. braku popularności wątków jest większa
> komplikacja kodu (chociaż biblioteki to upraszczają) i wymóg większej
> dyscypliny programistycznej (żeby sobie wątki nawzajem nie zrobiły kuku).
> To powoduje, że np. programiści bibliotek nie chcą tworzyć ich w wersji
> thread-safe, a to z kolei powoduje, że inne biblioteki i aplikacje, które
> taką bibliotekę wykorzystują, też muszą być jednowątkowe i problem narasta.

W tym monecie dyskusji warto IMO wspomnieć o czymś takim jak userspacowe
procesy. Implementacja którą znam to maszyna wirtualna erlang-a. Tworzy
się to niesamowicie szybko. Procesy sobie nawzajem kuku nie zrobią.
Niestety już sama maszyna wirtualna powoduje spory narzut na wydajność.

Nie mniej jednak czasem jeśli budujemy system rozproszony ilość gratisów
tego typu które dostajemy od języka przyćmiewa kwestie wydajności.
Poza rozproszonymi systemami erlang ma niewiele zastosowań.

-- 
Pozdrawiam
orcus
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads