
获得徽章 0
赞了这篇文章
func main() {
runtime.GOMAXPROCS(1)
var w sync.WaitGroup
w.Add(257)
for i := 0; i < 257; i++ {
go func(j int) {
fmt.Println(j)
w.Done()
}(i)
}
w.Wait()
}
有没有大佬能解释一下这个输出是"256,0->255"。
个人的理解是:"因为只有一个P,所以只会有一个M来执行这257个G,p的本地G队列容量为256,所以最后一个G来的时候,会带走该P的一半G到全局G队列,不管他带的是哪一半,最后的结果是本地队列中是连续的一半G,全局队列中是输出257的这个G加连续一半的G,第一个输出256是毋庸置疑的,因为当全局队列中有G且Go调度计数器%61=0的时候,会从全局队列中取出一个G执行,那么在1-60这个调度期间,应该会使用本地的G,到第61次的时候再从全局队列中取一个G,直到本地全部G执行完,在执行全局队列中的G,这样来看,结果应该是256+60个连续的输出序号+某一个序号+60个连续的输出序号.....",和结果截然不同,有大佬知道吗?
runtime.GOMAXPROCS(1)
var w sync.WaitGroup
w.Add(257)
for i := 0; i < 257; i++ {
go func(j int) {
fmt.Println(j)
w.Done()
}(i)
}
w.Wait()
}
有没有大佬能解释一下这个输出是"256,0->255"。
个人的理解是:"因为只有一个P,所以只会有一个M来执行这257个G,p的本地G队列容量为256,所以最后一个G来的时候,会带走该P的一半G到全局G队列,不管他带的是哪一半,最后的结果是本地队列中是连续的一半G,全局队列中是输出257的这个G加连续一半的G,第一个输出256是毋庸置疑的,因为当全局队列中有G且Go调度计数器%61=0的时候,会从全局队列中取出一个G执行,那么在1-60这个调度期间,应该会使用本地的G,到第61次的时候再从全局队列中取一个G,直到本地全部G执行完,在执行全局队列中的G,这样来看,结果应该是256+60个连续的输出序号+某一个序号+60个连续的输出序号.....",和结果截然不同,有大佬知道吗?
展开
2
2
赞了这篇文章
赞了这篇文章
赞了这篇沸点
赞了这篇沸点