use*_*783 8 language-agnostic erlang multithreading programming-languages go
M:N线程是将M个用户线程映射到N个内核线程的模型.这使得能够创建大量(M)用户线程,因为它们重量轻,仍然允许(N路)并行.
这对我来说似乎是一个双赢,那么为什么这么少的语言/实现使用这个线程模型呢?我所知道的唯一例子是Go的"goroutines"和Erlang的流程.
M:N线程有哪些缺点?为什么其他语言不使用这种表面看起来很有前途的线程模型呢?
部分原因是“这就是其他人都在做的事情”。虽然 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 代码的能力,因此对它们来说优化这一点更为重要。
与 OS/C 代码良好的 M:N 线程互操作并非不可能(Go 做得很好),但如果你按照操作系统的做法,那就更容易做到。
| 归档时间: |
|
| 查看次数: |
595 次 |
| 最近记录: |