Home Arrow Icon Knowledge base Arrow Icon Global Arrow Icon vai ir kādi īpaši lietošanas gadījumi, kad mutes ir ievērojami ātrāki nekā kanāli


vai ir kādi īpaši lietošanas gadījumi, kad mutes ir ievērojami ātrāki nekā kanāli


Mutexes var būt ievērojami ātrāki nekā kanāli īpašos lietošanas gadījumos galvenokārt to vieglā rakstura un tā, kā viņi pārvalda strīdus un sinhronizāciju. Šeit ir detalizēti skaidrojumi ar kontekstu, kurā mutexes pārspēj kanālus:

Fundamentālas atšķirības, kas ietekmē veiktspēju

Mutexes nodrošina savstarpēju izslēgšanu, ļaujot tikai vienam pavedienam vai goroutīnam vienlaikus piekļūt kritiskai sadaļai. Iekšēji mutex darbība parasti ietver atomu instrukcijas, un tā var būt saistīta ar kodola līmeņa bloķēšanu tikai tad, ja ir strīdi. Tādēļ nesaturētā mutex bloķēšanas/atbloķēšanas operācijas bieži maksā tikai dažas nanosekundas.

Turpretī kanāli ir augstāka līmeņa abstrakcijas, kas paredzētas saziņai starp goroutīniem vai pavedieniem. Kanāla nosūtīšana vai saņemšana nozīmē rindas pārvaldību, iespējamās atmiņas piešķīrumus, plānot goroutines un pamodināt tos, ja guļ. Šīs pieskaitāmās izmaksas nozīmē pat vienkāršas stāvokļa mutācijas, kuras apsargā kanāls, rodas vairāk izmaksu, salīdzinot ar mutex konteksta maiņas un koordinācijas darba dēļ.

Šīs būtiskās atšķirības jau norāda, kāpēc vienkāršai kopīgai mainīgai aizsardzībai vai kritiskām sadaļām mutexi parasti ir ātrāki.

Lietošanas gadījumi, kur mutes ir ātrāki

vienkārša kopīga stāvokļa aizsardzība

Ja programmai ir jāaizsargā kopīgi mainīgie - piemēram, skaitītāji, kartes vai vienkārši karodziņi â mutexes ir daudz ātrāki, jo kritiskā sadaļa ietver minimālu sinhronizāciju virs galvas. Piemēri ir:

- Pieprasījumu skaitīšana tīmekļa serverī: Katru pieprasījuma pieauguma darbību var sargāt ar mutex, nepieprasot ziņojumu nosūtīšanu caur kanālu, kas pievieno rindu veidošanu un kavēšanos. Mutexes ļauj tiešai, tiešai piekļuvei, un ir pierādīts, ka tie uzlabo caurlaidspēju pēc lieluma vai lielāka secības.

- Piekļūstot koplietotajām kešatmiņām vai kartēm: datu struktūru aizsardzība ar muteksu piedāvā inline lasījumus un raksta ar minimālām pieskaitāmām izmaksām. Izmantojot kanālus kā starpniekus šeit, tiek ieviests papildu latentums, jo katra piekļuve kļūst par pieprasījuma un atbildes turp un atpakaļ.

Etalona testi rāda, ka uz mutex balstītiem skaitītājiem var būt aptuveni 75 reizes ātrāks nekā kanālu bāzes skaitītājiem, jo ​​samazinātas sinhronizācijas pieskaitāmās izmaksas un izvairīšanās no rindu pārvaldības izmaksām un konteksta pārslēgšanas kanāliem raksturīgajiem.

Zema strīdība vai nesadalīti scenāriji

Vides zemā strīdā mutex bloķēšanas un atbloķēšanas operācijas ir gandrīz tikai atomu operācijas bez gaidīšanas laikiem. Neuzkrītošais gadījums ir tas, kur spīd mutexes, jo bloķēšana ir viegla un parasti neizraisa kodola līmeņa plānošanu.

