Mutexes gali būti žymiai greitesnis nei kanalų konkrečiais naudojimo atvejais, pirmiausia dėl jų lengvo pobūdžio ir dėl to, kaip jie valdo ginčus ir sinchronizaciją. Čia pateikiami išsamūs paaiškinimai su kontekstais, kuriuose „Mutexes“ lenkia kanalus:
Pagrindiniai skirtumai, darantys įtaką našumui
„Mutexes“ suteikia abipusį atskirtį, leisdami tik vienam gijai ar gorutinui patekti į kritinę dalį vienu metu. Viduje „Mutex“ operacija paprastai apima atomines instrukcijas ir gali apimti branduolio lygio blokavimą tik tada, kai yra ginčų. Dėl šios priežasties nenutrūkstamos „Mutex Lock“/„Atrakinimo operacijos“ dažnai kainuoja tik keletą nanosekundžių.
Kanalai, atvirkščiai, yra aukštesnio lygio abstrakcijos, skirtos bendrauti tarp gorutinų ar gijų. Siuntimas ar gavimas kanale apima eilės valdymą, galimus atminties paskirstymą, gorutinų planavimą ir pabudimą, jei jie miega. Ši pridėtinė vertė reiškia net paprastas būsenos mutacijas, kurias saugo kanalas, reikia daugiau išlaidų, palyginti su mutex dėl konteksto perjungimo ir koordinavimo darbų.
Šie esminiai skirtumai jau rodo, kodėl paprastai bendrai kintamai apsaugai ar kritinėms sekcijoms muteksai paprastai būna greitesni.
Naudokite atvejus, kai mutexes yra greitesni
Paprasta bendra valstybės apsauga
Kai programai reikia apsaugoti bendrus kintamuosius, tokius kaip skaitikliai, žemėlapiai ar paprastos vėliavos “,„ Mutexes “yra daug greitesni, nes kritinė dalis apima minimalią sinchronizacijos pridėtinę vertę. Pavyzdžiai:
- Skaičiuojant užklausas žiniatinklio serveryje: Kiekvieną užklausos padidinimo operaciją galima saugoti „Mutex“, nereikalaujant pridėtinės išlaidų siuntimo pranešimų per kanalą, kuris prideda eilės ir planavimo vėlavimus. „Mutexes“ leidžia tiesmukiškai, tiesiogiai prieigą ir buvo įrodyta, kad pagerina pralaidumą pagal dydį ar daugiau.
- Prieiga prie bendrų talpyklų ar žemėlapių: Duomenų struktūrų apsauga naudojant „MutexES“ siūlo inline skaitymus ir rašo su minimaliomis pridėtinėmis išlaidomis. Naudojant kanalus kaip tarpininkai, čia pateikiamas papildomas delsos, nes kiekviena prieiga tampa atsakymo į abi kelionę į abi kelionę.
Lyginamieji testai rodo, kad „Mutex“ pagrindu sukurti skaitikliai gali būti maždaug 75 kartus greitesni nei kanalų pagrindu sukurti skaitikliai, nes sinchronizuojant ir išvengia eilės tvarkymo išlaidų ir konteksto perjungimo, būdingo kanalams, išlaidas.
Mažas ginčas ar neaplenktų scenarijų
Mažos ginčo aplinkoje „Mutex Lock“ ir „Atrakinimo operacijos“ yra beveik tik atominės operacijos be laukimo laiko. Neapibrėžtas atvejis yra tas, kai „Mutexes“ šviečia, nes fiksavimas yra lengvas ir paprastai nesukelia branduolio lygio planavimo.
Tačiau kanalai patiria išlaidas net ir mažai ginčijamasi, nes kiekvienas siuntimas/gaunamas apima sudėtingesnį valdymą, buferinį ir sinchronizavimą. Taigi, nedideliam skaičiui gorutinų arba scenarijuose, turinčiuose mažai ginčų, „Mutexes“ žymiai pralenkia kanalus.
Aukštas suderinamumas su paprastu užraktu
Scenarijuose, kai daugelis gorutinų atlieka labai trumpus kritinius skyrius, modifikuojančias bendrą būseną, „Mutexes“ vis dar paprastai būna efektyvesni nei kanalai. Pagrindinė priežastis yra ta, kad „Mutexes“ blokuoja gorutinus branduolį, leidžiantį efektyviai planuoti planavimą ir pabudęs tiksliai vienu gorutinu, kai atrakinama. Kita vertus, kanalai apima aktyvų „Goroutine“ planavimą ir eilės valdymą, kuris sukuria pridėtines išlaidas.
Pavyzdžiui, etalonuose, kuriuose dalyvauja iki 10 gorutinų, „Mutexes“ yra kelis kartus greitesni, o mutexes išlieka konkurencingos net ir šimtuose gorutinų.
Darbo pasiskirstymas, kai būsenos mutacijos yra minimalios
Tvarkyti pjūvius ar užduočių sąrašus, „Mutexes“ gali būti greitesnės, kai trumpai užrakinamos, kad būtų pop ar stumiamos užduotys. Nors kanalai yra labai natūralūs paskirstant užduotis, jei kritinė sekcija yra trumpa, o bendroji būsena reikalauja greito užrakinimo ir atrakinimo, mutexes išvengia papildomų kanalų koordinavimo pridėtinių išlaidų ir padidina geresnį pralaidumą.
Daugelyje realaus pasaulio sistemų, tokių kaip darbuotojų baseinai ar darbo eilės, „Mutexes“ gali būti paprastesnės ir greitesnės užduočių sąrašų tvarkymui, palyginti su kanalais.
Kodėl šiais atvejais muteksai yra greitesni
- Mažesnės pridėtinės išlaidos: „Mutexes“ naudoja atominius CPU instrukcijas tiesiogiai užrakinti ir atrakinti, dažnai be konteksto jungiklio ar brangių planavimo sprendimų.
- Branduolys, blokuojantis eilėmis: Gorutino miegas miega efektyviai mutexes, formuodamas eilę, o planuoklis juos pažadina nuosekliai. Kanalai sukelia sudėtingesnius pabudimo ir planavimo modelius.
- Nėra pranešimo Pravažiavimo išlaidų: kanalai turi skirti buferius ar eilės įrašus ir nukopijuoti/perduoti duomenis, o tai nereikalinga, kai pakanka paprastos nuosavybės ir išskirtinumo.
- Tiesioginė prieiga prie atminties: „Mutexes“ suteikia tiesioginę prieigą prie atminties kritiniame skyriuje, o kanalams reikia siųsti duomenis per ryšio terpę, pridedant nerviškumo ir latencijos sluoksnius.
Kontekstai, mažiau tinkami kanalams
Nors kanalai yra elegantiškas ir saugus būdas bendrauti tarp gorutinų ir yra labai vertingi atliekant dujotiekio apdorojimą ir tvarkant įvykius, jų pridėtinės išlaidos daro juos mažiau tinkamus trumpoms, dažnai bendroms būsenos mutacijoms.
Kanalai yra idealūs, kai sinchronizuojant sudėtingus skaičiavimus, apimančius kelis gorutinus, kai pranešimų perdavimo semantika yra natūralūs ir naudingi. Bet norint paprastam fiksavimui, „Mutexes“ šviečia.
Eksperimentiniai ir etaloniniai įrodymai
- „Go“ sinchronizacijos primityvų etalonai rodo, kad „Mutex“ skaitikliai veikia su latencijomis nanosekundžių diapazone, o kanalų skaitikliai yra lėtesni (pvz., 0,8 ns, palyginti su 60 ns vienai operacijai).
- Našumas keičiasi tik esant labai didelėms skalėms (pvz., Tūkstančiai gorutinų), kai kanalai kai kuriais atvejais gali pralenkti muteksus, nes kanalai vengia užrakinti pridėtines ir geresnius modelius.
- Dėl ginčo „Mutexes“ pralenkia spinteles dėl branduolio lygio planavimo efektyvumo.
- „Mutexes“ išvengia atminties paskirstymo ir konteksto perjungimo kanaluose, o tai lemia reikšmingą pralaidumo padidėjimą ir mažesnį CPU naudojimą, kad būtų apsaugoti bendrieji kintamieji.
Naudojimo bylos rekomendacijų santrauka
- Naudokite „Mutexes“ saugodami bendrą atmintį ar kintamą būseną, į kurią patektų tuo pačiu metu, ypač jei kritinis skyrius yra trumpas ir apima paprastas operacijas.
- Naudokite kanalus skaičiavimams, vamzdynams ir įvykiams orientuotoms architektūroms organizuoti, kur pranešimai žymi būsenos ar užduotis, kurias reikia apdoroti asinchroniškai.
- Našumui kritiniam kodui, apimančiam tiesiogines būsenos mutacijas keliais gijimais ar gorutinais, „Mutexes“ paprastai suteikia pranašesnį pralaidumą ir mažesnį latenciją.
- Apsvarstykite kanalus, kai jūsų lygiavertė logika yra naudinga iš pranešimų perdavimo semantikos, tačiau venkite jų, kad būtų aukšto dažnio paprasti užrakinimo poreikiai.
Techninis gilus nardymas
„Mutexes“ paprastai naudoja atomines operacijas, tokias kaip palyginimas ir pražanga (CAS) užrakinti ir atrakinti vartotojo erdvėje ir įvesti branduolį tik tada, kai įvyks tvirtinimas, kad užblokuotų sriegį. Tai sumažina konteksto perjungimą ir pridėtines išlaidas nenugalime.
Kanalai įgyvendina „Fifo“ eiles pranešimams ir dažnai palaiko buferiai, kurie gali pakeisti dydį. Siunčiant kanalą reikia patikrinti, ar imtuvas yra paruoštas, nukopijuoti duomenis į buferį ar blokuoti, ir suplanuoti priimamąjį gorutiną. Šie veiksmai prideda išlaidų, kurios daugėja su operacijos dažniu.
„Mutexes“ miego, kuriame varžosi siūlai, ir palaikykite eilę, taigi tik vienas siūlas vienu metu atsibunda. Kanalai gali pažadinti kelis gorutinus, kai bus prieinami pranešimai, todėl susidarys sudėtingesnės planavimo ir konteksto perjungimo išlaidos.
Išvada
Apibendrinant galima pasakyti, kad muteksai yra žymiai greitesni nei kanalų scenarijuose, kuriems reikalingas greitas, paprastas ir dažnas bendras būsenos mutacijas, turinčias mažą ginčą ar trumpas kritines dalis. Jų lengvas atominis operacija, efektyvus branduolio blokavimas ir gijų pabudimas bei tiesioginė prieiga prie atminties suteikia puikų našumą, palyginti su planavimu, kopijavimu ir pranešimais, perduodančiais viršutinius kanalus. Kanalai geriau tinka komunikuoti sudėtingą darbą ir koordinuoti gorutinus, tačiau moka kainą neapdorotą sinchronizacijos greitį.
Šį supratimą palaiko keli etalonai ir praktiniai gamybos sistemų ir eksperimentinių rezultatų pavyzdžiai. Taigi sprendimas tarp „Mutexes“ ir kanalų turėtų būti grindžiamas darbo krūvio charakteristikomis ir sinchronizacijos poreikiais, o „Mutexes“ pirmenybė teikiama neapdoroto greičiui saugant bendrą atmintį ir kanalus, skirtus aukštesnio lygio koordinavimo ir komunikacijos modeliams.