1

如前所述,虚拟线程最终会映射到实际线程。假设创建了 100 万个虚拟线程。在 8 核处理器中,我假设将有 8 个内核线程。所以,我的问题是

  1. 100 万个虚拟线程如何映射到 8 个内核线程?这背后的算法是什么?
  2. 为什么阻塞在虚拟线程中很便宜?据我了解,这是因为它不会阻塞运营商(内核)线程。但是内核线程使用上下文切换,为什么它仍然很便宜?
  3. 虚拟线程是否适合代码需要调用本机方法的用例(public native String getSystemTime();)
4

1 回答 1

0
  1. 虚拟线程和内核线程的映射由线程模型完成。有 3 种螺纹型号可供选择

    1. 多对一

在此处输入图像描述

  1. 一对一

在此处输入图像描述

  1. 多对多

在此处输入图像描述

本质上,线程库保持用户线程/虚拟线程到内核线程之间的映射。

  1. 用户线程的阻塞很容易,因为所有内核线程需要做的就是将用户线程的状态保存在内核线程或进程本身中,并拿起另一个用户线程。另一方面,如果内核线程需要进行上下文切换,则需要驱逐大量寄存器并将其存储在内存中。这个过程很昂贵。

此外,创建内核线程需要创建完整的线程控制块,以便内核可以管理这些线程。这个过程再次缓慢。

  1. 您始终在用户线程级别工作。因此,您进行的任何调用都需要在用户线程本身上。
于 2022-01-04T11:05:42.677 回答