Go_Goroutine详解( 二 )


P的个数是通过runtime.GOMAXPROCS设定(最大256) , Go1.5版本之后默认为物理线程数 。在并发量大的时候会增加一些P和M,但不会太多,切换太频繁的话得不偿失 。
单从线程调度讲,Go语言相比起其他语言的优势在于OS线程是由OS内核来调度的,goroutine则是由Go运行时(runtime)自己的调度器调度的 , 这个调度器使用一个称为m:n调度的技术(复用/调度m个goroutine到n个OS线程) 。其一大特点是goroutine的调度是在用户态下完成的, 不涉及内核态与用户态之间的频繁切换,包括内存的分配与释放,都是在用户态维护着一块大的内存池,不直接调用系统的malloc函数(除非内存池需要改变),成本比调度OS线程低很多 。另一方面充分利用了多核的硬件资源,近似的把若干goroutine均分在物理线程上,再加上本身goroutine的超轻量,以上种种保证了go调度方面的性能 。

推荐阅读