You are on page 1of 52

FELADATKIRS

A feladatkirst a tanszki adminisztrciban lehet tvenni, s a leadott munkba eredeti, tanszki pecsttel elltott s a tanszkvezet ltal alrt lapot kell belefzni (ezen oldal helyett ). Az elektronikusan feltlttt dolgozatban mr nem kell beleszerkeszteni ezt a feladatkirst.

Budapesti Mszaki s Gazdasgtudomnyi Egyetem Villamosmrnki s Informatikai Kar Automatizlsi s Alkalmazott Informatikai Tanszk

Dinamikus kdanalzisen alapul prediktv holtpontdetektls


Szakdolgozat

Ksztette Thaler Benedek

Konzulens Rajacsics Tams

2013. november 23.

Tartalomjegyzk
Kivonat Abstract Bevezet 1. Elmleti ttekints 1.1. Parallel rendszerek . . . . . . . . . . . . . 1.1.1. Parallel rendszerek kommunikcija 1.1.2. Rendszer holtpontja . . . . . . . . 1.2. Holtpontmegelzs a gyakorlatban . . . . . 1.2.1. Hierarchikus zrols . . . . . . . . 1.2.2. Egylpses zrols . . . . . . . . . 1.2.3. Zrmentes adatstruktrk . . . . . 1.2.4. Token alap adathozzfrs . . . . 1.3. Holtpontdetektls a gyakorlatban . . . . 1.3.1. Erforrsok monitorozsa . . . . . 1.3.2. Felgyelet . . . . . . . . . . . . . . 1.4. sszegzs . . . . . . . . . . . . . . . . . . 2. A DeadlockHunter program 2.1. Motivci . . . . . . . . . 2.2. Megolds . . . . . . . . . 2.2.1. Adatgyjts . . . . 2.2.2. Adatfeldolgozs . . 2.2.3. Megjelents . . . . 2.3. Implementci . . . . . . . 2.3.1. Architektra . . . . 2.3.2. Adatgyjts . . . . 2.3.3. Megjelents . . . . 2.4. Optimalizls . . . . . . . 4 5 6 7 7 9 14 15 16 18 20 24 27 27 28 30 32 32 33 34 34 35 36 36 37 38 41

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

2.4.1. Az adatgyjts optimalizlsa . . . . 2.4.2. A megjelents optimalizlsa . . . . 2.5. Fejlesztsi tervek . . . . . . . . . . . . . . . 2.5.1. Forrskd megnyitsa . . . . . . . . . 2.5.2. Felhasznli dokumentci ksztse . 2.5.3. jrafordts nlkli felhasznls . . . 2.5.4. Automatikus kiegszts a keresben 2.5.5. Kdtisztts . . . . . . . . . . . . . . Ksznetnyilvnts Irodalomjegyzk

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

42 43 44 45 45 45 46 46 47 49

HALLGATI NYILATKOZAT
Alulrott Thaler Benedek, szigorl hallgat kijelentem, hogy ezt a szakdolgozatot meg nem engedett segtsg nlkl, sajt magam ksztettem, csak a megadott forrsokat (szakirodalom, eszkzk stb.) hasznltam fel. Minden olyan rszt, melyet sz szerint, vagy azonos rtelemben, de tfogalmazva ms forrsbl tvettem, egyrtelmen, a forrs megadsval megjelltem. Hozzjrulok, hogy a jelen munkm alapadatait (szerz(k), cm, angol s magyar nyelv tartalmi kivonat, kszts ve, konzulens(ek) neve) a BME VIK nyilvnosan hozzfrhet elektronikus formban, a munka teljes szvegt pedig az egyetem bels hlzatn keresztl (vagy autentiklt felhasznlk szmra) kzztegye. Kijelentem, hogy a benyjtott munka s annak elektronikus verzija megegyezik. Dkni engedllyel titkostott diplomatervek esetn a dolgozat szvege csak 3 v eltelte utn vlik hozzfrhetv.

Budapest, 2013. november 23.

Thaler Benedek hallgat

Kivonat
A konkurens vgrehajsra kpes rendszerek terjedse felgyorstotta a prhuzamossgot tmogat szoftver architektrk s algoritmusok fejldst. A parallel rendszerek tervezse komoly kihvst jelent, a hibsan kialaktott vagy implementlt alkalmazsok karbantartsa kltsges s megterhel feladat az zemeltet szmra. A dolgozat az elfordul problmk jellegnek rszletes trgyalsa mellett szmos technikt ismertet, melyekkel ezek elkerlhetek. Az ismertetett technikk kihasznljk a [C++11] szabvny szmos jdonsgt; a konkurencit tmogat szinkronizcis primitveket, a tranzakcionlis memrit kihasznl atomi memria objektumokat s a move szemantikt. A msodik fejezet bemutat egy dinamikus kdanalzisen alapul alkalmazst, mely hatkonyan kpes elre jelezni egy rendszer holtpontjait, olyan kritikus helyzetekben is megoldst nyjtva, ahol ms megoldsok implementlsa nagyon kltsges lenne, az talaktssal jr fejlesztsi erfesztsek vagy a teljestmnyromls miatt.

Abstract
The widespread of multicore processor architectures facilitate and speeds up the development of concurrent software architectures and algorithms. Being a rather tough challenge the design of such systems, failure to design or implement a concurrent application often implies serious maintenance costs later. This thesis describes the common pitfalls like race condition and deadlock and enumerates several solution which counteract and prevent them. The solutions make use of the brand new and highly anticipated features of the [C++11] standard, like the synchronization primitives supporting concurrency, the atomic memory objects and methods which exposes the interesting capabilities of transactional memory and the move semantics. The second chapter introduces an analyzer tool based on dynamic code analysis which is able to predict the deadlocks of a system. This tool successfully provides diagnostics even in cases where the other standard solutions would require excess refactoring or would cause signicant performance degradation.

Bevezet
Napjainkban mr a kzpkategris okostelefonok is gyakran ngymagos processzort tartalmaznak. A korbban csak a szuperszmtgpek luxusnak tekintett konkurens architektrk mr a mindennapok szerves rszt kpezik. A tbb vgrehajt egysggel rendelkez platformok erforrsait csak a jl sklzd tbbszl programok kpesek megfelelen kihasznlni. A prhuzamos szemllet elsajttsa nem egyszer, a megvltozott eszkz architektra j algoritmusokat s szoftver architektrkat ignyel. Az j megoldsok j tpus problmkat okoznak, melyek kzl a stabilits s megbzhatsg szempontjbl klnsen veszlyesek a nehezen reproduklhat s felderthet versenyhelyzetek (race condition ) s holtpontok (deadlock ). A dolgozat els fejezete egy elmleti ttekintst nyjt a paralell rendszerekrl, a konkurens megoldsok bevezetstl vrhat teljestmnynvekedsrl, a modern opercis rendszereken elrhet szinkronizcis primitvekrl, azoknak hardveres htterrl s a gyakran alkalmazott optimalizcikrl. A fejezet ezutn a holtpont jelensg trgyalst kveten 6 technikt mutat be, melyek alkalmazsval klnbz kompromisszumok mellett a holtpont elkerlhet. Az egyes megoldsok sszegzse rszletezi az alkalmazhatsg korltait, a vrhat elnyket s htrnyokat. Az sszefoglal rmutat arra, hogy ltezik elvrsok olyan halmaza, melyet a bemutatott holtpont-megelzsi s -elkerlsi technikk nem kpesek kielgteni. A msodik fejezet bemutat egy olyan szoftvert, mely kpes az elzleg megoldatlan krdseket megvlaszolni. A dinamikus kdanalzisen alapul elemz lehetv teszi egy rendszerben megtallhat holtpont lehetsgek feldertst s elrejelezst, nem tve szksgess a holtpont bekvetkezst. A rszletesen trgyalt optimalizciknak ksznheten lehetv vlik nagy tereszt kpessg (high throughput ) alkalmazsok hatkony elemzse. A fejezet vgl betekintst nyjt a fejlesztsi tervekbe is.

1. fejezet Elmleti ttekints


1.1. Parallel rendszerek

A flvezet alap processzorok tranzisztorszma hozzvetlegesen megjelensk ta [Moore] trvnynek megfelelen minden kt vben megduplzdik. Az exponencilis nvekeds lehetv teszi a processzorok rajelnek felsklzst, nagyobb memrik ellltst, st, mg a digitlis kamerk szenzorainak pixelmrett is rinti. A jelenlegi tranzisztor koncepci s gyrtstechnolgia nem enged meg atomi mretnl kisebb tranzisztorokat, gy a hagyomnyos tranzisztorok exponencilis nvekedsben idvel letrs vrhat, azonban a processzorok rajelnek nvekedst mr most egy sokkal slyosabb akadly htrltatja: a rengeteg, kis helyre zsfolt flvezet eszkz hterhelse olyan nagy, hogy az eszkz nmagt megronglja. A jelensg miatt a processzor rajel nvekeds mrtke a 2000-es vek elejn cskkensnek indult [CMOS-VLSI]. A technikai fejlds folytonossga rdekben a flvezetgyrtk a tranzisztorok zsfoltsgt csillaptand egy processzorba tbb vgrehajt egysget (magot ) kezdek integrlni, melyek prhuzamosan dolgozva kpesek egysgnyi id alatt tbb utastst vgrehajtani, a hterhels tlzott koncentrlsa nlkl, ezzel megnyitva egy j korszakot a modern szoftverfejlesztsben. A tbbmagos rendszerek megjelense egy sor j lehetsget s kihvst llt a szoftverfejlesztk el, akik ki akarjk hasznlni a konkurens rendszerek kpessgeit, azaz tbb szlat, folyamatot kvnnak prhuzamosan utilizlni. A piaci lehetsg elssorban abban rejlik, hogy az a szoftver, ami kpes elosztottan mkdni, s gy teljestmnye a vgrehajtegysgek szmnak nvekedsvel jl sklzdik, szigniknsan hatkonyabb, mint azok, amik nem kpesek erre. Az ebben az rtelemben hatkony rendszerek fejlesztsi kltsgeinek megnvekedst a konkurens rendszerek termszetbl fakadk kihvsok okozzk. (Megjegyzend, hogy a tbbszl alkalmazsok megjelense megelzte a tbbmagos processzorok elterjedst, utbbi csak nvelte a konkurens termszet jelentsgt.)

Az egyik legfontosabb klnbsg, amivel a programoz egy konkurens rendszer fejlesztse sorn szembesl, hogy az utastsok vgrehajtsnak sorrendje nem determinisztikus a tbbszlsg vgett. Ennek kvetkeztben nem elg a program mkdsvel nagyjbl tisztban lenni, nem lehet nhny tesztesetet lefuttatva megbizonyosodni a funkcionalits helyessgrl: brmikor elfordulhat, hogy a teszteset futtatsakor ppen kedvez volt a szlak temezse, s gy a vgeredmny rtelmben helyes mkds volt meggyelhet, azonban a program hibs, ms temezs, idzts esetn viszont ennek megfelelen hibs eredmnyre fog jutni. A prhuzamosan fut szlak helyes mkdsnek biztostst s a szinkronizcis lehetsgeket az 1.1.1 szakasz trgyalja. Az elbbi, leginkbb technikai nehzsgen megoldand problmt jelent egy program komponenseinek prhuzamostsa. A fejlesztnek azonostania kell azokat a rszeket, amelyek kpesek egymstl fggetlenl mkdni, nem tmaszkodnak a msik eredmnyeire, gy az egyes tevkenysgek kln szlakon vgezhetek, akr egy idben is. Az ilyen egyszer mdon prhuzamosthat feladatokat nevezzk trivilisan prhuzamosthatnak. Trivilisan prhuzamosthat algoritmus a mtrixszorzs algoritmusa: A B = C esetn Ci,j rtke csak Ai s Bj fggvnye. A jl prhuzamosthat algoritmusok fejlesztse aktv kutatsi terlet. Ms esetekben elfordulhat, hogy kt komponens fgg egymstl, mkdsk mgis tlapolhat: ha B feladat i + 1. itercija csak A feladat i. itercijtl fgg, a kt feladat i + 1. itercija futhat prhuzamosan. Egy ilyen tpus feladatra plda lehet egy olyan rendszer, ami szvegfjlokat dolgoz fel s az eredmnyeit egy adatbzisba rja. A fenti dencinl maradva itt A-val jellhetjk a fjl egy nagyobb rsznek beolvasst s feldolgozst, mg B -vel az adatbzis rst. Amg A olvassa a fjlt s a lemezmvelet miatt blokkoldik, B kirhatja az elz szmts eredmnyeit, fordtva pedig amikor B az adatbzismvelet befejezsre vr, A olvashatja s feldolgozhatja a bemeneti fjl kvetkez darabjt. Az ilyen tpus sztcsatolsok feldertse s kiaknzsa jelenti a szoftverek prhuzamostsnak elsdleges clpontjt. Lteznek tovbb olyan algoritmikus problmk, amelyek szndkosan gy lettek megalkotva, hogy ne lehessen ket disztributlni. A [bcrypt] kriptograi algoritmus a bemenetn speciklt rtkkel arnyosan sok itercit vgez, tovbb minden egyes iterci tmaszkodik az elz eredmnyre. Ebben az esetben a motivci az elosztott s prhuzamos rendszerek ltal vgzett kdtrs elleni vdelem elsegtse. Felmerl a krds, hogyha a teljestmnynvekeds ennyire egyrtelm, mirt nem vgzi el a prhuzamosthat rszek keresst a fordt program vagy a processzor, ahogy teszik azt szmos ms optimalizci esetben. Mivel a processzor nem ismerheti a vgrehajtand utastsok szemantikjt, magas szint prhuzamosthatsg

feldertsre aligha van lehetsg. Ellenben a fordtprogram ltal prhuzamostott program vgrehajtst tmogat utastskszletek lteznek, pldul a [VLIW], vagy az Intel Itanium processzorcsald alapja, az [EPIC]. Az ilyen architektrj processzorok lnyegben tbb prhuzamos csvezetkkel (pipeline ) rendelkeznek, melyekben kpesek prhuzamos utastsvgrehajtsra. A megkzelts htrnya, hogy a hatkony mkdshez megfelel heurisztikkat alkalmaz fordtkra lenne szksg, azonban ezek a mai napig kutats trgyt kpezik. A prhuzamostott programokat futtatni kpes konkurens rendszerek sem jelentenek tetszleges mrtkben sklzhat teljestmnynvekedst. [Amdahl] trvnye kimondja, hogyha a programunknak csupn B hnyada nem prhuzamosthat (mrpedig ilyen hnyad napjaink programjainak termszetbl fakadan mindig akad, pl.: futtatkrnyezet inicializci, felhasznli interakcira vrakozs, adatbzis s hlzati mveletek, stb.), s ezt a programot egy n szlat prhuzamosan futtatni kpes processzoron futtatjuk, akkor a vgrehajtshoz szksges id arnyos lesz T (n)nel: T (n) = T (1) B + 1 (1 B ) n (1.1)

