JP2904483B2 - 周期的プロセスのスケジューリング方法 - Google Patents

周期的プロセスのスケジューリング方法

Info

Publication number
JP2904483B2
JP2904483B2 JP2757797A JP2757797A JP2904483B2 JP 2904483 B2 JP2904483 B2 JP 2904483B2 JP 2757797 A JP2757797 A JP 2757797A JP 2757797 A JP2757797 A JP 2757797A JP 2904483 B2 JP2904483 B2 JP 2904483B2
Authority
JP
Japan
Prior art keywords
priority
group
time
cpu
periodic
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Expired - Lifetime
Application number
JP2757797A
Other languages
English (en)
Other versions
JPH09319597A (ja
Inventor
理 竹内
雅彦 中原
隆裕 中野
正明 岩嵜
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Hitachi Ltd
Original Assignee
Hitachi Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Hitachi Ltd filed Critical Hitachi Ltd
Priority to JP2757797A priority Critical patent/JP2904483B2/ja
Publication of JPH09319597A publication Critical patent/JPH09319597A/ja
Application granted granted Critical
Publication of JP2904483B2 publication Critical patent/JP2904483B2/ja
Anticipated expiration legal-status Critical
Expired - Lifetime legal-status Critical Current

Links

Description

【発明の詳細な説明】
【0001】
【発明の属する技術分野】本発明はプロセスのスケジュ
ーリング方法に係わり、特に各プロセスを周期的に起動
するプロセススケジューリング方法に関する。
【0002】
【従来の技術】従来、連続メディア処理を行なうプロセ
スのスケジューリング方法としては、Conductor/Perfor
mer モデル(1st International Workshop on Real-Tim
e Operating Systems and Applications,1994 )を用い
たスケジューリング方法が知られていた。連続メディア
処理とは、画像や音声などをデジタル化したデータを変
換、転送する処理を指す。
【0003】この方法では、システムに存在するストリ
ームが一つの場合、ストリームに属するプロセスが周期
的にスケジューリングされることを保証する。ただし、
ここで言うストリームとは、加工した連続メディアデー
タを直接または間接に受け渡しあうプロセス群を指す。
同一ストリームに属するプロセスは、連続メディア処理
データの加工処理を行なう順番が一意に決められてい
る。先頭のプロセスは、外部装置(例えばビデオデジタ
イザ)から連続メディアデータの入力を得る。以後のプ
ロセスは、順番が一つ前のプロセスから前のプロセスが
加工した連続メディアデータを受け取り、自分が行なう
べきデータ加工(例えば圧縮処理)を行ない、順番が一
つ後のプロセスに自分が加工した連続メディアデータを
送り渡す。最後尾のプロセスは、外部装置(例えばネッ
トワークアダプタ)に連続メディアデータを出力する。
【0004】Conductor/Performer モデルを用いたスケ
ジューリング方法の概要を以下に示す。ストリームごと
に、周期駆動の Conductor プロセスが一つ準備され
る。Conductor プロセスが起動すべき Performer プロ
セス(ストリームに属するプロセス)の順番は予め登録
されている。Conductor プロセスは、この登録されてい
る順番に従い Performer プロセスを起動する。そのた
めに、Conductor プロセスおよび Performer プロセス
は、共に自プロセスの起床通知用のメッセージキューを
保持する。他プロセスの起動は、そのプロセスが保持す
るメッセージキューに対してメッセージを送信すること
により行なう。
【0005】Conductor プロセスは、指定された周期で
駆動される。Conductor プロセスは、登録されている P
erformer プロセスの順番に従い、次の順番の Performe
r プロセスが所有するメッセージキューへのメッセージ
送信と Conductor プロセスが所有者であるメッセージ
キューへのメッセージ到達待ちを行なうコール(関数呼
び出し)を繰り返し発行する。すなわち、Conductor プ
ロセスは、登録されている Performer プロセスの順番
に従い、 Performer プロセスの起動と、起動したPerfo
rmer プロセスが一周期分の実行を完了するまでの休眠
を繰り返す。最後の順番の Performer プロセスが実行
を完了したら、Conductor プロセスは次の周期駆動のト
リガがタイマ割り込みを契機にかけられるまで休眠す
る。
【0006】一方、Performer プロセスは、Conductor
プロセスからメッセージを受け取ることにより起床し、
一周期分の連続メディア処理を行なう。一周期分の連続
メディア処理を完了したら、Conductor プロセスが所有
者であるメッセージキューにメッセージ送信と自プロセ
スが所有するメッセージキューへのメッセージ到達待ち
を行なうコールを発行する。Performer プロセスは、次
の周期の起動を通知するメッセージが Conductor プロ
セスから送信されるまで休眠することになる。
【0007】上記スケジューリング方法は、システムに
存在するストリームが一つの場合、Performer プロセス
が周期的に CPU を割り当てられることを保証する。
【0008】
【発明が解決しようとする課題】Conductor/Performer
モデルに従ったスケジューリング方法は、システム上に
存在するストリームが複数になった場合、以下の問題が
生じる。
【0009】(a)各 Conductor プロセス及び Perfor
mer プロセスの優先度が時間と共に変動しない。そのた
め、駆動周期が異なる Conductor プロセスが混在した
場合、Conductor プロセスの実行開始間隔が変動する。
すなわち Conductor プロセスが起床されたときに、同
等の優先度又はより高い優先度をもつ他の Conductorプ
ロセスや他の Performer プロセスが実行中である可能
性がある。すなわち起床された Conductor プロセスと
他の Conductor プロセス又は他の Performerプロセス
との間で CPU 時間の競合が生じ、これに伴い Conducto
r プロセスの実行開始間隔が変動するとともに後続する
Performer プロセスの実行間隔も変動する。
【0010】(b)起床通知がプロセス間通信(IPC)
により行なわれるため、メッセージ送信とメッセージ受
信の関数呼び出しが発生し、起床通知に伴うオーバーヘ
ッドが大きい。
【0011】これらの問題点は、マルチメディアデータ
のリアルタイム MPEG 圧縮処理などの高スループットを
要求される連続メディア処理の実現を困難にする。これ
らの処理では、連続メディアデータ入力時のバッファ管
理を割り込みを使わずに行なわなければ、割り込みオー
バーヘッドにより十分なスループットが得られなくな
る。そのためには、システムに複数のストリームが存在
する場合でも、Performer プロセスの実行間隔をできる
だけ一定に保ち、割り込みによる通知なしに Performer
プロセスが自発的に入力バッファの切り替えを行なわ
ねばならない。同様に起床通知に用いる IPC のオーバ
ーヘッドもスループットの低下を招く。
【0012】また、Conductor/Performer モデルに従っ
たスケジューリング方法は、デッドラインミス(Conduc
tor プロセスの駆動から指定された時間内で一周期分の
処理を完了できなかった状態)を Conductor プロセス
へのシグナル通知により行なう。シグナルハンドラの優
先度は、通常、対象プロセスと同じ優先度を持つため、
シグナルハンドラ処理により、他のストリームのプロセ
スの実行が遅延される可能性がある。すなわち一つのス
トリームの処理遅延が他ストリームの処理遅延を引き起
こす可能性がある。
【0013】本発明は、(a)複数ストリームがシステ
ム内に存在する場合でも、連続メディア処理を行なうプ
ロセスの実行間隔を一定に保ち、(b)プロセスの起
床、休眠の制御に伴うオーバーヘッドをより小さくし、
(c)処理遅延の回復処理を行なうシグナルハンドラを
実行することによって、一つのストリームの処理遅延が
生じても、他ストリームの処理遅延を引き起こさない、
(d)ネットワーク・パケットの到達など非同期イベン
トが発生した際に、連続メディア処理を行うプロセスの
実行間隔の変動を防止する周期的プロセスのスケジュー
リング方法を提供する。
【0014】
【課題を解決するための手段】本発明は、周期的に実行
される少なくとも1つのプロセスを含むプロセスグルー
プが複数存在し、これら複数のプロセスグループを並行
実行させる周期的プロセスのスケジューリング方法にお
いて、各プロセスグループごとに起動間隔周期と一周期
ごとの必要CPU時間が指定されたとき、指定されたプ
ロセスグループのCPU割り当て時間が他のプロセスグ
ループのCPU割り当て時間と衝突しないように確保
し、かつ指定された各プロセスグループの起動間隔周期
を保つように調整する周期的プロセススケジューリング
方法を特徴とする。
【0015】また本発明は、プロセスグループの1つ
CPUを割り当てる時点に達したとき、このプロセスグ
ループに属するプロセスの実行優先度をシステム内で最
高の優先度に変更することによってこのプロセスを起動
し、その後当該プロセスから優先度変更の要求がある場
合を除いて連続して割り当てられたCPU割り当て時間
分だけ最高の優先度を保つプロセス起動方法を特徴とす
る。
【0016】
【0017】
【0018】
【発明の実施の形態】以下、本発明の実施形態について
図面を用いて詳細に説明する。
【0019】(1)第1の実施形態 本発明のスケジューリング方法を実現するためのプロセ
ス起動の流れ、および連続メディアデータの流れを図1
に示す。システムには一つの周期駆動カーネルプロセス
(101)が存在する。周期駆動カーネルプロセス(101)は、
タイマ割り込みハンドラ(104)により周期的に駆動され
る制御プロセスである。周期駆動カーネルプロセス(10
1)は、CPU 割り当て順序記述テーブル(900)を参照して
次に連続メディアデータを処理するプロセス(以後周期
プロセスと呼ぶ)(102)群を選択し、選択した周期プロ
セス(102)群の優先度を変更することにより、各周期プ
ロセス(102)の周期的なスケジューリングを実現する。
また、スケジューリングすべき周期プロセス(102)が存
在しない場合には、それ以外の通常プロセス(109)をス
ケジューリングする。この動作の詳細は後述する。
【0020】同一の連続メディアデータを処理する少な
くとも1つの周期プロセス(102)は、一つのプロセスグ
ループ(103)を形成する。プロセスグループ(103)に属す
る周期プロセス(102)は、その処理順が予め定められて
いる。処理順が最初の周期プロセス(102)は、周期駆動
カーネルプロセス(101)による優先度変更によって優先
的に駆動され、外部入力装置(105)からの入力連続メデ
ィアデータを入力バッファ(106)を介して読み取り、デ
ータの加工を行なう。加工されたデータは共有バッファ
(110)などを介して処理順が次の周期プロセス(102)に渡
される。プロセスグループ(103)内の周期プロセス(102)
の優先度は次々に継承され、処理順が最後の周期プロセ
ス(102)は、出力バッファ(107)を介して外部出力装置(1
08)に出力し、自プロセスの優先度を下げることによっ
て実質的にこのプロセスグループ(103)の1周期の処理
を終了する。システムには複数のプロセスグループ(10
3)、例えば音声情報を処理するプロセスグループと画像
情報を処理するプロセスグループなど、が存在し得る。
【0021】なお図示しないスケジューラが関数呼び出
しによって呼び出され、CPU 割り当て順序記述テーブル
(900)を作成したり、指定されたプロセスを駆動する処
理を行う。スケジューラは、呼び出されたプロセスによ
って動作しスケジューリングに関連する処理を行うプロ
グラム・モジュールの集まりである。
【0022】プロセスグループには、グループマスタプ
ロセスが存在する。グループマスタプロセスは、プロセ
スグループに属するプロセスのうち、処理順が先頭であ
るプロセスである。プロセスグループに属するプロセス
で、グループマスタプロセス以外のプロセスはスレーブ
プロセスと呼ばれる。プロセスグループ(103)の生成、
削除は、グループマスタプロセスによって以下のインタ
フェースを用いて行われる。
【0023】<関数名> create_proc_group(master_pid, slave_pid_array,proc
_array_number,pgroupid) <引数> master_pid: グループマスタプロセスのプロセス識別子 slave_pid_array: グループを構成するスレーブプロセ
ス識別子の配列 proc_array_number: グループを構成するスレーブプロ
セス識別子の数 pgroupid: 生成されたプロセスグループの識別子がリタ
ーンする。 <リターン値> SUCCESS: 正常終了 もしくは、各種エラーコード <説明>create_proc_group 関数は、master_pid で指
定されるプロセスをグループマスタとするプロセスグル
ープを生成する。生成されたプロセスグループは、mast
er_pid で指定されるプロセスの他に、slave_pid_arra
y, proc_array_number で指定されるプロセス群から構
成される。pgroupid に生成されたプロセスグループ識
別子が返る。なお master_pid 及び slave_pid_array
で指定するプロセス識別子をもつ個々のプロセスはすで
に生成済であることが前提である。
【0024】<関数名> destroy_proc_group(pgroupid) <引数> pgroupid: プロセスグループ識別子 <リターン値> SUCCESS: 正常終了 もしくは、各種エラーコード <説明>destroy_proc_group 関数は、pgroupid で指定
されるプロセスグループを削除する。
【0025】プロセスグループの管理に用いる配列デー
タ及び制御ブロックのデータ構造を図2に示す。
【0026】プロセスグループは、プロセスグループ制
御ブロック(202)を用いて管理される。プロセスグルー
プ制御ブロック(202)は、master_pid フィールド(20
3)、pid_array フィールド(204)、nproc フィールド(20
5)からなる。master_pid フィールド(203)は、プロセス
グループのグループマスタプロセスのプロセス識別子を
格納する。pid_array フィールド(204)は、プロセス識
別子配列(206)へのポインタを格納する。プロセス識別
子配列(206)は、プロセスグループを構成するスレーブ
プロセスのプロセス識別子の配列である。nproc フィー
ルド(205)は、プロセス識別子配列(206)に格納されてい
るプロセス識別子の数を格納する。また、プロセスグル
ープ識別子からプロセスグループ制御ブロック(202)へ
の変換は、プロセスグループ制御ブロックポインタ配列
(201)を用いて行なう。すなわち、プロセスグループ制
御ブロックポインタ配列(201)の、プロセスグループ識
別子をインデックスに持つ要素に、プロセスグループ制
御ブロック(202)へのポインタが格納されている。プロ
セスグループ識別子に対応するプロセスグループ制御ブ
ロック(202)が存在しない場合には、プロセスグループ
制御ブロックポインタ配列(201)の該当要素には、nil
ポインタが格納されている。
【0027】create_proc_group 関数の処理フローを図
3に示す。
【0028】ステップ301で、プロセス制御ブロックポ
インタ配列(201)の要素のうち、nilポインタが格納され
ている要素を一つ検索する。そのインデックス値を pgr
oupid のリターン値とする。
【0029】ステップ302で、プロセスグループ制御ブ
ロック(202)に用いるメモリ領域を確保する。
【0030】ステップ303で、プロセス識別子配列(206)
に用いるメモリ領域を確保する。
【0031】ステップ304で、create_proc_group 関数
の引数 master_pid で指定されたグループマスタプロセ
スの識別子を、ステップ302でメモリ領域を確保したプ
ロセスグループ制御ブロック(202)の master_pid フィ
ールド(203)に格納する。
【0032】ステップ305で、create_proc_group 関数
の引数 slave_pid_array で指定されたスレーブプロセ
スのプロセス識別子の配列を、ステップ303でメモリ領
域を確保したプロセス識別子配列(206)にコピーする。
【0033】ステップ306で、プロセス識別子配列(206)
へのポインタをpid_array フィールド(204)に格納す
る。
【0034】ステップ307で、create_proc_group 関数
の引数 proc_array_number で指定されたプロセスグル
ープを構成するスレーブプロセス識別子の数を、ステッ
プ302でメモリ領域を確保したプロセスグループ制御ブ
ロック(202)の nproc フィールド(203)に格納する。
【0035】destroy_proc_group 関数の処理フローを
図4に示す。
【0036】ステップ401で、destroy_proc_group 関数
の引数 pgroupid をインデックスに持つプロセスグルー
プ制御ブロックポインタ配列(201)の要素を検索し、そ
の要素により指されるプロセスグループ制御ブロック(2
02)が使用していたメモリ領域を解放する。
【0037】ステップ402で、上記プロセスグループ制
御ブロック(202)の pid_array フィールド(204)により
指されるプロセス識別子配列(206)が使用していたメモ
リ領域を解放する。
【0038】ステップ403で、プロセスグループ制御ブ
ロックポインタ配列(201)の、解放するプロセスグルー
プに対応する要素に nil ポインタを代入する。
【0039】プロセスグループ(103)は、スケジューリ
ングの単位になる。プロセスグループ(103)のグループ
マスタは、その初期化時において、alloc_time_slot 関
数を用いて、指定周期ごとに指定時間にわたりプロセス
グループ(103)に対し CPU が割り当てられることを予約
する。また、CPU 時間の割り当てが不要になった場合に
は、dealloc_time_slot 関数を呼び出し、その予約を解
除する。
【0040】alloc_time_slot 関数が呼び出されると、
スケジューラは、各プロセスグループが要求する周期と
1周期あたりの実行時間を満たすような CPU の割り当
て順序を決定し、CPU 割り当て順序記述テーブル(900)
を作成する。この作成アルゴリズムについては後述す
る。
【0041】周期カーネルプロセス(101)は、CPU 割り
当て順序記述テーブル(900)に基づいて各周期プロセス
(102)のスケジューリングを行なう。プロセスグループ
(103)に対して CPU を割り当てるべき時間が到達する
と、周期駆動カーネルプロセス(101)はそのプロセスグ
ループ(103)のグループマスタプロセスの優先度を rais
edにする。優先度が raised の周期プロセス(102)は、
ユーザプロセスの中で最高の優先度を持つことが保証さ
れる。また、優先度が raised のプロセス(102)は、周
期駆動カーネルプロセス(101)よりも優先度が高いこと
も保証される。
【0042】グループマスタプロセスの優先度が raise
d になってから指定時間経過すると、タイマ割り込みハ
ンドラ(104)は、プロセスグループ(103)に属する周期プ
ロセス(102)のうち優先度が raised である周期プロセ
ス(102)の優先度を depressedにする(グループマスタ
プロセスは、同じプロセスグループ(103)に属する他の
周期プロセス(102)に優先度を継承することが可能であ
る。これについては後述する)。優先度が depressed
のプロセス(102)は、ユーザプロセスの中で最低の優先
度を持つことが保証される。
【0043】これにより、プロセスグループ(103)に CP
U が割り当てられるべき時間は、優先度が raised であ
るプロセスグループ(103)に属する周期プロセス(102)が
実行可能状態にある限り、プロセスグループ(103)に属
さないユーザプロセスや周期駆動カーネルプロセス(10
1)がスケジューリングされることはない。また、CPUが
割り当てられるべきでない時間は、プロセスグループ(1
03)に属する周期プロセス(102)がスケジューリングされ
ることはない。いずれの周期プロセス(102)にも割り当
てられない CPU 時間は、通常プロセス(109)又は無限ル
ープを実行し常に実行可能状態にあるアイドルプロセス
に割り当てられる。アイドルプロセスの優先度を depre
ssed に次いで低い優先度に設定することによって周期
プロセス(102)又は周期駆動カーネルプロセス(101)に C
PU が割り当てられるべきでない時間にスケジューリン
グされないことが保証される。
【0044】alloc_time_slot 関数、dealloc_time_slo
t 関数の外部仕様は以下の通りである。
【0045】<関数名> alloc_time_slot(pgroupid, interval, length) <引数> pgroupid: CPU の割り当てを保証されるプロセスグルー
プ識別子 interval: プロセスの起動間隔 length: 確保すべき一周期あたりのプロセスグループの
実行時間 <リターン値> SUCCESS: 正常終了 もしくは、各種エラーコード <説明>alloc_time_slot 関数は、pgroupid で指定さ
れるプロセスグループが、interval で指定される周期
で、length で指定される時間にわたり CPU が割り当て
られることを要求する。interval 及びlength は、所定
のタイムスロットを単位として指定する。interval で
指定される周期で、グループマスタプロセスの優先度が
raised になる。グループマスタプロセスは、proc_rai
se_handoff 関数(後述)を用いて、プロセスグループ
に属する他のプロセスの優先度を raised にし、自プロ
セスを depressed (もしくは基準優先度)に変更する
ことが可能である。グループマスタプロセスの優先度が
raised になってから length で指定した時間が経過す
ると、プロセスグループに属するプロセスのうち優先度
が raised になっているプロセスの優先度が強制的に d
epressed に変化する。さらにそのプロセスに対してタ
イムアウトシグナルが送信される。
【0046】interval の値は2のべき乗でなければな
らない。それ以外の値が指定された場合には、指定値以
下で最大の2のべき乗値が指定されたものとしてスケジ
ューラは処理する。
【0047】<関数名> dealloc_time_slot(pgroupid) <引数> pgroupid: CPU の割り当て保証を解除するプロセスグル
ープ識別子 <リターン値> SUCCESS: 正常終了 もしくは、各種エラーコード <説明>dealloc_time_slot 関数は、pgroupid で指定
されるプロセスグループが保持していた CPU の割り当
て要求を解除する。
【0048】alloc_time_slot 関数により、CPU の割り
当てを要求されたスケジューラは、すべてのプロセスグ
ループ(103)の要求通りにプロセスグループ(103)のスケ
ジューリングが行なえるとは限らない。図5に示す様
に、同じ時刻に複数のプロセスグループ(501,502)をス
ケジューリングできないため、重なっているプロセスグ
ループ(501,502)のうちいずれか一つのプロセスグルー
プ(501)の CPU の割り当て時間(503)の重なっている時
間を別の時間(504)にずらす必要が生じるためである。
【0049】スケジューラは、以下のアルゴリズムに従
い各プロセスグループ(103)の CPUの割り当て時間を決
定し、その結果を後述の CPU 割り当て順序記述テーブ
ル(900)に登録する。CPU の割り当てはタイマ割り込み
発生間隔を単位に行なう。実時間を、タイマ割り込みの
発生する時刻を境界にタイムスロット群に分割する。以
下のアルゴリズムに従い、各タイムスロットごとに割り
当てるべきプロセスグループ(103)を決定していく。
【0050】アルゴリズムのフローチャートを図6に示
す。
【0051】ステップ 601 において、割り当てるべき
プロセスグループ(103)(alloc_time_slot 関数によ
り、既に CPU の割り当て予約要求が発行されているプ
ロセスグループ(103))が要求している Interval 値の
うち、最大の Interval 値と同じサイズを持つ図7に示
すタイムスロットテーブル(700)を作成する。タイムス
ロットテーブル(700)は1次元の配列であり、配列の各
要素には、対応するタイムスロットに割り当てられるべ
きプロセスグループ(103)識別子を格納していく。各要
素の初期値として、該当タイムスロットが未割り当てで
あることを示す識別子が格納される。
【0052】ステップ 602 において、割り当てるタイ
ムスロットをまだ決定していないプロセスグループ(10
3)の存在を調べる。すべてのプロセスグループ(103)に
対してタイムスロットの割り当てが完了している場合に
は正常終了(ステップ613)する。
【0053】ステップ 603 において、まだ割り当てる
タイムスロットを決定していないプロセスグループ(10
3)のうち、alloc_time_slot 関数発行時に要求した Int
erval値が最小のプロセスグループ(103)を選択する。
【0054】ステップ 604 において、ステップ 603 で
選択されたプロセスグループ(103)の要求している Inte
rval 値を I に、Length 値を L に代入する。
【0055】ステップ 605 において、タイムスロット
0〜I−1までのうち、未割り当てのタイムスロット
を、隣接しているタイムスロットごとにグループ化す
る。以後、本ステップでグループ化されたタイムスロッ
ト群 Xi (i=1,2,・・・n) を連続空きタイムスロットと呼
ぶことにする。
【0056】ステップ 606 において、ステップ 605 で
得られた連続空きタイムスロット群のサイズ(タイムス
ロット数)の合計が L よりも少ない場合には、すべて
のプロセスグループ(103)の要求を満たすタイムスロッ
トの割り当てが不可能であると判断して異常終了(ステ
ップ 614)する。
【0057】ステップ 607 において、ステップ 605 で
得られた連続空きタイムスロットのうち最大サイズをも
つものと L の大小を比較する。
【0058】L の方が小さければ、ステップ 608 にお
いて、L のサイズ以上のサイズを持つ連続空きタイムス
ロットのうち、サイズが最小のものを選択する。
【0059】ステップ 609 において、ステップ 608 で
選択した連続空きタイムスロットの先頭の L タイムス
ロットを、ステップ 603 で選択したプロセスグループ
(103)に割り当てる。ここで割り当てられたタイムスロ
ットの他に、I, 2I,3I... タイムスロット後のタイムス
ロットもステップ 603 に選択したプロセスグループ(10
3)に割り当てる。これで、ステップ 603 で選択したプ
ロセスグループ(103)に対するタイムスロットの割り当
てを完了し、ステップ 602 にジャンプする。
【0060】ステップ 607 において、L の方が、ステ
ップ 605 で得られた最大の連続空きタイムスロットサ
イズより大きければ、ステップ 610 において、サイズ
が最大の連続空きタイムスロットを選択する。
【0061】ステップ 611 において、ステップ 610 で
選択した連続空きタイムスロットに属する全タイムスロ
ットをステップ 603 で選択したプロセスグループ(103)
に割り当てる。さらに、ここで割り当てられたタイムス
ロットの他に、I,2I,3I ...タイムスロット後のタイム
スロットもステップ 603 に選択したプロセスグループ
(103)に割り当てる。
【0062】ステップ 612 では、L からステップ 610
で選択した連続空きタイムスロットのサイズを引いた値
を新しい L の値として、ステップ 605 にジャンプす
る。
【0063】タイムスロットテーブル(700)の作成例を
図7と図8を用いて示す。
【0064】タイムスロットを割り当てるプロセスグル
ープ(103)は3つとする。各プロセスグループ(103)が要
求している Interval 値(801)、Length 値(802)を図8
に示す。
【0065】まず、3つのプロセスグループ(103)が要
求している Interval 値(801)の最大値である 32 の大
きさを持つタイムスロットテーブル(700)を作成する。
タイムスロットテーブル(700)の各要素は、未割り当て
を示す識別子に初期化する。
【0066】Interval 値(801)が最小のプロセスグルー
プAに割り当てるタイムスロットを決定する。タイムス
ロット0〜7のタイムスロット群から連続空きタイムス
ロットを生成する。この場合は、タイムスロット0〜7
からなるサイズ8の連続空きタイムスロットが一つ生成
される。
【0067】プロセスグループAが要求している Lengt
h 値(802)2は、先程生成した連続空きタイムスロット
のサイズ8より小さいため、この連続空きタイムスロッ
トの先頭2タイムスロット、すなわち、タイムスロット
0と1がプロセスグループAに割り当てられる。この他
に、プロセスグループAが要求している Interval 値(8
01)8の整数倍後のタイムスロットもプロセスグループ
Aに割り当てられる。すなわち、タイムスロット0、1
の他に、8、9、16、17、24、25がプロセスグループA
に割り当てられる。これに従い、タイムスロットテーブ
ル(700)の該当要素を更新する。これでプロセスグルー
プAに対するタイムスロットの割り当ては完了する。
【0068】次に、Interval 値(801)が2番目に小さい
プロセスグループBに割り当てるタイムスロットを決定
する。タイムスロット0〜15から、連続空きタイムスロ
ットを生成する。この場合、タイムスロット2〜7及び
タイムスロット10〜15からなる各サイズ6の連続空きタ
イムスロットが2つ生成される。
【0069】プロセスグループBが要求している Lengt
h 値(802)3は、このサイズ6より小さい。3以上のサ
イズを持つ連続空きタイムスロットのうちサイズが最小
の連続空きタイムスロットを選択する。ここでは、タイ
ムスロット2〜7からなる連続タイムスロットが選択さ
れる。この連続空きタイムスロットの先頭3タイムスロ
ットがプロセスグループBに割り当てられる。すなわ
ち、タイムスロット2〜4がプロセスグループBに割り
当てられる。同様に、タイムスロット18〜20もプロセス
グループBに割り当てられる。これに従い、タイムスロ
ットテーブル(700)の該当要素を更新する。これでプロ
セスグループBに対するタイムスロットの割り当ては完
了する。
【0070】最後にプロセスグループCに割り当てるタ
イムスロットを決定する。タイムスロット0〜31から、
連続空きスロットを生成する。この場合、以下の連続空
きタイムスロットが生成される。 ・タイムスロット5〜7からなるサイズ3の連続空きタ
イムスロット ・タイムスロット10〜15からなるサイズ6の連続空きタ
イムスロット ・タイムスロット21〜23からなるサイズ3の連続空きタ
イムスロット ・タイムスロット26〜31からなるサイズ6の連続空きタ
イムスロット プロセスグループCが要求している Length 値(802)7
は、上記連続空きタイムスロットの最大サイズ6より大
きい。そこで、まず、最大サイズ6を持つ連続空きタイ
ムスロットを一つ選択する。ここではタイムスロット10
〜15からなる連続空きタイムスロットが選択されたとす
る。この連続タイムスロットに属するすべてのタイムス
ロット、すなわち、タイムスロット10〜15がプロセスグ
ループCに割り当てられる。これに従いタイムスロット
テーブル(700)の該当要素を更新する。
【0071】プロセスグループCが要求している Lengt
h 値(802)7から、先に選択した連続空きタイムスロッ
トのサイズ6を引いた残り1タイムスロットの割り当て
を次に行なう。再び、連続空きスロットを生成する。こ
の場合は、以下の連続空きタイムスロットが生成され
る。 ・タイムスロット5〜7からなるサイズ3の連続空きタ
イムスロット ・タイムスロット21〜23からなるサイズ3の連続空きタ
イムスロット ・タイムスロット26〜31からなるサイズ6の連続空きタ
イムスロット 1以上のサイズを持つ連続空きタイムスロットのうち、
サイズが最小のものを選択する。この場合、タイムスロ
ット5〜7からなる連続空きタイムスロットが選択され
る。この連続空きタイムスロットの先頭1タイムスロッ
ト、すなわちタイムスロット5がプロセスグループCに
割り当てられる。これに従い、タイムスロットテーブル
(700)の該当要素を更新する。これでプロセスグループ
Cに対するタイムスロットの割り当ては完了する。
【0072】以上の処理によってタイムスロットごとに
割り当てられるプロセスグループは図7に示す通りに決
定される。これから、スケジューラは図9に示す CPU
割り当て順序記述テーブル(900)を生成する。この CPU
割り当て順序記述テーブル(900)は、CPU を割り当てる
べきプロセスグループ(915)の順序とその割り当て時間
(916)(タイムスロット数)を記述したテーブルであ
る。また、終了予定フラグ(917)は、その行の CPU 割り
当てが完了したとき、プロセスグループ(915)の一周期
分の割り当てが終了するか否かを示す。例えば、903 の
終了予定フラグ(917)は、プロセスグループCにタイム
スロット5を割り当てても一周期分の割り当てを完了し
ていないため OFF あるいは FALSE になっているが、90
6 の終了予定フラグ(917)は、タイムスロット10〜15を
割り当てれば一周期分の割り当てを完了するため ON あ
るいは TRUE になっている。タイムスロットテーブル(7
00)からCPU 割り当て順序記述テーブル(900)への変換ア
ルゴリズムは自明であるため省略する。インデックス(9
14)は、次に CPU を割り当てる CPU 割り当て順序記述
テーブル(900)の行(エントリ)を示すポインタである。
プロセスグループ(915)がOTHERS を指定するタイムスロ
ットは、通常プロセス(109)に割り当てられるタイムス
ロットである。OTHERS(907)は、プロセスグループCに
割り当てられた6タイムスロットが経過する前にプロセ
スグループC中の周期プロセスの実行が終了した場合に
空いたタイムスロットが通常プロセス(109)に割り当て
られることを示している。
【0073】スケジューラは、alloc_time_slot 関数が
発行されるごとに図8のような既存のテーブルと新しい
alloc_time_slot 関数による要求とを基にして CPU 割
り当て順序記述テーブル(900)を作成し直す。
【0074】上記アルゴリズムに従って生成された CPU
割り当て順序記述テーブル(900)に従い、周期駆動カー
ネルプロセス(101)はプロセスグループ(103)のスケジュ
ーリングを行なう。周期駆動カーネルプロセス(101)
が、周期的な CPU 割り当てを要求してきたプロセスグ
ループ(103)に属する周期プロセス(102)の優先度を rai
sed または depressed または基準優先度に変更するこ
とにより、このスケジューリングを実現する。
【0075】また、周期駆動カーネルプロセス(101)に
よって優先度が raised になった周期プロセスは、自プ
ロセスの優先度を depressed に変更し、かつ同一プロ
セスグループに属する他の周期プロセスの優先度を rai
sed に変更することにより、プロセス・グループ内のハ
ンドオフ・スケジューリングを実現する。
【0076】優先度の変更は、proc_raise, proc_raise
_cancel, proc_raise_handoff, proc_depress, proc_de
press_cancel 関数を用いて行う。これら関数の外部仕
様を以下に示す。
【0077】<関数名> proc_raise(pid, time, flags) <引数> pid: プロセス識別子 time: 優先度を raised に保つ時間 flags: 指定時間経過後の優先度を指定するフラグ。以
下のフラグが指定可能である。 RIORITY_NORMAL プロセスの優先度を基準優先度に変更する。 PRIORITY_DEPRESSED プロセスの優先度を depressed に変更する。また、指
定時間経過時に pid で指定されるプロセスにシグナル
を送信するか否かを以下のフラグで指定する。 SEND_SIGNAL 指定時間経過時に pid で指定されるプロセスにタイム
アウトシグナルを送信する。 <リターン値> SUCCESS: 正常終了 もしくは、各種エラーコード <説明>proc_raise 関数は、pid で指定されるプロセ
スの優先度を time で指定される時間(タイムスロット
数)だけ raised に設定する。time にはそのプロセス
が属するプロセスグループに割り当てられた時間(916)
又は INFINITY を指定する。優先度が raised であるプ
ロセスは、他のいかなるユーザプロセスよりも優先度が
高いことが保証される。
【0078】複数のプロセスの優先度を同時に raised
にすることはできない。すでに優先度が raised である
プロセスが存在するときに本関数がコールされた場合、
本関数はエラーリターンする。
【0079】time に INFINITY が設定されている場合
には、該当プロセスに対し proc_raise_cancel 関数か
proc_raise_handoff 関数が発行されるまで、該当プロ
セスの優先度は raised に保たれる。INFINITY は、例
えばタイマ割り込みハンドラ(104)が周期駆動カーネル
プロセス(101)を起動するときに指定される。周期プロ
セス(102)を起動するときには、通常 INFINITY は指定
されない。
【0080】time に INFINITY 以外の値が指定されて
いる場合には、 time で指定した時間が経過しても、該
当プロセスに対して proc_raise_cancel 関数か proc_r
aise_handoff 関数が発行されなければ、flags で指定
されているフラグに応じて、プロセスの優先度が強制的
に変更される。flags に PRIORITY_NORMAL が指定され
ていると、プロセスの優先度が raised から基準優先度
に変更される。flagsに PRIORITY_DE
PRESSED が指定されていると、プロセスの優先
度が raised からdepressed に変化する。さらに flags
に SEND_SIGNAL が指定されていれば、そのプロセスに
対してタイムアウトシグナルが送信される。タイムアウ
トシグナルを受信したプロセスは、設定された優先度に
従って起動され、タイムアウトの場合の処理を行うこと
ができる。
【0081】<関数名> proc_raise_cancel(pid, flags) <引数> pid: プロセス識別子 flags: 変更後の優先度を指定するフラグ。以下が指定
可能である。 PRIORITY_NORMAL プロセスの優先度を基準優先度に変更する。 PRIORITY_DEPRESSED プロセスの優先度を depressed に変更する。 <リターン値> SUCCESS: 正常終了 もしくは、各種エラーコード <説明>proc_raise_cancel 関数は、proc_raise 関数
により raised に設定されたプロセスの優先度を flags
に応じて変更する。flags に PRIORITY_NORMAL が指定
されている場合には、変更後の優先度は、スケジューリ
ング属性に従って基準優先度になる。flags に PRIORIT
Y_DEPRESSED が指定されている場合には、変更後の優先
度は depressed になる。
【0082】<関数名> proc_raise_handoff(pid, flags) <引数> pid: プロセス識別子 flags: ハンドオフ後の優先度を指定するフラグ。以下
が指定可能である。 PRIORITY_NORMAL プロセスの優先度を基準優先度に変更する。 PRIORITY_DEPRESSED プロセスの優先度を depressed に変更する。 <リターン値> SUCCESS: 正常終了 もしくは、各種エラーコード <説明>proc_raise_handoff 関数は、pid で指定され
るプロセスの優先度をraised にし、かつ自プロセスの
優先度を flags に応じて変更する。pid で指定される
プロセスは、呼び出しプロセスと同じプロセスグループ
に属していなければならない。そうでなければエラーリ
ターンする。flags に PRIORITY_NORMAL が指定されて
いる場合には、ハンドオフ後の呼び出しプロセスの優先
度は基準優先度になる。flags に PRIORITY_DEPRESSED
が指定されている場合には、ハンドオフ後の呼び出しプ
ロセスの優先度は depressed になる。
【0083】呼び出しプロセスの優先度は raised でな
ければならない。優先度が raisedでないプロセスが本
関数を呼び出すとエラーリターンする。
【0084】呼び出しプロセスの優先度が raised に保
たれる上限時間が指定されている場合(proc_raise 関
数の time 引数に INFINITY 以外が指定されている場
合)には、ハンドオフ先のプロセスの優先度が raised
に保たれる時間は、呼び出し時点で残っている、ハンド
オフ元のプロセスの優先度が raised に保たれる時間と
なる。呼び出しプロセスの優先度が raised に保たれる
上限時間が指定されていない場合は、ハンドオフ先のプ
ロセスの優先度が raised に保たれる上限時間も存在し
ない。
【0085】<関数名> proc_depress(pid, time, flags) <引数> pid: プロセス識別子 time: 優先度を depressed に保つ時間 flags: 指定時間経過後の優先度を指定するフラグ。以
下のフラグが指定可能である。 PRIORITY_NORMAL プロセスの優先度を基準優先度に変更する。 PRIORITY_RAISED プロセスの優先度を raised に変更する。 <リターン値> SUCCESS: 正常終了 もしくは、各種エラーコード <説明>proc_depress 関数は、pid で指定されるプロ
セスの優先度を time で指定される時間(タイムスロッ
ト数)だけ depressed に設定する。優先度が depresse
d であるプロセスは、他のいかなるユーザプロセスより
も優先度が低いことが保証される。proc_depress 関数
は、主として周期駆動カーネルプロセス(101)が自プロ
セスの優先度を下げて通常プロセス(109)を起動するこ
とを目的として発行される。
【0086】time に INFINITY が設定されている場合
には、該当プロセスに対し proc_depress_cancel 関数
か proc_raise_handoff 関数が発行されるまで、該当プ
ロセスの優先度は depressed に保たれる。
【0087】time に INFINITY 以外の値が指定されて
いる場合には、 time で指定した時間が経過しても、該
当プロセスに対して proc_depress_cancel 関数が発行
されなければ、flags で指定されているフラグに応じ
て、プロセスの優先度が強制的に変更される。flags に
PRIORITY_NORMAL が指定されていると、プロセスの優
先度が depressed から基準優先度に変更される。flags
に PRIORITY_RAISED が指定されていると、プロセスの
優先度が depressed から raised に変化する。
【0088】<関数名> proc_depress_cancel(pid, flags) <引数> pid: プロセス識別子 flags: 変更後の優先度を指定するフラグ。以下が指定
可能である。 PRIORITY_NORMAL プロセスの優先度を基準優先度に変更する。 PRIORITY_RAISED プロセスの優先度を raised に変更する。 <リターン値> SUCCESS: 正常終了 もしくは、各種エラーコード <説明>proc_depress_cancel 関数は、proc_depress
関数により depressed に設定されたプロセスの優先度
を flags に応じて変更する。flags に PRIORITY_NORMA
Lが指定された場合には、変更後のプロセスの優先度は
基準優先度になる。flagsに PRIORITY_RAISED が指定さ
れた場合には、変更後のプロセスの優先度は raised に
なる。
【0089】上記関数群を実現するために必要な配列デ
ータ及び制御ブロックのデータ構造を図10に示す。
【0090】プロセス管理はプロセス制御ブロック(100
2)を用いて行なわれる。実行可能(レディ)状態にある
プロセスのプロセス制御ブロック(1002)は、優先度別
に、レディキューヘッダ配列(1001)の要素をキューヘッ
ダに持つ双方向キュー(以後、双方向レディキューと呼
ぶ)に接続される。レディキューヘッダ配列(1001)は、
優先度をインデックス値とした、優先度別の双方向レデ
ィキューのキューヘッダ(プロセス制御ブロックを指す
ポインタ)の配列である。ただし、優先度は値が小さい
ほど高優先度であるものとする。また、最高優先度の値
は raised、最低優先度の値は depressed で表す。
【0091】プロセス制御ブロック(1002)は、優先度別
の双方向レディキューに接続するために、next_proc フ
ィールド(1003)および prev_proc フィールド(1004)を
保持する。それぞれ、双方向キューの後ろのプロセス制
御ブロック(1002)へのポインタ、前のプロセス制御ブロ
ック(1002)へのポインタが格納される。但し、双方向レ
ディキューの先頭プロセス制御ブロック(1002)の prev_
proc フィールド(1004)には、レディキューヘッダ配列
(1001)の要素へのポインタが格納される。また、双方向
レディキューの末尾プロセス制御ブロック(1002)の nex
t_proc フィールド(1003)には、nil ポインタが格納さ
れる。
【0092】プロセス制御ブロック(1002)には、その他
に、counter フィールド(1005)、flags フィールド(100
6)、context フィールド(1007)、base_pri フィールド
(1010)が存在する。counter フィールド(1005)には、そ
のプロセスが raised もしくはdepressed の優先度を保
てる残り時間(タイムスロット数)を保持する。flags
フィールド(1006)には、raised もしくは depressed の
優先度を保てる時間が経過した後に、変更されるべきプ
ロセスの優先度を示すフラグが格納される。context フ
ィールド(1007)は、プロセスの実行コンテクストの退避
領域である。base_pri フィールド(1010)は、プロセス
の基準優先度が、プロセス生成時に格納される。
【0093】プロセス識別子からプロセス制御ブロック
(1002)への変換は、プロセス制御ブロックポインタ配列
(1009)を用いて行なう。すなわち、プロセス制御ブロッ
クポインタ配列(1009)の、プロセス識別子をインデック
スに持つ要素に、プロセス制御ブロック(1002)へのポイ
ンタが格納されている。プロセス識別子に対応するプロ
セス制御ブロック(1002)が存在しない場合には、プロセ
ス制御ブロックポインタ配列(1009)の該当要素には、ni
l ポインタが格納されている。
【0094】また、ctxproc(1008)は、現在実行中のプ
ロセスのプロセス制御ブロック(1002)へのポインタを格
納する。
【0095】proc_raise 関数の処理フローを図11に
示す。
【0096】ステップ1101で、スケジューラはプロセス
制御ブロックポインタ配列(1009)の、proc_raise 関数
の引数 pid をインデックスに持つ要素を求め、その要
素から指されるプロセス制御ブロック(1002)を、双方向
レディキューからデキューする。
【0097】ステップ1102で、レディキューヘッダ配列
(1001)の raised をインデックスに持つ要素を求め、そ
の要素をキューヘッダとする双方向レディキューの末尾
に、ステップ1101で得られたプロセス制御ブロック(100
2)をエンキューする。
【0098】ステップ1103で、proc_raise 関数の引数
time で指定した値を、ステップ1102で得られたプロセ
ス制御ブロック(1002)の counter フィールド(1005)に
格納する。
【0099】ステップ1104で、proc_raise 関数の引数
flags で指定した値を、ステップ1102で得られたプロセ
ス制御ブロック(1002)の flags フィールド(1006)に格
納する。
【0100】ステップ1105で、現在の実行コンテクスト
(各種レジスタの値)を、ctxproc(1008)から指される
プロセス制御ブロック(1002)の context フィールド(10
07)に退避する。
【0101】ステップ1106で、ctxproc(1008)に、シス
テム内で最高優先度を持つプロセスのプロセス制御ブロ
ック(1002)へのポインタを格納する。システム内で最高
優先度を持つプロセスのプロセス制御ブロックは以下の
手順で検索できる。まず、レディキューヘッダ配列(100
1)に格納されている各双方向レディキューのうち、キュ
ー長が1以上であり、かつ、インデックス値が最小の双
方向レディキューを求める。その双方向レディキューの
先頭にキューイングされているプロセス制御ブロック(1
002)が、求めるプロセス制御ブロック(1002)になる。こ
こでは、proc_raise 関数の引数 pid で指定され、ステ
ップ1102で raised の値をもってレディキューヘッダ配
列(1001)に接続されたプロセスが最高優先度を持つプロ
セスである。
【0102】ステップ1107で、ステップ1106で得られた
プロセス制御ブロックの contextフィールド(1007)に退
避されている実行コンテクストを回復する。ステップ11
07の処理によってプロセスのスイッチが生じ、実行コン
テクストの回復されたプロセスがディスパッチされる。
なおステップ1104とステップ1105との間でシステム内で
最高優先度を持つプロセスのプロセス制御ブロックポイ
ンタと ctxproc(1008)の内容を比較し、両者が同じであ
ればステップ1105〜1107の処理をスキツプできる。
【0103】proc_raise_cancel, proc_raise_handoff,
proc_depress, proc_depress_cancel 関数も、ステッ
プ1101から1102と同様のレディキュー操作、および、
(必要ならば)ステップ1103から1104と同様のプロセス
制御ブロック(1002)の各種フィールドの更新、および、
ステップ1105と同様の実行コンテクストの退避、およ
び、ステップ1106から1107と同様のシステム内で最高優
先度を持つプロセスの実行コンテクストの回復、を行な
うことで実現できる。処理フローは proc_raise 関数と
同様になるため、省略する。
【0104】proc_raise 関数及びproc_depress 関数が
発行された場合、その関数発行から、引数 time で指定
された時間が経過したか否かの検査を行なう必要があ
る。この検査は、プロセス制御ブロックの counter フ
ィールド(1005)を用いてタイマ割り込みハンドラ(104)
内で行なわれる。またタイマ割り込みハンドラ(104)
は、周期駆動カーネルプロセス(101)の駆動処理も併せ
て行う。これらを行うタイマ割り込みハンドラ(104)の
処理フローを図12に示す。あらかじめ設定したタイム
スロットごとにタイマ割り込みが発生してタイマ割り込
みハンドラ(104)に制御が渡り、図12に示す処理が実
行される。
【0105】ステップ1201では、レディキューヘッダ配
列(1001)の raised をインデックスに持つ要素を求め、
その要素に格納されているプロセス制御ブロック(1002)
へのポインタを変数 PCB に代入する。
【0106】ステップ1202では、ステップ1201で更新さ
れた PCB の値が nil ポインタであるか否かのチェック
を行なう。nil ポインタであればステップ1207に、nil
ポインタでなければステップ 1203 にジャンプする。
【0107】ステップ1203では、PCB で指されるプロセ
ス制御ブロック(1002)の counterフィールド(1005)を1
だけデクリメントする。ただし、counter フィールド(1
005)に INFINITY が格納されている場合には、何も行な
わない。
【0108】ステップ1204では、PCB で指されるプロセ
ス制御ブロック(1002)の counterフィールド(1005)の値
が0であるか否かのチェックを行なう。counter フィー
ルド(1005)の値が0であればステップ1205に、0以外で
あればステップ1206にジャンプする。
【0109】ステップ1205では、PCB で指されるプロセ
ス制御ブロック(1002)の flags フィールド(1006)に応
じてレディキュー操作を行なう。すなわち以下の操作を
行なう。まず、PCB で指されるプロセス制御ブロック(1
002)を、双方向レディキューからデキューする。次に、
flags フィールド(1006)に PRIORITY_NORMAL が格納さ
れている場合には、レディキューヘッダ配列(1001)の b
ase_pri フィールド(1010)に格納されている値をインデ
ックスとする要素を求め、その要素をキューヘッダとす
る双方向レディキューの末尾に PCB で指されるプロセ
ス制御ブロック(1002)をエンキューする。また、flags
フィールド(1006)に PRIORITY_DEPRESSEDが格納されて
いる場合には、レディキューヘッダ配列(1001)の depre
ssed をインデックスとする要素を求め、その要素をキ
ューヘッダとする双方向レディキューの末尾に PCB で
指されるプロセス制御ブロック(1002)をエンキューす
る。
【0110】ステップ1206では、PCB の値を、PCB で指
されているプロセス制御ブロック(1002)の next_proc
フィールド(1003)の値に更新する。その後ステップ1202
にジャンプする。
【0111】ステップ1207では、レディキューヘッダ配
列(1001)の depressed をインデックスに持つ要素を求
め、その要素に格納されている制御ブロック(1002)への
ポインタを変数 PCB に代入する。
【0112】ステップ1208では、ステップ1207で更新さ
れた PCB の値が nil ポインタであるか否かのチェック
を行なう。nil ポインタであればステップ1213に、nil
ポインタでなければステップ 1209 にジャンプする。
【0113】ステップ1209では、PCB で指されるプロセ
ス制御ブロック(1002)の counterフィールド(1005)を1
だけデクリメントする。ただし、counter フィールド(1
005)に INFINITY が格納されている場合には、何も行な
わない。
【0114】ステップ1210では、PCB で指されるプロセ
ス制御ブロック(1002)の counterフィールド(1005)の値
が0であるか否かのチェックを行なう。counter フィー
ルド(1005)の値が0であればステップ1211に、0以外で
あればステップ1212にジャンプする。
【0115】ステップ1211では、PCB で指されるプロセ
ス制御ブロック(1002)の flags フィールド(1006)に応
じてレディキュー操作を行なう。すなわち、以下の操作
を行なう。まず、PCB で指されるプロセス制御ブロック
(1002)を、双方向レディキューからデキューする。次
に、flags フィールド(1006)に PRIORITY_NORMAL が格
納されている場合には、レディキューヘッダ配列(1001)
の base_pri フィールド(1010)に格納されている値をイ
ンデックスとする要素を求め、その要素をキューヘッダ
とする双方向レディキューの末尾に PCB から指される
プロセス制御ブロック(1002)をエンキューする。また、
flags フィールド(1006)に PRIORITY_RAISED が格納さ
れている場合には、レディキューヘッダ配列(1001)の r
aised をインデックスとする要素を求め、その要素をキ
ューヘッダとする双方向レディキューの末尾に PCB か
ら指されるプロセス制御ブロック(1002)をエンキューす
る。
【0116】ステップ1212では、PCB の値を、PCB で指
されているプロセス制御ブロック(1002)の next_proc
フィールド(1003)の値に更新する。その後、ステップ12
08にジャンプする。
【0117】ステップ1213からステップ1216において、
周期駆動カーネルプロセス(101)の駆動処理を行う。周
期駆動カーネルプロセス(101)は、以下の事象が生じた
場合に駆動される。
【0118】(a)プロセスグループ(915)に割り当て
られるべき CPU 時間が経過したとき 周期駆動カーネルプロセス(101)は、CPU 割り当て順序
記述テーブル(900)に従い、テーブルに記述された時間
(916)を各プロセスグループ(915)に順次与えていく。プ
ロセスグループ(915)に与えられた時間(916)が経過した
とき、そのプロセスグループ(915)に属する優先度が ra
ised のプロセスの PCB の counter が0になるので、
ステップ1204及びステップ1205によってそのプロセスの
優先度が PCB -> flags に応じてより低い優先度に変更
され、結果として raised の次に優先度の高い周期駆動
カーネルプロセス(101)が駆動される。周期駆動カーネ
ルプロセス(101)は、CPU を割り当てるべきプロセスグ
ループ(915)を変更する。次にCPU を割り当てるべきプ
ロセスグループ(915)が存在しない場合、周期駆動カー
ネルプロセス(101)は自らの優先度を depressed に変更
することにより、通常プロセス(109)への CPU 時間の割
り当てを実現する。
【0119】(b)CPU の割り当てを要求しているプロ
セスグループ(915)の最小 Interval(例えば図8の例で
は8タイムスロットであり、以後最小 Interval と略
す)が経過した場合 (a)で述べたように、周期駆動カーネルプロセス(10
1)は、次に CPU を割り当てるべきプロセスグループ(91
5)が存在しない場合、自プロセスの優先度を depressed
に変更する。しかし、最小 Interval が経過するたび
に、最小 Interval での駆動を要求しているプロセスグ
ループ(915)に CPU 時間を割り当てる必要が生じる。そ
のため、最小 Interval 周期で周期駆動カーネルプロセ
ス(101)を駆動し、該当プロセスグループ(915)に対する
CPU 時間の割り当て処理を行う。
【0120】最小 Interval による周期駆動カーネルプ
ロセス(101)の駆動間隔は、kproc_timer という変数に
よって管理される。この変数は、alloc_time_slot 関数
によって CPU 割り当て順序記述テーブル(900)を作成す
るときスケジューラによって最小Interval に初期化さ
れる。
【0121】ステップ1213で、kproc_timer を1だけデ
クリメントする。
【0122】ステップ1214では、ステップ1213で更新さ
れた kproc_timer の値が0であるか否かをチェックす
る。0であれば、上記(b)の周期駆動カーネルプロセ
ス(101)の駆動契機であることを示す。周期駆動カーネ
ルプロセス(101)の駆動処理のため、kproc_timer の再
初期化後ステップ1215にジャンプする。
【0123】kproc_timer が0以外の場合には、ステッ
プ1105からステップ1107で示される実行コンテクストの
退避回復処理を実行する。プロセスグループ(915)に割
り当てられるべき CPU 時間が経過した場合(上記
(a)の場合)、周期駆動カーネルプロセス(101)がシ
ステム内で最高優先度を保持するプロセスとなり、ステ
ップ1105からステップ1107の実行によって周期駆動カー
ネルプロセス(101)が駆動される。
【0124】ステップ1215で、CPU 割り当て順序記述テ
ーブル(900)の Index(914)を、プロセスグループ(915)
のフィールドに OTHERS が格納されているエントリまで
進める。例えば、図9で、Index(914)が906のエントリ
を指していた場合、本ステップはIndex(914)が907のエ
ントリを指すように更新する。本ステップにより、ステ
ップ1216で駆動される周期駆動カーネルプロセス(101)
が、プロセスグループ(915)のフィールドに OTHERS が
格納されているエントリの次のエントリから、プロセス
グループ(915)への CPU 時間の割り当て処理を開始する
ことができる。Index(914)がすでにプロセスグループ(9
15)のフィールドに OTHERS が格納されているエントリ
を指している場合には、何も行わない。
【0125】ステップ1216で、proc_depress_cancel(ke
rn_proc, PRIORITY_NORMAL)関数を呼び出す。kern_proc
は、周期駆動カーネルプロセス(101)のプロセス識別子
を表す。本関数の実行により、周期駆動カーネルプロセ
ス(101)の優先度が depressed であれば depressed か
ら基準優先度(raised の次に高い優先度)に変更され
る。周期駆動カーネルプロセス(101)の優先度が基準優
先度であれば、この関数の実行によって優先度の変更は
ない。この時点で、優先度が raised であるプロセスは
存在しないことが保証される(各プロセスグループ(91
5)に、周期駆動カーネルプロセス(101)の駆動契機を待
たないで CPU 時間を割り当てないように、CPU 割り当
て順序記述テーブル(900)を設定している)ので、上記
(b)の場合の周期駆動カーネルプロセス(101)の駆動
が実現できる。
【0126】なお周期プロセス(102)の PCB->counter
がタイムスロットの間隔ごとに正しくデクリメントされ
るためには、周期プロセス(102)の PCB が常にレディキ
ューに接続されている必要がある。従って周期プロセス
(102)の PCB がレディキューから外されるようなウェイ
トは禁止される。周期プロセス(102)は、ウェイトする
場合、割り当てられた CPU 時間内でダイナミック・ジャ
ンプ等の手段によってウェイトする必要がある。
【0127】周期駆動カーネルプロセス(101)の動作の
フローチャートを図13に示す。
【0128】周期駆動カーネルプロセス(101)は、CPU
の割り当てを要求しているプロセスグループ(103)に割
り当てられた時間(916)又は最小 Interval ごとに、タ
イマ割り込みハンドラ(104)によって駆動される。すな
わちそのときタイマ割り込みハンドラ(104)を実行して
いたプロセスが周期駆動カーネルプロセス(101)を起動
する。周期駆動カーネルプロセス(101)は、基準優先度
で動作する。
【0129】ステップ 1301 において、CPU 割り当て順
序記述テーブル(900)の Index(914)をテーブルの1エン
トリ分インクリメントする。CPU 割り当て順序記述テー
ブル(900)の Index(914) は、次に周期駆動カーネルプ
ロセス(101)により CPUを割り当てられるべきプロセス
グループ(915)などを示すエントリを指している。
【0130】ステップ 1302 において、Index(914) に
より指される CPU 割り当て順序記述テーブル(900)のエ
ントリを検索する。
【0131】ステップ 1303 において、ステップ 1302
で得られたエントリのプロセスグループ(915)のフィー
ルドが OTHERS であるか否かの検査を行なう。
【0132】プロセスグループ(915)が OTHERS である
場合には、ステップ 1304において proc_depress(MYSEL
F, INFINITY, PRIORITY_NORMAL) をコールする。これに
より、周期駆動カーネルプロセス(101)は proc_depres
s_cancel 関数が発行されるまで、優先度が depressed
になる。周期的な CPU の割り当てを要求しているプロ
セスグループ(103)の最小 Interval ごとに、タイマ割
り込みハンドラ(104)からproc_depress_cancel 関数が
発行される。それまで、連続メディア処理を行なわない
通常プロセス(109)(alloc_time_slot 関数により周期
的なスケジューリングを要求していないプロセス)がス
ケジューリングされる。
【0133】プロセスグループ(915)が OTHERS でない
場合には、ステップ 1305 において、次に CPU を割り
当てるべきプロセスグループ(915)が一周期分の実行を
完了しているか否かを検査する。これは、図14に示す
ような、実行状態記述テーブル(1400)の done フィール
ド(1401)のフラグを用いて判定される。これは、alloc
_time_slot 関数を用いて周期的なスケジューリングを
要求しているプロセスグループ(103)ごとに、一周期分
の実行が完了したか否かを記述するフィールドである。
周期的なスケジューリングを要求しているプロセスグル
ープ(103)に属している周期プロセス(102)は、一周期分
の実行完了時に proc_raise_cancel 関数を自プロセス
に対して発行する(後述)。この関数を呼び出した周期
プロセス(102)が属するプロセスグループ(103)の done
フラグは、この関数の処理ルーチン内でセットされる。
【0134】ステップ 1302 で得られたエントリのプロ
セスグループ(915)が一周期分の実行を完了していた場
合には、ステップ 1306 においてそのエントリの終了予
定フラグ(917)を検索する。
【0135】終了予定フラグ(917)が FALSE であれば、
ステップ 1301 に戻る。
【0136】終了予定フラグ(917)が TRUE であれば、
ステップ 1308 において実行状態記述テーブル(1400)の
done フィールド(1401)の該当フラグをクリアする。さ
らにactive pid フィールド(1402)も初期化する。この
初期化方法はすぐ後で述べる。この後、ステップ 1301
に戻る。
【0137】ステップ 1305 で一周期分の実行を完了し
ていないと判定された場合には、ステップ 1309 におい
て、ステップ 1302 で得られたエントリの終了予定フラ
グ(917)を検査する。
【0138】終了予定フラグ(917)が TRUE であれば、
ステップ 1307 で proc_raise(pid,TIME, PRIORITY_DEP
RESS | SEND_SIGNAL) を発行する。pid には、実行状態
記述テーブル(1400)の active pid フィールド(1402)に
格納されているプロセス識別子が使用される。TIME に
はエントリの時間フィールド(916)の値が使用される。
実行状態記述テーブル(1400)の active pid フィールド
(1402)は、現在、プロセスグループ(103)に属するどの
周期プロセス(102)が連続メディア処理を実行中である
かを示す。このステップの直後に、TIME で指定した時
間にわたり pid で指定した周期プロセス(102)がスケジ
ューリングされる。
【0139】ステップ 1308 で該当エントリが初期化さ
れる。ステップ 1308 では、ステップ 1302 で選択され
たプロセスグループ(915)に対応する active pid フィ
ールド(1402)内のエントリが、そのプロセスグループ(9
15)のグループマスタのプロセス識別子に初期化され
る。また、proc_raise_handoff 関数が発行されると、
その処理ルーチン内で、ハンドオフ先のプロセス識別子
に active pid フィールド(1402)の該当エントリが更新
される。また proc_raise_cancel 関数が発行される
と、終了予定フラグ(917)が TRUE の場合、その処理ル
ーチン内で active pid フィールド(1402)の該当エント
リが初期化される。
【0140】ステップ 1309 で終了予定フラグ(917)が
FALSE であると判定されれば、ステップ 1310 において
、proc_raise(pid, TIME, PRIORITY_DEPRESS) を発行
し、処理を終了する。pid, TIME の設定方法はステップ
1307 の場合と同様である。やはり、このステップの直
後に、TIME で指定した時間にわたり pid で指定した周
期プロセス(102)がスケジューリングされる。
【0141】周期的なスケジューリングを要求している
プロセスグループ(103)に属する周期プロセス(102)群の
動作を図15から図17に示す。
【0142】図15は、プロセスグループ(103)内に属
する周期プロセス(102)の起動順序を示す図である。
【0143】プロセスグループ(103)に属する周期プロ
セス(102)は、その処理順が予め定められている。プロ
セスグループ(103)のグループマスタプロセス(1501)
は、周期駆動カーネルプロセス(101)の proc_raise 関
数により優先度が raised になり、起動する。プロセス
グループ(103)に属する各プロセス(102)は、proc_raise
_handoff 関数を用いて、次の順番の周期プロセス(102)
に優先度を継承する。継承後の自プロセス(102)の優先
度は depressed になる。最後の順番の周期プロセス(10
2)は、proc_raise_cancel 関数を用いて、一周期分の実
行を完了する。
【0144】図16は、グループマスタプロセス(1501)
の動作を示すプログラムである。
【0145】1601 行目で、自プロセスをグループマス
タプロセス(1501)とするプロセスグループ(103)を生成
する。以後、このプロセスグループ(103)がスケジュー
リングの単位になる。
【0146】1602 行目で、1601 行目で生成したプロセ
スグループ(103)に、interval で指定される間隔で、le
ngth で指定される CPU 時間を割り当てることを要求す
る。この関数発行後、図15で示されるように、周期駆
動カーネルプロセス(101)からグループマスタプロセス
(1501)に対し proc_raise 関数が発行されるようにな
る。
【0147】1603 行目から 1606 行目までが、連続メ
ディア処理を行なうループである。一周期分の連続メデ
ィア処理を行なった後、1605 行目で proc_raise_hando
ff関数を呼び出し、次に処理を行なうべき 1601 行目で
生成したプロセスグループ(103)に属するプロセス(102)
の優先度を raised にする。自プロセスの優先度はdepr
essed になる。
【0148】連続メディア処理の実行ループを指定回数
実行すると、1607 行目で、1602 行目で発行した CPU
時間の割り当て要求を解除する。
【0149】さらに、1608 行目で、1601 行目で生成し
たプロセスグループ(103)を削除する。
【0150】図17は、スレーブプロセス(102)の動作
を示すプログラムである。
【0151】1702 行目から 1704 行目までが連続メデ
ィア処理を行なうループである。
【0152】一周期分の連続メディア処理を行なった
後、1703 行目で proc_raise_handoff関数を呼び出し、
次に処理を行なうべき 1601 行目で生成したプロセスグ
ループ(103)に属する周期プロセス(102)の優先度を rai
sed にする。自プロセスの優先度は depressed にな
る。ただし、最後の順番の周期プロセス(102)は、1704
行目で proc_raise_cancel 関数を発行し、自プロセス
の優先度を depressed に変更する。連続メディア処理
の実行ループを指定回数実行すると、プログラムは終了
する。
【0153】一周期分の CPU の割り当て時間内に一周
期分の実行が完了しなかった場合には、実行状態記述テ
ーブル(1400)の active pid フィールド(1402)に登録さ
れているプロセス(102)に対しタイムアウトのシグナル
が送信される。かつ、実行状態記述テーブル(1400)の d
one フィールド(1401)内フラグに、IN_SIGNAL_TRANSACT
ION を示すフラグが立てられる。
【0154】このフラグが立っているプロセスグループ
(103)に関しては、ステップ 1305におけるプロセスグル
ープ(915)の実行終了判定が常に TRUE と判定される。
また、ステップ 1308 の done フィールド(1401)のクリ
アも行なわれない。すなわち、シグナルハンドラは、周
期プロセス(102)の基準優先度で、通常プロセス(109)と
同様にスケジューリングされ実行されることになる。こ
れにより、一つのストリームの処理遅延が他ストリーム
処理に影響を及ぼさないことを保証できる。
【0155】第1の実施形態によれば、単一の周期駆動
カーネルプロセス(101)が CPU 割り当て順序記述テーブ
ル(900)に基づいてすべてのプロセスグループ(103)の周
期的スケジューリングをするので、複数のプロセスグル
ープ(103)の間で CPU 時間の競合が生じることによって
周期プロセス(102)の実行が遅延することはない。また
周期プロセス(102)の実行優先度を変更した後、プロセ
ス・ディスパッチに依存した周期プロセス(102)の起動を
行うので、プロセス間通信を介して周期プロセスを起動
する場合に比べて起床通知に伴うオーバヘッドがより小
さい。また指定した CPU 時間を使い果たし、タイムア
ウトとなつたプロセスのシグナルハンドラ処理は、その
プロセスの基準優先度で実行されるため、シグナルハン
ドラ処理によつて他のプロセスグループの実行遅延を引
き起こすことはない。
【0156】(2)第2の実施形態 第1の実施形態では、プロセスグループ(103)に割り当
てられた時間(916)又は最小 Interval ごとにタイマ割
り込みハンドラ(104)を実行するプロセスから周期駆動
カーネルプロセス(101)へプロセス・スイッチするので、
このときプロセス・スイッチのオーバヘッドが介入す
る。第2の実施形態は、周期駆動カーネルプロセス(10
1)の代わりにプロセスのスケジューリングを制御するモ
ジュール(以後、スケジューラと呼ぶ)を設けてタイマ
割り込みハンドラ(104)とスケジューラを同一プロセス
で実行することによつてタイマ割り込みハンドラ(104)
から周期駆動カーネルプロセス(101)へのプロセス・スイ
ッチのオーバヘッドを削減する。スケジューラを用いて
本発明を実現するシステムの構成を図18に示す。
【0157】システムには、一つのスケジューラ(1801)
が存在する。スケジューラは、周期プロセスの優先度変
更、次にスケジューリングするプロセスの決定、及びそ
のプロセスのディスパッチ動作を行なう。スケジューラ
は、タイマ割り込みハンドラ(104)により周期的に呼び
出される。また、連続メディア処理を行なう周期プロセ
ス(102)が、処理順が次の周期プロセス(102)に優先度の
継承を行なう際、また、処理順が最後の周期プロセス(1
02)が、1周期分の実行を完了し、自プロセスの優先度
を変更する際にも、各関数の処理ルーチン内でスケジュ
ーラは呼び出される。これらのスケジューラ呼び出し方
法の詳細は後述する。
【0158】第1の実施形態と同様に、同一の連続メデ
ィア処理データを処理する周期プロセス(102)は、プロ
セスグループ(103)を形成する。プロセスグループ(103)
の生成、削除は、前述の create_proc _group、destroy
_proc_group 関数を用いて行なう。プロセスグループ(1
03)内で処理順の先頭の周期プロセス(102)は、外部入力
装置(105)から入力バッファ(106)を介して連続メディア
データを読み取り、データ加工を行なう。加工されたデ
ータは共有バッファ(110)を介して、処理順が次の周期
プロセス(102)に渡される。処理順が最後の周期プロセ
ス(102)は、出力バッファ(107)を介して外部出力装置(1
08)に出力する。
【0159】プロセスグループ(103)は、スケジューリ
ングの単位となる。プロセスグループ(103)のグループ
マスタプロセスは、その初期化時において、前述の all
oc_time_slot 関数を用いて、指定周期ごとに指定時間
にわたりプロセスグループ(103)に対し CPU が割り当て
られることを予約する。また、CPU 時間の割り当てが不
要になった場合には、前述の dealloc_time_slot 関数
を呼び出し、その予約を解除する。
【0160】alloc_time_slot 関数が呼び出されると、
スケジューラは、各プロセスグループが要求する周期と
1周期あたりの実行時間を満たすような CPU の割り当
て順序を決定し、CPU 割り当て順序記述テーブル(900)
を作成する。この作成アルゴリズムは第1の実施形態で
述べた通りである。
【0161】スケジューラ(1801)は、CPU 割り当て順序
記述テーブル(900)に基づいて各周期プロセス(102)のス
ケジューリングを行なう。プロセスグループ(103)に対
してCPU を割り当てるべき時間が到達すると、スケジュ
ーラ(1801)はそのプロセスグループ(103)のグループマ
スタプロセスの優先度を raised にする(前述の proc_
raise 関数を呼び出す)。グループマスタプロセスの優
先度が raised になってから指定時間経過すると、タイ
マ割り込みハンドラ(104)から呼び出されたスケジュー
ラ(1801)は、プロセスグループ(103)に属する周期プロ
セス(102)のうち優先度が raised である周期プロセス
(102)の優先度を depressed にする。このタイマ割り込
みハンドラ(104)からのスケジューラの呼び出し方法、
スケジューラの動作の詳細は後述する。これにより、プ
ロセスグループ(103)に CPU が割り当てられるべき時間
は、優先度が raised であるプロセスグループ(103)に
属する周期プロセス(102)が実行可能状態にある限り、
プロセスグループ(103)に属さないユーザプロセスがス
ケジューリングされることはない。また、CPU が割り当
てられるべきでない時間は、プロセスグループ(103)に
属する周期プロセス(102)がスケジューリングされるこ
とはない。いずれのプロセスグループ(103)にも割り当
てられない CPU 時間は、通常プロセス(109)又はアイド
ルプロセスに割り当てられる。
【0162】上記で述べたように、スケジューラ(1801)
は、タイマ割り込みハンドラ(104)または、自プロセス
もしくは他プロセスの優先度変更を要求する周期プロセ
ス(102)から呼ばれ得る。スケジューラを呼び出すとき
に用いるコマンドリストの形式を図19に示す。
【0163】スケジューラ(1801)を呼び出すタイマ割り
込みハンドラ(104)、周期プロセス(102)は、その呼び出
し関数の引数として図19で示されるコマンドリストの
先頭エントリへのポインタ(1901)を指定する。コマンド
リストは、スケジューラの動作の指示をリスト形式で示
したものである。コマンドリストの各エントリは、next
_command フィールド(1902)、flag フィールド(1903)、
pid フィールド(1904)からなる。next_command フィー
ルド(1902)は、次のエントリへのポインタが格納され
る。リストの最後尾のエントリの next_command フィー
ルドの値は nilである。flag フィールドには、HANDOF
F、CANCEL、INTERVAL、TIMER が指定可能である。ま
た、pid フィールドは、flag フィールドが HANDOFF の
ときのみ意味を持つ。
【0164】タイマ割り込みハンドラ(104)は、その駆
動のたびに flag に TIMER を格納したエントリからな
るコマンドリストをスケジューラ(1801)に渡す。また、
CPU の割り当てを要求しているプロセスグループ(103)
の最小 Interval ごとに、上記エントリの他に、flag
に INTERVAL を格納したエントリをもスケジューラに渡
す。従ってタイマ割り込みハンドラ(104)は前述の kpro
c_timer によって最小 Interval を判定する必要があ
る。
【0165】周期プロセス(102)が、処理順が次の周期
プロセス(102)に優先度を継承する場合、flags に HAND
OFF を、pid に処理順が次の周期プロセス(102)の識別
子を格納したエントリからなるコマンドリストをスケジ
ューラに渡す。
【0166】また、処理順が最後の周期プロセス(102)
が一周期分の実行を完了し、自プロセスの優先度を dep
ressed に変更する場合は、flags に CANCEL を格納し
たエントリからなるコマンドリストをスケジューラに渡
す。
【0167】最後に、上記コマンドリストを受け取り駆
動するスケジューラの動作フローを図20を用いて説明
する。
【0168】ステップ2001において、スケジューラは、
渡されたコマンドリストの先頭エントリの flag フィー
ルドを検索する。flag フィールドが HANDOFF であれば
ステップ2002に、flag フィールドが CANCEL であれば
ステップ2003に、ジャンプする。flag フィールドが IN
TERVAL であればステップ1215を実行後、ステップ2006
にジャンプする。flag フィールドが TIMER であればス
テップ1201〜1212を実行した後、ステップ1204で PCB -
> counter が0と判定されたプロセス、すなわちプロセ
スグループ(915)に割り当てられた CPU の時間(916)が
経過したプロセスであり、かつ next_command フィール
ドによって指される flag フィールドがINTERVAL でな
ければステップ2015にジャンプする。この条件を満足し
ない場合にはステップ2012にジャンプする。
【0169】ステップ2015において、スケジューラ起動
直前に CPU 時間が割り当てられていたプロセスグルー
プ( CPU 割り当て順序記述テーブル(900)の Index(91
4)で指されるエントリ)の終了予定フラグ(917)を検索
する。終了予定フラグ(917)がON であれば、第1の実施
形態で述べたタイムアウトのシグナル送信処理を行い、
ステップ2006にジャンプする。終了予定フラグ(917)が
OFF であれば直接ステップ2006にジャンプする。
【0170】ステップ2002において、優先度の継承元と
なる周期プロセス(1202)及び継承先となる周期プロセス
(1202)の優先度、プロセス制御ブロック(1002)内のカウ
ンタフィールド(1005)、フラグフィールド(1006)を更新
する。この更新方法は、図11で示したフローチャート
と同様になるので省略する。そして、ステップ2012にジ
ャンプする。
【0171】ステップ2003において、スケジューラ起動
直前に CPU 時間が割り当てられていたプロセスグルー
プ(CPU 割り当て順序記述テーブル(900)の Index(914)
で指されるエントリ)の終了予定フラグ(917)を検索す
る。終了予定フラグ(917)が ON であればステップ2005
に、OFF であればステップ2004にジャンプする。
【0172】ステップ2004において、実行状態記述テー
ブル(1400)の該当エントリの doneフィールド(1401)を
セットしてステップ2006にジャンプする。
【0173】ステップ2005は、ステップ1308と同じ動作
を行ない、ステップ2006にジャンプする。
【0174】ステップ2006は、ステップ1301〜1302と同
じ動作を行ない、ステップ2007にジャンプする。
【0175】ステップ2007において、ステップ2006で得
られたエントリのプロセスグループ(915)のフィールド
が OTHERS であるか否かの検査を行なう。OTHERS であ
ったらステップ2012に、それ以外であったらステップ20
08にジャンプする。
【0176】ステップ2008において、ステップ2006でイ
ンクリメントされた Index(914)で指されるエントリの
終了予定フラグ(917)、及び、そのエントリに対応する
実行状態記述テーブル(1400)の done フィールド(1401)
を検索する。両ビットが共にセットされていたらステッ
プ2009に、done フィールドのみセットされていたらス
テップ2006に、終了予定フラグのみセットされていれば
ステップ2010に、共にクリアされていたらステップ2011
にジャンプする。
【0177】ステップ2009は、ステップ1308と同じ動作
を行ない、ステップ2006にジャンプする。
【0178】ステップ2010は、Index(914)で指されるエ
ントリに登録されているプロセスグループ(103)のグル
ープマスタプロセス(1501)である周期プロセス(102)
を、エントリの時間(916)のフィールドで指定された時
間にわたり優先度を raised に変更し、かつ、その時間
の経過後にシグナルを送信すべく、プロセスの優先度、
及び対応するプロセス制御ブロック(1002)のカウンタフ
ィールド(1005)、フラグフィールド(1006)の更新を行な
う。この更新方法は、図11で示したフローチャートと
同様になるので省略する。その後ステップ2012にジャン
プする。
【0179】ステップ2011は、Index(914)で指されるエ
ントリに登録されているプロセスグループ(103)のグル
ープマスタ(1501)である周期プロセス(102)を、エント
リの時間フィールド(916)で指定された時間にわたり優
先度を raised に変更し、かつ、その時間の経過後にシ
グナルを送信しないように、プロセスの優先度、対応す
るプロセス制御ブロック(1002)のカウンタフィールド(1
005)、フラグフィールド(1006)の更新を行なう。この更
新方法は、図11で示したフローチャートと同様になる
ので省略する。その後ステップ2012にジャンプする。
【0180】ステップ2012では、ステップ2001から2011
で処理したエントリの next_command フィールドを検索
する。その値が nil でなければステップ2001に戻る。n
ilであれば、ステップ1105から1107を実行後終了する。
【0181】(3)第3の実施形態 第1の実施形態又は第2の実施形態の周期プロセスのス
ケジューリング方法に従ってシステムが動作中にネット
ワーク・パケットの到達などの非同期イベントが多発す
ると、周期プロセス(102)の実行が阻害され、周期プロ
セス(102)の駆動周期間隔のゆらぎが大きくなる。すな
わちネットワーク・パケットの受信処理などの非同期イ
ベント処理は、ある程度の応答性能が求められるため、
非同期イベント処理を優先し、その処理を行なうプロセ
スの優先度を周期プロセス(102)より高くすると、周期
プロセス(102)の実行時間に遅れが生じ得る。第3の実
施形態は、この問題を解決するために、ネットワーク・
パケットの受信処理を行う割り込みハンドラを階層化す
るものである。第1の実施形態又は第2の実施形態のタ
イマ割り込みハンドラ(104)、周期駆動カーネルプロセ
ス(101)、スケジューラ(1801)及びプロセスグループ(10
3)には変更がなく、第3の実施形態は第1の実施形態又
は第2の実施形態を補強する形で実施される。以下非同
期割り込みハンドラとしてネットワーク・パケットの受
信処理を行なう割り込みハンドラを例にとってこの割り
込みハンドラの構成、及びその動作方法を説明する。
【0182】図21に、本割り込みハンドラを中心とす
るシステムの構成、及び割り込みハンドラの構成を示
す。タイマ割り込みハンドラ(104)、周期駆動カーネル
プロセス(101)、スケジューラ(1801)等は図示を省略す
る。
【0183】本システムは、ハードウェアとして CPU(2
101)と、Ether ボード(2102)を有する。Etherボード(21
02)は、パケットを受信した際に、そのパケット到達をC
PU(2101)に通知し、パケット受信処理を行なうルーチン
(割り込みハンドラ)をCPU(2101)上で駆動する機能を
備える。また、CPU(2101)上には、パケット受信によっ
て駆動される第1レベル割り込みハンドラ(2103)の他
に、第2レベル割り込みハンドラ(2104)、アプリケーシ
ョン・プログラム(2105)が設けられる。第2レベル割り
込みハンドラ(2104)は、周期プロセス(102)の一つとし
て、前述したスケジューリング方法に従って周期駆動カ
ーネルプロセス(101)又はスケジューラ(1801)により周
期的に駆動される。アプリケーション・プログラム(210
5)は、受信したパケットを処理する業務プログラムであ
り、周期プロセス(102)又は通常プロセス(109)によって
走行する。
【0184】第1レベル割り込みハンドラ(2103)の動作
フローを図22に示す。
【0185】先に述べたように、第1レベル割り込みハ
ンドラ(2103)は、Etherボード(2102)のパケット到達通
知を契機に駆動される。そしてまずステップ2201で、受
信したパケットをパケットキュー(2106)にエンキューす
る。ステップ2202で、空きバッファ群(2108)の中から受
信バッファを一つ確保する。ステップ2203で、ステップ
2202で確保した受信バッファに対するパケット受信を要
求するコマンドをEtherボード(2102)に対し発行する。
すなわち第1レベル割り込みハンドラ(2103)は、受信バ
ッファを確保してパケットを受信する準備を行うだけで
あり、受信バッファ内の情報を参照するような処理を一
切しない。Ether ボード(2102)は、パケット到達を通知
してから、ステップ2203が実行されるまでの間に到達し
たパケットを受信することができない。なぜなら、第1
割り込みハンドラ(2103)から、受信パケットを格納すべ
き受信バッファのアドレスを指定されていないためであ
る。従ってその間にパケットが到達しても、Etherボー
ド(2102)はパケット受信に失敗し、そのパケットは喪失
されるが、その時間は最小限に抑えられる。
【0186】第2レベル割り込みハンドラ(2104)は、指
定した周期で周期駆動される。そして、第1レベル割り
込みハンドラ(2103)によりエンキューされたパケットキ
ュー(2106)に繋がれたパケットをデキューし、デキュー
したパケットを参照してプロトコル処理を行なう。そし
て、このプロトコル処理の結果、アプリケーション・プ
ログラム(2105)に渡すべき受信データが得られたなら
ば、受信データキュー(2107)にその受信データをエンキ
ューする。従って第2レベル割り込みハンドラ(2104)
は、単にあるプロセスグループ(103)に属する周期プロ
セス(102)の一つとして、スケジューリングされる。
【0187】アプリケーション・プログラム(2105)は、
受信データキュー(2107)にエンキューされた受信データ
のデキューと、受信データが格納されている受信バッフ
ァの解放処理を行なう。
【0188】周期プロセス(102)実行中にパケットが到
達した場合、周期プロセス(102)の実行は停止され、第
1割り込みハンドラ(2103)の実行が開始される。第1割
り込みハンドラ(2103)の実行を最優先で行なうことによ
り、Etherボード(2102)のパケット受信失敗によるパケ
ット喪失の発生を防いでいる。すなわち第1の実施形態
又は第2の実施形態に第3の実施形態を適用することに
よって、従来のように第1レベル割り込みハンドラ(210
3)と第2レベル割り込みハンドラ(2104)を1つのパケッ
ト受信割り込みハンドラで処理する場合に比べて、パケ
ット喪失の確率を小さくするとともに、周期プロセス(1
02)の実行遅れを少なくし、この両者の利点を両立させ
るものである。
【0189】第2レベル割り込みハンドラ(2104)は、周
期プロセス(102)としてスケジューリングされるため、
自プロセスに CPU(2101)が割り当てられる時刻になるま
では、パケットキュー(2106)にパケットがキューイング
されていても、その実行を開始することはない。そのた
め、第1割り込みハンドラ(2103)の実行が完了したら直
ちに周期プロセス(102)の実行は再開される。このよう
に割り込みハンドラを階層化することにより、パケット
到達に伴う周期プロセス(102)の実行停止時間を、第1
レベル割り込みハンドラ(2103)の実行時間のみに抑える
ことが可能になっている。
【0190】また、第2レベル割り込みハンドラ(2104)
は周期駆動が保証されている。そのため、パケットが到
達してからその駆動周期に相当する時間が経過する間
に、必ず1回は第2レベル割り込みハンドラ(2104)が駆
動される。すなわち、パケット到達から受信データキュ
ー(2107)へのエンキューまでに要する時間の上限も第2
レベル割り込みハンドラ(2104)の駆動周期となり、ネッ
トワーク・パケットの受信処理の応答性能の保証も可能
となる。
【0191】
【発明の効果】本発明のスケジューリング方法は、複数
の周期的な CPU の割り当て要求を同時に満たす CPU 時
間の割り当てアルゴリズムを提供する。このアルゴリズ
ムを用いた、一周期分の連続メディア処理の実行開始間
隔の変動は、周期駆動カーネルプロセスの駆動間隔より
短くなることが保証される。かつ、要求周期の短いプロ
セス、すなわち実行開始間隔の変動の絶対値を小さく抑
えねばならないプロセスほど周期駆動カーネルプロセス
の駆動後すぐに CPU 時間が割り当てられる。そのた
め、周期の短いプロセスほど、実行開始間隔の変動を小
さく抑えることが可能になる。
【0192】連続メディアデータの到達レートが一定で
ある場合、入力バッファの切り替えなどの入力バッファ
管理は周期的に行なえば良い。そのため、周期的なプロ
セスのスケジューリングが保証できれば、連続メディア
処理を行なうプロセスが自発的に入力バッファを切り替
えれば良く、入力連続メディアデータ到達の割り込みに
よる通知を必要としなくなる。割り込みオーバーヘッド
削減による連続メディア処理の性能向上が期待できる。
【0193】また、本発明のスケジューリング方法で
は、連続メディア処理を行なう各プロセスの起床、休眠
は優先度の変更により実現している。従来の IPC を用
いた方式よりも、起床、休眠に要するオーバーヘッドが
削減できる。この点からも連続メディア処理の性能向上
が期待できる。
【0194】さらに、本発明のスケジューリング方法で
は、一つのプロセスグループにデッドラインミスが発生
し、対象プロセスにシグナルが配送された場合、シグナ
ルハンドラの優先度は、連続メディア処理を行なうプロ
セスよりも低優先度であることが保証される。そのた
め、一つのストリームの処理遅延が他ストリーム処理に
影響を及ぼさないことを保証できる。
【0195】さらに、本発明の CPU 割り当てアルゴリ
ズムでは、各プロセスグループに割り当てられる時間を
できるだけ連続にとる。そのため、プロセススイッチ回
数が最小限に押さえられる。プロセススイッチに要する
オーバーヘッド削減による連続メディア処理の性能向上
も期待できる。
【0196】さらに、本発明の CPU 割り当てアルゴリ
ズムでは、各プロセスグループ間の実行時間比は常に一
定に保たれる。そのため、ランデブなどの同期機構を使
用しなくとも、ストリーム間同期の実現が可能になる。
【0197】さらに本発明は、非同期イベントが発生し
た際の連続メデイア処理を行うプロセスの実行間隔の変
動を防止できる。
【図面の簡単な説明】
【図1】本発明のスケジューリング方法におけるプロセ
ス起動及びデータの流れを示す図である。
【図2】プロセスグループを管理するデータの構造を示
す図である。
【図3】create_proc_group 関数のフローチャートであ
る。
【図4】destroy_proc_group 関数のフローチャートで
ある。
【図5】プロセスグループに割り当てる CPU 時間の重
なりを解消する方法を示す図である。
【図6】タイムスロットテーブル作成のフローチャート
である。
【図7】タイムスロットテーブルの作成例の結果を示す
図である。
【図8】タイムスロットテーブルの作成例のための入力
データを示す図である。
【図9】CPU 割り当て順序記述テーブルの構成を示す図
である。
【図10】プロセスを管理するデータの構造を示す図で
ある。
【図11】proc_raise 関数のフローチャートである。
【図12】タイマ割り込みハンドラのフローチャートで
ある。
【図13】周期駆動カーネルプロセスのフローチャート
である。
【図14】実行状態記述テーブルの構成を示す図であ
る。
【図15】連続メディア処理プロセスの起動の流れを示
す図である。
【図16】グループマスタプロセスのプログラムを示す
図である。
【図17】スレーブプロセスのプログラムを示す図であ
る。
【図18】本発明のスケジューリング方法におけるプロ
セス起動及びデータの流れを示す図である。
【図19】コマンドリストの構成を示す図である。
【図20】スケジューラのフローチャートである。
【図21】ネットワーク・パケット受信システムの構成
を示す図である。
【図22】第1レベル割り込みハンドラのフローチャー
トである。
【符号の説明】
101:周期駆動カーネルプロセス、102:周期プロ
セス、103:プロセスグループ、700:タイムスロ
ットテーブル、900:CPU 割り当て順序記述テーブ
ル、1400:実行状態記述テーブル、1801:スケ
ジューラ、
フロントページの続き (72)発明者 中野 隆裕 神奈川県川崎市麻生区王禅寺1099番地 株式会社日立製作所 システム開発研究 所内 (72)発明者 岩嵜 正明 神奈川県川崎市麻生区王禅寺1099番地 株式会社日立製作所 システム開発研究 所内 (56)参考文献 特開 平3−257633(JP,A) 特開 平6−67899(JP,A) 特開 昭62−266625(JP,A) 特開 平3−57026(JP,A) 特開 平8−241290(JP,A) 松岡聡・他、「マルチメディア処理に おけるOSレベルでのリソース・リザベ ーション」、情報処理学会研究報告 V ol.94、No.32(94−OS−63)情 報処理学会・発行(1994年3月)、P. 73〜80 盛岡敏・他、「QOS管理のための外 部資源管理機構について」、情報処理学 会研究報告 Vol.95、No.59(95 −OS−69)、情報処理学会・発行 (1995年6月)、P.61〜66 藤田・他、「動的QoSをサポートす るプロセッサ管理機構」、電子情報通信 学会技術研究報告 Vol.94、No. 573(CPSY94−117)、P.9〜16 (58)調査した分野(Int.Cl.6,DB名) G06F 9/46 G06T 1/00 G06F 3/14 JICSTファイル(JOIS)

Claims (3)

    (57)【特許請求の範囲】
  1. 【請求項1】周期的に実行される少なくとも1つのプロ
    セスを含むプロセスグループが複数存在し、これら複数
    のプロセスグループを並行実行させる計算機システムの
    周期的プロセススケジューリング方法において、 各プロセスグループごとに起動間隔周期と一周期ごとの
    必要CPU時間が指定されたとき、指定されたプロセス
    グループのCPU割り当て時間が他のプロセスグループ
    のCPU割り当て時間と衝突しないように確保し、かつ
    指定された各プロセスグループの起動間隔周期を保つよ
    うに調整する周期的プロセススケジューリング方法であ
    って 、 タイムスロットを単位としてCPU時間を割り当てるプ
    ロセスグループの順番を登録するテーブルを作成するス
    テップと、 起動間隔周期が短いプロセスグループから順にタイムス
    ロットを割り当てるようにプロセスグループを選択する
    ステップと、 選択したプロセスグループの起動間隔周期の範囲で連続
    して空いているタイムスロットである連続空きスロット
    を抽出するステップと、 必要CPU時間以上のサイズをもつ連続空きスロット群
    が存在するならば、必要CPU時間以上で最小のサイズ
    をもつ連続空きスロットの先頭から必要CPU時間だけ
    の連続する空きタイムスロットを選択したプロセスグル
    ープに割り当てるステップと、 必要CPU時間以上のサイズをもつ連続空きスロット群
    が存在しなければ、サイズが最大の連続空きスロットの
    全タイムスロットを選択したプロセスグループに割り当
    て、さらに必要CPU時間から割り当てたタイムスロッ
    ト分を差し引いた残り時間分について前ステップと本ス
    テップにより該プロセスグループに割り当てるステッ
    プ、とを有することを特徴とする周期的プロセススケジ
    ューリング方法。
  2. 【請求項2】周期的に実行される少なくとも1つのプロ
    セスを含むプロセスグループが複数存在し、これら複数
    のプロセスグループを並行実行させる計算機システムの
    周期的プロセススケジューリング方法において、 各プロセスグループごとに起動間隔周期と一周期ごとの
    必要CPU時間が指定されたとき、指定されたプロセス
    グループのCPU割り当て時間が他のプロセスグループ
    のCPU割り当て時間と衝突しないように確保し、かつ
    指定された各プロセスグループの起動間隔周期を保つよ
    うに調整する周期的プロセススケジューリング方法に従
    ってスケジュールされたプロセスを起動する方法であっ
    て、該プロセスグループの1つにCPUを割り当てる時点に
    達したとき、該プロセスグループに属するプロセスの実
    行優先度をシステム内で最高の優先度に変更することに
    よって該プロセスを起動し、その後該プロセスから優先
    度変更の要求がある場合を除いて連続して割り当てられ
    たCPU割り当て時間分だけ最高の優先度を保ち、連続
    して割り当てられた該CPU割り当て時間が経過する前
    に同一プロセスグループに属する第1のプロセスから第
    2のプロセスへ優先度を継承するよう指示されたとき、
    第1プロセスの実行優先度をシステム内で最高の優先度
    から最低の優先度に変更し、第2プロセスの実行優先度
    を最高の優先度に変更することによって第2プロセスを
    起動することを特徴とするプロセス起動方法。
  3. 【請求項3】請求項1記載の周期的プロセススケジュー
    リング方法に従ってスケジュールされたプロセスを起動
    する方法であって、 連続して割り当てられた該CPU割り当て時間が経過す
    る前に最高の優先度で起動された第1のプロセスから同
    一プロセスグループに属する第2のプロセスへ優先度を
    継承するよう指示されたとき、第1プロセスの実行優先
    度をシステム内で最高の優先度から最低の優先度に変更
    し、第2プロセスの実行優先度を最高の優先度に変更す
    ることによって第2プロセスを起動することを特徴とす
    るプロセス起動方法
JP2757797A 1996-03-28 1997-02-12 周期的プロセスのスケジューリング方法 Expired - Lifetime JP2904483B2 (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2757797A JP2904483B2 (ja) 1996-03-28 1997-02-12 周期的プロセスのスケジューリング方法

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
JP8-73673 1996-03-28
JP7367396 1996-03-28
JP2757797A JP2904483B2 (ja) 1996-03-28 1997-02-12 周期的プロセスのスケジューリング方法

Related Child Applications (1)

Application Number Title Priority Date Filing Date
JP17163198A Division JP3653176B2 (ja) 1998-06-18 1998-06-18 プロセス実行制御方法

Publications (2)

Publication Number Publication Date
JPH09319597A JPH09319597A (ja) 1997-12-12
JP2904483B2 true JP2904483B2 (ja) 1999-06-14

Family

ID=26365522

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2757797A Expired - Lifetime JP2904483B2 (ja) 1996-03-28 1997-02-12 周期的プロセスのスケジューリング方法

Country Status (1)

Country Link
JP (1) JP2904483B2 (ja)

Families Citing this family (10)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP3037182B2 (ja) 1997-02-17 2000-04-24 日本電気株式会社 タスク管理方式
TW511034B (en) * 1998-11-09 2002-11-21 Intel Corp Scheduling requests in a system
US7831973B2 (en) * 2003-12-26 2010-11-09 Panasonic Corporation Task scheduling apparatus, task scheduling method, task scheduling program, storage medium and transmission medium
JP4609070B2 (ja) * 2004-12-28 2011-01-12 沖電気工業株式会社 マルチ呼処理スレッド処理方法
JP5463076B2 (ja) * 2009-05-28 2014-04-09 パナソニック株式会社 マルチスレッドプロセッサ
JP5029675B2 (ja) * 2009-11-13 2012-09-19 沖電気工業株式会社 マルチ呼処理スレッド処理方法及び呼処理装置
JP6205689B2 (ja) * 2012-08-22 2017-10-04 沖電気工業株式会社 データ処理装置及びプログラム
JP5654643B2 (ja) * 2013-07-22 2015-01-14 パナソニック株式会社 マルチスレッドプロセッサ
JP2013214331A (ja) * 2013-07-22 2013-10-17 Panasonic Corp コンパイラ
KR102653582B1 (ko) 2016-03-18 2024-04-03 삼성전자 주식회사 전자장치 및 그의 프로세스 재개 방법

Non-Patent Citations (3)

* Cited by examiner, † Cited by third party
Title
松岡聡・他、「マルチメディア処理におけるOSレベルでのリソース・リザベーション」、情報処理学会研究報告 Vol.94、No.32(94−OS−63)情報処理学会・発行(1994年3月)、P.73〜80
盛岡敏・他、「QOS管理のための外部資源管理機構について」、情報処理学会研究報告 Vol.95、No.59(95−OS−69)、情報処理学会・発行(1995年6月)、P.61〜66
藤田・他、「動的QoSをサポートするプロセッサ管理機構」、電子情報通信学会技術研究報告 Vol.94、No.573(CPSY94−117)、P.9〜16

Also Published As

Publication number Publication date
JPH09319597A (ja) 1997-12-12

Similar Documents

Publication Publication Date Title
EP0798638B1 (en) Periodic process scheduling method
US5448735A (en) Task organization for execution using linked records referencing code modules
US7039012B2 (en) Process execution method and apparatus
US6272517B1 (en) Method and apparatus for sharing a time quantum
EP0617361B1 (en) Scheduling method and apparatus for a communication network
US7805727B2 (en) Execution control for processor tasks
US5247671A (en) Scalable schedules for serial communications controller in data processing systems
EP2300910B1 (en) Scheduler instances in a process
Pyarali et al. Evaluating and optimizing thread pool strategies for real-time CORBA
US6304891B1 (en) Execution control for processor tasks
KR20050016170A (ko) 실시간 동작 수행방법 및 시스템
KR20050030871A (ko) 실시간 동작 수행방법 및 시스템
KR20050011689A (ko) 실시간 동작 수행방법 및 시스템
JP2000242512A (ja) 複数のオペレーティングシステムを実行する計算機
CN103297395A (zh) 一种互联网业务的实现方法、系统以及装置
JP2904483B2 (ja) 周期的プロセスのスケジューリング方法
WO2012094862A1 (zh) 操作系统的任务调度方法、装置及计算机
US7116635B2 (en) Process execution method and apparatus
JP2000322278A (ja) プロセス実行制御方法
US20030163600A1 (en) Method and system where one thread can handle several different services concurrently
US20040010551A1 (en) Method and apparatus for automated network polling
JP3653176B2 (ja) プロセス実行制御方法
JP2009541852A (ja) コンピュータマイクロジョブ
JPH05108380A (ja) データ処理システム
US6952826B1 (en) Method for implementing a multi-level system model for deterministically handling selected data

Legal Events

Date Code Title Description
FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20090326

Year of fee payment: 10

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20090326

Year of fee payment: 10

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20100326

Year of fee payment: 11

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20110326

Year of fee payment: 12

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20110326

Year of fee payment: 12

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20120326

Year of fee payment: 13

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20130326

Year of fee payment: 14

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20130326

Year of fee payment: 14

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20140326

Year of fee payment: 15

EXPY Cancellation because of completion of term