1

lua と lvm.c を見てきました。VM インタープリターの状態を制御できるインターフェイスを実装したいと思っています。

lua 内からの協調的なマルチタスクは機能しません (ユーザー提供のコード)

デバッグフックは、命令実行制限の約 50% しか達成できませんが、例外が発生し、実行中の lua コードがクラッシュするだけです。しかし、さらに微調整できるようにする必要があります。

何万もの lua ユーザー スクリプトが実行されているシステムを作成したいと考えています。個々のスレッドは機能せず、実行制限が初心者の開発者にとって頭痛の種になるため、実行速度も制御します。しかし最終的に

while true do

end

永久に実行されますが、それがどうであれ気にしません。

私が見ることができるアイデア、ヘルプ、またはその他の実装はありますか?

編集: これはサンドボックスについてではありません。私はこの会話の分野の専門家です。

編集: 内部で実行される lua コード コルーチン ベースのコントローラーを使用したくありません。

編集: 1 つのスレッドを実行し、多数のユーザー提供の lua スクリプトを管理したいのですが、外部プロセス レベルの制御メカニズムはまったく拡張できません。

4

4 に答える 4

2

Lua Sandbox の実装を検索できます。たとえば、このwiki ページSO の質問は、いくつかの指針を提供します。サンドボックス化の取り組みのほとんどは、不正なコードの実行を許可しないことに重点を置いていますが、必ずしも無限ループを防止することに重点を置いているわけではないことに注意してください。より適切に制御するには、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 コード コルーチン ベースのコントローラーなし」と「外部プロセス制御メカニズムなし」の間で、多くの選択肢が残されているとは思いません。唯一のオプションは、ユーザー スクリプトごとに 1 つの VM を実行し、何らかの方法でそれらの VM にティックを与えることかもしれません (SO に関する最近の質問がありましたが、見つかりません)。このルートに進む前に、はまだコルーチンでこれをやろうとしていました (これは簡単に数万に拡張できるはずです。Tir は、コルーチンベースのアーキテクチャで100 万人のアクティブ ユーザーをサポートしていると主張しています)。

メカニズムは大まかに次のようになります。上に示したようにデバッグ フックをインストールし、そのフックからコントローラーに戻ります。コントローラーは再開する他のコルーチン (ユーザー スクリプト) を決定します。私が開発してきたLua デバッガーでは、まさにこのメカニズムが機能しています(ただし、1 つのクライアント スクリプトに対してのみ機能します)。これでは、ブロックされる可能性のある IO 呼び出しから保護されません。そのためには、VM レベルでウォッチドッグを使用して、必要以上に長くブロックされていないかどうかを確認する必要がある場合があります。

upvalue などを保持する実行中のコード フラグメントをシリアライズおよびデシリアライズする必要がある場合は、おそらくPlutoが唯一の選択肢です。

于 2012-09-12T19:24:11.507 に答える
0

と の実装lua_lockを見てくださいlua_unlockhttp://www.lua.org/source/5.1/llimits.h.html#lua_lock

于 2012-09-14T14:01:05.560 に答える