Ebbl kvetkezen az elmleti sebessgnvekeds adott rendszeren S (n): S (n) = T (1) 1 = 1 T (n) B + n (1 B ) (1.2)

Az (1.2) egyenletbe B = 0.05 rtket helyettestve nlim S (n) rtke 20-nak ad dik, avagy ha programunknak csak 5%-a nem prhuzamosthat, hiba futtatjuk a fennmarad rszt akr vgtelen sok feldolgoz egysggel rendelkez architektrn, csupn hsszoros teljestmnynvekedst rhetnk el.

1.1.1.

Parallel rendszerek kommunikcija

Egy elosztott, konkurens rendszerben szksg lehet az egyes gensek kztt informcicsere biztostsra. Pldul a korbban emltett tlapolt esetben a beolvasst s feldolgozst vgz gensnek rtesteni kell az adatbzismveleteket vgzt, hogy a kvetkez szelet processzlsa megtrtnt, az ksz az adatbzisba rsra. Ekkor az eredmnykzlst s a krdses adat tadst gy kell megvalstani, hogy a jelzsi folyamat sorn egyik gens se rzkelhessen inkonzisztens llapotot a rendszerben a vltoztatsokat atomi mdon kell vgrehajtani. Mskor tbb gens rhatja s olvashatja ugyan azt a fjlt (vagy ms erforrst), ekkor meg kell oldani a krsek sorostst, mivel valdi prhuzamos hozzfrs esetn a fjl tartalma korrumpldhatna az gensek klcsns kizrst kell biztostani. 9

Ezek a problmk megoldhatak akkor, ha biztosthat az gensek szmra a kritikus szakaszok egy idben kizrlagos vgrehajtsa, azaz egy adott szakaszban egyszerre csak egy gens tartzkodhat. Kritikus szakasz elmleti vzlata a kvetkez lehet: Minden szakasz jellemzje egy zr, amit az gensek bezrhatnak, kinyithatnak s ellenrizhetik az llapott. Ekkor a kritikus szakasz vgrehajtsa a kvetkez: 1. Az gens ellenrzi, hogy a zr nyitva van-e. Ha nem, vr, majd jra prblkozik. 2. Ha nyitva tallta a zrat, bezrja azt, ezzel jelezve belpst a kritikus szakaszba. 3. Vgrehajtja a vdend utastsokat. 4. Feloldja a zrat, ezzel kilpve a kritikus szakaszbl, engedlyezve ms gensek szmra a belpst. A tovbbiakban tekintsnk egy folyamatot, mint konkurens rendszert, amelyben az temezett szlak az gensek. A kvetkez megllaptsok ltalnosthatak elosztott rendszerekre. A fenti lpssorozat naiv (s gy hibs) implementcija a kvetkez:
// HIBAS KOD void startCritical(bool& lock) { while (lock); lock = true; } void stopCritical(bool& lock) { lock = false; } int main() { bool lock = false; startCritical(lock); doProtected(); stopCritical(lock); return 0; }

A fenti megolds hibja, hogy amennyiben a startCritical metdust vgrehajt szl a while ciklusbl val kilps utn elveszti a futsi jogt, egy msik szl 10

vele prhuzamosan zrolhatja ugyan azt a zrat, gy amikor az elbbi szl jra temezsre kerl, egyszerre tbben tartzkodhatnak azonos kritikus szakaszban. Valdi prhuzamossgot tmogat architektrn a hibs mkds az temezstl fggetlenl is elfordulhat, ennek eslyt pedig a klnbz vgrehajtsi egysgek dediklt gyorsttra csak nveli. A problma felmerlhet egszen egyszer begyazott rendszerek esetn is, ahol a vgrehajts szigoran egy szlon trtnik s csak egy folyamat van temezve, mivel megszakts (interrupt ) brmelyik pillanatban rkezhet, gy elidzheti a fent lert jelensget. Egyes egyszer pldkban megolds lehet a megszaktsok teljes letiltsa, az esetek tbbsgben azonban robusztusabb megoldsra van szksg. A problma rdekessge, hogy a megoldshoz hardware oldali tmogats elengedhetetlen. Mivel a zr ellenrzst s zrolst atomi mdon kell megtenni, szksg van arra, hogy az architektra utastskszlete ezt egy atomi utasts formjban megvalstsa. Ilyen utasts lehet a TSL (Test and Set Lock ) vagy a CAS (Compare And Exchange ). Elbbi az egyik operandusnak rtkt a msik operandus ltal mutatott helyre rja, miutn a fellrand rtket egy maghatrozott helyre mentette. A viselkeds felhasznlhat tevkeny vrakozs megvalstsra: a zrolst vgrehajt gens addig prblja a zrt llapotnak megfelel rtket a zr ltal mutatott cmre rni, amg az elz llapot nyitottnak nem addik ekkor biztos lehet benne, hogy a zr az ellenrzs pillanatban nyitva volt s azonos pillanatban (utastsban) ltala zrolsra kerlt. A CAS utasts megvalststl fggen sszehasonltja egyik operandust egy regiszter rtkvel s azt egyezs esetn fellrja a msik operandussal. Amennyiben az sszehasonlts klnbsget mutat, az els operandust rintetlenl hagyja s a sikertelensget jelzi, pldul a zero ag trlsvel1 . A megkzelts elnye, hogy versengs esetn nem trtnik memria rs, gy elkerlhet a felesleges szinkronizci. Napjaink konkurencit tmogat megoldsainak tbbsge a CAS utastson alapul s minden jelents platformon tmogatott [DiceEtAl], a korbbi hibs konstrukcinak egy javtott vltozata CAS hasznlatval a kvetkez lehet:
typedef std::atomic<bool> Lock; void startCritical(Lock& lock) { bool unlocked = false; while (!lock.compare_exchange_weak(unlocked, true)); } void stopCritical(Lock& lock) { lock.store(false); } http://courses.engr.illinois.edu/ECE390/archive/spr2002/books/labmanual/inst-refcmpxchg.html
1

11

A compare_exchange_weak metdus els argumentumt hasonltja ssze az atomi objektum rtkvel, egyezs esetn azt a msodik paramter rtkvel rja fell. Az sszehasonlts eredmnyt visszatrsi rtkvel jelzi. Az atomi utastsokon alapul konkurencit tmogat struktrk az 1.2.3 szakaszban kerlnek ismertetsre. A fenti, tevkeny vrakozson alapul kritikus szakasz (spinlock ) megoldja a klcsns kizrs problmjt, de funkcionalitsa nem teljes s teljestmnye sem minden esetben kielgt. Egy zrral szemben tmasztott funkcionlis igny lehet az idkorlttal vrakozs (timed wait ) vagy a vdett erforrs rsnak s olvassnak a megklnbztetse (read-write lock ). A tevkeny vrakozs tbb teljestmnyt is rint problmt okoz: A vrakoz szl feleslegesen sok CPU ciklust veszteget el, mikzben a zr llapott ellenrzi gyors ismtlsekben. Egy rosszul megvlasztott vrakozsi id ami a felesleges utastsok szmt cskkenten slyosan degradlhatja a rendszer teljestmnyt a lass zr tads miatt. Nem biztosthat, hogy a magasabb priorits szlak elbb hozzjutnak az ignyelt erforrsokhoz. Egyes szlak akr vletlen folytn, klnsen alacsony priorits esetn hezhetnek. Priorits rkls hinyban priorits inverzi alakulhat ki. Mivel a fenti problmk alkalmazs-szint megoldsa nagyon krlmnyes, a modern opercis rendszerek biztostanak szinkronizcis primitveket, amelyek kialaktsa gyelembe veszi a fenti ignyeket s kezeli az temezsi problmkat. Ezek gyjtneve mutex, a klcsns kizrs (mutual exclusion ) szavakbl ferdtve. Ezen primitvek zrolsnak vzlata a kvetkez: 1. A szl zrolni prblja az adott mutexet, ezzel kivltva egy rendszerhvst 2. Az opercis rendszer ellenrzi a mutex llapott 3. Amennyiben az szabad, zrolja azt a hv fl szmra, s visszatr 4. Amennyiben a mutex foglalt, a hv szlat hozzadja a mutex vrakozsi sorhoz s felfggeszti a szl futst A felszabadts vzlata: 1. A szl elengedi az adott mutexet, ezzel kivltva egy rendszerhvst 12

2. Az opercis rendszer a zr birtokosnak ellenrzse utn felszabadtja azt 3. Az opercis rendszer felbreszti a vrakozsi sorban tallhat szlak egy rszhalmazt majd visszatr A mutex vrakozsi listjnak modellezse a teljestmnyt rint fontos krds. Ha egy egyszer listt alkalmazunk, elkerljk az hezst, de konvoj hats alakulhat ki a rendszer a leglassabb szl sebessgvel fog haladni, gyelmen kvl hagyva a prioritsokat. Ha prioritsi sort alkalmazunk (pl.: kupac), pont fordtott lesz a helyzet: rvnyesl a szlak prioritsa, de hezs fenyegeti az alacsonyabb priorits szlakat. Ebben a helyzetben a prioritsok adaptv emelse segthet. Hasonlan fontos krds a vrakozsi sorban tallhat szlak felbresztend rszhalmaznak kivlasztsa. Ha csak egy szlat breszt fel a rendszer, (ms optimalizcik jelenlte mellett) megnvekszik a kontextusvltsok szma az ellenttes esethez kpest, amikor a rendszer minden vrakoz szlat felbreszt. Ekkor a tombol csorda (thundering herd ) problma jelenthet problmt: egyszerre tl sok szl szeretne a felszabadult erforrshoz hozzfrni, mivel ez nem sikerl, jra felfggesztsre kerlnek, ezzel szaggatott tve a rendszer mkdst (thrashing ). A vlaszts megfelel lehet akkor, ha vrhat, hogy a mutexet elsknt megszerz szl mg a kvetkez preempci eltt az fel is szabadtja, gy elkerlve a tbbi szl jbli felfggesztst. Az optimlis vlaszts fggvnye az temez egyb jellemzinek. A fenti vzlatszer megoldsban minden mvelet rendszerhvst ignyelt. A Linux kernel futex (Fast userspace mutex ) struktrja elkerli a rendszerhvsok szksgessgt, amennyiben nincsenek versenyz szlak. A megolds alapja egy megosztott memriaterletre helyezett futex, amit bizonyos felttelek mellett az egyes folyamatok maguk zrolhatnak. A megosztott memrinak ksznheten lehetsg nylik nem csak szlak, hanem folyamatok szinkronizcijra is [Futex]. Hasonl megoldst alkalmaz a Microsoft .NET Framework Monitor.Enter metdusa. Amennyiben a monitort resen tallja, belpteti a szlat s zrolja azt, rendszerhvs nlkl, CAS utastssal. Ha zrva tallta a monitort vagy nem sikerlt a zrols, elszr megprblkozik egy rvid tevkeny vrakozssal, elkerlve gy a szl felfggesztst. Ha az idztett spinning is sikertelen, a szl a vrakozsi sorba kerl.2

A mkds a http://www.microsoft.com/en-us/download/details.aspx?id=4917 cmrl letlthet SSCLI 2.0 csomagban, a clr/src/vm/syncblk.cpp fjlban gyelhet meg, az AwareLock::Enter metdustl indulva

13

1.1.2.

Rendszer holtpontja

A kvetkezkben tekintsnk egy rendszerre, mint klnbz feladatokat vgrehajt gensek halmazra. Egy gens esemnyekre vr s bizonyos esemnyek hatsra mveleteket vgez, majd esemnyeket vlt ki. Ekkor egy rendszer valamely H rszhalmaza holtponton van akkor, ha H minden eleme olyan esemnyre vr, amit csak H egy msik eleme tud kivltani. Ha a rendszer brmely rszhalmaza holtpontra jut, az adott rsz mkdse lell, gyakran magval vonva a teljes rendszer hasznlhatatlann vlst. A fenti dencira egy szemlletes plda a [DiningPhilosophers] problma, mely rviden a kvetkez kppen vzolhat: Egy tertett asztal krl lozfusok lnek. A tertk klnlegessge, hogy mindegyikk kztt csak pontosan egy eveszkz tallhat, azonban az tkezs megkezdshez kt eveszkzre van szksgk. Ekkor ha mindegyikk elszr a jobb oldali eveszkzt veszi kzbe, a bal oldali felvtele eltt vrakozsra knyszerl, mivel az bal szomszdjnak jobb oldali eveszkze volt, teht ppen hasznlatban van. gy klcsns egymsra vrs alakul ki, teht az tkezasztal, mint rendszer, holtpontra jut. Holtpont elfordulhat a trgyalt parallel rendszerek esetben is. Ekkor a rendszer (az tkezasztal) egy fut folyamat, a vgrehajt gensek (a lozfusok) pedig a folyamat szlai. A denci s a tovbbiakban trgyalt problmak s megoldsok ugyangy kiterjeszthetek nagyobb lptk problmkra is, pldul elosztott rendszerekre, ahol a rendszer a teljes frtnek, a vgrehajt gensek pedig az egyes frtbe kapcsolt szmtgpeknek felelnek meg. Egy szoftverrendszer szmra a holtpont nem szksgszeren okoz hibs kimenetet, tbbnyire inkbb a kimenet hinya az elsdleges tnet, ami a mkds lebnulst jelenti, anlkl, hogy a holtpontra jutott folyamat terminlna, ezltal jelezve a hibt az esetleges felgyeleti rendszereknek. Egy rendszer holtpontmentessgnek bizonytsa pusztn tesztesetek ismtelt futtatsval nem lehetsges. Mivel holtpontot okozhat idztsi problma (versenyhelyzet ), gyakran elfordul, hogy fejleszts kzben pldul a hinyz fordtsi idej optimalizcik miatt a problma nem jelentkezik. Ugyangy befolysolhatja az egyes szlak temezst, s gy a holtpont kialakulsnak lehetsgt, egy (az les krnyezettl klnbz) tesztkrnyezet, a valditl eltr tesztadat, vagy pusztn mrsi zaj. Ennek ellenre minden erfesztst meg kell tenni, hogy a lehetsges problmk mg az zemi krnyezetbe helyezs eltt kiderljenek. Egy olyan krnyezetben, ahol nem ll rendelkezsnkre elegend hibakeressi eszkz (pl.: debug szimblumok, kimert naplbejegyzsek) vagy maga a fut folyamat (csak post-mortem vizsglat lehetsges), ott bekvetkezett holtpont feldertse klnsen nehz. Addik a krds, hogy hogyan vdekezznk a holtpontok ellen, hogyan eliminljuk a vizsglat sorn a nemdeterminisztikussgbl add bizonytalansgot, milyen 14

