在一本书上看到一句话:
用多进程实现分布式和负载均衡,减轻单进程垃圾回收压力;用多线程(LWP)抢夺更多的处理器资源;用 coroutine 来提高处理器时间碎片利用率。
这句话是我在《Go 语言笔记》上看到的,《操作系统》我读的不深,所以分享下我的理解,希望纠正和补充。
对于存在 GC 的语言来讲,这个进程不仅要处理业务逻辑,还要在背后做空闲资源的回收和释放。单 CPU 的计算能力有限,所以通过将任务分发到不同的进程(可能是 CPU 物理上都是分开的)上,可以减轻进程压力。
如果一个进程中有多个用户态线程,假使某个线程陷入 I/O 阻塞,该进程也会快速的切到其他线程,继续执行计算任务,而不是因为某个线程阻塞而该进程被操作系统换出运行态。
coroutine 由 runtime 来调度给不同的线程来执行,在一个线程上切换 coroutine 比 在进程层面上切换线程的开销要小很多,所以能提高处理的利用率。
多处理器和多核心情况下,多进程可以快速迁移,充分利用处理器计算资源,避免单一进程处理GC出现的抖动(GC也是CPU密集型);
coroutine应该是用户态协程,避免CPU陷入内核进行上下文切换,将更多CPU时间片用在任务处理上。