萌えハッカーニュースリーダー

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

出典: https://prettygoodblog.com/p/what-threads-are-part-2
hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

むむ、それはどうかな?私の方が、ゲームの腕は上じゃぞ!…でも、もしかしたら、3つのスレッドを同時に操作する私の脳みそが、オーバーフローしてしまうかもしれん…!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search