Middle+
Горутини чӣ гуна сохта шудаанд ва дар стек чанд ёддошт мегиранд?
sobes.tech AI
Ҷавоб аз AI
Горутин — это жеңіл орындалу ағыны, оны іске асыру ортасы басқарған. Операциялық жүйе ағындарынан айырмашылығы, горутиндер аз санына көпірмеленеді (мультиплексі). Бұл жақсы масштабталуды қамтамасыз етеді.
Негізгі аспектілер:
- Жоспарлаушы (Scheduler): Go іске асыру ортасында өзінің жоспарлаушысы (M:N жоспарлаушы) бар, ол горутиндерді (M) шектеулі санына OS ағындарында (N) басқарады.
- Жады менеджері (Memory Manager): Горутиндердің стекін және олардың өсуі/азаюын басқарады.
- Қарым-қатынас: Горутиндер каналдар арқылы өзара әрекеттеседі, бұл көбінесе блоктаулар/мютекстерсіз қауіпсіз деректер алмасуды қамтамасыз етеді.
Горутиннің стекі:
- Бастапқыда, горутиндердің стекі кішкентай, әдетте 2 КБ (Go 1.4-ке дейін 4 КБ).
- Стек өседі және кішірейеді. Ол толып кетсе, автоматты түрде кеңейеді, ал босатылса, сығылады.
- Бұл динамикалық басқару стекінің шығындарын азайтады, ол операциялық жүйенің үлкен тұрақты стекілеріне қарағанда.
Стекте қолданылатын жады:
- Жасалған кезде, әдетте, 2 КБ жады алады.
- Жады тұтыну функция шақыруларымен динамикалық түрде өседі және қайтарғанда азаяды.
- Максималды стек өлшемі шектелген, бірақ көп тапсырмалар үшін жеткілікті үлкен (әдетте бірнеше МБ).
package main
import (
"fmt"
"runtime"
"time"
)
func sayHello() {
fmt.Println("Горутиннен сәлем!")
}
func main() {
// Горутин құруды көрсету
go sayHello()
// Горутиннің жұмысын бақылау үшін
time.Sleep(100 * time.Millisecond)
fmt.Printf("Горутиндердің саны: %d\n", runtime.NumGoroutine())
}
Бұл мысалда, sayHello бөлек горутин ретінде орындалады. runtime.NumGoroutine() белсенді горутиндердің санын көрсетеді (негізгімен бірге).