Rumah >pembangunan bahagian belakang >Golang >Penemuduga Goodbye Go: Model GMP, kenapa ada P?
. daripada soalan, sebenarnya, wawancara ini Intipati soalan adalah untuk bertanya: "
Artikel ini akan membawa anda meneroka sebab perubahan dalam model GM dan GMP.
Model GM
Sebelum Go1.1, model penjadualan Go sebenarnya adalah model GM, iaitu, tiada P.Hari ini saya akan membawa anda menyemak reka bentuk yang lepas.
Nyahsulit kod sumber Go1.0static void schedule(G *gp) { ... schedlock(); if(gp != nil) { ... switch(gp->status){ case Grunnable: case Gdead: // Shouldn't have been running! runtime·throw("bad gp->status in sched"); case Grunning: gp->status = Grunnable; gput(gp); break; } gp = nextgandunlock(); gp->readyonstop = 0; gp->status = Grunning; m->curg = gp; gp->m = m; ... runtime·gogo(&gp->sched, 0); }
jadual
kaedah untuk mendapatkan Kunci global. schedlock
方法来获取全局锁。gput
方法来保存当前 Goroutine 的运行状态等信息,以便于后续的使用。nextgandunlock
方法来寻找下一个可运行 Goroutine,并且释放全局锁给其他调度使用。runtime·gogo
nextgandunlock
kaedah untuk mencari Goroutine seterusnya boleh dijalankan dan kunci global dikeluarkan untuk digunakan oleh penjadual lain.
Panggilruntime·gogo
kaedah , jalankan Goroutine seterusnya untuk dilaksanakan yang baru diperolehi dan masukkan pusingan penjadualan seterusnya.
Dengan menganalisis kod sumber penjadual Go1.0.1, kita boleh menemui satu perkara yang menarik. Itu adalah penjadual itu sendiri (kaedah jadual di bawah proses biasa, ia tidak akan kembali, iaitu, ia tidak akan menamatkan proses utama).
🎜🎜🎜G-M Model Diagram 🎜🎜🎜 Dia akan terus menjalankan proses penjadualan. GoroutineB mula menjadi Penjadualan, iaitu berjalan. 🎜🎜Sudah tentu ada juga G yang disekat (Blocked). Katakan G sedang membuat beberapa sistem atau panggilan rangkaian, yang akan menyebabkan G terhenti. Pada masa ini, M (benang sistem) akan dimasukkan semula dalam baris gilir kernel, menunggu pusingan baharu bangun. 🎜🎜🎜🎜Kelemahan model GM🎜🎜🎜🎜Pada zahirnya, model GM nampaknya tidak boleh dihancurkan dan sempurna. Tetapi mengapa mengubahnya? 🎜🎜Pada tahun 2012, Dmitry Vyukov menerbitkan artikel "Dokumen Reka Bentuk Penjadual Go Scalable", yang masih menjadi sasaran utama artikel penyelidikan utama pada penjadual Go Dia menerangkan sebab dan pertimbangan keseluruhan dalam artikel tersebut . 🎜Penjadual Goroutine semasa (merujuk kepada model GM Go 1.0) mengehadkan kebolehskalaan program serentak yang ditulis dalam Go, terutamanya pelayan berkemampuan tinggi dan program pengkomputeran selari.
Pelaksanaan mempunyai masalah berikut:
Apakah perubahan yang akan dibawanya
Setiap P mempunyai baris gilir tempatan sendiri, yang sangat mengurangkan pergantungan langsung pada baris gilir global Hasilnya adalah pengurangan dalam persaingan kunci. Sebahagian besar overhed prestasi model GM ialah persaingan kunci.
Pada baki relatif setiap P, algoritma Work Stealing juga dilaksanakan dalam model GMP Jika baris gilir tempatan P kosong, G yang boleh dijalankan akan dicuri daripada baris gilir global atau baris gilir tempatan. P lain untuk dijalankan, mengurangkan melahu dan meningkatkan penggunaan sumber.
Digabungkan dengan kedudukan M (benang sistem), jika anda melakukan ini, terdapat masalah berikut.
Secara umumnya, bilangan M akan lebih daripada P. Seperti dalam Go, had maksimum bilangan M ialah 10000, dan nombor lalai P ialah bilangan teras CPU. Di samping itu, disebabkan sifat M, iaitu jika terdapat panggilan penyekat sistem yang menghalang M dan tidak mencukupi, M akan terus meningkat.Atas ialah kandungan terperinci Penemuduga Goodbye Go: Model GMP, kenapa ada P?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!