Article View: pl.comp.lang.c
Article #267919Re: Ciemna strona C++
From: Marcin ‘Qrczak’ Kowalczyk
Date: Thu, 29 Nov 2007 23:49
Date: Thu, 29 Nov 2007 23:49
93 lines
6099 bytes
6099 bytes
Dnia 29-11-2007, Cz o godzinie 14:12 +0100, Sebastian Kaliszewski pisze:
> W Py masz coś co się nazywa GIL czyli Globa Interpreter Lock. Przez wielu
> znienawidzone, ale się trzyma i po bliższym przyjrzeniu się nie jest wcale
> takie głupie.
Czy głupie, to zależy.
Ogólnie są różne metody realizowania wątków w języku programowania
implementowanym w typowym systemie operacyjnym (Unix albo Windows).
Oto trzy najważniejsze z nich:
1. Jeden wątek języka jest realizowany przez jeden wątek systemu
operacyjnego. Program używa systemowego stosu tak jak w C.
Program swobodnie woła blokujące funkcje systemowe tak jak w C.
Przykłady: C, C++, Java (Sun obecnie, a także GNU), .NET (Microsoft,
Mono), Lisp (SBCL na x86), Jython (używa bezpośrednio wątków Javy).
2. Wszystkie wątki języka są realizowane przez jeden wątek systemu
operacyjnego. Implementacja języka używa własnego stosu, żeby można
się było przełączać między różnymi stosami. Zamiast blokujących
funkcji systemowych używane są nieblokujące odpowiedniki, żeby nie
blokowały się inne wątki.
Przykłady: niektóre Lispy, Erlang (stary), Ruby, SML/NJ,
Java (Sun bardzo dawno temu - chyba), Glasgow Haskell (stary).
3. Jeden wątek języka jest realizowany przez jeden wątek systemu
operacyjnego, ale w danej chwili chodzi tylko jeden taki wątek naraz
(z wyjątkiem wołania funkcji w C, które wykonują się długo bez
potrzeby dostępu do rantajmu języka). Program używa systemowego
stosu tak jak w C. Program musi specjalnie oznaczać blokujące
funkcje systemowe.
Przykłady: OCaml, Python.
W pierwszej metodzie dużym problemem jest odśmiecanie. Poza tym wątków
nie może być zbyt dużo, a przełączanie między wątkami jest dość drogie.
W drugiej metodzie problemem jest niewykorzystanie potencjału
wielordzeniowych komputerów (chyba że przez rozbicie programu na osobne
procesy, co z powodzeniem stosuje Erlang). Kłopotliwe jest używanie
gotowych bibliotek, które zawierają funkcje wykonujące się długo bądź
które powodują przeplatanie się wywołań funkcji z różnych języków
(program może przykryć ramkę stosu funkcji w C ramką stosu funkcji
w C wykonywanej na rzecz innego wątku logicznego, a następnie spróbować
wrócić do tej pierwszej, kiedy druga jeszcze się nie skończyła).
Trzecia metoda łączy większość wad pierwszych dwóch. Wątków nie może być
zbyt dużo, a przełączanie między nimi jest jeszcze droższe niż w pierwszej
metodzie. Nie jest wykorzystywany potencjał wieloprocesorowych komputerów,
a funkcje wykonujące się długo muszą być specjalnie oznaczone. Nie lubię
tej metody. Główna zaleta: jest łatwa w realizacji.
Są i hybrydowe metody, mniej typowe:
4. Wątki języka są realizowane przez jeden wątek systemowy, chyba że
wołane są blokujące funkcje w C bądź funkcje w C, które wołają
z powrotem funkcje naszego języka - wtedy wątek systemowy staje się
związany z jednym wątkiem logicznym, a do wykonywania innych wątków
logicznych tworzone są pomocnicze wątki systemowe. W danej chwili
tylko jeden wątek systemowy ma dostęp do rantajmu języka.
Przykłady: Glasgow Haskell (między starym a nowym bądź nowy jako
jedna z opcji), Kogut.
5. Jak wyżej, ale wiele wątków systemowych naraz ma dostęp do rantajmu
języka (w praktyce jest sens, żeby było ich mniej więcej tyle ile
rdzeni).
Przykłady: Glasgow Haskell (nowy jako jedna z opcji),
Erlang (nowy - nie jestem pewien).
Być może w niektórych przykładach się pomyliłem. Przykłady są niepełne.
Na pewno Ruby planuje jakąś zmianę realizacji wątków.
Wątki Erlanga mają semantykę bliższą tradycyjnym procesom (zresztą
nazywają się procesami): logicznie nie współdzielą danych, ale mogą
wymieniać się komunikatami. Fizycznie komunikaty mogą być częściowo
współdzielone; są immutable, więc współdzielenie jest nieobserwowalne.
Każdy wątek/proces ma własny odśmiecacz, przynajmniej w starym Erlangu.
Perl miał jedną nieudaną implementację wątków, zarzuconą, oraz nowszą,
w której współdzielone zmienne są odróżniane od niewspółdzielonych.
O ile wiem, PHP nie ma żadnych wątków.
--
__("< Marcin Kowalczyk
\__/ qrczak@knm.org.pl
^^ http://qrnik.knm.org.pl/~qrczak/
Technical Details
Message-ID:
<1196380169.15384.58.camel@qrnik>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!newsfeed.gazeta.pl!opal.futuro.pl!news.internetia.pl!newsfeed.tpinternet.pl!atlantis.news.tpi.pl!news.tpi.pl!not-for-mailReferences:
<fghgeo$spf$1@nemesis.news.tpi.pl> <fghsb4$kpq$1@news.dialog.net.pl> <fgo4c7$mtu$1@news.vectranet.pl> <20071106073039.433f4934@Vorago> <fgqn9m$74j$2@news.vectranet.pl> <618565031.20071107113041@pkierski.net> <fgt6sh$jov$1@news.vectranet.pl> <fgtb6j$nur$1@news.vectranet.pl> <fgv6ba$k14$1@bozon2.softax.pl> <fgvkne$u3b$1@news.vectranet.pl> <fh1tjd$dtt$1@bozon2.softax.pl> <fh2lj6$qkh$1@news.vectranet.pl> <fha3as$pap$1@bozon2.softax.pl> <fhaj8u$e02$1@news.vectranet.pl> <fhf09d$ohq$1@bozon2.softax.pl> <fhfi9l$640$1@news.vectranet.pl> <fhurmu$5d9$1@bozon2.softax.pl> <fhv020$8k1$1@news.vectranet.pl> <fi2nbp$bit$1@nemesis.news.tpi.pl> <fi3e50$h2u$1@news.vectranet.pl> <fimcsr$8sk$1@bozon2.softax.pl>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!newsfeed.gazeta.pl!opal.futuro.pl!news.internetia.pl!newsfeed.tpinternet.pl!atlantis.news.tpi.pl!news.tpi.pl!not-for-mail From: Marcin ‘Qrczak’ Kowalczyk <qrczak@knm.org.pl> Newsgroups: pl.comp.lang.c Subject: Re: Ciemna strona C++ Date: Fri, 30 Nov 2007 00:49:29 +0100 Organization: tp.internet - http://www.tpi.pl/ Lines: 125 Message-ID: <1196380169.15384.58.camel@qrnik> References: <fghgeo$spf$1@nemesis.news.tpi.pl> <fghsb4$kpq$1@news.dialog.net.pl> <fgo4c7$mtu$1@news.vectranet.pl> <20071106073039.433f4934@Vorago> <fgqn9m$74j$2@news.vectranet.pl> <618565031.20071107113041@pkierski.net> <fgt6sh$jov$1@news.vectranet.pl> <fgtb6j$nur$1@news.vectranet.pl> <fgv6ba$k14$1@bozon2.softax.pl> <fgvkne$u3b$1@news.vectranet.pl> <fh1tjd$dtt$1@bozon2.softax.pl> <fh2lj6$qkh$1@news.vectranet.pl> <fha3as$pap$1@bozon2.softax.pl> <fhaj8u$e02$1@news.vectranet.pl> <fhf09d$ohq$1@bozon2.softax.pl> <fhfi9l$640$1@news.vectranet.pl> <fhurmu$5d9$1@bozon2.softax.pl> <fhv020$8k1$1@news.vectranet.pl> <fi2nbp$bit$1@nemesis.news.tpi.pl> <fi3e50$h2u$1@news.vectranet.pl> <fimcsr$8sk$1@bozon2.softax.pl> NNTP-Posting-Host: hjd150.internetdsl.tpnet.pl Mime-Version: 1.0 X-Trace: nemesis.news.tpi.pl 1196380514 9638 79.187.237.150 (29 Nov 2007 23:55:14 GMT) X-Complaints-To: usenet@tpi.pl NNTP-Posting-Date: Thu, 29 Nov 2007 23:55:14 +0000 (UTC) In-Reply-To: <fimcsr$8sk$1@bozon2.softax.pl> X-Mailer: Evolution 2.12.1 PLD Linux Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit