Różnica między wątkiem i procesem (POSIX)

0

Witam,
Piszę aplikacje sieciową (opartą o gniazda). Ogólnie nigdy tego nie robiłem, stąd ten wątek i może głupie pytania. Początkowo myślałem o stosowaniu funkcji fork() do obsługi klientów, ponieważ jest prosta i łatwo pozwala na wykonanie dwóch czynności jednocześnie. Dowiedziałem się, że główna różnica między procesami, a wątkami polega na współdzieleniu zasobów tzn. przykładowo mając kontener i zapisane w nim jakieś rekordy (np. struktury bazy danych) dla każdego procesu (będzie ich tyle, ile podłączonych klientów) będe miał odzielny kontener i nowo wrzucone dane nie będą dostępne w pozostałych procesach (jeśli dobrze rozumiem).

Konketne pytania:

  1. Czy wątki są najprostszym rozwiązaniem współdzielenia zasobów pomiędzy różnymi, jednocześnie wykonującymi się czynnościami?
  2. Jakie jest zdroworozsądkowe API dla języka C realizujące to? Ważne, aby kompilowało się pod Linuksem i FreeBSD. Chwilę poszukałem i znalazłem: http://pl.wikipedia.org/wiki/POSIX_Threads
    Mam zamiar uczyć się właśnie tego, chyba że doradzicie inaczej.

Pozdrawiam,

0

Sam fork() faktycznie skopiuje ci zasoby, ale już vfork() będzie trochę lżejszy.

  1. Tak, ale nie jedynym.
  2. Dla systemów jakie wymieniłeś masz pthread.
    Zaletą stosowania wielowątkowości jest dodatkowo to ze nad wątkami masz pełną kontrolę - możesz je ubijać, stopować czy chociażby czekać na ich zakończenie. W przypadku procesów musiałbyś to wszystko synchronizować np. za pomocą jakichś semaforów czy sygnałów.
0

Różne procesy == różne przestrzenie adresowe. Komunikacja między procesami to generalnie coś typu MPI, pomiędzy wątkami jest łatwiej, można mieć współdzielone obszary pamięci. Każdy wątek posiada swój własny stos, a na stosie jak wiadomo, leżą zmienne lokalne.

Jako ciekawostkę podam, że w standardzie C++11 jest obsługa wątków, nowsze GCC obsługują część standardu C++11 (właśnie między innymi wątki) używając do tego pod spodem pthreads (czyli POSIX Threads).

0
Newb napisał(a)
  1. Czy wątki są najprostszym rozwiązaniem współdzielenia zasobów pomiędzy różnymi, jednocześnie wykonującymi się czynnościami?

Wątki są jednym z najbardziej skomplikowanych sposobów równoległego przetwarzania.
Ciekawe dlaczego całkiem niedawno zaczęto dopiero to dostrzegać.
Obecnie nowe rozwiązania w tym kierunku promują MS (Async Agents, PPL - Concurrency Runtime) i Intel (TBB, Cilk++, ArBB).

Najprostszy sposób jaki znam, to podzielić dane lub parametry na kilka zbiorów i przetwarzać je osobnymi procesami - czyli np. MapReduce lub podział wg zakresu parametrów.

Inne sposoby to:

  • OpenMP
  • OpenMPI (mniej więcej tak samo złożone jak wątki)

OpenMP nie jest obiektowe, więc powinno działać z C, ale nie testowałem.

Nadchodzący standard dla wątków jest już dostępny tutaj:
http://www.stdthread.co.uk/

Btw. Właśnie przeczytałem że Cilk jest dostępny w kompilatorach Intel i gcc:
http://software.intel.com/en-us/articles/intel-cilk-plus-open-source/

0

Dzięki. W sumie super sprawa z tymi wątkami w standardzie C++. Ciekawe też ile poczekamy na ich implementację w GCC.

Póki muszę korzystać z GCC i języka C biorę pthreads.

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