Article View: pl.comp.lang.asm
Article #2058Re: ‘lock–free’ aka odżywianie grupy asemblerowców :-)
From: Andrzej Grażyński
Date: Fri, 19 Mar 2010 09:26
Date: Fri, 19 Mar 2010 09:26
112 lines
3229 bytes
3229 bytes
> nie znam tych wszystkich skrócików ;-) , ale nie autor odpowiedzi się
> trochę wgłębi w list autora pytania… :-) czy czasem te różne paradyg-
> manty nie przenoszą po prostu tego samego blokowania na inne poziomy wi-
> doczności i szerokości, bardziej ukryte dla programisty? a to ciągle
> ta sama instrukcja logiczna.
Tak, przenoszą, z istotnymi różnicami:
0. Blokada realizowana jest w sposób sprzętowy
1. Nakładanie i zdejmowanie blokady nie jest odrębną częścią algorytmu
rozwiązywania zadania, jest elementem atomu wchodzącego w skład tego
algorytmu
2. Blokada nakładana jest na czas wykonywania jednej instrukcji
3. Istnieje gwarancja zdjęcia blokady, bo wykonywanie instrukcji musi
się zakończyć (jeśli tak nie jest, mamy ogólną awarię sprzętową, co jest
katastrofą dla całego systemu).
4. Nie istnieją problemy typowe dla synchronizacji, np. deadlock
5. Nie ma gwarancji uzyskania wyłącznego dostąpu do zasobu, nie ma więc
gwarancji wykonania żądanej operacji.
Dla wyjaśnienia:
CAS - Compare And Swap:
CAS(M, A, B)
atomowe wykonanie sekwencji
if M = A
then
M := B
bądź
if M = A
then
XCHG(M, B)
bądź
if M = A
then
M := B
else
A := M
( tak działa CMPXCHG)
----------
DCAS - double CAS
jak wyżej, tylko dotyczy dwóch PRZYLEGŁYCH słów
if DWORD(M1, M2) = DWORD(A1, A2)
then
DWORD(M1, M2) := DWORD(B1, B2)
else
DWORD(A1, A2) := DWORD(M1, M2)
Tak działa CMPXCHG8B
------------
Casn
Jak wyżej, tylko dotyczy zbioru N niezależnych o siebie słów:
if {M1 .. Mn} = {A1 .. An}
then
{M1 .. Mn} := {B1 .. Bn}
else
{A1 .. An} := {M1 .. Mn}
W szczególności CAS2 jest szczególnym przypadkiem CASn dla n=2
Zauważ, czym CAS2 różni się od DCAS.
Przykład zastosowania:
Do wielodostępnej listy jednokierunkowej, której pierwszy element
wskazywany jest przez TOP, dołączamy na początek nowy rekord R:
R: Record
Next: <adres nastepnego rekordu>
...
End;
A := TOP;
B := Addr(R);
R.Next := A;
CAS(TOP, A, B);
{ dlaczego nie mogę napisać CAS(TOP, R.Next , Addr(R)) ? )
Technical Details
Message-ID:
<hnvg1a$7am$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> <hnlvpl$tkc$1@news.onet.pl> <hntddv$kql$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: Andrzej Grażyński <grazynsk@petex.com.pl> Newsgroups: pl.comp.lang.asm Subject: Re: ‘lock–free’ aka odżywianie grupy asemblerowców :-) Date: Fri, 19 Mar 2010 10:26:44 +0100 Organization: http://onet.pl Lines: 114 Message-ID: <hnvg1a$7am$1@news.onet.pl> References: <hi7d3a$u60$1@news.mixmin.net> <hnlvpl$tkc$1@news.onet.pl> <hntddv$kql$1@news.mixmin.net> NNTP-Posting-Host: public-gprs64668.centertel.pl Mime-Version: 1.0 X-Trace: news.onet.pl 1268990834 7510 91.94.125.152 (19 Mar 2010 09:27:14 GMT) X-Complaints-To: niusy@onet.pl NNTP-Posting-Date: Fri, 19 Mar 2010 09:27:14 +0000 (UTC) User-Agent: Thunderbird 2.0.0.23 (Windows/20090812) In-Reply-To: <hntddv$kql$1@news.mixmin.net> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit