Skip to content

Instantly share code, notes, and snippets.

@Wang-Kai
Created April 7, 2019 08:28
Show Gist options
  • Save Wang-Kai/4dae63dbecd6905cd1a9b080cc5024ca to your computer and use it in GitHub Desktop.
Save Wang-Kai/4dae63dbecd6905cd1a9b080cc5024ca to your computer and use it in GitHub Desktop.
实现并发运行的几种方式的理解

在一本书上看到一句话:

用多进程实现分布式和负载均衡,减轻单进程垃圾回收压力;用多线程(LWP)抢夺更多的处理器资源;用 coroutine 来提高处理器时间碎片利用率。

这句话是我在《Go 语言笔记》上看到的,《操作系统》我读的不深,所以分享下我的理解,希望纠正和补充。

对于存在 GC 的语言来讲,这个进程不仅要处理业务逻辑,还要在背后做空闲资源的回收和释放。单 CPU 的计算能力有限,所以通过将任务分发到不同的进程(可能是 CPU 物理上都是分开的)上,可以减轻进程压力。

如果一个进程中有多个用户态线程,假使某个线程陷入 I/O 阻塞,该进程也会快速的切到其他线程,继续执行计算任务,而不是因为某个线程阻塞而该进程被操作系统换出运行态。

coroutine 由 runtime 来调度给不同的线程来执行,在一个线程上切换 coroutine 比 在进程层面上切换线程的开销要小很多,所以能提高处理的利用率。

@Maxul
Copy link

Maxul commented Apr 7, 2019

多处理器和多核心情况下,多进程可以快速迁移,充分利用处理器计算资源,避免单一进程处理GC出现的抖动(GC也是CPU密集型);
coroutine应该是用户态协程,避免CPU陷入内核进行上下文切换,将更多CPU时间片用在任务处理上。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment