在 Go v1.1 之前,实际上 GMP确实是没有 P 的,所有的 M 线程都要从 全局队列中获取 G 来执行任务,为了避免冲突,从全局队列中获取 G 的时候,要先获取一把大锁。
当一个程序的并发量比较小的时候,影响还不大,而当程序的并发量非常大的时候,这个全局队列会成为性能的瓶颈。
除此之外 ,若直接把 G 从全局队列分配给 M,那么当 G 中当生系统调用或者其他阻塞性的操作时,M 会有一段时间处于挂起的状态,此时又没有新创建线程的线程来代替该线程继续从队列中取出其他 G 来运行,从效率上其实会打折扣。
加了 P 之后会带来什么改变呢?