Tomēr kanāliem rodas izmaksas pat zemā strīdā, jo katrs sūtījums/saņemšana ir saistīta ar sarežģītāku pārvaldību, buferizēšanu un sinhronizāciju. Tādējādi nelielam skaitam goroutīnu vai scenārijos ar nelielu strīdu, mutexes ievērojami pārspēj kanālus.

Augsta vienlaicība ar vienkāršu bloķēšanu

Scenārijos, kad daudzas goroutes veic ļoti īsas kritiskas sadaļas, kas modificē kopīgu stāvokli, mutexi joprojām ir efektīvāki nekā kanāli. Galvenais iemesls ir tas, ka mutexes bloķē kodolu goroutīnus, ļaujot efektīvi plānot un pamodoties tieši vienu goroutīnu, atbloķējot. No otras puses, kanāli ietver aktīvu goroutīna plānošanu un rindu pārvaldību, kas rada virs galvas zem slodzes.

Piemēram, etaloni, kur ir iesaistītas līdz 10 goroutīnām, rāda, ka mutexes ir vairākas reizes ātrākas, un mutexes joprojām ir konkurētspējīgas pat ar simtiem goroutīnu.

Darba sadalījums, ja stāvokļa mutācijas ir minimālas

Lai pārvaldītu šķēles vai uzdevumu sarakstus, mutexi var būt ātrāki, īsi bloķējot, lai pop vai virzītu uzdevumus. Lai arī kanāli ir ļoti dabiski uzdevumu izplatīšanai, ja kritiskā sadaļa ir īsa un kopīgajam stāvoklim nepieciešama ātra bloķēšana un atbloķēšana, mutexes izvairās no papildu kanāla koordinācijas pieskaitāmām izmaksām un nodrošina labāku caurlaidspēju.

Daudzās reālās pasaules sistēmās, piemēram, darba ņēmēju baseinos vai darba rindās, mutexes var būt vienkāršākas un ātrākas uzdevumu sarakstu pārvaldībai, salīdzinot ar kanāliem.

###, kāpēc šajos gadījumos mutexes ir ātrāki

- Zemākas pieskaitāmās izmaksas: mutexes izmanto atomu CPU instrukcijas tieši bloķēšanai un atbloķēšanai, bieži bez konteksta slēdža vai dārgiem plānošanas lēmumiem.

- Kodola bloķēšana ar rindu: strīdēšanās goroutīni efektīvi guļ uz muteksiem, veidojot rindu, un plānotājs tos modē pamodina. Kanāli izraisa sarežģītākus modināšanas un plānošanas modeļus.

- Nav ziņojumu nodošanas izmaksas: kanāliem ir jāpiešķir buferi vai rindas ieraksti un jākopē/pārsūta datus, kas nav nepieciešami, ja pietiek ar vienkāršu īpašumtiesībām un ekskluzivitāti.

- Tieša atmiņas piekļuve: mutexes atļauj tieši piekļūt atmiņai kritiskā sadaļā, savukārt kanāliem ir jānosūta dati caur sakaru vidi, pievienojot indikatoru un latentumu.

konteksti, kas ir mazāk piemēroti kanāliem

Lai arī kanāli nodrošina elegantu un drošu saziņas veidu starp goroutīniem un ir ļoti vērtīgi cauruļvadu apstrādei un notikumu apstrādei, to pieskaitāmie izmaksas padara tos mazāk piemērotus īsām, biežām kopīga stāvokļa mutācijām.

Kanāli ir ideāli, ja sinhronizējot sarežģītus aprēķinus, kas saistīti ar vairākām goroutīnām, kurās semantika ir dabiska un izdevīga. Bet vienkāršai bloķēšanai spīd mutes.

Eksperimentālie un etalona pierādījumi

- Etaloni ar Go sinhronizācijas primitīviem rāda, ka mutex skaitītāji darbojas ar latentumiem nanosekundēs diapazonā, savukārt kanālu skaitītāji ir lēnāki (piemēram, 0,8 ns pret 60 ns par vienu operāciju).

