mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
runtime: improve scheduler fairness
Currently global runqueue is starved if a group of goroutines constantly respawn each other (local runqueue never becomes empty). Fixes #5639. R=golang-dev, iant CC=golang-dev https://golang.org/cl/10042044
This commit is contained in:
parent
5caf762457
commit
4bb491b12e
2 changed files with 74 additions and 7 deletions
|
|
@ -8,6 +8,7 @@ import (
|
|||
"math"
|
||||
"runtime"
|
||||
"sync/atomic"
|
||||
"syscall"
|
||||
"testing"
|
||||
"time"
|
||||
)
|
||||
|
|
@ -107,6 +108,55 @@ func TestBlockLocked(t *testing.T) {
|
|||
}
|
||||
}
|
||||
|
||||
func TestTimerFairness(t *testing.T) {
|
||||
done := make(chan bool)
|
||||
c := make(chan bool)
|
||||
for i := 0; i < 2; i++ {
|
||||
go func() {
|
||||
for {
|
||||
select {
|
||||
case c <- true:
|
||||
case <-done:
|
||||
return
|
||||
}
|
||||
}
|
||||
}()
|
||||
}
|
||||
|
||||
timer := time.After(20 * time.Millisecond)
|
||||
for {
|
||||
select {
|
||||
case <-c:
|
||||
case <-timer:
|
||||
close(done)
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestTimerFairness2(t *testing.T) {
|
||||
done := make(chan bool)
|
||||
c := make(chan bool)
|
||||
for i := 0; i < 2; i++ {
|
||||
go func() {
|
||||
timer := time.After(20 * time.Millisecond)
|
||||
var buf [1]byte
|
||||
for {
|
||||
syscall.Read(0, buf[0:0])
|
||||
select {
|
||||
case c <- true:
|
||||
case <-c:
|
||||
case <-timer:
|
||||
done <- true
|
||||
return
|
||||
}
|
||||
}
|
||||
}()
|
||||
}
|
||||
<-done
|
||||
<-done
|
||||
}
|
||||
|
||||
func stackGrowthRecursive(i int) {
|
||||
var pad [128]uint64
|
||||
if i != 0 && pad[0] == 0 {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue