有人会如何为Lua VM创建抢占式调度程序?

时间:2012-09-12 18:29:19

标签: lua virtual-machine

我一直在看lua和lvm.c.我非常想实现一个接口,允许我控制VM解释器状态。

来自lua内的合作多任务对我来说不起作用(用户贡献的代码)

调试挂钩只让我获得了大约50%的指令执行限制,但是它引发了一个异常,只是崩溃了正在运行的lua代码 - 但我需要能够进一步调整它。

我想创建一个系统,其中运行数十万个lua用户脚本 - 单个线程不起作用,执行限制会让初级开发人员头疼,我也将控制执行速度。但最终还是

while true do

end

会永远执行,我真的不在乎它。

我能看到的任何想法,帮助或其他实现?

编辑:这不是关于沙盒假装我是这个领域的专家,用于此对话

编辑:我不想使用内部运行的基于lua代码协程的控制器。

编辑:我想运行一个线程,并管理大量用户贡献的lua脚本,外部进程级控制mechansim根本不会扩展。

4 个答案:

答案 0 :(得分:2)

您可以搜索Lua Sandbox实现;例如,这个wiki pageSO question提供了一些指示。请注意,沙盒中的大部分工作都集中在不允许执行错误代码,但不一定是防止无限循环。为了更好地控制,您可能需要将Lua沙盒与LXCcpulimit等内容结合起来。(根据评论不相关)

如果您正在寻找基于Lua,轻量级但不一定100%万无一失的东西,那么您可以尝试在单独的协程中运行您的客户端代码,并在该协程上设置一个调试挂钩,每隔N次触发一次线。在该挂钩中,您可以检查您运行的进程是否超出其报价。你还需要处理新的协同程序,因为那些需要设置自己的钩子(你需要禁用coroutine.create / wrap或者用设置你需要的调试钩子的东西替换它们。)

本案例中的代码可能如下所示:

local coro = coroutine.create(client_func)
debug.sethook(coro, debug_hook, "l", 1000) -- trigger hook on every 1000th line

这不是万无一失的,因为它可能会阻止某些IO操作,而调试钩子也无法帮助。

[根据更新的问题和评论进行编辑]

在“没有基于lua代码协程的控制器”和“没有外部过程控制机制”之间,我认为你没有多少选择。可能你唯一的选择就是每个用户脚本运行一个虚拟机,并以某种方式给这些虚拟机打勾(最近有一个关于SO的问题,但我找不到它)。在开始这条路线之前, I 仍会尝试使用协同程序(可以轻松扩展到数万个; Tir声称supporting 1M active users使用基于协程的架构)。

该机制大致如下所示:您安装上面显示的调试钩子,然后从该钩子返回到您的控制器,然后控制器决定要恢复的其他协程(用户脚本)。我有这个机制在Lua debugger我正在开发中工作(虽然它只用于一个客户端脚本)。这并不能保护您免受可以阻止的IO调用,因此您可能仍需要在VM级别拥有监视程序,以查看它是否被阻止的时间超过了所需的时间。

如果您需要序列化和反序列化保存upvalues等运行代码片段,那么Pluto可能是您唯一的选择。

答案 1 :(得分:0)

了解实施lua_locklua_unlockhttp://www.lua.org/source/5.1/llimits.h.html#lua_lock

答案 2 :(得分:0)

看看露露。这是lua VM写在lua上。它适用于Lua 5.1 对于较新版本,您需要做一些工作。但是,那么你真的可以成为一个策划者。

答案 3 :(得分:0)

看看这个, https://github.com/amilamad/preemptive-task-scheduler-for-lua 我维护这个项目。它是运行lua代码的非阻塞抢占式调度程序。适合长时间运行的游戏脚本。