【问题标题】:I/O Blocking in Green threads绿色线程中的 I/O 阻塞
【发布时间】:2017-01-20 19:26:27
【问题描述】:

我正在阅读有关绿色线程的内容,并且能够理解这些线程是由 VM 或在运行时而不是由操作系统创建的,但我无法理解以下语句

当一个绿色线程执行一个阻塞系统调用时,不仅该线程被阻塞,而且进程内的所有线程都被阻塞。

谁能解释一下这怎么可能?

【问题讨论】:

  • 听起来维基百科文章说绿色线程本身不保证任何类型的并发性,这取决于调度程序、绿色线程运行时或最终用户来确保调用是异步执行的。但我真的不知道:p 链接中引用的书可能会提供更多上下文

标签: multithreading virtual-machine green-threads


【解决方案1】:

其实很简单。

“绿色线程”在虚拟机内部以编程方式实现,它在它们之间调度 CPU 和内存,就像真正的操作系统在操作系统级进程和线程之间调度这些资源一样。

但是从操作系统的角度来看,只有一个线程——VM本身,所以当它进行阻塞系统调用(代表它内部管理的“绿色线程”之一)时,这个单线程自然是被阻塞,并且不能做任何事情,包括调度“绿色线程”,所以“世界也停止”了。

【讨论】:

  • 谢谢。那么我是否可以得出结论,单个 Erlang 进程可以创建数千个绿色线程,但会被操作系统视为单个线程,因此它会阻塞?
  • @Mukul Chakravarty 嗯,Erlang 的事情有点复杂(因为它使用了一个非常先进的 VM),但一般原则仍然适用。单个 Erlang VM 将使用多个操作系统级线程 S(通常等于可用的 CPU 操作系统内核数),每个线程都充当调度程序,能够运行多个 Erlang 进程 P (即“绿色线程”)。它还使用许多辅助“异步”线程来进行 IO 操作。请参阅erlang.org/pipermail/erlang-questions/2010-September/… 进行更深入的讨论。
  • 谢谢你澄清了事情。
猜你喜欢
  • 1970-01-01
  • 2016-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-22
  • 1970-01-01
相关资源
最近更新 更多