Планировщик главное
отличие go от современных
mainstream языков
В остальном это Pascal c GC
Slide 3
Slide 3 text
func main() {
var x int
threads := runtime.GOMAXPROCS(0)
for i := 0; i < threads; i++ {
go func() {
for { x++ }
}()
}
time.Sleep(time.Second)
fmt.Println("x =", x)
}
Slide 4
Slide 4 text
func test() {
a := 100
for i := 1; i < 1000; i++ {
a = i*100/i + a
}
}
func main() {
runtime.GOMAXPROCS(1)
go func() {
for {
test()
}
}()
time.Sleep(100 * time.Millisecond)
fmt.Println("hello world")
}
Slide 5
Slide 5 text
runtime: tight loops should be
preemptible #10958
aclements opened this issue on May 26, 2015 · 50
comments
Slide 6
Slide 6 text
Конкурентность и языки
Язык Отображение на
системные потоки
Lua none
C, C++, Python 1:1
Java <= 1.1, j2me, Python n:1
Go, Erlang n:m
Slide 7
Slide 7 text
Goroutines VS threads
Свойство Goroutines Threads
Время создания Быстро Медленно
Время удаления Быстро Медленно
Переключение
контекста
Быстро Медленно
Потребление памяти
под стек
2kB 512kB-1MB
Допустимое
количество
10^4 10^6
Slide 8
Slide 8 text
Вытесняющая и
кооперативная
многозадачность
Slide 9
Slide 9 text
Планировщики
— Work Sharing при появлении новой задачи
попытаться мигрировать ее на свободный
процессор
— Work Stealing когда процессор освобождается, он
пытается найти себе задачу
Slide 10
Slide 10 text
Scheduling Multithreaded
Computations by Work Stealing
Slide 11
Slide 11 text
G M P
— G - Goroutine
— M - OS thread
— P - "Processor"
Slide 12
Slide 12 text
No content
Slide 13
Slide 13 text
No content
Slide 14
Slide 14 text
No content
Slide 15
Slide 15 text
No content
Slide 16
Slide 16 text
GOMAXPROCS
Просто количество P
Slide 17
Slide 17 text
Spining threads
— M с P ищет G
— M без P ищет P
— Есть готовая к исполнению G, свободная P, но нет M
Slide 18
Slide 18 text
No content
Slide 19
Slide 19 text
Когда происходит переключение goroutines
— morestack() --> newstack()
— runtime.Gosched()
— locks
— network I/O
— syscalls
Slide 20
Slide 20 text
GOEXPERIMENT
=
preemptibleloops
Slide 21
Slide 21 text
Влияние на GC
GC не может работать пока есть невытесняемая
goroutine