【问题标题】:What is the difference between suspend-up and suspend-down coroutines?上挂和下挂协程有什么区别?
【发布时间】:2019-04-16 22:10:49
【问题描述】:

C++ 社区目前正在讨论挂起与挂起协程。

例如本提案中提到了暂停:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4453.pdf

这两个词是什么意思?

【问题讨论】:

    标签: c++ coroutine


    【解决方案1】:

    p0099r1: "A low-level API for stackful context switching" 中似乎解释了该术语:

    关于挂起和挂起术语的说明 术语挂起 和suspend-down在论文N4232 2中被介绍并继续推进 在 P0158 9 中区分 stackless (suspend-up) 和 stackful ( 暂停)上下文切换。这些条款依赖于特定的 C++ 函数调用操作的可视化,其中调用 函数“向下”传递控制,而从函数返回 “向上”传递控制权。作者推荐的条款 suspend-by-return 而不是 suspend-up ,而suspend-by-call
    暂停。推荐的术语直接引用 底层 C++ 操作,无需特定的 可视化。
    suspend-by-returnsuspend-up,或“无堆栈”上下文 切换)基于将控制权从被调用函数返回到其 调用者,以及一些关于是否调用函数的指示 已完成并正在返回结果或只是暂停和 预计会再次被调用。被调用函数的主体编码为 这样 - 如果它暂停 - 再次调用它会指示 控制到它最后返回的点。这既描述了 P0057 6 个可恢复功能和早期技术,例如 Boost.Asio 协程。 12
    suspend-by-callsuspend-down,或 “堆栈式”上下文切换)基于调用一个函数,该函数, 对其调用者透明,切换到其他逻辑链 功能激活记录。 (这可能是也可能不是连续的 堆栈区。处理器的堆栈指针寄存器(如果有)可能或可能 不参与。)这描述了 N4397 3 协程以及 Boost.Context、13 Boost.Coroutine2 14 和 Boost.Fiber。 15 std::execution_context::operator()() 需要调用挂起 语义。

    两者都是旧论文,与 p0057 分开,这似乎是主要的协程论文。 p0444 讨论了试图统一这些论文,但似乎没有任何进展。另请参阅Trip Report: C++ Standards Meeting in Issaquah, November 2016,其中说:

    Coroutines TS 包含 co_await 提案,基于 Microsoft 的原始设计。

    如前所述,目前正在努力对一种不同的、可堆叠的协程风格的提案进行标准化,以及在共同语法下统一这两种风格的探索性工作。然而,这些提案目前并未针对 Coroutines TS。相反,它们可能针对不同的 TS(如果出现统一的语法,可能是该语法,而不是 Coroutines TS 中的语法,最终合并到 C++ 标准中)。

    【讨论】:

    【解决方案2】:

    每个函数都创建一个堆栈帧(为局部变量等保留堆栈空间)

    暂停:

    • 由无堆栈上下文切换(协程...)使用
    • 因为你只有一个栈(应用程序栈),所以你必须移除挂起函数的栈帧(无栈协程函数)
    • 否则,在协程挂起后执行的其他函数将写入自己的堆栈帧,从而破坏挂起的堆栈帧
    • suspend-up == 删除挂起函数的堆栈帧 == 将堆栈中的一些地址向上步进(适用于堆栈从高地址向低地址增长的架构)

    暂停:

    • 由堆栈上下文切换(协程、纤程...)使用
    • 每个协程/光纤都有自己的堆栈,因此应用程序由多个堆栈组成
    • 如果堆栈式协程被挂起,堆栈帧仍保留在堆栈上(因为 zhr 堆栈是特定于/由协程拥有的)
    • 堆栈指针只是更改为另一个堆栈(== 切换到另一个堆栈式协程/光纤)
    • 因为栈帧还在栈上,所以称为suspend-down

    【讨论】:

      猜你喜欢
      • 2021-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-13
      • 2017-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多