Ada 202x (31日目) - スケジューリング戦略 ======================================== .. post:: Dec 31, 2019 :tags: ada, ada_2022 わずか一ヶ月とはいえ最初の方を読み返すと自分で文体が笑えますね。 リハビリの成果はあったのでしょうか。 taskのスケジューリング戦略 -------------------------- 今日はスケジューリング戦略に加わった変更をざっと見ていきます。 主にAdaランタイムがコンテキストスイッチも行うようなOSなし環境向けの機能です。 OSありですとOSに任せてしまったほうがいいような部分ですね。 一気に流し見していきます。 まずは ``task`` の優先順位から。 pragma Task_Dispatching_Policy ++++++++++++++++++++++++++++++ ``task`` のスケジューリング戦略はpragma ``Task_Dispatching_Policy`` で指定します。 標準で ``FIFO_Within_Priorities`` 、``Non_Preemptive_FIFO_Within_Priorities``、``Round_Robin_Within_Priorities`` 等のポリシーが定義されています。 (実装はポリシーを追加しても構いません。) その戦略の中のEarliest Deadline FirstにAda 202xで大きく手が入りました。 Earliest Deadline First(EDF)はデッドラインの近い ``task`` を優先的に実行するスケジューリング戦略です。 それが絶対時刻メインから相対時刻メインへと変更されました。 それに伴いpragma ``Task_Dispatching_Policy`` でEDFを指定する際のポリシーの名前も ``EDF_Across_Priorities`` から ``EDF_Within_Priorities`` へ変更されました。 pragma Generate_Deadlines +++++++++++++++++++++++++ 新しいpragmaです。 現在時刻と ``task`` の ``Relative_Deadline`` を元に絶対時刻のデッドラインを求めてそれを使うようにします。 このpragmaがない場合はデッドラインは相対時刻で管理されます。 ``Ada.Dispatching.EDF.Set_Deadline`` / ``Set_Relative_Deadline`` で ``task`` ごとにデッドラインを絶対時刻か相対時刻かも含めて設定できます。 Relative_Deadline +++++++++++++++++ ``Relative_Deadline`` はアスペクトの構文を使うようになりました。 ``task`` と ``protected`` に指定できます。 従来のpragma ``Relative_Deadline`` はobsolescentになっています。 また ``protected`` の ``Relative_Deadline`` は属性の構文で値を取得できるようになりました。 ``protected`` の場合は ``Task_Id`` に相当するライブラリに渡すための識別子がないためだと思われます。 Ada.Dispatching.EDF +++++++++++++++++++ 相対時刻がメインになったのに伴いパッケージ ``Ada.Dispatching.EDF`` にも大きな変更が加えられています。 | http://www.ada-auth.org/standards/2xrm/html/RM-D-2-6.html#p9 キューの戦略 ------------ ランデブーの際に複数の ``task`` が同じエントリを呼び出した場合、要求はキューに積まれて順番に解決されていきます。 pragma Queuing_Policy +++++++++++++++++++++ キューに積まれた要求の優先順位をつけるpragma ``Queuing_Policy`` にもポリシーが追加されています。 標準では ``FIFO_Queuing`` と ``Priority_Queuing`` が定義されていましたが、そこに ``Ordered_FIFO_Queuing`` が追加されました。 (実装はポリシーを追加しても構いません。) ``Ordered_FIFO_Queuing`` は ``FIFO_Queuing`` と大体同じですが動作がより細かく定められています。 ``FIFO_Queuing`` はAda 83からありますので今更変えられないということで分けられたようです。 Max_Entry_Queue_Length ++++++++++++++++++++++ キューのサイズを指定する ``Max_Entry_Queue_Length`` アスペクトが追加されました。 ``task`` または ``entry`` に指定できます。 ロックの戦略 ------------ ``protected`` に対するロックを獲得するやり方のことです。 pragma Admission_Policy +++++++++++++++++++++++ ロックの戦略を選択するpragma ``Admission_Policy`` が追加されました。 標準では ``FIFO_Spinning`` というポリシーが定義されています。 (実装はポリシーを追加しても構いません。) ``FIFO_Spinning`` はスピンロックを使ったアルゴリズムです。 ビジーループでロックが獲得できるまで待ちます。 AIではMultiprocessor Stack Resource Policy(MSRP)といったアルゴリズムにも触れられています。 調べてみると面白いかもしれません。 (調べてない。) 関連AI ------ - `AI12-0163-1`_ **Deterministic queue servicing for FIFO_Queueing** - `AI12-0164-1`_ **Max_Entry_Queue_Length aspect for entries** - `AI12-0206-1`_ **Nonoverridable should allow arbitrary kinds of aspects** - `AI12-0230-1`_ **Deadline Floor Protocol** - `AI12-0276-1`_ **Admission policy defined for acquiring a protected object resource** 所感 ---- この辺は毎回のように細かく更新されている部分ではあるのですが、普段OSの上で使っている分には全く触れることはありませんので私には有り難みが実感できないのですよね。 詳しい方がおられましたら是非解説してください。 .. _`AI12-0163-1`: http://www.ada-auth.org/cgi-bin/cvsweb.cgi/ai12s/ai12-0163-1.txt .. _`AI12-0164-1`: http://www.ada-auth.org/cgi-bin/cvsweb.cgi/ai12s/ai12-0164-1.txt .. _`AI12-0206-1`: http://www.ada-auth.org/cgi-bin/cvsweb.cgi/ai12s/ai12-0206-1.txt .. _`AI12-0230-1`: http://www.ada-auth.org/cgi-bin/cvsweb.cgi/ai12s/ai12-0230-1.txt .. _`AI12-0276-1`: http://www.ada-auth.org/cgi-bin/cvsweb.cgi/ai12s/ai12-0276-1.txt