- Veiktspēja mainās tikai ļoti augstā mērogā (piemēram, tūkstošiem goroutīnu), ja kanāli dažos gadījumos var pārspēt muteksus, jo kanāli izvairās no pieskaitāmās un labāka modeļa vienlaicīgas cauruļvadu bloķēšanas.

- Saskaņā ar strīdiem mutexes pārspēj spinlocks kodola līmeņa plānošanas efektivitātes dēļ.

- Mutexes izvairās no atmiņas piešķīrumiem un konteksta pārslēgšanas kanālos, kas noved pie ievērojamiem ieguvumiem caurlaidspējas un zemāka CPU izmantošana koplietojamo mainīgo aizsardzībai.

Lietošanas gadījumu ieteikumu kopsavilkums

- Izmantojiet mutexes, aizsargājot kopīgu atmiņu vai mainīgu stāvokli, kuram piekļūst vienlaikus, it īpaši, ja kritiskā sadaļa ir īsa un ietver vienkāršas operācijas.

- Izmantojiet kanālus aprēķinu, cauruļvadu un notikumu virzītu arhitektūru orķestrēšanai, kur ziņojumi attēlo stāvokli vai uzdevumus, kas jāapstrādā asinhroni.

- Par veiktspēju kritisko kodu, kas saistīta ar tieša stāvokļa mutācijām ar vairākiem pavedieniem vai goroutīniem, mutexi parasti nodrošina labāku caurlaidspēju un zemāku latentumu.

- Apsveriet kanālus, kad jūsu vienlaicīguma loģika gūst labumu no ziņojumu nodošanas semantikā, bet izvairieties no tiem, lai iegūtu augstas frekvences vienkāršas bloķēšanas vajadzības.

Tehniskā dziļā niršana

Mutexes parasti izmanto atomu operācijas, piemēram, salīdzināt-and-Swap (CAS), lai bloķētu un atbloķētu lietotāja telpā un ievada kodolu tikai tad, kad notiek apgalvojums, lai bloķētu pavedienu. Tas samazina konteksta pārslēgšanu un pieskaitāmās izmaksas nesadalītā gadījumā.

Kanāli ievieš FIFO rindas ziņojumiem, un tos bieži atbalsta buferi, kuru var mainīt. Kanāla nosūtīšana nozīmē, vai uztvērējs ir gatavs, datu kopēšana buferī vai bloķēšana un saņemšanas goroutīna plānošana. Šīs darbības pievieno izmaksas, kas reizinās ar darbības biežumu.

Mutexes miega, kas cīnās ar pavedieniem un uztur rindu, tāpēc vienlaikus pamostas tikai viens pavediens. Kanāli var pamodināt vairākas goroutīnas, kad ziņojumi kļūst pieejami, kā rezultātā ir sarežģītākas plānošanas un konteksta pārslēgšanas izmaksas.

Secinājums

Rezumējot, mutexi ir ievērojami ātrāki nekā kanāli scenārijos, kuriem nepieciešami ātras, vienkāršas un biežas kopīgas stāvokļa mutācijas ar zemu strīdu vai īsām kritiskām sadaļām. Viņu vieglā atomu operācija, efektīva kodola bloķēšana un pavedienu nomoda, kā arī tieša atmiņas piekļuve nodrošina izcilu veiktspēju, salīdzinot ar plānošanas, kopēšanas un ziņojumu nodošanu virs galvas kanāliem. Kanāli ir labāk piemēroti sarežģīta darba komunikācijai un goroutīnu koordinēšanai, bet maksā izmaksas par neapstrādātu sinhronizācijas ātrumu.

Šo izpratni atbalsta vairāki etaloni un praktiski piemēri no ražošanas sistēmām un eksperimentālie rezultāti. Tādējādi lēmumam starp muteksiem un kanāliem jābalstās uz darba slodzes raksturlielumiem un sinhronizācijas vajadzībām, un mutexi dod priekšroku neapstrādātam ātrumam kopīgas atmiņas un kanālu sargāšanai, kas paredzēti augstāka līmeņa koordinācijai un komunikācijas modeļiem.