Home Arrow Icon Knowledge base Arrow Icon Global Arrow Icon Kuidas läheb Go Runtime käepideme kanali toimingud sisemiselt


Kuidas läheb Go Runtime käepideme kanali toimingud sisemiselt


Go Runtime käitleb kanali toiminguid sisemiselt andmestruktuuride keeruka koordineerimise, lukustusmehhanismide, goroutiinide ajastamise ja sünkroonimise kaudu, et pakkuda tõhusat, õiglast ja ummikseisuvaba suhtlust goroutiinide vahel.

Go kanalid rakendatakse peamiselt andmestruktuurina "HCHAN", mis kapseldab kanali olekut, sealhulgas selle puhver, ootesaatjate ja vastuvõtjate järjekorrad, sünkroniseerimise primitiivid ja metateave, nagu näiteks kanal suletud. Kanalite loomisel eraldatakse hunnikule eksemplar `HCHAN" ja kanalit tähistav väärtus sellele struktuurile osutab, võimaldades mitmel goroutinil seda samaaegselt viidata ja kasutada.

Keskkonnas koosneb kanal:

- Puhverdatud kanalite ümmargune puhver, mida tähistavad viilu ja indeksid "sendx" ja "recvx", mis jälgivad, kus vastavalt elemente saata ja vastu võtta. Puhvri suurus on fikseeritud kanali loomisel ja see toimib järjekorrana, mis salvestab saadetud elemente, kuid pole veel vastuvõetud.
- Kaks FIFO ootejärjestust (lingitud nimekirjad) Goroutiinide haldamiseks blokeeriti saatmisel (`sendq`) ja vastuvõtmisel (` recvq`). Need järjekorrad salvestavad `Sudog` struktuurid, mis tähistavad blokeeritud goroutiini ja sellega seotud andmeid kanalioperatsioonide jaoks, näiteks saatmise väärtus või osuti, kuhu väärtus saada.
- Mutex -lukk, mis kaitseb samaaegset juurdepääsu kanali sisekonstruktsioonidele, tagades, et saatmine ja vastuvõtmine säilitab järjepidevuse ega rikuks kanali olekut samaaegse juurdepääsu all.

kanali saatmise toiming

Kui goroutine üritab kanalile väärtust saata (`ch e toiming