technikk lteznek holtpontmentes rendszer kialaktsra, valamint hogyan tegyk a rendszernket ellenllv, ha holtpont elfordulhat. A kvetkezkben trgyalsra kerlnek klnbz holtpont megelzsi (1.2. szakasz) s holtpont elkerlsi (1.3. szakasz) technikk, valamint a 2. fejezet bemutat egy ezektl eltr feldertsi technikt alkalmaz eszkzt.

1.2.

Holtpontmegelzs a gyakorlatban

Egy rendszerben holtpont kialakulsnak szksges felttelei tbbek kztt a kvetkezek: Erforrselvtel hinya: Egy gens nem foszthat meg egy msikat erforrsaitl. Pldnkban a lozfusok nem vehetik ki egyms kezbl az eveszkzket. Klcsns egymsravrs: Egy gens vrhat egy msikra gy, hogy kzben a msik fl (akr tttelesen) r vr. Pldnkban a holtpont bekvetkeztekor minden lozfus a tle bal oldalira vr. Foglalva vrakozs: Egy gens vrakozhat gy erforrsra, hogy kzben ms erforrst mr zrolt. Pldnkban egy lozfus vrakozhat eveszkzre, mikzben mr rendelkezik eggyel. Klcsns kizrs: Egyes erforrsokat egyszerre csak korltozott szm gens hasznlhat. Pldnkban egy eveszkzt egyszerre csak egy lozfus vehet kzbe. Szksges felttelek lvn, mindegyiknek egyszerre teljeslnie kell, hogy egy rendszerben felmerljn a holtpont lehetsge. Holtpont megelzsnek nevezzk azt, ha egy rendszer gy kerl kivitelezsre, hogy valamely fenti felttel semmikppen sem llhasson fenn. Az ilyen megoldsok megvalstst tbbnyire tervezsi idben el kell hatrozni, s a rendszerfejleszts minden szintjn gyelembe kell venni. Egyes felttelek kizrsa klnsen sok erfesztst ignyel. Az erforrselvtel alapja, hogy az egyes genseket prioritizljuk. Amikor egy gens zrolna egy mutexet, amit egy alacsonyabb priorits gens tart ppen, akkor a zr a magasabb priorits gens tulajdonba kerl, az alacsonyabb priorits pedig visszall abba a helyzetbe, amiben a zr megszerzse eltt volt, s vrakozni kezd. A zr tigazolsa az egyszerbb feladat, az llapotvisszallts ellenben komoly problmkat vet fel. Ha a megvltoztatott memriaterletek nem kerlnek visszalltsra, a rendszer inkonzisztens llapotban maradhat. Ennek rdekben minden zrols esetn pillanatkpet kell kszteni, akr a teljes memrirl, felkszlve egy esetleges visszalltsra. Tovbbi problmkat vet fel a kimeneti/bemeneti mveletek visszalltsa, amelyeknek a hatsa mr kikerlhetett a rendszer hatskre all a visszallts ignynek 15

megjelensekor, gy ezeket ksleltetni (kimenet esetn) vagy menteni (bemenet esetn) kell. Ms felttelek megszntetse valamivel kevesebb komplikcit gr technikkkal is megvalsthat. A klcsns egymsravrs elkerlsrl az 1.2.1 szakasz, a foglalva vrakozs tiltsrl az 1.2.2 szakasz valamint a klcsns kizrs megszntetsrl az 1.2.3 szakasz rtekezik. A megosztott adathozzfrs elkerlsnek lehetsgeivel az 1.2.4 szakasz foglalkozik.

1.2.1.

Hierarchikus zrols

A holtpont dencit megvizsglva lthatjuk, hogy holtpont akkor fordulhat el, ha az egyik vgrehajt egysg lefoglalt egy erforrshalmazt, majd ezutn egy msikat szeretne kisajttani, mikzben azt mr egy msik vgrehajt egysg lefoglalta, ami az elbbi halmaz egy elemre vr. Ez megegyezik azzal az esettel, ha a szlak a krdses erforrsok halmaznak brmely kt elemt klnbz sorrendben zrolnk. A felismers alapjn addik a hierarchikus zrols technikjnak tlete: Deniljunk az erforrsok halmazn egy teljes rendezst. A szlak csak a denilt sorrend szerint nvekv sorrendben zrolhatjk az egyes entitsokat, a holtpont kialakulst elkerlend. Ha sikerl a kt felttelt betartani, biztosak lehetnk abban, hogy a vizsglt erforrsokat hasznl szlak kztt nem fog holtpont kialakulni. Az entitsok rendezshez clszer lenne, ha mindegyikhez egy szmrtket rendelnnk, ami alapjn egyrtelmen addna a sorrend. Ha a memriacmet hasznljuk erre a clra, matematikai rtelemben megfelel rendezst kapunk, azonban ez a sorrend fordtsrl fordtsra (klnbz architektrkon, opercis rendszereken, eltr fordt kapcsolk esetn vagy pusztn a kd megvltoztatsa miatt), valamint futtatsrl futtatsra vltozhat (ASLR3 -t hasznl futtatkrnyezet esetn vagy ha a memria nincs virtualizlva). A memriacm vltoz jellege miatt nagyon krlmnyes visszakoz megoldsokat kell alkalmazni az erforrsok zrolsa sorn, melyek erforrspazarlak (a sorozatos visszalpsek s jraprblkozsok miatt) vagy nagyon bonyolult struktrkhoz vezetnek (elre meg kell hatrozni az erforrsok lefoglalsnak sorrendjt s ehez igaztani a mveletek sorrendjt is) melyek rendszerint nem is alkalmazhatak s karbantartsuk nagyon kltsges. Memriacmek helyett adjunk manulisan sorszmot az egyes erforrsoknak. Ez rendszerint egy tagvltoz belltsval trtnik, de bizonyos szigor kvetelmnyek mellett (zrak csak globlis vltozk vagy amennyiben tagvltozk, a befoglal osztlybl csak egy pldny lehet, mindegyik egy fordtsi egysgben vagy fjlban van denilva) hasznlhatunk preprocesszor makrkat, pl.: __LINE__ vagy
3

http://en.wikipedia.org/wiki/Address_space_layout_randomization

16

BOOST_PP_COUNTER()4 . A [C++11/Lockable] modellt kiterjeszt beszmozhat erforrsburkol a kvetkezkppen nzhet ki:


thread_local std::stack<std::size_t> lockedOrders; template <typename BasicLockable> class OrderedLockable { public: OrderedLockable(BasicLockable& resource, std::size_t order) :_resource(resource), _order(order) {} void lock() { if (lockedOrders.top() > _order) { throw std::logic_error("Invalid locking order"); } _resource.lock(); lockedOrders.push(_order); } void unlock() { lockedOrders.pop(); _resource.unlock(); } std::size_t getOrder() { return _order; } private: BasicLockable& _resource; std::size_t _order; };

A fenti plda kt problmra is megoldst nyjt: lehetsget ad az egyes entitsok beszmozsra az inicializlskor, valamint biztostja azt, hogy az egyes szlak csak a legutbb zrolt de mg nem elengedett erforrs azonostjnl nagyobb azonostj erforrst zrolhassanak. Az ellenrz rutin ltal dobott kivtelt nem ajnlott elkapni, a hibt kivlt szl mkdst kell a kialaktott sorrendhez alaktani. Az ellenrzs helyes mkdshez szksg van egy szlspecikus trolban elhelyezett veremre, ami a foglalsok sorrendjt jegyzi. Fontos megjegyezni, hogy a thread_local trolsi osztly ler (Storage class specier ) s a benne trolt nem [C++11/POD]-tpus elemek jelenleg gyengn tmogatottak, gy egyes platformo4

http://www.boost.org/doc/libs/1_54_0/libs/preprocessor/doc/ref/counter.html

17

kon (pl.: GCC version < 4.8) szksges lehet thread_local helyett a __thread ler hasznlata, vagy a verem helyett csak egy veremre mutat pointer trolsa, amit az egyes szlak indtsakor inicializlni kell. A megolds htrnya, hogy az egyes erforrsokat mr tervezsi idben rendezni kell (legalbb valamilyen fa struktrba), hogy az egyes szlak mkdse ennek megfelelen legyen kialaktva. Ha a sorrend meghatrozsa a fejleszts megfelelen korai fzisban elmarad, ksbb csak komoly erfesztsek rn ptolhat, mivel az egyes szlak mkdsnek megvltoztatst vonhatja maga utn. A msik problma egy elemenknt zrolhat listval modellezhet. Tegyk fel, hogy az egyik algoritmusunk a listt balrl jobbra tudja hatkonyan feldolgozni, az egyedi elemeket folyamatosan, egyms utn zrolva, de nem elengedve, mg egy msik algoritmus ugyan ezt tudja, csak jobbrl balra. Ha az elemekhez rendelt zrakat a nekik megfelel sorban szeretnnk lefoglalni, az egyik algoritmus gy kell megvltoztatni, hogy az az sszes elemet egyszerre (vagy legalbbis ignyeihez kpest ellenttes irnyban) zrolja, ami rontja a hatkonysgt. Ha nem szeretnnk egyik algoritmust sem megvltoztatni, hasznlhatunk egy lista szint zrat, ez viszont cskkenti a zrols granualitst, ami adott esetben kritikus lehet. Az elemenknt zrolhat lista pldja letszertlennek tnhet, viszont az ezzel modellezhet problmk (pl.: zenet propaglsa egy architektra rtegein keresztl) nagyonis letszerek. A hierarchikus zrols technika alkalmazsa olyan feladatokban, ahol az adatfolyam irnya egyrtelm, sikerrel hasznlhat, de klns krltekintst s alapos tervezst ignyel, ellenben a fent bemutatott pldnak a futsidej tbbletterhelse nem szignikns. Ezzel szemben mr ltez, karbantartand, a technikt nem alkalmaz problms alkalmazsok ilyen md kijavtsa ritkn vezet eredmnyre s komoly erfesztst ignyel. Olyan feladatok esetn, ahol az egyes komponensek kommunikcijnak irnya nem egyrtelm, a technika nem alkalmazhat jelents teljestmnybeli degradci nlkl.

1.2.2.

Egylpses zrols

A holtpont megelzhet gy, ha minden szl a szksges erforrsokat egy lpsben foglalja le. Ennek menete a kvetkez: A szl meghatrozza a zroland entitsokat, majd sorban megprblja ket lefoglalni. Amennyiben valamelyik erforrs foglalt, az sszes tbbit elengedi, majd vrakozni kezd a foglalt entitsra. A C++11 std::lock() metdusa is ezt a mkdst valstja meg [C++11/lock]:
{ std::lock(m1, m2, m3);

18

doProtectedOperation(); m1.unlock(); m2.unlock(); m3.unlock(); }

A fenti megolds hibja, ha a lock() hvs utn brmelyik mvelet kivtelt eredmnyez, a mutexek zrva maradnak. Java vagy C# krnyezetben bevett szoks a problma megoldsra egy try-finally blokkot vonni a vdett opercik kr, s a finally blokkban vgezni az erforrsok felszabadtst. C++ esetben a preferlt megolds a RAII idiom [ExceptionalC++] alkalmazsa.
{ std::lock(m1, m2, m3); std::lock_guard<std::mutex> lock1(m1, std::adopt_lock); std::lock_guard<std::mutex> lock2(m2, std::adopt_lock); std::lock_guard<std::mutex> lock3(m3, std::adopt_lock); doProtectedOperation(); }

A lock_guard burkol osztlyok gondoskodnak arrl, hogy megsemmislskkor elengedjk a felgyelt mutexet. Mivel kivtel keletkezse esetn a vezrls elhagyja a kapcsos zrjelek ltal hatrolt blokkot, meghvdik az r pldnyok destruktora s a fenti mkds rvnyre jut, biztostva ezzel az inkonzisztens llapot kialakulsnak megakadlyozst. A lock_guard konstruktora alaprtelmezett esetben megprblja a felgyelt erforrst zrolni, a std::adopt_lock cmke feltntetsvel jelezzk, hogy erre mr nincs szksg. Megjegyzend, hogy a fenti technikk nem csak a standard knyvtr mutex tpusval mkdnek, hanem brmilyen ms tpussal, ami kielgti a Lockable modell kvetelmnyeit [C++11/Lockable]. A megvalstand metdusok rvid lersukkal a kvetkezek: lock(): Blokkol addig, amg nem tudja zrolni az erforrst. Amennyiben kivtel keletkezik, az erforrs nem marad zrolva. unlock(): Felszabadtja az erforrst, kivtelt nem vlthat ki. try_lock(): Blokkols nlkl megksrli zrolni az erforrst, a sikeressget visszatrsi rtkvel jelzi. A fentiek gyelembe vtelvel knnyen kszthetnk olyan burkol osztlyokat, amelyek a standard knyvtr zrolst tmogat eszkzeivel egyttmkdve hasznlhat 19

s olyan erforrsokat felgyel, amelyek alaprtelmezetten nem tmogatjk a prhuzamos hozzfrst (pl.: adatbzis-kapcsolat, hlzati ler). A bemutatott megolds megelzi a holtpontot kialakulst, mivel a std::lock() hvst vgrehajt szl ahelyett, hogy ms erforrsokat zrolva tartva vrakozna, a sikeresen kisajttott zrakat elszr elengedi, s utna kezdi meg a vrakozst, gy nem alakulhat ki egymsra vrs, mivel ha valaki vrakozik, akkor nem birtokol erforrsokat. Holtpont helyett viszont ms problmk merlnek fel: a lert visszakozs, backo stratgia alkalmazsa sorn fenyeget a livelock kialakulsnak veszlye: a vgrehajt egysgek nagyon udvariasan jra s jra elengedik a mr lefoglalt erforrsokat, rdemi elrelps nlkl. A gyorsan ismtld visszakozsokbl addan a livelock szitucik slyosan degradljk a rendszer teljestmnyt. A megolds msik htrnya a zrolsi granualits problmja. Ha tbb, egymsra pl mveletet szeretnnk vgrehajtani, hagyomnyos esetben a ksbbi mveletek ltal ignyelt erforrsok kisajttst ksbbre halaszthatjuk, gy nvelve a multiprogramozs fokt s a rendszer teljestmnyt. Egylpses zrols esetn knytelenek vagyunk minden entitst elre lefoglalni, gy feleslegesen hossz idre (tl korn) kisajttani azokat, kizrva annak a lehetsgt, hogy ms szlak azokon mveleteket vgezhessenek, amikor ezt a vgrehajtott mveletsor nem indokolja. Klnsen rossz a helyzet akkor, ha (egy msik foglals mellett) zrolhat entitsok listjn kell mveletet vgeznnk: ahelyett, hogy csak az aktulis elemet sajttannk ki, knytelenek vagyunk a teljes lista sszes elemt zrolnunk, feleslegess tve ezzel az elemszint mutexeket, a konkurencia szintjt gyakorlatilag nullra cskkentve. Tovbbi problmja a techniknak, ha a lefoglaland erforrsok egy rszt csak futsi idben ismerjk meg, egy msik zroland entitssal trtn interakci utn. Ilyenkor csak nagyon krlmnyesen, vagy akr (csak futsidben ismert szm erforrs esetn) sehogyan sem tudjuk alkalmazni a megoldst. Az egylpses zrols megfelel lehet kisebb alkalmazsok holtpontmentessgnek biztostsra, nagyobb rendszerek esetn azonban a teljestmnyt komoly mrtkben negatvan befolysol jellege miatt nem megfelel eszkz.

1.2.3.

Zrmentes adatstruktrk

A korbban trgyalt megoldsok mindegyike az erforrs zrols egy specilis mdjt hasznlta arra, hogy a klcsns kizrs megvalstsa mellett holtpontmentes konkurens mkdst biztostson. A zrak hasznlatnak egy htrnya, hogy kommunikcit tesz szksgess az opercis rendszerrel (rendszerhvs), mely kommunikci mrtke optimista stratgival cskkenthet, de nem elkerlhet. A msik felmerl problma, hogy a zrra vrakozs blokkolja a vgrehajt egysget, azt az 20

opercis rendszer felfggesztheti, a felfggeszts hossznak ideje pedig nem garantltan korltos. Az indeterminisztikus vrakozs alkalmatlann teszi a zrakat vals idej rendszerek szmra. Helyes konkurens mkds megvalsthat blokkol zrak s vrakozsok nlkl is. Egy algoritmust zrmentesnek (lock-free ) neveznk, ha a rendszerszint halads garantlt, s vrakozs mentesnek (wait-free ) akkor, ha a vgrehajt egysgenknt tekintett halads is garantlt. Minden vrakozs mentes algoritmus egyben zrmentes is. Az ilyen jellemzket mutat technikk kiemelt szerepet jtszanak vals idej rendszerekben. ltalnossgban elmondhat, hogy az ilyen algoritmusok hasznlatnak is ra van; a kifejlesztsk s helyessgknek bizonytsa, valamint karbantartsuk jval kltsgesebb feladat, mint egy azonos funkcij, zrakkal operl vltozatnak. Tovbb a halads garantlsa extra utastsokat ignyel, gy egy zrmentes megvalsts lassabb lehet hagyomnyos prjnl alacson konkurencij helyzetekben. C++ krnyezetben zrmentes adatstruktrkon konkurens vgrehajt gensek szinkronizcijt lehetleg hardware ltal tmogatott atomi mveleteken s a hozzjuk kapcsolt memriarendezsi (memory ordering ) szablyokon keresztl lehet biztostani. Az egyes mveletek interthread relcija, a szinkronizci pontos karakterisztikja a fggvnyhvsok paramtereivel szablyozhat. A kvetkezkben tett lltsok felttelezik, hogy mindig az alaprtelmezett, memory_order_seq_cst van hasznlatban. Ms belltsokkal egyes architektrkon hatkonyabb mkds rhet el, azonban a helyessg bizonytsa mg nehezebb vlik. A tovbbiakban a szinkronizcirl tett lltsok pusztn a megrtst szolgljk, nem nyjtanak teljeskr tjkoztatst s egyes fogalmakat leegyszerstenek a szabvnyhoz kpest. Az egyes memriarendezsi technikkrl s a pontos terminolgirl bvebb irnymutatst a [ConcurrencyInAction] vagy a [C++11/MemoryModel] ad. A szinkronizci alapja a sequenced before s az atomi mveletek kztti implicit synchronized with relci. Egy A mvelet sequenced before relciban van egy B mvelettel, ha egy szekvencilis kdban eltte ll. Egy B atomi mvelet synchronized with relciban van A atomi mvelettel, ha egy azonos memriaterletet A r s B olvas. Ezen relcik tranzitvak, gy az atomi mveletek felhasznlhatak arra, hogy velk sequenced before relciban ll memriamveletek befejezdst jelezzk. Ha a memria modell nem tenne ilyen kiktseket, elfordulhatna, hogy a fordt ltal alkalmazott utasts-trendezs, a processzor soron kvli utastsvgrehajtsa vagy egy agresszv gyorsttr miatt a jelzsknt hasznlt vltoz mdostst egy msik szl (vgrehajt gens) id eltt rzkelje. A kvetkez kdrszlet egy egy-termel, egy-fogyaszt (single producer, single consumer ) FIFO sort mutat be. A trol jellegzetessge, hogy kt prhuzamos fut szl frhet hozz egy x mret puerhez, mely hozzfrs sorn egyik elemeket illeszthet

21

be, msik a beillesztett elemeket veheti ki. A megvalsts nem hasznl zrakat, a mkds helyessgt az atomi mveletek szinkronizcis tulajdonsgai biztostjk. A bemutatott kd csupn a megrtst szolglja, az eredeti, teljes vltozat megtallhat a Boost knyvtrban 5
template <typename T> class SpscQueue { enum { maxSize = 100 }; std::atomic<size_t> _writeIndex; T _buffer[maxSize]; std::atomic<size_t> _readIndex; SpscQueue(const SpscQueue &) = delete; SpscQueue(SpscQueue &&) = delete; const SpscQueue& operator=(const SpscQueue&) = delete; public: SpscQueue(void) :_writeIndex(0), _readIndex(0) {} bool push(const T& t) { size_t writeIndex = _writeIndex.load(); size_t next = (writeIndex + 1) % maxSize; if (next == _readIndex.load()) { return false; // full buffer } _buffer[writeIndex] = t; _writeIndex.store(next); return true; } bool pop(T& ret) { size_t writeIndex = _writeIndex.load(); size_t readIndex = _readIndex.load(); if (writeIndex == readIndex) { return false; // empty buffer }
5

http://svn.boost.org/svn/boost/trunk/boost/lockfree/spsc_queue.hpp

22

ret = _buffer[readIndex]; size_t next = (readIndex + 1) % maxSize; _readIndex.store(next); return true; } };

A push metdus egy beszrand elemet vr, siker esetn igazzal tr vissza, ha a kontner tele van, hamissal. Elszr megllaptja az rand mez indext (_writeIndex), majd veszi inkrementltjnak puermret szerinti maradkt (a puer krkrs mdon kerl rsra). Ha az gy kapott index megegyezik az olvasand indexszel, a puer tele van; a metdus a sikertelensget jelezve hamissal tr vissza. Ellenkez esetben eltrolja a kapott elemet s frissti az rand indexet. A pop metdus megprbl egy elemet kivenni a sorbl; siker esetn igazzal tr vissza, ha a kontner res, hamissal. Elszr megllaptja az elzleg rt s olvasott mez (_readIndex) rtkt, ha ezek megegyeznek, a puer res, a metdus a sikertelensget jelezve hamissal tr vissza. Ellenkez esetben kiolvassa a puerbl a megllaptott olvassi indexen tallhat rtket, eltrolja az olvassi rtk maradkos inkrementltjt, majd az olvasott rtkkel visszatr. A fent vzolt mkds logikja miatt nem fordulhat el, hogy elbbi metdus fellr egy rtket, amit utbbi metdus mg nem olvasott fel. Ha az aktulis rsi s olvassi indexeket nem atomi mezkben trolnnk, elfordulhatna, hogy az utaststrendezsek miatt az rsi index beri az olvassit oly mdon, hogy push metdus telinek, pop metdus pedig resnek rzkeli a puert. A korbban trgyalt atomi mveletek kztt fennll relciknak ksznheten a fenti pldban ez nem fordulhat el. Lthattuk, hogy bizonyos specilis esetekben (mint a fenti krkrs puer), megfelel konkurencia szint s terhels mellett praktikus megoldsok kszthetek zrak hasznlata nlkl is. Azonban nem minden problmra j megolds a zrmentes megkzelts egyes esetekben jval lassabb lehet zrakat hasznl megfeleljnl, ms helyzetekben pedig nem is realizlhat. A zr- s vrakozs-mentes algoritmusok s adatstruktrk aktv kutatsi terletek, a tranzakcionlis memria fejldsvel prhuzamosan jabb megoldsok megjelensre lehet szmtani.

23

1.2.4.

Token alap adathozzfrs

Egyes helyzetekben szksg lehet arra, hogy nemcsak a zrak alkalmazst, hanem a kzs, megosztott adat rst is tiltsuk a rendszerben. Ennek stabilitsi, biztonsgi okai lehetnek. Ekkor az adathozzfrs engedlyezse vagy lehetsge egy azonost (token ) birtoklstl fgghet. Amikor egy vgrehajt egysg ltrehoz egy megosztsra (tovbbadsra) alkalmas entitst, megszerez egy azonostt, ami ezt az entitst reprezentlja. Ezutn csak az azonostn keresztl kpes hozzfrni az entitshoz, a vgrehajtand mvelettl fggetlenl. Valdi megoszts ebben a modelben nincs, ha a birtokos szeretn engedlyezni ms vgrehajtegysg szmra a hozzfrst, az azonostt tovbbadja, a fogad fl lesz az j birtokos, eredeti tulajdonosa elveszti jogait az entits felett. C++ krnyezetben a fent vzolt mkds kzelthet std::unique_ptr hasznlatval.
#include #include #include #include <memory> <thread> <iostream> <cassert>

struct Task { int data; void execute() { std::cout << "Task data: " << data << std::endl; } }; typedef std::unique_ptr<Task> TaskPtr; void taskProcessor(TaskPtr taskPtr) { taskPtr->execute(); } int main() { TaskPtr taskPtr(new Task{1}); std::thread processor(taskProcessor, std::move(taskPtr)); assert(taskPtr.get() == nullptr); processor.join(); return 0; }

A Task struktra egy elvgzend feladatot szimbolizl, ami rendelkezik valamilyen 24

vdend adattal (data) s egy execute metdussal, mely meghvsval a reprezentlt feladat vgrehajthat. A main fggvny a dinamikus memriban ltrehoz egy ilyen struktrt, a kapott mutatt (pointer ) egy megfelel std::unique_ptrben trolja. Ezutn elindt egy feladat feldolgoz szlat, amelynek tadja az imnt ltrehozott feladatot, kihasznlva a C++11-ben megjelen move szemantikt. Miutn az tads megtrtnt, a std::unique_ptr res marad, tbb nincs lehetsg rajta keresztl hozzfrni a Task pldnyhoz. Ekzben az jonnan indul szl lefuttatja a taskProcessor fggvnyt, mely tveszi a feladatra mutat std::unique_ptr-t. Ezen keresztl elrhet a korbban ltrehozott feladat, amit a fggvny az execute metdus meghvsval vgre is hajt. A feladat ltal elfoglalt memriaterlet felszabadtsrl a std::unique_ptr gondoskodik, a taskProcessor visszatrsekor. Az zenetvlts ebben a formban nem klnsen hatkony, mivel minden egyes ltrehozott feladatot egy j szlnak kell tadni, amely ltrehozsa kltsges s ami megsznik a feladat vgrehajtsa utn. A szlak jrahasznostsa rdekben rdemes szlkszlet (thread pool ) hasznlata, ahova az egyes szlak a feladat vgrehajtsa utn visszatrnek, hogy ksbb jra temezhetek legyenek, elkerlve a ltrehozsukkal s megszntetskkel kapcsolatos extra terhelst. Egy kivl temez s szlkszlet implementcit tartalmaz az Intel R Threading Building Blocks6 knyvtr. A fenti plda csupn az zenetklds szemantikjnak szemlltetst szolglja. A megkzelts csak akkor mkdik, ha az zenetklds rsztvevi nem frnek hozz direkt a std::unique_ptr tartalmhoz, azt nem mentik el s nem hasznostjk jra. Az egyes szlak tovbbra is elrik a folyamat teljes cmtert, gy a vdend adat szerencstlen esetben fellrdhat, vagy versenyhelyzet alakulhat ki. Ms rendszerek megvalstanak valdi zenetkldst. Erlang krnyezetben lehetsg van olyan folyamatok ltrehozsra, melyek egy a futtatkrnyezet ltal biztostott csatornbl veszik ki a nekik cmzett zeneteket. Mivel az Erlang ltal biztostott vltozk nem mdosthatak (inmutable ), versenyhelyzet veszlye nem ll fenn. A kvetkez Erlang nyelv mintaprogram egy egyszer zenetkldsi modellt mutat be:
-module(messaging). -compile(export_all). taskProcessor() -> receive {Data, Pred} -> Pred(Data), taskProcessor();
6

https://threadingbuildingblocks.org/

25

{quit} -> true; _ -> taskProcessor() end. main() -> TaskProcessor = spawn(messaging, taskProcessor, []), TaskProcessor ! {1, fun(X) -> io:format("Task data: ~w~n", [X]) end}, TaskProcessor ! {quit}.

A megolds elnye, hogy a ltrehozott TaskProcessor folyamat a feladat vgrehajtsa utn folytatja az zenetsor feldolgozst, csak explicit felszltsra (quit zenet) lp ki. A folyamatok temezsrl a futtatkrnyezet gondoskodik. A bemutatotthoz hasonlt zenetkldsi rendszert hasznl tbbek kztt az ermvek s ms misszi-kritikus rendszerek vezrlsre certiklt Ada7 programozsi platform, s a valsidej alkalmazsokat kiszolgl QNX8 opercis rendszer is. Ezek esetben a szinkron zenetklds sorn a kld fl addig blokkoldik, amg a rendszer az zenetet a fogad fl memriaterletre nem msolta, valamint a fogad fl hasonl mdon blokkolhat, zenetre vrakozva. Elkpzelhet aszinkron zenetklds is, pldul InniBand9 kommunikcis technolgia hasznlata esetn. Ekkor az RDMA-t (Remote Direct Memory Access ) tmogat hardware eszkz msolja az adatokat a kt fl memrija kztt, viszont az rintett memrialapok kilapozsnak megakadlyozsrl gondoskodni kell. Ezen technolgik esetn a terminolgia az zenet (message ), zenetklds (message passing ) s csatorna (channel ) tekintetben megegyezik. A fentiek alapjn megllapthat, hogy az zenetklds egy biztonsgossg tekintetben nagyon hasznos technika, azonban teljestmnyt tekintve nem kiemelked. Mg ha el is kerljk az adatok mozgatst vagy msolst a memriban, a modell szemllete akadlyoz abban, hogy egyszerre tbb vgrehajt egysg dolgozzon azonos adaton, gy a konkurencia elrhet szintje cskken. Br elsre gy tnik, hogy az zenetklds nem hasznl zrakat, a blokkol utastsok a felszn alatt akr ugyan azokat a szinkronizcis primitveket alkalmazhatjk. A kommunikci irnynak helytelen megvlasztsa gy holtponthoz vezet, pldul ha kt folyamat egymsnak akar zenetet kldeni; ekkor mindkett a msik fogadsra fog vrni.
7 8

https://en.wikipedia.org/wiki/Ada_(programming_language) https://en.wikipedia.org/wiki/QNX 9 https://en.wikipedia.org/wiki/InniBand

26

1.3.

Holtpontdetektls a gyakorlatban

Egyes rendszerek esetben nem lehet tervezsi idben holtpontmentessget biztostani, mskor pedig nem biztostott az anyagi jelleg rfordts, hogy a ritkn elfordul holtpontokat a rendszer karbantarti eltvoltsk. Elbbi jellemz egy programozhat rendszer esetben, pldul egy opercis rendszer vagy egy adatbziskezel fejlesztsekor, ahol erforrsokat ms programok szmra kell biztostani, gy az egymsra vrs egy msik a rendszer feletti rtegben alakul ki (folyamatok vagy tranzakcik szintjn). Utbbi helyzetre plda egy olyan nagymret kdbzis, melynek eredeti szerzi mr nem elrhetek, megfelel tszervezshez pedig hinyzik a karbantarti csapat kompetencija vagy idkerete zemeltetse viszont felttlenl szksges. Ekkor clszer a rendszerben holtpontdetektlsi technikkat alkalmazni. Ezen technikk megoldst nyjtanak arra az esetre, amikor nem lehetsges az alkalmazs holtpontmentestse, gy a bekvetkez holtpontokat valamilyen mdon az alkalmazs kontextushoz kpest kvlrl kell megszntetni. A mkds folytonossga rdekben monitorozni kell az erforrsokat s felhasznlikat, holtpont utn kutatva, vagy valamilyen heurisztikval segtve kell eszkallni a problmt gyans helyzetben. A kvetkez kt szakasz egy-egy ilyen technikt trgyal.

1.3.1.

Erforrsok monitorozsa

Egy adatbziskezel rendszer ki van szolgltatva felhasznlinak. Mivel egyszerre tbb fggetlen program kapcsoldhat s hajthat vgre tranzakcikat, knnyen elfordulhat, hogy egyes tblkat rossz temben, ellenkez sorrendben zrolnak. Ha az adatbziskezel nincs felkszlve ilyen helyzetekre, felhasznli holtpontra kerlnek s nerbl sem kommitlni, sem abortlni nem tudnak majd. Egy lehetsges megolds az erforrsok s tranzakcik kapcsolatainak reprezentlsa egy G(V, E ) fggsgi gral, ahol v V pontosan akkor, ha v egy erforrs vagy egy fut tranz akci s (i, j ) E akkor, ha i egy tranzakci ami j erforrst zrolva tartja vagy ha i egy erforrs, amire j tranzakci vr. Ekkor egy j0 erforrs zrolsa az azt ignyl i0 tranzakci szmra a kvetkez kppen trtnik: 1. Ha (i0 , j0 ) E , a tranzakci mr birtokolja az erforrst, a procedra visszatr. 2. Ha |{k |(k, j0 )}| = 0, vagyis ha az erforrs mg szabad, legyen E := E (i0 , j0 ), ezzel jelezve a zrolst. A zr regisztrlst kveten a procedra visszatr.

27

3. Ha az erforrs foglalt volt, legyen E := E (j0 , i0 ) majd tekintsk a j0 cscsbl indtott mlysgi keresst, mely sikeres, ha a bejrs sorn jra visszarkezik j0 cscsba. Ha a keress sikertelen, nincs egymsra vrakozs, i0 biztonsgosan vrakozhat, a procedra visszatr. Ellenben ha a keress sikeres, az erforrs biztostsa a rendszert holtpontra juttatn. A procedra abortlja i0 tranzakcit (V := V \ {i0 }), majd felszabadtja zrolt erforrsait s visszavonja legutbbi zrolsi ignyt (E := E \ {(a, b)|a = i0 b = i0 }). Knnyen belthat, hogyha az erforrs allokci a fenti lpseket kveti, nem alakulhat ki egymsra vrakozs. (Egy ilyen helyzet egy krt felttelezne a grfban, kr eleme azonban nem lehet levl elem, gy a msodik lpsben az l tovbbi vizsglat nlkl hozzadhat a fggsgi grfhoz, a harmadik lps explicit mdon ellenrzi a kr elfordulst, a kiindul grf krmentes (res), ms mdon pedig nem keletkezik irnytott l.) A harmadik lps esetben az adatbziskezel mrlegelheti, hogy melyik tranzakcit abortlja; gyelembe kell venni a tranzakcik prioritst, az abortlssal s visszaforgatssal (rollback ) jr kltsgeket, trekedni kell az hezs elkerlsre. A procedra knnyen kiterjeszthet megosztha (pldul olvashat s rhat) erforrsokra. Az egyes fggsgeket reprezentl leket meg kell jellni a zrols jellege szerint, s a msodik lpsben nem kell gyelembe venni az olvassi fggsgeket, amennyiben a ltrehozand zrols is olvassi jelleg. A modell jl alkalmazhat akkor, ha a zrolsok frekvencija lehetv teszi a keressek vgrehajtst az ignyelt teljestmnyszint fenntartsa mellett. Amennyiben az erforrsok szma s a rezervcik gyakorisga nagy, a megolds implementlsa mrlegelend. Egy opercis rendszer esetben pldul egy folyamat zrainak nyilvntartsa feleslegesen lasstan a mkdst, a szlak helyes konkurens viselkedsrl a programoznak kell gondoskodnia sajt hatskrn bell. Ezzel szemben ez nem felttelezhet egy adatbziskezel rendszer esetben, ahol az egyes erforrsokhoz klnbz kliensek is hozzfrhetnek.

1.3.2.

Felgyelet

Amennyiben nincs lehetsg az alkalmazs mdostsra, s a futtatkrnyezet sem vltoztathat, tmeneti megolds lehet egy monitoroz rendszer fellltsa. A monitoroz rendszer feladata elre denilt metrikk mentn vizsglni a fut alkalmazst, az egyes mrszmok kritikus rtke esetn pedig elre meghatrozott eljrs vgrehajtsa. Az alkalmazhat metrikk s eljrsok nagyban fggenek a felgyelend rendszer jellemzitl. Egy holtpontra jutott alkalmazs jellemzje, hogy az egymsra vrs kvetkez28

tben az egyes szlak nem vgeznek semmilyen mveletet, fel vannak fggesztve. Ekkor az alkalmazs processzor hasznlata hossz idn keresztl a vrtnl alacsonyabb lesz, amit egy monitoroz rendszer knnyen felismerhet. A megolds nem alkalmazhat akkor, ha ilyen res vrakozsi szakaszok az zemszer mkds sorn is elfordulhatnak. Pldul egy webszerver esetben vrhat, hogy az alacsony forgalm idszakokban az egyes szlak passzvan vrakoznak a bejv krsekre, ms szmtst nem vgeznek. Ekkor a processzorterhelst gyel metrika fals pozitv jelzst adhat. Monitorozhatak az alkalmazs ltal okozott mellkhats jelleg mveletek is. Az elz esetben problmt jelent szerver funkcij, krseket kiszolgl alkalmazs esetben amennyiben kszl napl bejegyzs a krs berkezsekor s a vlasz elkldsekor, a bejegyzsek sszeprostsval a felgyeleti rendszer pontos kpet kaphat a rendszer vlaszidejrl. A szokatlanul hossz vrakozsok j indiktorai egy vgtelen vrakozsnak. Az erforrshasznlat s mellkhats analzis mdszerek kombinlhatak, hatkonysguk gy nvelhet. A kritikus helyzetben vgrehajtand eljrs is mrlegels krdse. Egyes helyzetekben megengedhet az alkalmazs llapotnak elvesztse s egy rvid kiess, ekkor az a felgyeleti rendszer ltal terminland majd jraindtand. Az jraindts sikeressgt mindenkppen ellenrizni kell, sikertelensg esetn a problma eszkalland. A terminls eltt clszer lehet egy pillanatkp ksztse a memrirl (coredump, minidump), gy az zemeltet ksbb meggyzdhet a monitoroz rendszer dntsnek helyessgrl s szksg esetn nomthatja kongurcijt. Ms esetekben nem elfogadhat, hogy automatizmusok rendelkeznek ms alkalmazsok futsi joga felett, ekkor a felgyeleti dolgozk riasztsa clszer. Ilyen jelleg riasztsok frekvencijt megfelelen alacsony szinten kell tartani, a tlzott zenetradat sorsa gyakran a gyelmen kvl hagys hossz tvon. A megolds elnye az egyszer kivitelezhetsg, a felgyeleti rendszerek terjedsvel egy ilyen egyszer metrika belltsa gyorsan s megbzhatan elvgezhet, az alkalmazs mdostsa nlkl. A megolds megbzhatsga azonban agglyos, a heurisztika j belltsa nehz feladat, gy ezt csupn tmeneti megoldsknt rdemes megfontolni, hossz tvon a vesztesgek meghaladhatjk az alkalmazs valdi kijavtsnak kltsgeit.

29

1.4.

sszegzs

Az 1.2 s az 1.3 szakasz szmos technikt trgyalt; mindegyik megolds clja a fejlesztett vagy felgyelt rendszer holtpontmentestse. A cl kzs, az alkalmazhatsg s az eredmnyek azonban sok tekintetben eltrek. Az 1.1-es tblzat sszefoglalja az egyes eszkzk elnyeit s htrnyait nhny fontosnak tlt szempont szerint. Megolds neve Teljestmny Megvalsts kezdete Hierarchikus zrols Egylpses zrols Zrmentes adatstruktrk Token alap hozzfrs Erforrsok monitorozsa Felgyelet Magas Mrskelt Magas Alacsony Mrskelt Magas Tervezs Fejleszts Fejleszts Tervezs zemeltets zemeltets Alkalmazhatsg Univerzlis Megbzhatsg Megbzhat

Korltozott Megbzhat Korltozott Megbzhat Univerzlis Megbzhat

Korltozott Megbzhat Korltozott Heurisztika

1.1. tblzat. Holtpont-megelzsi s -elkerlsi technikk sszehasonltsa

A Teljestmny oszlop azt jelzi, hogy az egyes megoldsok implementlsa mennyiben befolysolja az alkalmazs sebessgt; az tereszt kpessget (throughput ) valamint a ksleltetst (latency ) s a konkurencia fokt. A lehetsges rtkek sorrendje legjobbtl a legrosszabb fel haladva: Magas, Mrskelt, Alacsony. A Megvalsts kezdete oszlopbl kiolvashat, hogy az egyes technikk amennyiben kivlasztsra kerlnek mikor rintik legkorbban az alkalmazsfejlesztst. Itt a tervezsi fzis a legkorbbi idszak, ekkor a technika alkalmazsa befolysolja az alkalmazand architektrt. A fejlesztsi szakaszban megvalsthat megoldsok implementcis dnts eredmnyeknt kerlhetnek a rendszerbe legksbb. Az zemeltets eszkzei az alkalmazs fejlesztstl fggetlenl felhasznlhatak. Az Alkalmazhatsg oszlop kt csoportra bontja a versenyzket: Univerzlis az a technika, ami az alkalmazsi terlettl fggetlen s tbbnyire kpes mindegyik architektrval egytt mkdni, korltozottknt jellt az a megolds, amely hasznlata feltteleket tmaszt a rendszer szervezsvel szemben. Megbzhatsg alatt rtend az, hogy milyen valsznsggel tiszttja meg a technika alkalmazsa a fejlesztett rendszert a holtpontoktl. Megbzhat az a megolds, ami matematikailag bizonythatan holtpontmentess alaktja az rintett rszeket, ellenkez esetben a megolds heurisztika. Az egyes technikkat trgyal szakaszok rszletesen trgyaljk az elnyket s a felmerl problmkat. A tblzat alapjn elmondhat, hogy nincs olyan megolds, ami minden szempont szerint idelis. Amennyiben egy ltez, nagy teresz30

tkpessggel rendelkez alkalmazs megbzhat holtpontmentestse a cl, csak a zrmentes adatstruktrk alkalmazsa az egyetlen lehetsges technika, ami minden kezdeti felttelt teljest. Ennek alkalmazhatsga azonban ersen korltozott, valszntlen, hogy egy teljes rendszert rdemes erre a koncepcira pteni, emellett a tkletesen klnbz szemllet elsajttsa s rendszerbe integrlsa s tesztelse komoly kltsgeket jelent. A 2. fejezet bemutat egy megoldst, mely ilyen szlssges helyzetekben is alkalmazhat.

31

2. fejezet A DeadlockHunter program


2.1. Motivci

A Morgan Stanley Magyarorszg Elemz Kft szles proljnak jelents eleme az anyacg pnzgyi tevkenysgnek informatikai s matematikai tmogatsa. Szmos nagyteljestmny alkalmazst fejleszt s zemeltet, melyek feladata a kereskedelem sorn generld adatok feldolgozsa s rtelmezse. Ezen rendszerek egyike egy tzsdei kereskedelemhez kthet meglehetsen sokrt alkalmazs hlzat, melynek fejlesztsvel, karbantartsval s integrcijval foglalkoztam. A legnagyobb komponens egy C++ nyelven rt szerveroldali alkalmazs tovbbiakban GlobalContractor mely egy MIMO rendszerrel modellezhet: Sok forrsbl gyjt adatokat melyeket transzformci utn tbb elzet fel publikl. A multi input-multi output modell hatkony sklzdsnak biztostsa rdekben az alkalmazs folyamatosan tbb egymstl klnbz feladat, de azonos adathalmazon dolgoz szlat alkalmaz. Sajnlatos mdon a tbbszl szervezs magval von nhny kellemetlen problmt, gy tbbszr elfordult, hogy egy j komponens bevezetsekor az alkalmazs semmiflekppen sem determinisztikus mdon holtpontra jutott. A holtpont megjelense az les krnyezetben fut nagyteljestmny szerverek esetn volt jellemz, a hibk feldertst a kereskedelmi adatok bizalmassgra vonatkoz szablyok tovbb neheztettk. Egy olyan megoldsra volt szksg, ami a holtpont jelleg problmkat teljes egszben megsznteti vagy megszntethetv teszi, valamit bizonyossgot ad arra, hogy a vizsglt rendszer holtpontmentes amennyiben valjban az. Emellett kvetelmny volt, hogy az alkalmazs konkurens sklzdsi jellemzi ne degradldjanak, valamint a megolds alkalmazsa ne ignyelje a teljes rendszer tszervezst.

32

2.2.

Megolds

A fentiek alapjn lthat, hogy az ignyek pontosan azt a halmazt alkotjk, amit az els fejezet megoldsai nem tudnak kielgteni. Azok a technikk, amiket a tervezs elejtl kezdve kell alkalmazni, teljes jrarst ignyelnnek, gy nem hasznlhatak. A mrskelt vagy alacsony teljestmnymutatval jellemzett megoldsok hasznlhatatlanul lassv tennk a teljes alkalmazst. Az adott architektra jellegbl fakadan pedig a zrmentes adatstruktrk nem alkalmazhatak hatkonyan. A korbban bemutatott megoldsok nem hibsak vagy alacsonyabb rendek; az ignyek tlzak, ebben a formban nem tarthatak, ms megkzeltst tesznek szksgess. Ezt beltva relaxljuk a feltteleket. Ha brmely fenti szempontbl engednnk, az alkalmazs minsge romlana. Ebben a kvetelmnycsapdban szletett meg egy olyan eszkz tlete, mely csupn analzist vgez, a rendszert magt vltozatlanul hagyja. A szksgletek azonostsa utn megvizsgltam, hogy nem ltezik-e a piacon mr elrhet, hasonl funkcij megolds. Egyedl az Intel R Parallel Studio XE 20131 eszkzt talltam, mely lltja magrl, hogy holtpontanalzist kpes vgezni. A program htrnya meglehetsen borsos rn tl, hogy kizrlag Microsoft Visual Studio C Compilert s Intel C Compilert tmogat, Gnu C Compilert nem, gy alkalmatlan a konkrt esetben trtn felhasznlsra. Az alternatvk mrlegelse utn a kvetkez tervezi dntst hoztam: Az elksztend eszkz hajtson vgre egy mrst a javtand alkalmazson, a mrsi eredmny legyen egy jelents, amely rszletezi a megtallt holtpontokat (ill. holtpont lehetsgeket) s segti a karbantart programozt a hibt okoz folyamatok lokalizlsban. A holtponttal fenyeget szitucik azonostsnak alapja a dinamikusan denilt zrolsi sorrend megsrtse. A megkzelts elnye, hogy a mrs denilhat gy, hogy az ksbb tetszleges alkalmazst ki tudjon szolglni, valamint nem, vagy csak kis mrtkben ignyli a mrt alkalmazs mdostst. Htrnya, hogy csak diagnosztizl, a holtponthelyzetek tnyleges kikszblse emberi beavatkozst ignyel. A mdosts helynek megbecslsben a mreszkz javaslatokkal segti a programozt. Mivel a tervezs idejben sem a GCC AST (Abstract Syntax Tree ) plugin rendszere, sem a Clang Static Analyzere nem llt azon a szinten, hogy megfelelen tmogatni tudjon egy tfog elemzst, dinamikus kdanalzis mellett dntttem. A dinamikus mdszer szksgess teszi a mrt alkalmazs mdostst s tfogbb tesztelst ignyel, viszont a megvalstsa nagysgrendekkel egyszerbb. A mrs formai szempontbl hrom fzisra tagoldik: adatgyjts, a gyjttt adat rtelmezse s feldolgozsa, eredmnyek megjelentse. A kvetkez szakaszok ezen fzisokat formalizmust taglaljk, implementcis rszletek rintse nlkl.
1

http://software.intel.com/en-us/intel-parallel-inspector

33

2.2.1.

Adatgyjts

Mivel az alkalmazsban kialakul zrolsi sorrendek felvtelre van szksg, elg, ha a futs sorn regisztrljuk az egyes zrak egymsutnisgt. A holtpontok feldertst komolyan megnehezti, hogy azok elfordulsa gyakran egy versenyhelyzet kimenetelnek fggvnye, a nemdeterminisztikus viselkeds nagyon megnyjtja a reproduklsra fordtand idt valamint nagyon krlmnyes arrl ismtelt futtatsokkal megbizonyosodni, hogy a rendszer garantltan holtpontmentes. A deadlockHunter nagyon fontos jellemzje, hogy a fent ismertetett bizonytalansgot kikszbli. Az erforrsok zrolsnak s elengedsnek egymsutnisgt szlanknt kln-kln trolkba menti. Csak logikai sorrendet trol, az idztsi paramtereket gyelmen kvl hagyja, gy lehetv tve azt, hogy egy ksbbi fzisban a szlak egyenknt rgztett aktivitst idfggetlenl aggregljuk. A mrs elvgzshez esemnyek rgztsre van szksg. Esemny vltdik ki minden egyes alkalommal, amikor egy szl egy erforrst zrol vagy felszabadt. Minden esemnyhez logikailag kt informcit szksges trolni: Esemny tpusa: Erforrs zrolsa vagy felszabadtsa trtnt Erforrs azonostsa: Brmi, ami alapjn az erforrs egyrtelmen azonosthat a rendszerben, pldul a zr memriacme. A deadlockHunter ezen fell trolja a fjlt, a metdust s a kdsort, ami az esemnyt kivlt utastst tartalmazza, gy megknnytve a felhasznl szmra az eredmnyek ksbbi rtelmezst. A mrs ltal ellltott mrsi eredmny struktrja a kvetkezkppen formalizlhat (csak a legszksgesebb jellemzkre szortkozva, eltekintve a ksbb trgyaland implementcis rszletektl): Mrs: { Szl[] szlak } Szl: { Esemny[] esemnyek } Esemny: { EsemnyTpus tpus, Er oforrs er oforrs } EsemnyTpus: boolean Er oforrs: integer

2.2.2.

Adatfeldolgozs

A fent denilt adatstruktra feldolgozsa utn egy irnytott G grfot szeretnnk kapni eredmnyl, mely a kvetkez kppen denilhat: v V ( G ) v ltal rep rezentlt erforrs a mrs folyamn zrolsra kerlt e : (u, v ) E ( G ) (u, v

34

V ( G ) egy szl az u ltal reprezentlt erforrst kzvetlenl v ltal reprezentlt erforrs zrolsa eltt zrolta s v zrolsakor mg nem szabadtotta fel. ) Az gy denilt grf elnye, hogy szigoran az esemnyek sorrendisgt tekintve kpes az egymstl idben tvol vgbemen esemnyeket szlfggetlenl sszefslni, megoldva ezzel a versenyhelyzetek nehz vizsglhatsgnak problmjt. Tekintsk a kvetkez mrsi pldt, melynek vizulis reprezentcija a 2.1. brn lthat: Szl1: zr(A), zr(B), nyit(B), zr(C), zr(D) Szl2: zr(A), zr(B), nyit(B), zr(D), zr(C)

2.1. bra. Plda mrsbl elll grf

2.2.3.

Megjelents

A feldolgozott adatok clja, hogy a karbantart szmra vilgoss tegye, hogy elfordulhate holtpont a mrt alkalmazsban (azaz van-e kt olyan szl, ami azonos erforrsokon klnbz zrolsi sorrendet alkalmaz) s ha van, akkor segtse a karbantart szmra a problms programrszek azonostst. Ezen cloknak megfelelen a megjelents kt rszre oszlik. Egyrszrl az alkalmazs biztost egy grfot (lsd 2.1. bra), mely az erforrsok zrolsnak sorrendjt brzolja. llts: Amennyiben a ltrejv grf egy fa, a vizsglt erforrsok klcsns kizrst okoz zrolsok nem juttatjk holtpontra a mrt alkalmazst. Bizonyts: Indirekt mdon. Tegyk fel, hogy az alkalmazst lemrtk, nem jutott holtpontra, a mrs eredmnyekppen elll grf egy fa s megfelel idzts esetn mgis elfordulhat holtpont. A holtpont kialakulsnak felttele az egymsra vrs, vagyis T1 szl zrolta A erforrst s vr B-re mg T2 szl zrolta B erforrst s vr A-ra. Mivel ms idztsi paramterek mellett ez a kt szl 35

nem jutott holtpontra a mrs folyamn s sikeresen zroltk az erforrsokat, az eredmnygrf dencija miatt A s B erforrst reprezentl cscsok megjelennek s kztk irnytott t tallhat, teht a grfban kr van, teht a grf nem fa, gy ellentmondsra jutunk. A felhasznl a mrs utn ellenrzi a grfot; amennyiben az fa, az alkalmazs a fenti lltsnak megfelelen a mrt lefuts folyamn semmilyen idztsi paramterek mellett nem futhat holtpontra, teht nincs tovbbi mdostsra szksg. Ha az eredmnygrf nem fa, azaz tartalmaz irnytott krt, akkor fennll a holtpont elfordulsnak veszlye, tovbbi vizsglatra van szksg. Az rintett erforrsok vizsglatt segti a megjelentst vgz fellet msik rsze. Az egyes erforrsokat azonost alapjn mely megjelenik a grf cscsain kereshetjk ki a gyjttt adatok kzl, gy kpet kapva arrl, hogy mely metdusok mentn trtntek az egyes zrolsok. A klnbz zrolsi hierarchikat elemezve a karbantart megllapthatja, hogy melyik szl zrsorrendje tekinthet hibsnak, lokalizlva ezzel a mdostand kdrszletet.

2.3.

Implementci

Az elzekben a motivcira adott absztrakt vlaszt rszleteztem, kitrve a megolds helyessgnek bizonytsra s rtelmezsre, szortkozva a felttlenl szksges logikai komponensekre, eltekintve az implementcis rszletektl ott, ahol ez lehetsges volt. A kvetkezkben az elksztett deadlockHunter programot ismertetem elszr architekturlis szinten, majd vgigmegyek az egyes komponensek implementcis rszletein, kln kiemelve a felmerl kihvsokra adott vlaszokat.

2.3.1.

Architektra

A fent speciklt alkalmazs megvalstsa architekturlis szempontbl kt f rszt tesz szksgess; Egy adatgyjtsrt s egy megjelentsrt felels komponenst. A deadlockHunter programban ez egy knyvtr (shared object) s egy binris llomny formjban realizldik. Az implementci rdekessge, hogy a kt komponens programkdja tlnyom rszben megegyezik. A 2.2. bra szemllteti a komponensek kommunikcijt. A mrst vgz komponens a gyjttt adatokat vagy egy XML dokumentumba sorostja, vagy Google Protocol Buer2 formtumba menti. A kinyert dokumentumot a megjelent komponens beolvassa s azokbl egy grfot kszt valamint egy keres felletet biztost. A tovbbiakban a kt komponens jellemz rszeit mutatom be rviden.
2

Google Protocol Buer: https://developers.google.com/protocol-buers

36

2.2. bra. Mrs komponenseinek lehetsges elrendezse

Google Protocol Buer Az XML formtum elnye, hogy karakteres termszetbl addan ember szmra is knnyen olvashat s kereshet, valamint gpi feldolgozsa is egyszer s szmos platformon tmogatott natv mdon vagy knyvtrakon keresztl. Htrnya az XML formtumnak, hogy a dokumentum mrete a reprezentlt informcihoz kpest nagyon nagy, amit krlmnyes trolni s lass beolvasni. A Google Protocol Buer elnyei s htrnyai pont fordtottak. Azonos adatmennyisg sorosts utn sokkal kisebb mret, mint XML esetben, a sorostott llomny beolvassa gyorsabb, viszont maga az llomny emberi olvas szmra rtelmezhetetlen s az feldolgozs klnbz platformokon kln tmogatst s karbantartst ignyel. Mivel jelen krnyezetben a kis mret s gyors feldolgozs abszolt prioritst lvez, a Protocol Buer tmogats megjelense utn az XML formtum csupn tesztelsi s kompatibilitsi okokbl van jelen a rendszerben.

2.3.2.

Adatgyjts

Az adatgyjtst gy kellett megvalstani, hogy a GlobalContractor alkalmazsba knnyen integrlhat legyen. A kdon vgzett elzetes vizsglat sorn kiderlt, hogy minden krdses erforrs tbbnyire rekurzv mutexek preprocesszor makrk egy szk halmaznak segtsgvel van zrolva s felszabadtva, a kvetkez kt idima egyikvel: Guard idiom: A makr egy osztlyt pldnyost a stacken. A konstruktor zrolja a megadott erforrst, a blokk vgre rve a stack lebontsakor pedig a destruktor felszabadtja azt. Ezt C++ krnyezetben RAII idiomnak nevezzk. Acquire/Release idiom: Kln makrk llnak rendelkezsre az erforrs zrolsra s felszabadtsra, melyek az tadott cmen tallhat struktrn hvnak elre denilt metdusokat (acquire() s release()). Lthatan mindkt megolds knnyen kibvthet gy, hogy a zrols s felszabadts tnyt egy kls meggyel fel jelezze, anlkl, hogy a makrdenciktl

37

eltekintve a mrt rendszeren brmilyen vltoztatst kne eszkzlni. Az els idima esetn egy tovbbi osztly pldnyostsa, a msodik esetben egy-egy metdus meghvsa elegend. A makrk jradenilst egy fordtsi idben llthat kapcsolhoz kthetjk, gy az alkalmazs futsidej terhelst kizrlag a mrs sorn szenved el, egyb esetekben a teljestmny a mdostatlan vltozattal megegyezik (mivel ugyan az a programkd kerl fordtsra).
#ifdef DEADLOCK_HUNTER DH::MutexGuard dh_##GUARD(MUTEX); APP::MutexGuard GUARD(MUTEX); #else APP::MutexGuard GUARD(MUTEX); #endif

Ezeket a jelzseket fogadja a mrs sorn az alkalmazshoz linkelt knyvtr. Minden szl szlspecikus trban (thread local storage ) elrhet egy egyke mintt kvet (singleton ) osztly pldnya, ami a jelzseket trolja. A szlspecikus trol hasznlatnak elnye, hogy az esemnyek regisztrlsa sorn a versenyhelyzetek gyelmen kvl hagyhatak (mivel minden szl sajt memriaterlett mdostja). Az egyes loklis trolkat egy globlis trol fogja ssze. Elsdleges feladata a mrs vgn a gyjttt adatok sorostsa s fjlba rsa. Ezen globlis pldny felletn keresztl szksg esetn mg a mrs futsa kzben is diagnosztikai informcikhoz juthatunk (lsd Megjelents) valamint tmenetileg felfggeszthetjk vagy jraindthatjuk az adatgyjtst. A GlobalContractor alkalmazs esetben a mrs vezrlse egy adminisztrcis felletbe integrldott.

2.3.3.

Megjelents

A mrsi eredmnyek analizlsa s vizualizcija kt klnbz felleten keresztl trtnhet. Hagyomnyos parancssoros, valamint egy bngszbl elrhet grakus fellet ll rendelkezsre. Brmely klienst is vlasszuk, a megjelents elsdleges feladata a mrs sorn elzleg sorostott adatok beolvassa s rtelmezse. A program a feldolgozott adatokbl egy grfot pt (az erforrsok azonostsra a memriacme szolgl), amibl egy Graphviz3 .dot4 formtum struktrt kszt, ami alapjn a Graphviz program a grfot brzol kpfjlokat kpes ellltani. A program ltal biztostott formtumok kzl rdemes az svg formtumot vlasztani, s azt Mozilla Firefox bngszvel
3 4

Graphviz: grf vizualizcis szoftver, http://www.graphviz.org/ DOT lernyelv: http://www.graphviz.org/doc/info/lang.html

38

megtekinteni. Brmely ms tesztelt kombinci (megjelents: Mozilla Firefox, Google Chrome, Microsoft Internet Explorer, Windows Image and Fax Viewer; formtumok: jpg, png, svg) elfogadhatatlan hibkat okozott a megjelentsben, a kpfjlok szokatlanul nagy mrete miatt (pl.: 20.000 5000 pixel). A grf egyes cscsain megjelen feliratok a cscs ltal reprezentlt erforrst denil osztly neve tallhat amit a program a kapcsold fjl neve alapjn tippel meg egy egyedi azonostval kiegsztve, pl.: ModelProxy.23. Az osztly nv megjelentsre azrt esett a vlaszts, hogy a program futsa a tapasztalt karbantart szmra knnyen kvethet legyen. Az egyedi azonostra az egyes osztlyok klnbz pldnyaiban denilt klnbz erforrsok megklnbztetse miatt van szksg. A grf lei szlanknt klnbz sznnel vannak sznezve, a sznek s szlazonostk sszerendelse tblzatban jelenik meg a kpen. Parancssoros fellet A parancssoros fellet a ktelez feladatain tl kpes a kimeneti formtumok kztt konvertlni, valamint egy keresfelletet biztost, ami a grfon megjelentett nevek alapjn keres az elemzett adatok kztt, s megjelenti a keresett erforrsra jellemz zrolsokat s krnyezetket, szlanknt csoportostva (2.3. bra). A szlak azonostsa platformfgg. Linux platformon a szlhoz rendelt LWP jelenik meg. Ennek elnye, hogy a gdb program ugyanezt az azonostt hasznlja, gy pldul egy coredump elemzse sorn az egyes szlak knnyen azonosthatak. Az egyes esemnyek szveges reprezentcija egy formtumsztring megadsval kongurlhat. A megjelenthet mezk a kvetkezek: %t Esemny tpusa (zrols vagy felszabadts) %f Esemnyt kivlt metdus neve (GCC fordt hasznlata esetn a __PRETTY_FUNC__ kiegszts hasznlatval) %F Kivlt utastst tartalmaz fjl neve %l Kivlt utastst tartalmaz sor szma %a Erforrs memriacme Az egyes mezk tetszlegesen kombinlhatak s kiegszthetek ms karakterekkel. Grakus fellet A parancssori fellet megvalstsa egyszer, a mkdse a lehet leggyorsabb, keresztplatformos megolds, viszont rendelkezik nhny komoly htrnnyal is: a platformfggetlen folyamkezls miatt nem tmogatja a kurzorbillentyk kezelst, az 39

Thread #12345 > lockFirst() (App.cc:186) > lockSecond() (App.cc:219) [*] < lockSecond() (App.cc:219) [*] < lockFirst() (App.cc:186) Thread #54321 > lockSecond() (App.cc:219) [*] > lockFirst() (App.cc:186) < lockFirst() (App.cc:186) < lockSecond() (App.cc:219) [*]
2.3. bra. Keress eredmnye (plda). A *-al jellt sorok a keresett erforrsra vonatkoz esemnyek

automatikus parancs kiegsztst, valamint a hasznlata nem intuitv. A problmk megoldsa vgett elksztettem egy grakus felletet, ami bngszbl rhet el. A mkdshez szksg volt egy http szerverre, ami kpes kommuniklni a C++ kdbzissal, elrhet a vllalati krnyezetben, pehelysly s egyszeren integrlhat. A szmbavett alternatvk a kvetkezek: Mongoose:5 Kis mret, egyszer C++ szoftver, ami gy nagyszer vlaszts lenne, de sajnos nem elrhet a vllalton bell. Twisted:6 Kiforrott, stabil szoftver, szimpatikus szkriptnyelv; viszont nem talltam olyan Python/C++ interoperabilitsi lehetsget, ami megfelelt volna a kvetelmnyeknek. Node.js:7 A kvetelmnyeket legnagyobb rszben kielgti s volt mr tapasztalatom a szksges felhasznlsi mddal. A Javascript/C++ integrci nem trivilis s nagyon trkeny, lsd ksbb. A fentiek alapjn a vlaszts a Node.js-re esett. A Javascript/C++ kommunikci megvalstsa vgett ksztettem egy Node.js addont, ami a berkez krseket tovbbtja a C++ komponensnek, a vlaszt pedig Javascript objektumok formjban teszi elrhetv. Az integrci a Node.js ltal hasznlt Google V8 Javascript motoron8 alapul. Ezentl rtam egy Node.js szerver programot Javascript nyelven, ami kiszolglja az automatikusan elksztett, a mrst reprezentl grfot, lehetv teszi a zrolsi
5 6

C++ nyelv webszerver: https://github.com/valenok/mongoose Python nyelv esemny orientlt hlzati motor: http://twistedmatrix.com/ 7 Javascript nyelv hlzati platform: http://nodejs.org/ 8 Google V8 Javascript motor: http://code.google.com/p/v8/

40

esemnyek knyelmes keresst, a szlak aggreglt informciinak megtekintst, valamint biztost egy intelligens trace funkcit. A keressi kifejezsre illeszked rgztett esemnyeket listz oldalon megjelen kontextusok sora adott esetben hosszra nylhat, s dacra minden optimalizcinak, tbbnyire egy erforrsra vonatkozan hasonl rszleteket mutat, amelyek kzl krlmnyes kikeresni az rdekes mintkat. A leggyakoribb feladat olyan mintk keresse, ahol kt erforrs mindkt lehetsges sorrendben lefoglalsra kerl. A krdses erforrsok azonostsa lehetv vlik az eredmnygrf vizsglatval. A krk azonostsnak lehetsgt Tarjan ersen sszefgg komponensek algoritmusa s egy sajt rekurzv konstrukci biztostja. Az Autotrace funkci az gy kapott s rdekesnek tlt, koniktusos szlak relevns erforrs kontextusait listzza. A fellet hasznlathoz el kell indtani egy loklis Node.js szervert ($ node server.js), ezutn a konzolon megjelen cmen az alkalmazs elrhet. Az eredmnyek analizlsa sorn a bngszett tartalmat egyrtelmen azonostja az URL-je, valamint egyes rdekesnek tartott rszek kln meg is jellhetek, mely jellsek tkrzdnek az URL-ben; gy a karbantart a fontos eredmnyeket egyszeren meg tudja osztani kollgival a linket tovbbkldve. A fellet funkcionalitsrt jQuery9 , az ignyes megjelensrt Twitter Bootstrap10 keretrendszerek felelnek. Az gy kapott fellet intuitv, valamint az elrshez csupn egy bngszre van szksg. A megolds htrnya, hogy a Javascript/C++ tmenetrt felels illeszt komponens lefordtshoz rendelkeznnk kell a megfelel Node.js knyvtrakkal (shared object ), amiket ugyanazzal a fordtval lettek fordtva.

2.4.

Optimalizls

A deadlockHunter a fent lert formban funkcionlisan ksznek tekinthet, azonban hasznlhatsg tren a gyakorlatban kvnnivalkat hagy maga utn. A kezdeti tesztelsek megmutattk, hogy egy igazn komplex alkalmazs hosszas mrse komoly teljestmnybeli problmkat okozhat. A konkrt problmkat a kvetkez alfejezetekben ismertetem a megoldsaikkal egytt. Amikor ezek a problmk felmerltek, a kiutat nem a kd mikrooptimalizlsban kerestem, egy-egy gpi utasts megsprolsa itt-ott nem segtett volna hanem az adatstruktrk s algoritmusok javtsban. Ennek megfelelen aprlkos kdoptimalizlsra nem kerlt sor, mivel nem volt r szksg.
9 10

jQuery: kliens oldalra sznt Javascript keretrendszer: http://jquery.com/ Twitter Bootsrap frontend keretrendszer: http://twitter.github.com/bootstrap/

41

2.4.1.

Az adatgyjts optimalizlsa

Az egyik problmt a mrs folyamn az esemnyek vlogats nlkli regisztrlsa jelentette. A mrt alkalmazsban gyakran elfordult a kvetkez minta: Egy nagy elemszm listn iterlt, minden elem feldolgozsa eltt az elemet zrolta egy megfelel mutexen keresztl, majd a feldolgozs vgeztvel a zrat elengedte. Ez sok esemny bejegyzst jelentette. Mivel ezeket az itercikat az alkalmazs minden gerjeszts mellzse esetn, "resjratban" is folytatta, a trolt esemnyek szma nagyon gyorsan nvekedett, hamar tllpve a rendelkezsre ll memrit (A tesztkrnyezetben 16 GB-ot). A trivilis megoldsa a problmnak, hogy a trolt esemnyek szmnak fggvnyben azokat idnknt a httrtrra mentjk s a memribl eltvoltjuk. Ennek a megkzeltsnek tbb htultje is van: Tovbbra is rengeteg esemnnyel kell majd foglalkozi a megjelents sorn, ami ott jabb teljestmnyproblmkhoz vezethet, a hatalmas kimeneti fjlok kezelse nehzkes s archivlsuk kltsges valamint a folyamatos fjlmveletek feleslegesen lasstjk a mrst. Egy jobb megoldshoz jutunk, ha a fent emltett mintt gyeljk meg. A ciklus ismtelt futtatsa jbl s jbl ugyan azokat az esemnysorokat eredmnyezi. Egyszeren addna, hogy akkor ezeket az ismtlseket csoportostsuk, s sproljuk meg pldul az ismtld stringek trolst egy string cache hasznlatval. Ez egy letkpes elgondols, azonban az esemnycsoportok sszehasonltsa jabb felismershez vezet el: Kizrlag az idztsi paramtereikben klnbznek, vagyis egy olyan jellemzben, amit szndkosan nem vesznk gyelembe mivel a grfalkots sorn ez az informci eldobsra kerl. Teht az egyes esemnycsoportok kzl egy tetszleges kivtelvel a tbbi eldobhat, anlkl, hogy vesztennk a mrs pontossgbl. Ennek megfelelen az esemnyeket regisztrl komponens a kvetkez kppen vltozik: 1. Kezdetben egy res csoportlistval s egy res tmeneti listval jn ltre 2. A berkez esemnyeket az tmeneti listban rgzti 3. A csoport vgn az tmeneti listt sszehasonltja az sszes eddigi csoporttal. Ha tall olyan csoportot, amely megegyez sorrendben tartalmaz az tmeneti csoportban tallhat esemnyekkel ekvivalens esemnyeket, s csak azokat, akkor az tmeneti listt eldobja, s jat kezd. Egybknt az tmeneti listt elmenti j csoportknt, s ezutn rti. Hogy a megolds mkdhessen kt fogalmat kell denilni: Mikor van egy csoportnak vge, valamint mikor mondunk kt esemnyt ekvivalensnek. Mindkt fogalom nagyon komolyan befolysolja a mrs kimenetelt, a dencikat gy hatroztam 42

meg, hogy azok segtsk a GlobalContractor mrst. Ms alkalmazs esetn elfordulhat, hogy egy alkalmasabb denci tallhat. A csoportok hatrnak meghatrozsra a szl ltal zrva tartott erforrsok szmt hasznltam fel. Ehez nyilvn kell tartani a mrszmot, ami konstans idben megtehet. Amennyiben a zrolt erforrsok szma elr egy elre meghatrozott korltot, az aktulis csoport lezrsra kerl. A korltot alkalmasan kell megvlasztani, a gyakori mintk fggvnyben. A GlobalContractor esetben ezt a korltot a 0 szinten hatroztam meg. Amennyiben egy szl elenged minden erforrst, zroldik az addigi tevkenysge. (Ez a vlaszts elsegtette azt is, hogy a csoportok hasznlata egy teljesen ms helyzetben nyjtson segtsget) Ha elfordul, hogy egy szl futsnak kezdetn maghoz ragad egy erforrst, s azt hossz idn keresztl nem engedi el, mikzben sok klnbz tevkenysget hajt vgre sok esemnyt generl akkor megfontoland a korlt felemelse, hogy az gy kialakul nagymret csoportokat feldaraboljuk. Ennek ra van, 0-tl klnbz korlt hasznlata tovbbi vintzkedseket ignyel, egy esetleges hibs mrst megelzend. Az egyes esemnyek kztti egyenlsg opertor denilsa sorn ugyancsak rdemes gyelembe venni az alkalmazs jellegzetessgeit. Amennyiben ezt nem tesszk meg, a vlasz trivilisan addik: Kt esemny megegyezik, ha minden rla trolt informci megegyezik (pl.: fjl, sor s memriacm). Ez a vlaszts helyessgt tekintve megfelel, viszont a kritrium relaxlsval knnyebben feldolgozhat eredmnyt kapunk. Bizonyos esetekben elfordulhat, hogy megengedhejk a memriacm klnbzsgt (s csak a fjlt valamint a sort ellenrizzk). Ez a vlaszts a legtbb esetben nem helyes, viszont alkalmanknt mgis j s knnyen elemezhet grfhoz vezet minket, amin jobban meggyelhetek az egyes zrolsi mintk. A GlobalContractor esetben, ms optimalizcik hasznlata mellett a vlaszts a fjl nevt, a forrskd sorszmt s az erforrs memriacmt gyelembe vev egyenlsg opertorra esett. Az optimalizci megvalstst kveten a mrkddal elltott alkalmazs memriahasznlata alig trt el az alaprtelmezett mkds kzben meggyelhet ignyektl, s resjratban semmilyen emelkedst nem mutatott, gy teljes mrtkben elrte cljt.

2.4.2.

A megjelents optimalizlsa

Egy kiterjedt teszt futtatsa mg a fenti optimalizci gyelembe vtelvel is nagyon sok regisztrlt esemnyhez vezet, ami a grf reprezentcit ttekinthetetlenn teszi. A problma forrsa, hogy olyan esemnyek is megjelennek, amelyek nem vesznek rszt holtpont kialaktsban. Az ilyen esemnyeket reprezentl cscsokat eltntethetjk, ha az eredmnygrf levl cscsainak levgst addig ismteljk, amg 43

van ilyen cscs. llts: A grf leveleinek ismtelt levgsval nem vesztnk el lehetsges holtpontra utal mintt. Bizonyts: Korbban belttuk, hogy a grf konstrukcija miatt csak akkor alakulhat ki holtpont az alkalmazsban, ha az irnytott grf nem fa, vagyis ha irnytott krt tartalmaz. Teht amg nem vgunk le olyan cscsot, ami egy irnytott kr eleme, addig nem vesztnk el rtkes informcit sem. Mivel egy cscs pontosan akkor levl, ha nincs belle kimen irnytott l, ezrt egy levl nem lehet irnytott kr eleme, teht elhagyhat. Mivel az gy keletkez grf pontosan ugyan azt az rtkes informcit hordozza, mint az elz, a lpst megismtelhetjk, egszen addig, amg van levl cscs. Megjegyzs: Ha az eredmnygrf fa, az sszes cscsot eldobhatjuk s res grfot kapunk teht holtpontra nincs lehetsg ami megfelel a korbbi lltsnak. Az gy kapott, jelentsen reduklt mret grf sokkal knnyebben elemezhet, m egy az elzhz nagyon hasonl tlettel mg tbb cscsot hagyhatunk el. llts: A grf gykr cscsainak ismtelt levgsval nem vesztnk el lehetsges holtpontra utal mintt. Bizonyts: Az elz mintjra. Egy cscs pontosan akkor gykr, ha nem mutat r irnytott l, teht nem mehet t rajta irnytott kr, vagyis eldobhat. Az rtkes informci megmaradsa miatt a lps ismtelhet, amg van gykr pont. Megjegyzs: Az elz mdszerhez hasonlan, csak ezt az eljrst alkalmazva pontosan akkor lesz a kimeneti grf az res grf, ha a bemeneti grf fa volt. Megjegyzs 2: A mdszert alkalmazva a grf elvesztheti sszefggsgt. A bemutatott kt mdszerrel transzformlt grf nagysgrendekkel kevesebb cscsot tartalmazott a GlobalContractor esetben s emberi vizsglatra sokkal alkalmasabbnak bizonyult. Tekintve, hogy a fenti ttelek szerint informcit nem vesztettnk, az optimalizci hasznosnak tlhet.

2.5.

Fejlesztsi tervek

A deadlockHunter jelen formjban hasznlhat s betlti a cljt, viszont a fejleszts s tesztels sorn felmerltek tovbbi tletek, melyek nvelnk a felhasznlbartsgot vagy a project fejldse miatt fontosak. Az rks fejlds ignye egy 44

szoftver sajtja s szerves rsze, ezrt ezen tletek kzl a kvetkezkben ismertetem a legfontosabbakat.

2.5.1.

Forrskd megnyitsa

A project nem jhetett volna ltre a fejleszts sorn hasznlt szmtalan nylt forrskd szoftver nlkl (pl.: Linux, GCC, Eclipse, git, boost, graphviz s msok), gy egyrtelm a forrs megnyitsnak motivcija, tekintve tovbb, hogy az eszkz ltalnos cl, gy ms krnyezetben is hasznosnak bizonyulhat. A deadlockHunter mr nem tartalmaz vllalati (proprietary ) fggsgekket, azokat lecserltem funkcionlisan ekvivalens, nylt forrskd alternatvikra. Az utols lps, hogy a forrskd megnyitst a Morgan Stanley megfelel testlete is jvhagyja. Az erfeszts sikeressge egyelre bizonytalan, de valsznsthet. Amennyiben az akci sikerrel jr, az eszkz szabadon elrhetv ttele az eddigi gyakorlattl eltr, egyedlll esemny lesz a vllalat trtnetben, s remlhetleg egy j irny kezdete.

2.5.2.

Felhasznli dokumentci ksztse

Ha sikerl a forrskd megnyitsa, szksgess vlik egy mindenki szmra szabadon elrhet dokumentci elksztse is, mely tartalmazz felhasznli segdletet s integrtori tmutatt is. Mivel jelen dokumentum a teljessg ignyvel rszletezi az alkalmazs fontos rszeit, nem alkalmas a felhasznli dokumentci szerep betltsre.

2.5.3.

jrafordts nlkli felhasznls

A jelenlegi vltozat preprocesszor makrkat hasznl a meggyelend fggvnyhvsok monitorozhatv ttele rdekben. Ez a megolds a teljes alkalmazs jrafordtst ignyli a mreszkz be- s kikapcsolsa esetn. A vlts felgyorstsa rdekben elrhetv kell tenni egy olyan monitor megoldst, melynek bekapcsolsa dinamikus linkelsi idben trtnik, Unix szer rendszereken az LD_PRELOAD11 krnyezeti vltoz ltal biztostott felleten, mg Windows rendszereken a DLL Injection 12 megoldson keresztl.
11 12

https://en.wikipedia.org/wiki/LD_PRELOAD https://en.wikipedia.org/wiki/DLL_Injection

45

2.5.4.

Automatikus kiegszts a keresben

A grakus felletet az egyszerbb s knyelmesebb hasznlat rdekben kell gy tovbbfejleszteni, hogy a keresben megjelenjenek a lehetsges, illeszked kereskifejezsek, automatikus kiegszts formjban. Ehhez meg kell teremteni a lehetsget, hogy a C++ oldal kiajnlja a rendelkezsre ll opcikat.

2.5.5.

Kdtisztts

A C++ programkdon elvgzend nhny apr, de tfog vltoztats: Dokumentci: Ahol esetleg mg hinyzik az API dokumentci, ott azt el kell kszteni, valamint az sszes API dokumentcit t kell nzni s az esetlegesen elavult rszeket frissteni kell. Ezutn a forrskdbl klnll dokumentcit kell generlni, az automatizmust rgztve, megismtelhet mdon. Projekt namespace: Az integrci egyszerstse vgett az sszes komponenst egy kzs namespace al kell helyezni. Guard macro nevek: A fejlc fjlok guard macroi jelenleg a kvetkez formtumban vannak: _CLASSNAME_H. Ezt kell talaktani gy, hogy tkrzze a knyvtrstruktrt.

46

Ksznetnyilvnts
Ksznetet mondok csaldomnak, hogy szeretettel viseltk, amikor estnknt munkbl hazatrve ahelyett, hogy velk egytt csaldi krben tltttem volna a vacsort, szgyentelenl nhny dits sonks sajtos szalmis szendviccsel s egy liter tejjel elvonultam s szmtgpem trsasgban grnyedtem vgig az estt, majd az jszakt. Ksznm anyai nagymammnak, hogy jelents mennyisg konverzibilis trgyi eszkzt bocsjtott rendelkezsemre az ltala biztostott cukros kekszgolyk ATP-re konvertlsa mg a legsttebb jjeli rk idejn is kpes volt jabb (a felhasznlsok szmval linerisan nvekv konstanssal amortizlt) 10 perc munkra elegend energit biztostani. Ksznm apai nagymammnak, hogy hzi baracklekvrval s paradicsomlevvel felvidtotta a reggeli breds pillanatait ekkor mindig feledni tudtam a htalv fejezetek szmt. Hls vagyok neki, hogy szvn viseli szakbarbarizmusom elrehaladott llapott s mindig tovbbkldi a kulturlis tmj zens prezentcikat tartalmaz krleveleket bennem a fentebb stl mvelst elsegtend. Ksznm apai nagyapmnak, hogy mr akkor bevezetett a tranzisztorok varzslatos vilgba, amikor mg az Ohm trvnyben tallhat betket sem ismertem ha nincs az szeld, de hatrozott gondoskodsa, amivel az egyetlen igaz letplya fel terelt, most taln egy vidki sznjtsz szakkr felolvasprbjn lnk vagy egy szkmentes keleti jelleg pesti tez padljn prblnk egy alrendel mdon tbbszrsen bvtett, didaktikus elemekkel gondosan krlvett mondatot mg kacifntosabb tenni. Ksznm anyai nagyapmnak, hogy megmutatta, hogyan kell nyulat nyzni, kulcsot msolni s hogy milyen szp a kilts a kilencemeletes tetejrl. Biztos vagyok benne, hogy szletsnapi kszntsei nagymrtkben inspirltak. Ksznm ddszleimnek klnsen anyai-apai ddanymnak hogy folyamatos lelki tmogatst nyjtottak a legelkeseredettebb idkben is. Ddi! Tudom, hogy meggrtem, hogy ids korodban majd gondodat viselem. Nem felejtettelek el, mgha ritkn beszlnk is! Mg van egy-kt elintzni valm, de hamarosan tallkozunk. Ksznm bartaimnak, hogy szeretnek s elfogadnak, valamint biztostanak mun-

47

km nlklzhetetlensgrl mg akkor is, amikor a dolgozatom cmnek rszletezse kzben tekintetk kiss kdss vlik. Kln ksznm, hogy egszsgemmel nem t rdve szletsnapom alkalmbl megajndkoztak 5 teljes rd f (x) e2ix dx tpus csokis keksszel. Ezek majdnem vgig kitartottak, csupn a C++ szabvny olvassa kzben megindul kegyetlen ostromnak nem tudtak ellenllni. Nlkletek nem sikerlt volna. Ksznm a Morgan Stanley Magyarorszg Elemz Kft-nek, hogy nanszrozta a dolgozat alapjt ad program elksztst s megengedte a fejleszts sorn sszegyjttt tapasztalatok s kutatsi eredmnyek publiklst. Szvet melenget rzs, hogy hrom manager is elolvasta a relevns fejezeteket, tlk ezton krek elnzst, n magamtl soha, (soha!) nem rnk ennyit. A dolgozat nem jhetett volna ltre szmos nagyszer tbbnyire nylt forrskd program nlkl. Ezek kzl a teljessg ignye nlkl nhny: Linux, GCC, Git, A L TEX, Gnome, vim, Firefox. Ksznet a fejlesztknek s tamogatknak!

Mondottam, ember, kzdj s bzva bzzl!

Irodalomjegyzk
[Amdahl] Gene Amdahl. Validity of the single processor approach to achieving large-scale computing capabilities. AFIPS Conference Proceedings, pages 483 485, 1967. [C++11] ISO/IEC 14882:2011. Standard for Programming Language C++, May 2013. [C++11/Lockable] ISO/IEC 14882:2011. Standard for Programming Language C++, May 2013. 30.2.5.3 Lockable requirements. [C++11/MemoryModel] ISO/IEC 14882:2011. Standard for Programming Language C++, May 2013. 1.7 The C++ memory model. [C++11/POD] ISO/IEC 14882:2011. Standard for Programming Language C++, May 2013. 9. Classes, close 9. [C++11/lock] ISO/IEC 14882:2011. Standard for Programming Language C++, May 2013. 30.4.3 Generic locking algorithms. [CMOS-VLSI] Neil H. E. Weste and David Money Harris. CMOS VLSI design. Addison-Wesley, fourth edition, March 2010. [ConcurrencyInAction] Anthony Williams. C++ Concurrency in Action: Practical Multithreading. Manning Publications, 2012. [DiceEtAl] Dave Dice, Danny Hendler, and Ilya Mirsky. Lightweight contention management for ecient compare-and-swap operations. Euro-Par 2013 proceedings, page 2, May 2013. [DiningPhilosophers] Edsger W. Dijkstra. Twenty-eight years. E.W. Dijkstra Archive. Center for American History, January 1987. [EPIC] Michael S. Schlansker and B. Ramakrishna Rau. Epic: An architecture for instruction-level parallel processors. Proceedings of 1999 USENIX Annual Technical Conference, February 2000. 49

[ExceptionalC++] Herb Sutter. Exceptional C++. Addison-Wesley, 1999. [Futex] Hubertus Franke and Rusty Russell. Fuss, futexes and furwocks: Fast userlevel locking in linux. Proceedings of the Ottawa Linux Symposium, June 2002. Gordon E. Moore. Cramming more components onto integrated circuits. Electronics Magazine., page 4, 1965. Joseph A. Fisher. Very long instruction word architectures and the ELI512. Proceedings of the 10th annual international symposium on Computer architecture., pages 140 150, 1983. Niels Provos and David Mazieres. A future-adaptable password scheme. Proceedings of 1999 USENIX Annual Technical Conference, pages 81 92, 1999.

[Moore]

[VLIW]

[bcrypt]

50