Tavapärastes tingimustes, kui tegemist on mitmelõimelise programmeerimisega, suureneb programmi keerukus märkimisväärselt, jõudlus langeb märkimisväärselt ja vigade tõenäosus suureneb märkimisväärselt.
Mitmelõimeline programmeerimine on mõeldud programmi paralleelseks käivitamiseks, et parandada andmetöötlusvõimekust, kuid enamasti tähendab see konkurentsi jagatud ressursside pärast, mistõttu tuleb ressursiobjektide muutmisel see lukustada. Kuid lukkude rakendamiseks on palju erinevaid viise, seega vaatame C#-s mitme tüüpi lukkude rakendamist ja jõudlust.
Mitmed viisid lukkude kasutamiseks
1. Aatomilukk
Saavuta "lukustamata" konkurents tuumaoperatsiooni Interlocked.CompareExchange.
Ametlik seletus on pakkuda aatomilisi operatsioone muutujatele, mida jagavad mitmed lõimed. Nimeruum: System.Threading
2. Kriitiline piirkond
Mitme lõime seriaalistamine avalike ressursside või kooditüki ligipääsuks on kiire ja sobiv andmejuurdepääsu kontrollimiseks. Lukusüntaks C#-s on süntaksi suhkur kriitilise ala jaoks (Monitor).
3. Aatomitöö
Aatomioperatsioonid, mis on erandjuhtum, on olemuslikult lõimekindlad, seega pole vaja neid lukustada.
Ametlikult tõlgendatakse seda kui antud muutuja väärtuse suurendamist aatomilise operatsioonina ja tulemuse salvestamist. Nimeruum: System.Threading
4. Loe ja kirjuta lukk
Lugemis-kirjutamise lukud võimaldavad ressursse lugeda, kui teised programmid kirjutavad, seega kui ressurss lubab räpaseid lugemisi, on see sobivam.
Ametlik selgitus viitab lukustatud olekule, mida kasutatakse ressursside ligipääsu haldamiseks, võimaldades mitmelõimelist lugemist või eksklusiivset kirjutamisõigust. Nimeruum on System.Threading
5. Semafor
Semaforid, mis on loodud piiratud arvu kasutajaressursside kontrollimiseks.
Ametlik selgitus piirab lõimede arvu, mis võivad samaaegselt ligi pääseda ressursile või ressursside kogumile. Nimeruum on System.Threading
6. Sündmused
Kasutatakse selleks, et teavitada lõime, et on toimunud mõningaid sündmusi, alustades järglasülesande algust.
Ametlik selgitus ütleb, et lõimede sünkroniseerimise sündmused lähtestuvad automaatselt, kui signaal saabub pärast lõime vabastamist. Selliseid tüüpe ei saa pärida.
7. Vastastikune välistamine
C# keeles on Mutex klass, otse System.Threading nimeruumi all, Mutex on tegelikult mutex, mis suudab mitte ainult lahendada ressursikonkurentsi mitme lõime vahel, vaid ka ressursikonkurentsi protsesside vahel.
Jõudlustesti kood
Käivita kood
Tulemustestide tulemused
Märkus: Ülaltoodud andmed põhinevad ainult praeguse testikeskkonna riistvara jõudluse tulemusel ning neid saab omavahel võrrelda.
1) Erinevates testides on see kindlasti kiireim, et mitte lukustada, seega püüa vältida ressursside konkurentsi, mis viib lukustatud tööni.
2) Interlocked. CompareExchange näitab järjepidevalt paremat jõudlust mitmelõimelises süsteemis, olles teisel kohal.
3) Kolmas lukk, kriitiline tsoon, näitab samuti head jõudlust, seega palun lükka teised ümber, kui nad väidavad, et lukustus on madal.
4) Neljas koht on aatommuutuja (aatomiline) operatsioon, kuid praegu toetab see ainult muutujate isekasvamist ja lahutamist ning rakendatavus ei ole tugev.
5) Viienda lugemise/kirjutamise luku (ReaderWriterLockSlim) jõudlus on samuti okei, toetab mitte midagi lugemist ja praktilisus on endiselt suhteliselt hea.
6) Ülejäänud semaforid, sündmused ja mutex on kehvema tulemusega, loomulikult on neil oma rakendusala, kuid nad ei toimi hästi ressursikonkurentsis.
Algne lingi aadress:Hüperlingi sisselogimine on nähtav.
|