SSブログ
English Version

リアルタイムモニタ(ZealMon)の製作(その2)セマフォの実装 [Z80]

 前回の記事でライトウェイトである程度高速なリアルタイムモニタ/リアルタイムOS(以降、モニタと記す)の製作について書きましたが、今回はこれにセマフォ管理機能を追加したので記録して置きたいと思います。

 前回の記事でも書いたように今回制作したモニタの特徴の一つとしてタスクの状態の情報をTCB(タスクコントロールブロック)には持たずにキューで管理することでTCBの更新箇所を最小限にするというのがあります。今回追加するセマフォ機能もこのコンセプトを継承します。

 セマフォは Wikipedia にも書いてあるようにカウンティングセマフォバイナリセマフォがあります。今回は汎用性の高いカウンティングセマフォを実装することにします。
 セマフォ管理データは一つのセマフォに付き2バイトで初期値を管理対象のリソース数とします。

セマフォ管理データの構造


 セマフォの操作は次のようにしました。
  • セマフォの獲得(P操作)
     セマフォ管理データの上位バイトがゼロ※1で下位バイトが1以上の場合は使用可能なリソースが残っていることを示し、リソース確保のためにこの値をディクリメントします。
     上記以外の場合はセマフォ管理データを待ちキューとして使い、セマフォを要求したタスクのTCBをリンクに追加し、ウェイト状態として扱います。
     ※1 TCBの上位アドレスは零ではない前提を利用した管理方法です
  • セマフォの解放(V操作)
     セマフォ管理データのキューにTCBがある場合(上位バイトがゼロではない場合)は末尾のTCBをキューから外してレディーキューに追加します。セマフォのキューが空になった時はポインタが NULL(=ゼロ)になるのでカウントデータとしてシームレスに使用できます。
     セマフォのキューにTCBが無い場合はセマフォー管理データをカウンタとして使用し、インクリメントします。

 実装はメチャ簡単そうですね。それでは実際にセマフォ機能を使ったデモを作ってみましょう(デモ作りの方が遥かに大変でした)。
 今回のデモは前回と同様にネット上で公開されているブラウザで動作するMSX環境のMSXPenを使ってGAME言語インタープリタを同時に二つ動かしてみます。
 以前CP/Mに移植したGAME言語のインタープリタ&コンパイラをGAMECとして公開しましたが、今回はコンカレントなGAME言語インタープリタなのでCGAMEですw

 画面表示制御は高速化のためVDPを直に制御しています。TEXT2(80字モード)の画面での実行を前提にしているので実行前に mode 80 のコマンドで80文字モードにしています。
 「コントロールA」の操作でキー所有のタスクが変わります。キーの所有管理は上記のセマフォで行っています。

コンカレントGAMEインタープリタ動作中の様子


 今回作成したデモソフトを下記のリンクからダウンロードできます。


 Twitter(X)に投稿した動画付きメッセージを貼っておきます。



★追記 2023/10/15
 上記の動画の動作について若干補足します。
  • 連続表示中にキー資源の所有を失うと少し速くなる理由
     連続表示中にも常にキーセンスをしていてキー資源を所有している場合は BIOS のキーセンス処理をコールしますが、キー資源を所有していない場合は実際のキーセンス処置を呼ばずにキー入力無しと判断するようにしているためです(つまりキーセンス処理が軽くなるので速くなる)。

  • 連続表示中にもう一方のタスクがキー入力状態になると表示が速くなる理由
     キー入力処理ではキーセンス後、キー入力が無い場合、タイマー待ち状態になり、タイムアウト後に再度キーセンスをコールする処理を繰り返しています。このためタスクは多くの時間タイマー待ち状態で止まっていて CPU 資源を殆ど消費しないためです。



[TOP] [ 前へ ] 連載記事一覧 [ 次へ ]

nice!(0)  コメント(0)