Article View: pl.comp.lang.asm
Article #2049Re: ‘lock–free’ aka odżywianie grupy asemblerowców :-)
From: Michoo
Date: Sun, 10 Jan 2010 22:30
Date: Sun, 10 Jan 2010 22:30
59 lines
3661 bytes
3661 bytes
minięty czas pisze:
> onegdaj ‟Bogdan (bogdro)” rzecze:
>> W dniu 08.01.2010 14:48, minięty czas pisze:
>>> czy instrukcja ‘compare and set’ (oraz wszystkie podobne),
>>> to nie jest instrukcja blokująca? co z tego, że sama w sobie nie
>>> blo- kuje, jeśli i tak oparte na niej algorytmy używają jej jako
>>> blokera? algorytmy, które zwą siebie mianem ‘lock—free’… to chyba
>>> tylko zwykła reklama.
>> Sam sobie odpowiadasz: "co z tego, że sama w sobie nie blokuje". Ta
>> instrukcja jest nieblokująca, dlatego należy ją poprzedzić prefiksem
>> LOCK. Wtedy, oczywiście, staje się blokująca.
>> Swoją drogą, nie masz na myśli "compare and exchange"?
> ale nie o to dokładnie.
> wiadomo, że prefiks “lock” blokuje procesor (czy cokolwiek) ·wewnętrznie·, ale mam na myśli typowe zastosowania tej instrukcji (tak, ‘and exchange’). ta instrukcja w algorytmach ‘lock–free’ występuje zwykle jako warunek pętli, co wydaje się, że działa tak samo jak każdy inny mechanizm blokowania.
Typowe przykłady zastosowania ssą ;) (Tzn zazwyczaj robi się na tym taki
mutex z aktywnym oczekiwaniem.)
Rozważmy kolejkę fifo służącą do przekazywania komunikatów między n
producentami a k konsumentami:
standardowo)
blokujesz dostęp do kolejki
wstawiasz element
odblokowujesz dostęp
blokowanie jak sama nazwa wskazuje uniemożliwia innym równoległy dostęp,
jeżeli zderzą się 4 procesy to 1 wejdzie do sekcji krytycznej a reszta
pójdzie spać (co jest drogie - zmiana kontekstu)
w podejściu lock-free)
próbujesz wstawić coś do kolejki
jeżeli próba się nie powiodła to ją ponawiasz
cały czas nie blokujesz nikomu dostępu - jeżeli zderzą się 4 procesy to
1 zakończy akcję z sukcesem a reszta ponowi próbę w następnym cyklu a
dzięki prefiksowi lock za każdym razem jednemu się powiedzie.
O ile dobrze pamiętam to jest to działające wstawianie do listy
jednokierunkowej:
extern "C" int enqueue(void *item,void *queue)__attribute__((fastcall));
section .text
global enqueue
;edx - wskażnik na wskaźnik na kolejkę, ecx - wskaźnik na wstawiany element
enqueue:
mov eax,[edx] ;[**]ładujemy adres aktualnego ogona
pre: mov [ecx],eax ;[*]ustawiamy go jako poprzednika we
wstawianym elemencie
lock cmpxchg [edx],ecx ;staramy się podmienić wskaźnik na ogon
listy
jne pre ;jak się nie powiodło to ponawiamy próbę
ret
koszt całości jest niewielki, mimo, że lock zaburza trochę przetwarzanie
strumieniowe (blokada magistrali)
--
Pozdrawiam
Michoo
Technical Details
Message-ID:
<hidkec$as1$1@news.onet.pl>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.rmf.pl!agh.edu.pl!news.agh.edu.pl!news.onet.pl!not-for-mailReferences:
<hi7d3a$u60$1@news.mixmin.net> <hi7otf$793$1@inews.gazeta.pl> <hi7rnu$g3v$1@news.mixmin.net>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.rmf.pl!agh.edu.pl!news.agh.edu.pl!news.onet.pl!not-for-mail From: Michoo <michoo_news@vp.pl> Newsgroups: pl.comp.lang.asm Subject: Re: ‘lock–free’ aka odżywianie grupy asemblerowców :-) Date: Sun, 10 Jan 2010 23:30:44 +0100 Organization: http://onet.pl Lines: 59 Message-ID: <hidkec$as1$1@news.onet.pl> References: <hi7d3a$u60$1@news.mixmin.net> <hi7otf$793$1@inews.gazeta.pl> <hi7rnu$g3v$1@news.mixmin.net> NNTP-Posting-Host: c2-211.icpnet.pl Mime-Version: 1.0 X-Trace: news.onet.pl 1263162636 11137 62.21.2.211 (10 Jan 2010 22:30:36 GMT) X-Complaints-To: niusy@onet.pl NNTP-Posting-Date: Sun, 10 Jan 2010 22:30:36 +0000 (UTC) User-Agent: Mozilla-Thunderbird 2.0.0.22 (X11/20090706) In-Reply-To: <hi7rnu$g3v$1@news.mixmin.net> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit