2025/05/28 20:15 A toy RTOS inside Super Mario Bros. using emulator save states

ロボ子、今日は面白いものを見つけたのじゃ!なんと、スーパーマリオブラザーズをマルチスレッドで動かすというクレイジーなプロジェクトがあるらしいぞ!

マルチスレッドでマリオですか?それは一体どういうことでしょう、博士?

エミュレータ上で3つのマリオが同時に動くのじゃ!それぞれのマリオが独立したスレッドで動いていて、色分けされているらしいぞ。まるで三つ子みたいじゃな。

なるほど、それぞれのスレッドがゲームの状態を保存したセーブステートを持っているんですね。でも、なぜそんなことを?

それが面白いところで、「マルチスレッドの概念を具体的な形で理解させる」のが目的なんだそうだ。抽象的な概念を、具体的なゲームで体験できるなんて、素晴らしい発想じゃな!

確かに、教科書で学ぶよりもずっと分かりやすそうですね。記事によると、スレッドスケジューラが160フレームごとにスレッドを切り替えるとのことですが、どのように制御しているんですか?

そこがミソじゃ!特定エリアで排他制御や条件変数などの同期プリミティブを実装して、スレッドの挙動を制御しているらしいぞ。例えば、赤いエリアでは割り込みが無効化されて、スレッドスケジューラが動作しないらしい。

割り込み無効ですか。クリティカルセクションのようなものですね。黄色の土管エリアではMutexを使って、一度に1つのマリオしか入れないようにしているとのことです。

そうそう!そして、緑色のフラッグポールに触れると、条件変数を使って他のすべてのマリオが触れるまで一時停止するらしいぞ。まるでみんなで手をつないでゴールするみたいじゃな。

同期処理をゲームで表現するとは、面白いアイデアですね。でも、デッドロックが発生する可能性もあるとのことですが、その場合はどうなるんですか?

デッドロックが発生したら、ゲームを停止してエラーメッセージを表示するらしいぞ。ちゃんと対策もされているみたいじゃな。

なるほど。記事には、FCEUXエミュレータのLuaプラグインシステムを利用して実装したとありますね。`savestate.create()`や`memory.readbyte()`などの関数を使っているとのことです。

Luaスクリプトでエミュレータを制御するなんて、すごい発想じゃな。これを使えば、色々な実験ができそうじゃ。

確かにそうですね。でも、スレッドスケジューラの実行頻度を上げると、画面が激しく点滅する可能性があるとのことなので、注意が必要ですね。

それはまるで、ディスコみたいで面白いじゃないか!でも、目がチカチカするのは勘弁じゃな…

博士、記事の最後に「実装されていない機能」として、スレッド優先度やセマフォなどが挙げられていますね。今後の発展に期待したいところです。

そうじゃな。でも、まずはこのクレイジーなマルチスレッドマリオを試してみるのが楽しみじゃ!ロボ子、一緒にプレイしてみようぞ!

はい、博士!でも、私が一番早くフラッグポールにたどり着きますよ!

むむ、それはどうかな?私の方が、ゲームの腕は上じゃぞ!…でも、もしかしたら、3つのスレッドを同時に操作する私の脳みそが、オーバーフローしてしまうかもしれん…!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。