Bahasa Go dilengkapi dengan penjadual coroutine yang cekap, yang boleh mengendalikan tugas serentak dan melaksanakan program berprestasi tinggi dengan mudah. Dalam artikel ini, kami akan melihat secara mendalam pada penjadual coroutine dalam bahasa Go dan meneroka pelaksanaan, operasi dan pengoptimumannya.
Pengenalan kepada coroutine
Coroutine ialah utas ringan atau utas mod pengguna. Ia dijadualkan oleh pengaturcara, bukan oleh sistem pengendalian. Ciri coroutine ialah ia bukan preemptive, iaitu konteks ditukar hanya apabila fungsi yield() dipanggil secara eksplisit. Oleh itu, overhed penukaran coroutine adalah sangat kecil, ia boleh dibuat dan dimusnahkan dengan mudah, dan banyak coroutine boleh dijalankan pada masa yang sama untuk mencapai pelaksanaan serentak program.
Model coroutine bahasa Go
Bahasa Go mengguna pakai model coroutine M:N, iaitu berbilang benang mod pengguna M, sepadan dengan hubungan berbilang urutan peringkat sistem N. Model ini memanfaatkan sepenuhnya CPU berbilang teras, sambil mengurangkan overhed penukaran konteks dan meningkatkan prestasi penjadualan.
M mewakili urutan sistem pengendalian, iaitu urutan fizikal, yang merupakan unit terkecil penjadualan sistem pengendalian. N mewakili benang maya (goroutine) dalam sistem masa jalan bahasa Go (masa jalan), yang merupakan unit terkecil untuk mencapai konkurensi. N goroutines akan dipetakan ke benang M dan dijadualkan oleh penjadual pada masa jalan.
Penjadual Coroutine
Penjadual coroutine ialah komponen teras dalam sistem masa jalan bahasa Go, bertanggungjawab untuk mengurus dan menjadualkan berbilang coroutine untuk melaksanakan tugas. Ia adalah penjadual peringkat tinggi yang boleh mengawal perjalanan dan penukaran coroutine dan merealisasikan penjadualan peringkat coroutine. Dalam bahasa Go, penjadual coroutine menggunakan entiti berjalan tambahan yang dipanggil Goroutine, yang boleh menukar tugas pelaksanaan dalam coroutine dengan lebih cekap.
Prinsip pelaksanaan penjadual coroutine
Prinsip pelaksanaan penjadual coroutine boleh dibahagikan kepada dua peringkat: peringkat sistem pengendalian dan peringkat sistem masa jalan bahasa Go.
Peringkat sistem pengendalian
Pada peringkat sistem pengendalian, penjadual coroutine akan memetakan berbilang urutan pengguna kepada berbilang rangkaian sistem pengendalian pada masa jalan, mengambil kesempatan daripada keupayaan pengkomputeran selari CPU berbilang teras.
Seni bina M:N dalam model coroutine bahasa Go, iaitu, M mewakili urutan sistem pengendalian (Mesin), N mewakili urutan maya bahasa Go (N, mewakili Goroutine) dan penjadual menguruskan penjadualan semasa runtime . Fungsi utama penjadual adalah untuk mengekalkan baris gilir tugas penjadualan pada setiap utas sistem pengendalian, menjadualkan secara dinamik pelaksanaan tugas pada setiap utas mengikut keutamaan tugas dalam baris gilir tugas dan algoritma penjadualan, dan menguruskan sumber benang.
Peringkat sistem masa jalan bahasa Go
Pada peringkat sistem masa jalan bahasa Go, penjadual coroutine menggunakan tiga mekanisme: penjadual, baris gilir penjadual dan P.
Penjadual
Penjadual coroutine bahasa Go dikawal oleh penjadual global, yang mengekalkan baris gilir penjadual, baris gilir P, nombor putaran, algoritma penjadualan, dsb. Penjadual secara dinamik mengurus pelaksanaan tugas pada setiap utas untuk mengoptimumkan kecekapan pelaksanaan coroutine.
Barisan Penjadual
Baris gilir penjadual ialah tempat penjadual merekodkan semua Goroutine yang menunggu untuk dijadualkan. Apabila penjadual memperuntukkan Goroutine kepada P, ia akan mencari Goroutine menunggu penjadualan daripada baris gilir barisan tempatan.
P
P ialah pemproses yang digunakan untuk melaksanakan Goroutine, dan baris gilir yang dimilikinya ialah baris gilir tempatan. Bilangan P dikawal oleh pembolehubah persekitaran GOMAXPROCS Jika tidak ditetapkan, atur cara Go menjadi lalai kepada bilangan teras mesin.
Pengoptimuman penjadual Go
Terdapat banyak strategi pengoptimuman untuk penjadual Go, berikut adalah beberapa daripadanya:
Apabila semua Goroutine dalam baris gilir P tertentu disekat, penjadual Go akan mencari Goroutine dalam baris gilir P lain dan mencuri beberapa dan meletakkannya dalam baris gilir sendiri untuk berlari. Strategi ini memastikan perkongsian beban dan beban yang stabil untuk semua Ps.
Goroutine boleh menetapkan pemasa untuk dirinya sendiri semasa pelaksanaan Apabila masa tamat, ia memanggil masa jalan.Goexit untuk memberitahu masa jalan bahawa Goroutine ini boleh aktif. dijadualkan. Penjadual Go juga mempunyai dasar pra-preemption jika goroutine tidak secara aktif memanggil Goexit. Sebelum Pergi 1.13, preemption hanya boleh dilakukan apabila GOMAXPROCS adalah 1. Ia kini telah dinaik taraf untuk menyokong lebih banyak situasi.
Untuk mengurangkan persaingan untuk tugasan antara thread yang berbeza, setiap thread akan mempunyai local queue sendiri dan setiap thread akan mengambil keutamaan daripada local Dapatkan tugas dan laksanakan hanya apabila baris gilir tempatan kosong, tugas itu akan diambil dari baris gilir global.
Ringkasan
Penjadual coroutine ialah salah satu komponen utama konkurensi berprestasi tinggi dalam bahasa Go. Ia bertanggungjawab untuk mengurus dan menjadualkan berbilang coroutine untuk melaksanakan tugasan Ia mengguna pakai model coroutine M:N dan menggunakan mekanisme dan algoritma yang berbeza pada peringkat sistem pengendalian dan peringkat sistem runtime bahasa Go untuk memastikan pelaksanaan dan penjadualan coroutine yang cekap. Pada masa yang sama, penjadual Go juga mempunyai banyak strategi pengoptimuman, seperti preemption coroutine, baris gilir larian tempatan dan mencuri tugas, yang boleh membantu program berjalan dengan lebih cekap dan meningkatkan prestasi dan daya pemprosesan program.
Atas ialah kandungan terperinci Penjelasan terperinci tentang penjadual coroutine dalam bahasa Go. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!