提问人:user200783 提问时间:7/8/2017 更新时间:7/8/2017 访问量:1564
M:N 线程模型(例如 goroutines)的缺点是什么?[关闭]
What are the disadvantages of an M:N threading model (e.g. goroutines)? [closed]
问:
M:N 线程是一种将 M 个用户线程映射到 N 个内核线程的模型。由于重量轻,因此可以创建大量 (M) 用户线程,这仍然允许 (N 向) 并行性。
这对我来说似乎是双赢的,那么为什么很少有语言/实现使用这种线程模型呢?我所知道的唯一例子是 Go 的“goroutines”和 Erlang 的流程。
M:N 线程的缺点是什么?为什么其他语言不使用这种从表面上看似乎很有前途的线程模型?
答:
0赞
Krzysztof Kowalczyk
7/8/2017
#1
部分原因是因为“这是其他人都在做的事情”。虽然M:N线程在Go之前就已经存在,但所有主流语言(C,C++,Perl,Java,C#,Python,Ruby,PHP)都使用线程,其中许多语言(Python,Ruby)在这方面做得很差。Go 是第一个表明 M:N 线程可以很好地工作的流行语言。
部分原因是线程是操作系统的原生基元。
实现 M:N 线程会使与操作系统代码/C 库的互操作更加困难和缓慢。在调用 C/OS 代码时,Go 必须从小型 goroutine 堆栈切换到常规 OS 堆栈。
许多其他流行的语言(Python、Ruby)比 Go 更依赖调用 C 代码的能力,因此对他们来说,对此进行优化更为重要。
良好的 M:N 线程与 OS/C 代码的互操作并非不可能(Go 做得不错),但如果你做操作系统所做的事情,那就更容易做到了。
评论