思うだけで学ばない日記 2.0

思うだけで学ばない日記から移転しました☆!よろしくお願いします。

マイクロスレッド基本おさらい

【マイクロスレッドとは】

ユーザープログラムの中で特定関数を明示的に呼び出すことによってコンテキストを切り替え、それ以外では切り替わらないという強度にノンプリエンプティブなディスパッチメカニズム(によって実現されるスレッド)。詳細な解説

【特徴】

  • exec(), suspend(), resume()という3関数だけで実現可能
  • コンテキスト切り替えがちょー軽い

【長所】

  • コンテキスト切り替えがちょー軽い
  • マイクロスレッド同士の排他制御もちょー軽い
    • exec(), suspend(), resume()呼び出しを含まずに完結する資源アクセスについては一切不要。
  • 移植がちょー簡単

【弱点】

  • リアルタイム応答性能が低い
    • exec()もsuspend()もresume()も呼ばれない期間はマイクロスレッド間のコンテキストスイッチングを全く起こせないので、、
  • スレッド終了時のオブジェクトの後始末(デストラクタ呼び出し)に一工夫要る
    • 自動オブジェクトの後始末さえ局面によっては一工夫要る*1

【構成要素】

  • コンテキスト切り替え関数
    1. exec(): 指定した関数bar()を呼び出す(bar()を先頭から実行開始)
    2. suspend(): 関数bar()の実行を中断して戻る
    3. resume(): 関数barの実行を再開する(呼び出し元はexec()を呼んだ関数でなくとも良い)
  • スタック領域stk[]
  • スタックポインタ退避変数ssp
  • stk[]とsspを集約した構造体ctx

stk[], ssp, ctxはスレッドコンテキスト毎に必要*2

【仮定】

ターゲットCPUのアーキテクチャ*3が下記条件を全部満たすとする。

  1. 汎用レジスタR1〜Rnのうち、m個(ただしm<n-2)が関数呼び出し前後で保存される
  2. 関数呼び出し時に、少なくとも第2引数までがレジスタに置かれる(スタックには積まれない)
  3. 関数からの戻りは、PRレジスタが指す番地へのジャンプとして実現される

別に引数やら関数からの戻り先やら全部スタックに積んでくれてもマイクロスレッドは実現可能だろうが、今日日そんな原始的なアーキテクチャ全く見かけないし(何
(つづく)

*1:これはマイクロスレッドに限らず、ディスパッチャしか持たないプリミティブなマルチスレッドシステム全てが抱える問題ではある、、
ハズ、、

*2:ていうかctxがスレッドコンテキストを代表する。

*3:アーキテクチャ=CPUのレジスタ仕様+インストラクションセット+コンパイラが遵守する関数呼び出し規約。
少なくともこの話の中では。