mboost-dp1

Sun

Multiverse-skaber forklarer Multiverse

- Via DZone - , redigeret af Avenger- , indsendt af arne_v

Er man programmør og f.eks. ønsker at have styr på, at to operationer ikke går i konflikt med hinanden, så kan “Software Transactional Memory” (STM) være en løsning, og udvikleren Peter Veentjer har gennem de seneste 18 måneder arbejdet på en løsning til Java-platformen.

Det er blevet til projektet Multiverse, hvor målet er at gøre det så nemt at benytte, at flere programmører vil benytte sig af STM.

Veentjer nævner i et interview til hjemmesiden DZone et eksempel med en bankkonto, hvor STM er godt at bruge. Er der 10 euro på en konto, og to processer vil hæve 5 euro på samme tid, så skal resultatet give 0, men det kan ende med 5, hvis ikke de to forespørgsler håndteres korrekt.

P.t. er projektet nået til version 0.4, og version 0.5 er på vej med flere nyheder og forbedringer samt en del optimeringer. Følg linket til kilden for at læse hele interviewet med Veentjer. Du kan læse mere om projektet på dets hjemmeside.





Gå til bund
Gravatar #1 - ghostface
15. mar. 2010 07:25
Nogen der kan komme med et eksempel hvor den optimale løsning ikke bare er en database med transaktionsstyring (noget vi vel har haft siden 1970erne) eller er hans bank eksempel blot et teknisk eksempel?

Hvad er forskellen fra det her og de "locks" vi kender fra eksisterende programmering? De lader da til at have samme formål med at låse en variabel ned så man netop ikke kommer til at læse eller skrive til den på det forkerte tidspunkt.
Gravatar #2 - Mort
15. mar. 2010 07:48
Jeg kender ikke den implementation der er beskrevet her, men formålet med transaktionel memory er at få et konsistent snapshot af hvordan tilstanden ser ud, når man starter transaktionen.

Ved at bruge låse så kan man låse begrænsede portioner af ens data, så de ikke kan tilgås af andre tråde. Det kan betyde at performancen bliver degraderet fordi tråd 2 er nødt til at vente på at tråd 1 bliver færdig, før den kan fortsætte. I uheldige tilfælde risikerer man også en deadlock når to tråde venter på hinanden.

Bruges transaktionel memory vil hver tråd ikke låse sine data, men have et snapshot af hvordan data så ud da transaktionen blev startet.
Gravatar #3 - p1x3l
15. mar. 2010 07:53
well vis man sider koder sådanne ting ser jeg gerne man tænker over sådanne ting i stedet for bruge et framework/tooolkit og håbe på det hele ordner sig

stadig programørs skyld vis så framework/toolkit "multiverse ik flasker sig som det ska
Gravatar #4 - TrolleRolle
15. mar. 2010 08:08
Fordelen her er to ting:

#1 I forhold til traditionel locking bruger man her i stedet "roll back" hvis man, EFTER at man har lavet ændringer, opdager at andre har pillet i data. Det giver naturligvis et overhead, men det er åbenbart sådan i praksis at den tid som spildes på roll back er mindre end den tid som spildes på at vente på låse. (Jeg kunne forestille mig at denne fordel kan diskuteres. Det afhænger nok af opgaven osv.)

#3 Med sådan et framework kan man netop blot skrive sine programmer uden at selv at skulle bekymre sig om at kode selve "låsedelen". Det er nu som regel bedst at lade dem, som er bedst til en opgave, løse den.

Gravatar #5 - mireigi
15. mar. 2010 08:28
ghostface (1) skrev:
Nogen der kan komme med et eksempel hvor den optimale løsning ikke bare er en database med transaktionsstyring (noget vi vel har haft siden 1970erne) eller er hans bank eksempel blot et teknisk eksempel?

Hvad er forskellen fra det her og de "locks" vi kender fra eksisterende programmering? De lader da til at have samme formål med at låse en variabel ned så man netop ikke kommer til at læse eller skrive til den på det forkerte tidspunkt.


Transaktionsstyring er faktisk et godt eksempel.
På en konto er der 100 kr. Der bliver så udført 5 transaktioner på samme tid. Med almindelige locks bliver dataene låst til én transaktion per gang og saldoen beregnes:
T1: -50kr (50kr)
T2: +10kr (60kr)
T3: -40kr (20kr)
T4: -70kr (-50kr) Denne transaktion fejler fordi kontoen vil gå i minus
T5: +50kr (0kr)

Med Multiverse opstår dette problem ikke. Her kan flere transaktioner tilgå dataene på samme tid. Inden transaktionerne afsluttes kontrollerer de med de øvrige transaktioner om dataene stadig er gyldige:
T1: -50kr (100kr)
T2: +10kr (100kr)
T3: -40kr (100kr)
T4: -70kr (100kr)
T5: +50kr (100kr)

Kontrollen kan se således ud:
100 + ((-50) + (10) + (-40) + (-70) + (50)) >= 0

Hvis kontrollen fejler bliver der lavet et rollback på dataene og transaktionerne afvikles igen, men med en prioritering på hver transaktion således at så mange som muligt af transaktionerne gennemføres.

Det er i hvert fald sådan jeg har forstået Multiverse.
Gravatar #6 - snemarch
15. mar. 2010 08:41
Tråd-synkronisering er ofte dyrere end man lige skulle tro - det kan degradere performance gevaldigt, og ødelægger scalability. Derudover er synkronisering svært når man bevæger sig udover trivielle eksempler.

