具有虚假堆栈溢出的零开销检查

主要观点:

  • 有支持在动态语言的虚拟机中通过 API 启动多个线程的情况,这带来了保持运行时内部关键状态同步的挑战,如内存分配器、垃圾收集器、编译器等。
  • 运行时实现者倾向于分片这些组件,每个线程有自己私用的部分,如单独的小堆,耗尽后请求全局停止事件,需解决如何指示所有线程停止的问题。
  • VM 实现者通过将同步检查融入现有检查来解决,如 Skybison 融入栈溢出检查,V8 在 Maglev 的函数入口也类似,且并非所有应用都涉及常规函数调用,有时可在循环回边检查中断或进行其他线程同步检查,如 CPython、PyPy、Ruby 的 YARV 等,作者写此文是因为 PyPy 发布了使用类似技术的新功能,还提到了 guard pages 及相关参考文献。

关键信息:

  • 虚拟机中多个线程启动及同步挑战。
  • 运行时实现者的分片处理方式。
  • 不同语言实现中同步检查的方式及示例代码。
  • PyPy 新功能及相关内容。

重要细节:

  • Skybison 把同步检查融入栈溢出检查,在帧推送时利用慢路径处理。
  • V8 在 Maglev 的函数入口类似处理。
  • CPython、PyPy、Ruby 的 YARV 在特定情况下在循环回边进行中断检查等。
  • PyPy 新功能是将检查置于托儿所耗尽检查之后用于采样分析。
阅读 13
0 条评论