先用一张图描述一个golang并发程序在运行时的Groutine Processor,Groutine和CPU的结构形态,和他们之间的关系。
简单说,这张图详细展示了某一时刻,程序对CPU资源的使用情况。
第一个观点: groutine在创建时,并不能指定要放入到哪个Groutine Processor。理由之一,Groutine Processor的调度策略包括任务窃取,即当自身的groutine队列没有可运行的groutine时,或从其他的Groutine Processor的groutine队列(应该是从队尾)中窃取一些可运行的groutine添加到自身的groutine队列中并运行。(这里的“可运行”包括groutine存在且不被阻塞)
第二个观点:P和M之间的调度,会涉及线程的上下文切换,即涉及系统调用(从用户空间的运行切换到内核空间的运行)。
以上知识会引出本篇文章的主题,如何将一个流水线的各项工作合理的分配到有限的groutine上,并合理充分利用的CPU资源。
剩余部分,不久更新。