Ada 202x (31日目) - スケジューリング戦略¶
わずか一ヶ月とはいえ最初の方を読み返すと自分で文体が笑えますね。 リハビリの成果はあったのでしょうか。
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
にも大きな変更が加えられています。
キューの戦略¶
ランデブーの際に複数の 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の上で使っている分には全く触れることはありませんので私には有り難みが実感できないのですよね。
詳しい方がおられましたら是非解説してください。