#1: bankoverførslen her skal nok blot tænkes som et eksempel; banktransaktioner vil have en database indover for at have persistance. Der hvor STM vinder er in-memory operationer med en del reads og relativt få writes.
Gravatar #7 - sleth
15. mar. 2010 09:38
mireigi (5) skrev:

Med Multiverse opstår dette problem ikke. Her kan flere transaktioner tilgå dataene på samme tid. Inden transaktionerne afsluttes kontrollerer de med de øvrige transaktioner om dataene stadig er gyldige:
T1: -50kr (100kr)
T2: +10kr (100kr)
T3: -40kr (100kr)
T4: -70kr (100kr)
T5: +50kr (100kr)

Kontrollen kan se således ud:
100 + ((-50) + (10) + (-40) + (-70) + (50)) >= 0

Hvis kontrollen fejler bliver der lavet et rollback på dataene og transaktionerne afvikles igen, men med en prioritering på hver transaktion således at så mange som muligt af transaktionerne gennemføres.

Det er i hvert fald sådan jeg har forstået Multiverse.


Dit eksempel er ikke helt korrekt i forhold til hvordan TM normalt er implementeret. TM er opbygget over et koncept med transactions, kraftigt inspireret af hvordan databaser fungerer. En transaction opererer på et sæt inputdata, laver nogle beregninger og commiter resultatet til hukommelsen. En transaction skal opfattes som atomisk. Dvs. at transaction fejler, hvis en anden transaction har pillet ved inputdata undervejs. Der findes en række forskellige måder at detektere konflikter i forbindelse med transactions. Generelt tager man et snapshot af alle inputdata til en transaction før den udføres. Skulle det så ske at nogle ændringer af inputdata er ændret i det øjeblik hvor en transaction committes, vil transaction'en fejle og den må foretages på ny.

Det vil sige at dit eksempel vil alle transactions på nær en, fejle i første forsøg. Idet den første committer sit resultat, vil resten fejle, da inputdata er ændret. De må så starte forfra. Så resultatet er det samme som hvis det var lavet med locks og tråde.

Filosofien bag TM er fin nok, men personligt tror det er en død sild. Der er en række fundamentale problemer. F.eks. er det umuligt at håndtere I/O i transactions og nestede transactions er heller ikke let. STM er desuden langsomt. Sun arbejdede på hardware support for TM i deres kommende Rock processor. Den kommer vist aldrig på markedet efter Oracles opkøb.
Gravatar #8 - Harries
15. mar. 2010 12:19
sure, en simpel ting som alle ordentlige kodere ville lave, skal nu have et navn, patenteres, og sælges.

det er ting som disse der har fyldt softwareverdenen med totalt latterlige patenter..

blaaaaaa!! :D
Gravatar #9 - darune
15. mar. 2010 15:00
Syntes faktisk eksemplet med bank er ret dårligt. Dette vil næppe blive brugt i backend af banksystem eller det har jeg i hvert fald svært ved at forestille mig (der vil man enten bruge noget andet eller have andre mekanismer til at sørge for at pengetransaktionerne er atomare). Det tætteste jeg kan komme er måske en eller en anden form for hjemmebank application/budget beregner el. lignende. Men hvorfor køre flertrådet på denne måde i den type app. har jeg svært ved at se.

Kom med et eksempel hvor dette rent faktisk vil kunne anvendes med fordel fremfor traditionel låsning. Hvor med fordel forståes bedre performance eller nemmere at lave korrekt.
Gravatar #10 - Raekwon_
15. mar. 2010 15:30
#8 Jeg kan godt lide at du kalder synkroniseringsproblemer for simple ting alle "ordentlige" kodere skal kunne lave.
Det viser total mangel på indsigt og viden i området.

Der er en grund til at der er så (relativt) lidt understøttelse for multikerne systemer i applikationer, og det er simpelthen synkroniserings problematikken som er voldsomt kompleks.
Gravatar #11 - sleth
15. mar. 2010 15:44
darune (9) skrev:
Kom med et eksempel hvor dette rent faktisk vil kunne anvendes med fordel fremfor traditionel låsning. Hvor med fordel forståes bedre performance eller nemmere at lave korrekt.


Ideen i TM er sådan set fin nok. Man skal ikke tænke på låse overhovedet. Alt bliver håndteret med transactions, som er rimeligt simple at forstå. Fordelen ved TM skal findes i applikationer der kræver mange låse, som kun er nødvendige for undgå meget sjældne race-conditions. Altså låse der sjældent er konflikt omkring. Har du f.eks. en billedbehandlingsalgoritme der med flere tråde arbejder på forskellige område at et billede, kan det være svært at opdele billedet i fornuftige dele der kan tilknyttes en lås. Bruger man TM, skal man ikke bekymre sig om at to tråde skulle skrive i de samme pixels i billedet. Sker det engang imellem, vil den ene transaction bare fejle og den vil blive lavet en gang til.

Det er selvfølgelig ikke gratis når transactions fejler. Derfor skal det helst ikke ske for tit.
Gå til top

Opret dig som bruger i dag

Det er gratis, og du binder dig ikke til noget.

Når du er oprettet som bruger, får du adgang til en lang række af sidens andre muligheder, såsom at udforme siden efter eget ønske og deltage i diskussionerne.

Opret Bruger Login