gpt4 book ai didi

multithreading - 究竟是什么让 Erlang 进程、绿色线程、协程 "lighter"比内核线程?上下文切换很重怎么办?

转载 作者:行者123 更新时间:2023-12-04 04:29:05 27 4
gpt4 key购买 nike

这个问题在这里已经有了答案:




11年前关闭。




Possible Duplicate:
Technically why is processes in Erlang more efficient than OS threads?



每当提到 Erlang 进程或绿色线程或协程时,与内核线程相比,它们总是被描述为“轻量级”。通常给出的原因是内核线程涉及缓慢的上下文切换。

但是,缓慢的上下文切换到底是怎么回事?与在用户空间中切换绿色线程相比,它慢了多少?

上下文切换是导致事件驱动程序(如 Nignx)和多处理程序(如 Apache)之间性能和内存消耗差异的主要(唯一?)因素吗?

最佳答案

抢占式、单片式、多任务操作系统上的上下文切换涉及两种路径之一,一种是通过某些系统服务调用( sleep 、互斥获取、等待事件、阻塞 I/O)隐式让步给调度程序,另一种是通过中断和调度程序决定交换正在运行的任务。

当调度程序交换任务时,会发生一些重量级的事情:

  • 所有操作都作为操作系统内核的一部分发生,以高级别的特权运行。检查(或应该检查)每个操作,以确保调度程序做出的决定不会授予任务任何额外的权限(想想本地 root 漏洞利用)
  • 交换用户模式进程地址空间。这导致内存管理器在页表布局中闲逛,并将新的目录库加载到控制寄存器中。
  • 这也意味着保存在 CPU 缓存中的数据可能会被删除和清除。如果您的任务刚刚访问了一堆常用的东西,然后上下文切换并“丢失”它(在下次访问时,它[可能]必须再次从主内存中获取)
  • 根据您进入内核的方式,您需要从内核中捕获 OUT。例如,如果您进行系统调用,CPU 将通过一组非常精确的步骤转换到内核中运行的代码,然后在退出时展开这些步骤。这些步骤比对程序中的另一个模块进行函数调用更复杂,因此它们需要更多时间。

  • 据我了解,绿色线程任务非常简单。用户模式调度程序指示协程运行,直到协程屈服。上面的一些区别:
  • 协程的调度都不会发生在内核态,实际上调度绿色线程一般不需要涉及任何操作系统服务,也不需要任何阻塞的操作系统服务。因此,所有这些都可以在没有任何上下文切换或任何用户/内核转换的情况下发生。
  • 绿色线程不会被抢占式调度,甚至根本不会被绿色线程管理器抢占,它们是协同调度的。这有好有坏,但如果例程写得很好,通常是好的。每个任务都精确地完成它需要做的事情,然后返回到调度程序,但没有任何上下文交换开销。
  • 绿色线程共享它们的地址空间(据我所知)。在上下文切换时不会发生地址空间的交换。堆栈(据我所知)已交换,但这些堆栈由调度程序管理,并且交换堆栈也是对寄存器的简单写入。交换堆栈也是一种非特权操作。

  • 简而言之,用户模式下的上下文切换涉及一些库调用和写入堆栈指针寄存器。内核模式下的上下文切换涉及中断、用户/内核转换和系统级行为,如地址空间状态更改和缓存刷新。

    关于multithreading - 究竟是什么让 Erlang 进程、绿色线程、协程 "lighter"比内核线程?上下文切换很重怎么办?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5878231/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com