关于go的调度问题

jingyugao · · 979 次点击
关于goroutine的执行顺序官方文档肯定不会说谁先谁后,只会告诉你不要假设他们谁先谁后,因为并发就是这样规定的。不知道你假定goroutine的执行顺序有何意义?当然按照目前的runtime实现,指定一个P,创建少量的goroutine,是会先运行最后一个goroutinue,剩下的按照顺序依次运行。因为P的结构中有runnext字段用来保存最后新建的goroutine,M去找G来运行的时候也是优先找p的runnext。 但是这仅仅goroutine的没被抢占,M还未执行P本地队列中的G。如果你试试创建大量的G,就会发现goroutine的执行顺序并不符合你的说明。 详细的实现需要看runtime的具体代码,有兴趣可以一起阅读 https://github.com/sheepbao/golang_runtime_reading, 里面有我注释的golang 调度实现,可以回答你的问题。
#5
更多评论
根据假设,j=9的routine先运行,若不发生抢占式调度,接着依次是012345678,最后的打印结果是9012345678 如果发生调度,那么根据时间来看,0是最先打印的,接着是123456789,因为hash操作比较费时间。 但是实际结果很奇怪。当循环的常数比较大时,结果是091234567.好像是抢占式调度了 当常数较小时,是9012345678,应该是没有抢占 当常数在某个范围内时,打印的结果是乱序的
#1
go的说明原文能贴出来吗?想看看。
#2