Muteksid võivad olla oluliselt kiirem kui kanalid konkreetsetel kasutusjuhtudel peamiselt nende kerge olemuse ja väite ja sünkroonimise haldamise viisi tõttu. Siin on üksikasjalikud selgitused kontekstidega, kus Mutexes edestavad kanalit:
Põhimõttelised erinevused mõjutavad tulemuslikkust
Muteksid tagavad vastastikuse tõrjutuse, võimaldades ainult ühel lõimel või goroutiinil kriitilisele sektsioonile korraga juurde pääseda. Sisemiselt hõlmab Mutexi toiming tavaliselt aatomijuhiseid ja võib kerneli taseme blokeerimist hõlmata ainult siis, kui on olemas vaidlused. Seetõttu maksavad vastupanuta Mutexi luku-/avamisoperatsioonid sageli vaid paar nanosekundit.
Kanalid on seevastu kõrgema taseme abstraktsioonid, mis on mõeldud suhtlemiseks goroutiinide või lõimede vahel. Kanalil saatmine või vastuvõtmine hõlmab järjekorra haldamist, võimalike mälu eraldamist, goroutiinide ajastamist ja nende magamise korral äratamist. See üldkulud tähendavad isegi lihtsaid olekumutatsioone, mida kanalil valvatakse, rohkem kulusid, võrreldes mutexiga konteksti vahetamise ja koordineerimistöö tõttu.
Need põhimõttelised erinevused näitavad juba, miks on lihtsad jagatud muutuva kaitse või kriitiliste sektsioonide puhul mudelid üldiselt kiiremad.
Kasutage juhtumeid, kus mutexid on kiirem
Lihtne jagatud olekukaitse
Kui programm peab kaitsma jagatud muutujaid, näiteks loendurid, kaardid või lihtsad lipud â mudekseid on palju kiirem, kuna kriitiline osa hõlmab minimaalset sünkroonimise pea kohal. Näited hõlmavad:
- Taotluste loendamine veebiserveris: iga päringu juurdekasvutoimingut saab valvata mutex, ilma et oleks vaja kanalit läbi sõnumite saatmise üldkulusid, mis lisab järjekordade ja ajaplaanide viivitusi. Muteksid võimaldavad sirgjoonelist, otsest juurdepääsu ja on näidatud, et need parandavad läbilaskevõimet või rohkem suurusjärku.
- Jagatud vahemäludele või kaartidele juurdepääs: Mutexidega andmestruktuuride kaitsmine pakub minimaalse üldkuludega lugemisi ja kirjutab. Kanalite kasutamine vahendajatena tutvustab siin täiendavat latentsusaega, kuna iga juurdepääs saab päringu-vastuse edasi-tagasi.
Võrdluskatsed näitavad, et mutexipõhised loendurid võivad sünkroonimise vähendatud üldkulude tõttu olla umbes 75 korda kiiremini kui kanalipõhised loendurid ning vältida kanalitele omase järjekorra haldamise ja konteksti ümberlülituse kulusid.
Madal väide või vastupanuta stsenaariumid
Madalates vaidluskeskkondades on Mutexi lukustus- ja avamisoperatsioonid peaaegu aatomioperatsioonid ilma ooteaegadeta. Vastupidamatu juhtum on koht, kus muteksid säravad, kuna lukustamine on kerge ja tavaliselt ei käivita kerneli tasemel sõiduplaani.
Kanalid kannavad kulusid siiski isegi madala vaidlusega, kuna iga saatmine hõlmab keerukamat juhtimist, puhverdamist ja sünkroonimist. Seega edestavad Mutexes väheste goroutiinide või vähese väitega stsenaariumide korral kanalite oluliselt.
Suur samaaegne lihtsa lukustumisega
Stsenaariumide korral, kus paljud goroutiinid teostavad väga lühikesi kriitilisi sektsioone, mis muudavad jagatud olekut, kipuvad muteksid endiselt kanalidest tõhusamad olema. Peamine põhjus on see, et mutexid blokeerivad kerneli goroutiinide võitlemist, võimaldades tõhusat ajakava koostamist ja ärgates täpselt ühte goroutine'i vabastamisel. Kanalid seevastu hõlmavad aktiivset goroutine ajakava koostamist ja järjekordade haldamist, mis loob koormuse all pea kohal.
Näiteks etalonid, kus kaasatud on kuni 10 goroutiini, näitavad mutekseid mitu korda kiiremini ja mutexid on konkurentsivõimelised isegi sadade goroutiinidega.
Tööjaotus, kui olekumutatsioonid on minimaalsed
Ülesannete viilude või loendite haldamiseks võivad muteksid olla kiirelt lukustamisel või ülesannete lükkamisel. Kuigi kanalid on ülesannete jaotuse jaoks väga loomulikud, kui kriitiline osa on lühike ja jagatud olek nõuab kiiret lukustamist ja avamist, väldivad muteksid kanali koordinatsiooni täiendavat üldkulu ja toovad parema läbilaskevõime.
Paljudes reaalajasüsteemides, näiteks töötajate kogumid või tööjärjekorrad, võivad muteksid olla lihtsam ja kiirem töönimekirjade haldamiseks võrreldes kanalitega.
###, miks muteksid on nendel juhtudel kiirem
- Alumine üldkulud: Mutexid kasutavad aatomi CPU juhiseid otse lukustamiseks ja lukustamiseks, sageli ilma kontekstilüliti või kulukaid ajakava otsuseid.
- Kerneli blokeerimine järjekordadega: Goroutiinide võitlemine magab muteksidel tõhusalt, moodustades järjekorra ja ajakava äratab neid seeriaviisiliselt. Kanalid põhjustavad keerukamaid äratusi ja ajakava.
- Sõnumi möödumise kulud puuduvad: kanalid peavad eraldama puhvrid või järjekorrakirjed ja kopeerima/ülekande andmeid, mis pole vajalikud, kui lihtsast omandist ja ainuõigust on piisav.
- Otsene mälu juurdepääs: mutexid võimaldavad otsest mälu juurdepääsu kriitilises jaotises, kanalid aga vajavad andmete saatmist suhtlusmeediumi kaudu, lisades kaudse ja latentsuse kihti.
Kontekstid vähem sobivad kanalite jaoks
Ehkki kanalid pakuvad elegantset ja ohutut viisi goroutiinide vahel suhtlemiseks ning on torujuhtme töötlemiseks ja sündmuste käitlemiseks väga väärtuslikud, muudavad nende üldkulud vähem sobivaks lühikesteks, sagedasteks jagatud olekumutatsioonideks.
Kanalid on ideaalsed keerukate arvutuste sünkroonimisel, mis hõlmavad mitut goroutiini, kus sõnumi läbimine on loomulik ja kasulik. Kuid lihtsaks lukustamiseks paistab muteksid.
Eksperimentaalsed ja võrdlusalused tõendid
- GO sünkroonimise primitiividega võrdlusalused näitavad, et mutex -loendurid töötavad nanosekundide vahemikus latentsusaegadega, samas kui kanaliloendurid on suurusjärku aeglasemad (nt 0,8 ns vs 60 ns toimingu kohta).
- jõudlus pöörab tagasi ainult väga kõrgetel skaaladel (nt tuhanded goroutiinid), kui kanalid võivad mõnel juhul mudekseid edestada, kuna kanalid väldivad pea kohal lukustamist ja paremat mudeli samaaegset torustikku.
- Vaieldades edestavad mutexid kerneli tasemel ajastamise tõhususe tõttu spinlokid.
- Mutexid väldivad kanalites esinevat mälu jaotust ja konteksti lülitamist, mis põhjustab läbilaskevõime olulist kasu ja madalama protsessori kasutamist jagatud muutujate kaitsmiseks.
kasutusjuhtumi soovituste kokkuvõte
- Kasutage samaaegselt juurdepääsu jagatud mälu või muutuva oleku kaitsmisel mutekseid, eriti kui kriitiline osa on lühike ja hõlmab lihtsaid toiminguid.
- Kasutage arvutuste, torujuhtmete ja sündmustepõhiste arhitektuuride orkestreerimiseks kanaleid, kus sõnumid tähistavad olekut või ülesandeid, mida töödeldakse asünkroonselt.
- Tulemuslikkukriitilise koodi jaoks, mis hõlmab otsese oleku mutatsioone mitme lõime või goroutiini abil, pakuvad muteksid tavaliselt parema läbilaskevõime ja madalama latentsusaja.
- Kaaluge kanaleid, kui teie samaaegsuse loogika saab teada sõnumi läbivast semantikast, kuid vältige neid lihtsate lihtsate lukustusvajaduste korral.
Tehniline sügav sukeldus
Muteksid kasutavad tavaliselt aatomitoiminguid, näiteks võrrelda ja vahekest (CAS) kasutajaruumis lukustamiseks ja avamiseks ning sisenege kernelisse ainult siis, kui keerme blokeerimiseks toimub vaidlus. See minimeerib konteksti lülitumist ja pealisketlust mittevainutatava juhtumi korral.
Kanalid rakendavad sõnumite jaoks FIFO järjekorda ja neid toetavad sageli puhvrid, mis võivad muutuda. Kanali saatmine hõlmab kontrollimist, kas vastuvõtja on valmis, andmete kopeerimine puhvrisse või blokeerimine ja vastuvõtva goroutine'i kavandamine. Need sammud lisavad kulud, mis korruvad töö sagedusega.
Mutexid magavad niidil ja säilitavad järjekorra, nii et korraga ärkab ainult üks niit. Kanalid võivad ärgata mitu goroutiini, kui sõnumid muutuvad kättesaadavaks, mis viib keerukamate sõiduplaanide ja konteksti vahetamise kuludeni.
Järeldus
Kokkuvõtlikult on muteksid oluliselt kiirem kui kanalid stsenaariumides, mis nõuavad kiireid, lihtsat ja sagedasi jagatud olekumutatsioone, millel on väikesed vaidlused või lühikesed kriitilised sektsioonid. Nende kerge aatomitööde rakendamine, tõhus kerneli blokeerimine ja niidide ärkamine ning otsene mälu juurdepääs pakuvad suurepäraseid jõudlust võrreldes ajakava koostamise, kopeerimise ja sõnumite ülekandmise kanalitega. Kanalid sobivad paremini keerukate tööde edastamiseks ja goroutiinide koordineerimiseks, kuid maksavad töötlemata sünkroonimiskiirusel kulusid.
Seda arusaamist toetavad mitu võrdlusalust ja praktilisi näiteid tootmissüsteemidest ja eksperimentaalsetest tulemustest. Seega peaks mutekside ja kanalite vaheline otsus põhinema töökoormuse omadustel ja sünkroonimisvajadustel, mille muteksid on eelistatud toore kiiruse jaoks jagatud mälu valvamisel ja kanalitele, mis on reserveeritud kõrgema taseme koordineerimiseks ja kommunikatsioonimustriteks.