编程语言的并发模型

104 阅读1分钟

如果大家学过其它语言的多线程,可能就知道不同语言对于线程的实现可能大相径庭:

  • 由于操作系统提供了创建线程的 API,因此部分语言会直接调用该 API 来创建线程,因此最终程序内的线程数和该程序占用的操作系统线程数相等,一般称之为1:1 线程模型,例如 Rust。
  • 还有些语言在内部实现了自己的线程模型(绿色线程、协程)。程序内部的 M 个线程最后会以某种映射方式使用 N 个操作系统线程去运行,因此称之为M:N 线程模型,其中 M 和 N 并没有特定的彼此限制关系。一个典型的代表就是 Go 语言的协程(协商式调度)。而Java线程在jdk1.2之前,是基于称为绿色线程(抢占式调度)的用户线程实现,但从JDK1.3起,主流平台上的主流商用Java虚拟机的线程模型普遍都被替换为基于操作系统原生原生线程模型来实现,即采用1:1的线程模型。
  • 还有些语言使用了 Actor 模型,基于消息传递进行并发,例如 Erlang 语言。

总之,每一种模型都有其优缺点及选择上的权衡,而 Rust 在设计时考虑的权衡就是运行时(Runtime)