Vastuvõtuoperatsioon (`lexity:

1. lukustamine: kanali mutex on lukus.

2. Kontrollige saatjatelt: kui saatja ootab `sendq`:
- Vastuvõtja võtab väärtuse otse saatjalt `Sudog".
- Saatja on kasutusele võetud ja märgistatud.
- Mõlemad goroutiinid jätkavad kohe puhverdamata.

3. Kontrollige puhverdatud kanalite puhvrit: kui ükski saatja ei oota:
- Kanal kontrollib, kas selle puhver sisaldab mingeid elemente.
- Kui jah, kopeeritakse element puhverpositsioonist `buf [recvx]`.
- `recvx` indeksit suurendatakse ja` qcount` vähendatakse.
- Lukk vabastatakse ja vastuvõtja jätkub blokeerimiseta.

4. vastuvõtja blokeerimine: kui puhver on tühi ja ükski saatja ei oota:
- Vastuvõtja goroutine on esindatud kui `sudog”.
- see on lukustatud "Recvq".
- Vastuvõtja pargib ajastaja, kuni saatmise operatsioon blokeerib selle.

5. Suletud kanal võtab vastu: kui kanal on suletud ja puhver on tühi:
- võtab vastu elemendi tüübi nullväärtuse.
- Vastuvõtjad ei blokeeri ja suudavad suletud oleku tuvastada teise Boole'iga, mis on tagasi saadud operatsioonist.

6. Õiglus ja kord: ootajad võetakse õigluse säilitamiseks FIFO -d ja ajakava järgib järjestamispiiranguid, kuid ei taga ajakava käitumise tõttu ranget ajastust.

Parkimine ja ajakava integreerimine

Kanalid on tihedalt integreeritud Go Goroutine'i ajakavaga, mis haldab Goroutine'i elutsükke, kasutades kolme olemit:

- G (Goroutine): kerge, kasutajataseme niit.
- M (masin): OS -niit, mis käivitab goroutiinid.
- P (protsessor): omab kohalikku järjekorda jooksvate goroutiinide ja ressursside kohta, mis on vajalikud GO -koodi täitmiseks.

Kui kanalioperatsioon blokeerib (kas saatke või saab vastu), on Goroutine:

- on tähistatud ootamisena.
- eemaldatakse kohalikust käigu järjekorrast omamise `p` kohta.
- on seotud vastavas kanalijärjekorras (`sendq` või` recvq`).
- Seejärel valib planeerija veel ühe jooksva goroutiini, et sellel `p` joosta.

Kui blokeeritud toiming valmib lõpule (nt vastaspoole saatmine või vastuvõtmine juhtub):

- Ootege Goroutine on kanalijärjekorrast.
- tähistatud jooksev.
- asetatakse tagasi ajakava kohalikule või ülemaailmsele jooksujärjekorrale.
- Goroutine jätkab täitmist.

See disain väldib hõivatud ootamist ja tagab tõhusa konteksti vahetamise minimaalse üldkuluga võrreldes traditsioonilise OS -i keerme blokeerimisega.

kanali sulgemine

Kanal sulgemine seab sama mutexi kaitstud `HCHAN -is suletud lipu. Kanali sulgemine põhjustab järgmist:

- Kõik blokeeritud saatjad paanitsevad, kui nad üritavad saata.
- Kõik blokeeritud vastuvõtjad on FIFO -järjekorras blokeerimata, et saada ülejäänud puhverdatud väärtused ja seejärel nullväärtused.
- Edasi saab nullväärtused kohe ilma blokeerimiseta.
- Kohe suletud kanali paanika saatmine.
- Lähedane toiming sünkroniseeritakse ka kanali toimingutega läbi mutexi, et vältida võistlustingimusi.

Sisemised andmestruktuurid

- HCHAN: Keskne struktuur:
- `buf` (puhvermassiivi osuti)
- `DataqSiz` (puhvri suurus)
- `qcount` (praegu puhverdatud elementide arv)
- `sendx`,` recvx` (puhverindeksid)
- `sendq`,` recvq` (blokeeritud saatjate ja vastuvõtjate järjekorrad oota)
- "Suletud" lipp
- manustatud mutex (oleku kaitsmiseks ja mitme samaaegse toimingu koordineerimiseks).

- Sudog: sisemine käitusaja struktuur, mis tähistab kanali toimingut ootavat goroutiini. Hoiab:
- osuti goroutiinile.
- näpunäited saatmise või saadud andmete juurde.
- lingid järgmisele `Sudog 'ootejärjekorras.

- WaitQ: Lingitud SUDOGS -i nimekiri, mis esindab kas Saada kelnereid (`sendq`) või vastuvõtjad (` recvq`). FIFO õigluse tagamine.

Valige avaldus ja kanalid

Go 'Select` -avaldus tutvustab keerukust, kuna mitu kanali toimingut võistlevad samaaegselt. Runtime haldab iga valitud korpuse mitu ootejärjekorda ja mitmest kanalist võrguühenduseta valimine hõlmab:

- proovides igal juhul mitte blokeerivaid toiminguid.
- Kui ükski ei jätka, lisage goroutiini kõigi asjakohaste järjekordade korral.
- Kui üks toiming saab jätkuda, eemaldatakse teised kelnerid ja blokeerivad goroutine.

See valikuline ootemehhanism on õigluse ja tõhususe säilitamiseks sügavalt integreeritud käitusajakavaga.

jõudluse ja samaaegsuse kaalutlused

Kanalite disain püüdleb tasakaalus ohutuse ja jõudluse vahel:

- Mutex lukustamine: tagab järjepidevuse, kuid võib muutuda kitsaskohaks väga suure vaidluse korral. Käitumisaeg hoiab luku korraks oleku aatomilise ajakohastamiseks.
- Otsene üleandmine: väldib võimaluse korral puhvrit, võimaldades kiiremat suhtlust goroutiinide vahel.
- Parkimine ja parkimine: minimeerib konteksti lülitumise pea kohal võrreldes OS -niididega.
- Õiglus: jõustatakse nälgimise vältimiseks FIFO järjekordade kaudu.
- Vahemälu ja paikkond: UNPARKITE GOROUTIINID saavad jätkata erinevatel protsessoritel (`p`s), mis võib põhjustada vahemälu vahele jäämist.
- Äike karjaprobleem: kanali või ringhäälingu sulgemine võib paljusid goroutineid samaaegselt äratada, millega planeerija peab mõistlikult hakkama saama.

Kanalid tähistavad elegantset samaaegsust, mis ühendab lukuga kaitstud rõngapuhvrit goroutine ajakava mehhanismidega, pakkudes GO programmides ohutust, tellimist ja tõhusust.

Go kanali toimingute sisemised sisemised näitavad tihedat sidumist andmestruktuuride, lukustamise ja käitusajaplaneerija vahel, manustades sünkroniseerimist kasutajataseme kergetesse niitidesse ja võimaldades rikkalikke sidemustreid ilma raske OS-i kerneli interaktsioonita. See lähenemisviis eristab GO samaaegsuse mudelit ja on peamine põhjus, miks kanaleid on programmeerija vaatevinklist nii tõhusad ja lihtne kasutada.