协程是轻量级的线程,创建成本很低,与线程不同的是其不受操作系统调度,协程的调度由用户程序提供,go语言中的协程调度器将协程调度到线程中运行,用户使用go关键字即可创建协程。
? 频繁的创建线程会造成不必要的开销,因此引入了线程池的技术,线程池中预先包存一定数量的线程,新任务将不在创建线程,而是将任务放在线程池的任务队列中,线程池中的线程不断地从任务队列中取出任务并执行,这样可以有效减少频繁创建任务造成的开销。系统调用会使线程池的状态恶化,如果大部分线程进入阻塞状态,会使得任务队列中的任务产生堆积,因此就需要创建更多的线程,而过多的线程会使得上下文切换的开销变大,工作在用户态的协程能大大减小上下文的切换开销!
? 协程调度器可以把多个协程调度到线程中运行,同时即使把阻塞的协程调度出来,有效避免了线程的频繁切换,达到了使用少量线程实现高并发的效果。
M必须持有P才能执行代码,M和其它的线程一样也会被操作系统阻塞
原文:https://www.cnblogs.com/koeln/p/15186116.html