(57)【要約】【課題】スピンロックの時間を短縮した排他制御を実現するリアルタイムシステム、排他制御方法を提供すること【解決手段】リアルタイムシステムでは、あるプロセッサのいずれかがオブジェクトロックを占有中に、他のプロセッサがオブジェクトロックを要求したか否かを示すマジックナンバー変数を管理するセマフォ情報部を備える。オブジェクトロックを取得したプロセッサＡは、マジックナンバー変数を参照してプロセッサＡ及びプロセッサＢの要求する処理を実行する。オブジェクトロックを取得できなかったプロセッサＢは、マジックナンバー変数を更新する。【選択図】図６
2012221402.tif 000002
【特許請求の範囲】
【請求項１】
第１及び第２プロセッサを備えるリアルタイムシステムであって、
あるプロセッサのいずれかがオブジェクトロックを占有中に、他のプロセッサがオブジェクトロックを要求したか否かを示すマジックナンバー変数を管理するセマフォ情報部を備え、
前記オブジェクトロックを取得した第１プロセッサは、前記マジックナンバー変数を参照して前記第１及び前記第２プロセッサの要求する処理を実行し、
前記オブジェクトロックを取得できなかった第２プロセッサは、前記マジックナンバー変数を更新する、リアルタイムシステム。
【請求項２】
前記セマフォ情報部は、前記マジックナンバー変数の同期情報であるサブロックを管理し、
前記第２プロセッサは、前記マジックナンバー変数を更新する前に、前記サブロックを占有し、更新後に前記サブロックを解放することを特徴とする請求項１に記載のリアルタイムシステム。
【請求項３】
前記第１プロセッサは、前記第１プロセッサが要求する処理を実行した後に、前記第２プロセッサが要求する処理を実行することを特徴とする請求項１または請求項２に記載のリアルタイムシステム。
【請求項４】
前記第１及び前記第２プロセッサが要求する処理は、セマフォ資源の返却にかかる処理であることを特徴とする請求項１乃至請求項３のいずれか１項に記載のリアルタイムシステム。
【請求項５】
第１及び第２プロセッサを備えるリアルタイムシステムにおける排他制御方法であって、
あるプロセッサのいずれかがオブジェクトロックを占有中に、他のプロセッサがオブジェクトロックを要求したか否かを示すマジックナンバー変数を管理し、
前記オブジェクトロックを取得した第１プロセッサは、前記マジックナンバー変数を参照して前記第１及び前記第２プロセッサの要求する処理を実行し、
前記オブジェクトロックを取得できなかった第２プロセッサは、前記マジックナンバー変数を更新する、排他制御方法。
【請求項６】
前記マジックナンバー変数の同期情報であるサブロックを管理し、
前記第２プロセッサは、前記マジックナンバー変数を更新する前に、前記サブロックを占有し、更新後に前記サブロックを解放することを特徴とする請求項５に記載の排他制御方法。
【請求項７】
前記第１プロセッサは、前記第１プロセッサが要求する処理を実行した後に、前記第２プロセッサが要求する処理を実行することを特徴とする請求項５または請求項６に記載の排他制御方法。
【請求項８】
前記第１及び前記第２プロセッサが要求する処理は、セマフォ資源の返却にかかる処理であることを特徴とする請求項５乃至請求項７のいずれか１項に記載の排他制御方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明はリアルタイムシステム、及び排他制御方法に関する。
【背景技術】
【０００２】
近年、組み込み用のマイクロプロセッサにおいて実行されるソフトウェアは、複雑化、高速化が進んでいる。そのため、リアルタイムシステムにおいてもマルチコアプロセッサが普及してきている。マルチコアプロセッサでは、プロセッサコア間を跨ぐリソース処理（同期処理や排他制御等）が複雑になるため、マルチコアプロセッサの排他制御（ロック制御）に起因するデッドロックや、マルチコアプロセッサの実行効率が落ちるという問題が生じ得る。このような、状況の下、マルチコアプロセッサの効率的な利用の必要性が高まっている。
【０００３】
特許文献１には、ロック失敗率を低減するマルチタスク方式のマルチプロセッサシステムにおけるロック制御についての技術が開示されている。特許文献２には、共有メモリへのアクセスの際に用いるロック回路を二重化する技術が開示されている。特許文献３には、複数のプロセッサが対等な条件で監視を行うことにより、共有資源に対するロックを強制的に行う手法について開示している。
【０００４】
マルチコアプロセッサシステムにおいて、複数のプロセッサから使用されるオブジェクト（タスク、セマフォ等）の管理ブロックと呼ばれるデータ構造にアクセスする際の排他制御方法として、ロックを用いたものが挙げられる。リアルタイムＯＳ（オペレーティングシステム）上のオブジェクトは、カーネル管理ブロックと呼ばれるデータ構造で管理されている。カーネル管理ブロックは、メモリ上に設けられる。
【０００５】
リアルタイムＯＳを用いたシングルコアプロセッサのシステムにおいて、アプリケーションがサービスコールを呼び出してオブジェクトを使用する場合、リアルタイムＯＳはカーネル管理ブロックへのアクセスを行う。このアクセスの間に、カーネル管理ブロックは他の要因により変更がなされることはない。
【０００６】
しかし、マルチコアプロセッサシステムでは、複数のタスクが同時に動作し、サービスコールを同時に呼び出す可能性がある。このため、サービスコール呼び出しによりオブジェクトを使用する場合、一方のプロセッサがカーネル管理ブロックへのアクセスを行っている最中には他方のプロセッサがカーネル管理ブロックへのアクセスを行うことを禁止しなければならない。すなわち、排他制御の仕組みが必要となる。
【０００７】
排他制御を行うための機構として、ロックが挙げられる。詳細には、どのプロセッサからもアクセスできる共有メモリ領域上にロック変数を用意する。プロセッサは、ロック変数の値が０であれば１に書き換える。この書き込み処理ができた状態をロックの取得と呼ぶ。また、ロック変数を１から０に書き換えることをロックの解放と呼ぶ。すでにロック変数に１が書き込まれていた場合、他のプロセッサがロックを取得していることになる。そのため、新たにロックを取得しようとするプロセッサは、ロック取得の待ち状態となり、ロックの取得を繰り返し試みる。このロックの取得を繰り返し試みる状態をスピンロックと呼ぶ。
【０００８】
非特許文献１には、図７に示すように、上述のカーネル管理ブロックの構成が開示されている。カーネル管理ブロック１０１は、タスク情報１０２と、プロセッサ情報１０３と、セマフォ情報１０４と、を具備する情報である。タスク情報１０２は、タスク毎に持つ情報であり、タスク管理ブロックから構成される。タスク管理ブロックは、タスクキューｔｓｋ＿ｑｕｅｕｅ１０２１と、タスク状態ｔｓｔａｔ１０２２と、待ち解除時のエラーコードｗｅｒｃｄ１０２３と、タイムイベントブロックｐ＿ｔｍｅｖｔｂ１０２４と、待ちオブジェクトの管理ブロック＊ｐ＿ｗｏｂｊｃｂ１０２５と、を備える。
【０００９】
プロセッサ情報１０３は、プロセッサ毎に持つ情報であり、プロセッサ管理ブロックから構成される。プロセッサ管理ブロックは、タスクロックｔｓｋ＿ｌｏｃｋ１０３１により構成される。
【００１０】
セマフォ情報１０４は、セマフォ管理ブロックＳＥＭＣＢと、セマフォ初期化ブロックＳＥＭＩＮＩＢと、から構成される。セマフォ管理ブロックＳＥＭＣＢは、セマフォ待ちキューｗａｉｔ＿ｑｕｅｕｅ１０４１と、初期化ブロックｐ＿ｓｅｍｉｎｉｂ１０４２と、オブジェクトロックｏｂｊ＿ｌｏｃｋ１０４３と、セマフォ現在カウント値ｓｅｍｃｎｔ１０４４と、から構成される。
【００１１】
セマフォ初期化ブロックＳＥＭＩＮＩＢは、セマフォの初期値を保持するブロックであり、セマフォ属性１０４５と、セマフォ資源数の初期値ｓｅｍｃｍｔ１０４６と、セマフォ最大資源数ｍａｘｓｅｍ１０４７と、を持つ情報である。
【００１２】
待ちオブジェクトの管理ブロック＊ｐ＿ｗｏｂｊｃｂ１０２５は、セマフォ管理ブロックＳＥＭＣＢが存在するメモリアドレスを参照している。セマフォ待ちキューｗａｉｔ＿ｑｕｅｕｅ１０４１は、タスク管理ブロックＴＣＢが存在するアドレスを参照している。初期化ブロックｐ＿ｓｅｍｉｎｉｂ１０４２は、セマフォ初期化ブロックＳＥＭＩＮＩＢが存在するメモリアドレスを参照している。
【００１３】
あるプロセッサがセマフォ現在カウント値１０４４やセマフォ待ちキューｗａｉｔ＿ｑｕｅｕｅ１０４１の操作を行う場合、リアルタイムＯＳはオブジェクトロックｏｂｊ＿ｌｏｃｋ１０４３をはじめに取得する。プロセッサがｏｂｊ＿ｌｏｃｋ１０４３を取得できなかった場合、当該プロセッサはスピンロックによる待ち状態となる。オブジェクトロックｏｂｊ＿ｌｏｃｋ１０４３が解放されたら、当該プロセッサは、待ち状態を終了できる。このように排他制御が実現されている。
【００１４】
図８及び図９は、マルチプロセッサシステムにおいて、マルチプロセッサ用リアルタイムＯＳがサービスコールｓｉｇ＿ｓｅｍを呼び出した場合の動作を示すフローチャートである。サービスコールｓｉｇ＿ｓｅｍの基本処理は、対象セマフォの資源待ちタスクが存在するか否かにより処理内容が異なる。資源待ちタスクが存在する場合、そのタスクの待ち解除処理が行われる。資源待ちタスクが存在しない場合、セマフォ資源であるカウンタをインクリメントする。
【００１５】
はじめに、リアルタイムＯＳは、割り込みを禁止する（Ｓ１０１）。リアルタイムＯＳは、オブジェクトロックｏｂｊ＿ｌｏｃｋ１０４３を取得できるまでスピンロック状態となる（Ｓ１０２）。リアルタイムＯＳは、オブジェクトロックｏｂｊ＿ｌｏｃｋ１０４３を取得後に、セマフォ待ちキューｗａｉｔ＿ｑｕｅｕｅ１０４１が空か否かを判定する（Ｓ１０３）。
【００１６】
セマフォ待ちキューｗａｉｔ＿ｑｕｅｕｅ１０４１が空ではない場合（Ｓ１０３：Ｎｏ）、リアルタイムＯＳは、セマフォ待ちキューｗａｉｔ＿ｑｕｅｕｅ１０４１の先頭タスクのタスク管理ブロックＴＣＢを取得する（Ｓ１０４）。リアルタイムＯＳは、タスクロックｔｓｋ＿ｌｏｃｋ１０３１を確認する（Ｓ１０５）。そして、リアルタイムＯＳは、タスクロックｔｓｋ＿ｌｏｃｋ１０３１の取得を試みる（Ｓ１０６）。タスクロックｔｓｋ＿ｌｏｃｋ１０３１の取得が成功した場合（Ｓ１０６：Ｙｅｓ）、リアルタイムＯＳは、セマフォ待ちキューｗａｉｔ＿ｑｕｅｕｅ１０４１の先頭タスクを削除、すなわち待ち状態の解除を行う（Ｓ１０７）。
【００１７】
リアルタイムＯＳは、待ち解除の対象となったタスクのタスク状態ｔｓｔａｔ１０２２の値を参照して、ディスパッチが必要か否かを判定する（Ｓ１０８）。ディスパッチが必要である場合（Ｓ１０８：Ｙｅｓ）、リアルタイムＯＳは、ディスパッチが必要であるという情報を保持する（Ｓ１０９）。その後、リアルタイムＯＳは、タスクロックｔｓｋ＿ｌｏｃｋ１０３１を解放する（Ｓ１１０）。ディスパッチが必要ではない場合（Ｓ１０８：Ｙｅｓ）、リアルタイムＯＳは、即座にタスクロックｔｓｋ＿ｌｏｃｋ１０３１を解放する（Ｓ１１０）。
【００１８】
その後、リアルタイムＯＳは、戻り値を"Ｅ＿ＯＫ"に設定する（Ｓ１１１）。ここで、戻り値とは、サービスコールｓｉｇ＿ｓｅｍの実行結果を示す値である。リアルタイムＯＳは、オブジェクトロックｏｂｊ＿ｌｏｃｋ１０４３を解放するとともに、ディスパッチ処理を必要に応じて行う（Ｓ１１２）。そして、リアルタイムＯＳは、割り込み処理を許可する（Ｓ１１３）。
【００１９】
次に、セマフォ待ちキューｗａｉｔ＿ｑｕｅｕｅ１０４１が空であった場合の処理を説明する（Ｓ１０３：Ｙｅｓ）。セマフォ待ちキューｗａｉｔ＿ｑｕｅｕｅ１０４１が空であった場合（Ｓ１０３：Ｙｅｓ）、リアルタイムＯＳは、セマフォ現在カウント値ｓｅｍｃｎｔ１０４４と、セマフォ最大資源数ｍａｘｓｅｍ１０４７と、を比較する（Ｓ１１４）。
【００２０】
セマフォ最大資源数ｍａｘｓｅｍ１０４７がセマフォ現在カウント値ｓｅｍｃｎｔ１０４４よりも大きい場合（Ｓ１１４：Ｙｅｓ）、リアルタイムＯＳは、セマフォ現在カウント値ｓｅｍｃｎｔ１０４４を１増加させる（Ｓ１１５）。そして、リアルタイムＯＳは、戻り値を"Ｅ＿ＯＫ"に設定する（Ｓ１１６）。一方、セマフォ最大資源数ｍａｘｓｅｍ１０４７がセマフォ現在カウント値ｓｅｍｃｎｔ１０４４よりも大きくない場合（Ｓ１１４：Ｎｏ）、リアルタイムＯＳは、戻り値を"Ｅ＿ＱＯＶＲ"に設定する（Ｓ１１７）。
【００２１】
Ｓ１１６またはＳ１１７の設定の後、リアルタイムＯＳは、上述のＳ１１２及びＳ１１３の処理を行う。
【００２２】
続いて、２つのプロセッサがほぼ同時にサービスコールｓｉｇ＿ｓｅｍを呼び出した場合のマルチコアプロセッサの動作を図１０を参照して説明する。プロセッサＡは、タスク処理によりサービスコールｓｉｇ＿ｓｅｍを呼び出し、カーネル処理を開始する（Ｔ１０１）。本例では他に競合するプロセッサが無いため、プロセッサＡは、オブジェクトロックｏｂｊ＿ｌｏｃｋ１０４３を取得する（Ｔ１０２）。
【００２３】
一方、プロセッサＢは、タスク処理によりプロセッサＡに遅れてサービスコールｓｉｇ＿ｓｅｍを呼び出す（Ｔ１０５）。ここで、プロセッサＡがオブジェクトロックｏｂｊ＿ｌｏｃｋ１０４３をすでに取得済みである。そのため、プロセッサＢは、オブジェクトロックｏｂｊ＿ｌｏｃｋ１０４３をＴ１０６のタイミングで取得することができない。
【００２４】
プロセッサＡは、オブジェクトロックｏｂｊ＿ｌｏｃｋ１０４３を解放し（Ｔ１０３）、カーネル処理を終了する（Ｔ１０４）。
【００２５】
プロセッサＢは、Ｔ１０６からＴ１０３までの間、待ち状態、すなわちスピンロックの状態となる。プロセッサＢは、プロセッサＡによるオブジェクトロックｏｂｊ＿ｌｏｃｋ１０４３の解放後にオブジェクトロックｏｂｊ＿ｌｏｃｋ１０４３を取得する（Ｔ１０７）。その後、プロセッサＢは、オブジェクトロックｏｂｊ＿ｌｏｃｋ１０４３を解放し（Ｔ１０８）、カーネル処理を終了する（Ｔ１０９）。
【先行技術文献】
【特許文献】
【００２６】
【特許文献１】特開平０１−２９７７６０号公報
【特許文献２】特開平０２−１３５５３２号公報
【特許文献３】特開平０４−２５５０６３号公報
【非特許文献】
【００２７】
【非特許文献１】[平成23年3月10日検索]、インターネット＜URL：http://www.nces.is.nagoya-u.ac.jp/NEXCESS/blog/index.php?catid=56&blogid=5＞
【発明の概要】
【発明が解決しようとする課題】
【００２８】
図７〜図１０に示したマルチコアプロセッサシステムでは、プロセッサコア間を跨いだ共有資源の操作を行う場合、ロックを用いた排他制御を行う。ここで、あるプロセッサがロックを取得している間に、他のプロセッサがロックを取得しようとする場合がある。この場合、先にロックを取得したプロセッサがロックを解放するまで、他のプロセッサは待ち状態、すなわちスピンロック状態となる。これにより、この他のプロセッサ（例えば、図１０のプロセッサＢ）は他の処理を行うことができないため、リアルタイムＯＳのカーネル時間がスピンロックの時間分だけ長くなってしまう。
【課題を解決するための手段】
【００２９】
本発明にかかるリアルタイムシステムの一態様は、
第１及び第２プロセッサを備えるリアルタイムシステムであって、
あるプロセッサのいずれかがオブジェクトロックを占有中に、他のプロセッサがオブジェクトロックを要求したか否かを示すマジックナンバー変数を管理するセマフォ情報部を備え、
前記オブジェクトロックを取得した第１プロセッサは、前記マジックナンバー変数を参照して前記第１及び前記第２プロセッサの要求する処理を実行し、
前記オブジェクトロックを取得できなかった第２プロセッサは、前記マジックナンバー変数を更新する、ものである。
【００３０】
本発明にかかる排他制御方法の一態様は、
第１及び第２プロセッサを備えるリアルタイムシステムにおける排他制御方法であって、
あるプロセッサのいずれかがオブジェクトロックを占有中に、他のプロセッサがオブジェクトロックを要求したか否かを示すマジックナンバー変数を管理し、
前記オブジェクトロックを取得した第１プロセッサは、前記マジックナンバー変数を参照して前記第１及び前記第２プロセッサの要求する処理を実行し、
前記オブジェクトロックを取得できなかった第２プロセッサは、前記マジックナンバー変数を更新する、ものである。
【００３１】
本発明では、オブジェクトロックを取得できなかった第２プロセッサは、マジックナンバー変数の更新のみを行い、処理を終了できる。また、オブジェクトロックを取得した第１プロセッサは、自身の処理に加えて第２プロセッサの処理も実行する。これにより、第２プロセッサの待ち時間が減少、すなわちスピンロックが生じなくなり、かつ所望の処理を実行することができる。
【発明の効果】
【００３２】
本発明によれば、スピンロックの時間を短縮した排他制御を実現するリアルタイムシステム、排他制御方法を提供することができる。
【図面の簡単な説明】
【００３３】
【図１】実施の形態１にかかるリアルタイムシステムの備えるカーネル管理ブロックの構成を示す図である。
【図２】実施の形態１にかかるリアルタイムシステムにおいて、マルチプロセッサ用リアルタイムＯＳがサービスコールｓｉｇ＿ｓｅｍを呼び出した場合の動作を示すフローチャートである。
【図３】実施の形態１にかかるリアルタイムシステムにおいて、マルチプロセッサ用リアルタイムＯＳがサービスコールｓｉｇ＿ｓｅｍを呼び出した場合の動作を示すフローチャートである。
【図４】実施の形態１にかかる実施の形態１にかかるリアルタイムシステムにおいて、マルチプロセッサ用リアルタイムＯＳが行う代替処理の詳細を示すフローチャートである。
【図５】実施の形態１にかかる実施の形態１にかかるリアルタイムシステムにおいて、マルチプロセッサ用リアルタイムＯＳが行う代替処理の詳細を示すフローチャートである。
【図６】２つのプロセッサがほぼ同時にサービスコールｓｉｇ＿ｓｅｍを呼び出した場合における、実施の形態１にかかるリアルタイムシステムの動作を示すシーケンス図である。
【図７】非特許文献１にかかるリアルタイムシステムの備えるカーネル管理ブロックの構成を示す図である。
【図８】非特許文献１にかかるリアルタイムシステムにおいて、マルチプロセッサ用リアルタイムＯＳがサービスコールｓｉｇ＿ｓｅｍを呼び出した場合の動作を示すフローチャートである。
【図９】非特許文献１にかかるリアルタイムシステムにおいて、マルチプロセッサ用リアルタイムＯＳがサービスコールｓｉｇ＿ｓｅｍを呼び出した場合の動作を示すフローチャートである。
【図１０】２つのプロセッサがほぼ同時にサービスコールｓｉｇ＿ｓｅｍを呼び出した場合における、非特許文献１にかかるリアルタイムシステムの動作を示すシーケンス図である。
【発明を実施するための形態】
【００３４】
＜実施の形態１＞
以下、図面を参照して本発明の実施の形態について説明する。はじめに、本実施の形態にかかるリアルタイムシステムの備えるカーネル管理ブロックの構成を、図１を参照して説明する。
【００３５】
カーネル管理ブロック１は、タスク情報２と、プロセッサ情報３と、セマフォ情報４と、を具備する情報である。タスク情報２は、タスク毎に持つ情報であり、タスク管理ブロックから構成される。タスク管理ブロックは、タスクキューｔｓｋ＿ｑｕｅｕｅ２１と、タスク状態ｔｓｔａｔ２２と、待ち解除時のエラーコードｗｅｒｃｄ２３と、タイムイベントブロックｐ＿ｔｍｅｖｔｂ２４と、待ちオブジェクトの管理ブロック＊ｐ＿ｗｏｂｊｃｂ２５と、を備える。
【００３６】
プロセッサ情報３は、プロセッサ毎に持つ情報であり、プロセッサ管理ブロックから構成される。プロセッサ管理ブロックは、タスクロックｔｓｋ＿ｌｏｃｋ３１により構成される。
【００３７】
セマフォ情報４は、セマフォ管理ブロックＳＥＭＣＢと、セマフォ初期化ブロックＳＥＭＩＮＩＢと、から構成される。セマフォ管理ブロックＳＥＭＣＢは、セマフォ待ちキューｗａｉｔ＿ｑｕｅｕｅ４１と、初期化ブロックｐ＿ｓｅｍｉｎｉｂ４２と、オブジェクトロックｏｂｊ＿ｌｏｃｋ４３と、セマフォ現在カウント値ｓｅｍｃｎｔ４４と、サブロックｓｕｂ＿ｌｏｃｋ４５と、マジックナンバー変数ＳｅｍＭＮ４６と、を具備する構成である。
【００３８】
セマフォ初期化ブロックＳＥＭＩＮＩＢは、セマフォの初期値を保持するブロックであり、セマフォ属性４７と、セマフォ資源数の初期値ｓｅｍｃｍｔ４８と、セマフォ最大資源数ｍａｘｓｅｍ４９と、を持つ情報である。
【００３９】
図１の構成は、セマフォ管理ブロック内にサブロックｓｕｂ＿ｌｏｃｋ４５と、マジックナンバー変数ＳｅｍＭＮ４６と、を備える点が図７の構成と異なる。サブロックｓｕｂ＿ｌｏｃｋ４５は、セマフォ現在カウント値ｓｅｍｃｎｔ４４またはマジックナンバー変数ＳｅｍＭＮ４６を書き換える際に取得する必要があるロック情報である。マジックナンバー変数ＳｅｍＭＮ４６は、オブジェクトロックｏｂｊ＿ｌｏｃｋ４３を取得できなかったプロセッサがカウンタ操作（セマフォ現在カウント値ｓｅｍｃｎｔ４４）を行ったことを、オブジェクトロックｏｂｊ＿ｌｏｃｋ４３を取得したプロセッサが認識するための変数である。マジックナンバー変数ＳｅｍＭＮ４６が１である場合、カウンタ操作が行われたことを示す。
【００４０】
続いて、本実施の形態にかかるリアルタイムシステムの動作を説明する。図２及び図３は、本実施の形態にかかるリアルタイムシステムにおいて、マルチプロセッサ用リアルタイムＯＳがサービスコールｓｉｇ＿ｓｅｍを呼び出した場合の動作を示すフローチャートである。サービスコールｓｉｇ＿ｓｅｍは、セマフォ資源を返却し、返却にかかるセマフォに対する取得待ち状態のタスクが存在する場合には、当該タスクを起動するサービスコールである。
【００４１】
リアルタイムＯＳは、タスクからサービスコールｓｉｇ＿ｓｅｍが呼び出されたら、サービスコールｓｉｇ＿ｓｅｍの処理を開始する。リアルタイムＯＳは、割り込みを禁止する。（Ｓ１１）。リアルタイムＯＳは、オブジェクトロックｏｂｊ＿ｌｏｃｋ４３の取得を試みる（Ｓ１２）。
【００４２】
オブジェクトロックｏｂｊ＿ｌｏｃｋ４３の取得が成功しなかった場合（Ｓ１２：Ｎｏ）、リアルタイムＯＳは、サブロックｓｕｂ＿ｌｏｃｋ４５の取得を行う（Ｓ１３）。リアルタイムＯＳは、セマフォ現在カウント値ｓｅｍｃｎｔ４４と、セマフォ最大資源数ｍａｘｓｅｍ４９と、を比較する（Ｓ１４）。
【００４３】
セマフォ最大資源数ｍａｘｓｅｍ４９がセマフォ現在カウント値ｓｅｍｃｎｔ４４よりも大きい場合（Ｓ１４：Ｙｅｓ）、リアルタイムＯＳは、セマフォ現在カウント値ｓｅｍｃｎｔ４４を１増加させる（Ｓ１５）。リアルタイムＯＳは、マジックナンバー変数ＳｅｍＭＮ４６を１に更新する（Ｓ１６）。そして、リアルタイムＯＳは、戻り値を"Ｅ＿ＯＫ"に設定する（Ｓ１７）。一方、セマフォ最大資源数ｍａｘｓｅｍ４９がセマフォ現在カウント値ｓｅｍｃｎｔ４４よりも大きくない場合（Ｓ１４：Ｎｏ）、リアルタイムＯＳは、戻り値を"Ｅ＿ＱＯＶＲ"に設定する（Ｓ１８）。
【００４４】
リアルタイムＯＳは、Ｓ１７またはＳ１８の処理の後にサブロックｓｕｂ＿ｌｏｃｋ４５を解放する（Ｓ１９）。
【００４５】
続いて、Ｓ１２にてオブジェクトロックｏｂｊ＿ｌｏｃｋ４３の取得が成功した（Ｓ１２：Ｙｅｓ）場合の処理を説明する。リアルタイムＯＳは、セマフォ待ちキューｗａｉｔ＿ｑｕｅｕｅ４１が空か否かを判定する（Ｓ２０）。
【００４６】
まず、Ｓ２０にてセマフォ待ちキューｗａｉｔ＿ｑｕｅｕｅ４１が空であった場合の処理（Ｓ２０：Ｙｅｓ）を説明する。リアルタイムＯＳは、セマフォ現在カウント値ｓｅｍｃｎｔ４４と、セマフォ最大資源数ｍａｘｓｅｍ４９と、を比較する（Ｓ２１）。
【００４７】
セマフォ最大資源数ｍａｘｓｅｍ４９がセマフォ現在カウント値ｓｅｍｃｎｔ４４よりも大きい場合（Ｓ２１：Ｙｅｓ）、リアルタイムＯＳは、サブロックｓｕｂ＿ｌｏｃｋ４５を取得する（Ｓ２２）。リアルタイムＯＳは、セマフォ現在カウント値ｓｅｍｃｎｔ４４を１増加させる（Ｓ２３）。その後、リアルタイムＯＳは、サブロックｓｕｂ＿ｌｏｃｋ４５を解放する（Ｓ２４）。そしてリアルタイムＯＳは、戻り値を"Ｅ＿ＯＫ"に設定する（Ｓ２５）。
【００４８】
一方、セマフォ最大資源数ｍａｘｓｅｍ４９がセマフォ現在カウント値ｓｅｍｃｎｔ４４よりも大きくない場合（Ｓ２１：Ｎｏ）、リアルタイムＯＳは、戻り値を"Ｅ＿ＱＯＶＲ"に設定する（Ｓ２６）。
【００４９】
次に、Ｓ２０にてセマフォ待ちキューｗａｉｔ＿ｑｕｅｕｅ４１が空ではなかった場合の処理（Ｓ２０：Ｎｏ）を説明する。リアルタイムＯＳは、セマフォ待ちキューｗａｉｔ＿ｑｕｅｕｅ４１の先頭タスクのタスク管理ブロックＴＣＢを取得する（Ｓ２７）。リアルタイムＯＳは、タスクロックｔｓｋ＿ｌｏｃｋ３１を参照する（Ｓ２８）。そして、リアルタイムＯＳは、タスクロックｔｓｋ＿ｌｏｃｋ３１の取得を試みる（Ｓ２９）。タスクロックｔｓｋ＿ｌｏｃｋ３１の取得が失敗した場合（Ｓ２９：Ｎｏ）、リアルタイムＯＳは、前述のＳ１２から処理を再度行う。
【００５０】
タスクロックｔｓｋ＿ｌｏｃｋ３１の取得が成功した場合（Ｓ２９：Ｙｅｓ）、リアルタイムＯＳは、セマフォ待ちキューｗａｉｔ＿ｑｕｅｕｅ４１の先頭タスクを削除、すなわち待ち状態の解除を行う（Ｓ３０）。
【００５１】
リアルタイムＯＳは、待ち解除の対象となったタスクのタスク状態ｔｓｔａｔ２２の値を参照して、ディスパッチが必要か否かを判定する（Ｓ３１）。ディスパッチが必要である場合（Ｓ３１：Ｙｅｓ）、リアルタイムＯＳは、ディスパッチが必要であるという情報を保持する（Ｓ３２）。ディスパッチが必要ではない場合（Ｓ３１：Ｎｏ）、リアルタイムＯＳは、ディスパッチが必要であるという情報を保持しない。その後、リアルタイムＯＳは、タスクロックｔｓｋ＿ｌｏｃｋ３１を解放し（Ｓ３３）、戻り値を"Ｅ＿ＯＫ"に設定する（Ｓ３４）。
【００５２】
リアルタイムＯＳは、Ｓ３４、Ｓ２５、Ｓ２６のいずれかの処理の後に他のプロセッサの代替処理を実行する（Ｓ３５）。この代替処理の詳細については、図４〜図６を参照して後述する。サービスコールｓｉｇ＿ｓｅｍの戻り値は、代替処理（Ｓ３５）の後にもいずれかの値（"Ｅ＿ＯＫ"または"Ｅ＿ＱＯＶＲ"）に設定されたままとなる。
【００５３】
代替処理の後に、リアルタイムＯＳは、オブジェクトロックｏｂｊ＿ｌｏｃｋ４３を解放するとともに、ディスパッチ処理を必要に応じて行う（Ｓ３６）。そして、リアルタイムＯＳは、割り込み処理を許可する（Ｓ３７）。
【００５４】
続いて、他のプロセッサの代替処理（Ｓ３５）の詳細について、図４及び図５を参照して説明する。
【００５５】
リアルタイムＯＳは、サブロックｓｕｂ＿ｌｏｃｋ４５の取得を行う（Ｓ４１）。リアルタイムＯＳは、マジックナンバー変数ＳｅｍＭＮ４６の設定値が０であるか否かを判定する（Ｓ４２）。マジックナンバー変数ＳｅｍＭＮ４６の設定値が０である場合（Ｓ４２：Ｙｅｓ）、リアルタイムＯＳは、後述のＳ６０の処理を行う。
【００５６】
マジックナンバー変数ＳｅｍＭＮ４６の設定値が０ではない場合（Ｓ４２：Ｎｏ）、リアルタイムＯＳは、セマフォ待ちキューｗａｉｔ＿ｑｕｅｕｅ４１が空か否かを判定する（Ｓ４３）。
【００５７】
まず、セマフォ待ちキューｗａｉｔ＿ｑｕｅｕｅ４１が空ではない場合（Ｓ４３：Ｎｏ）について説明する。リアルタイムＯＳは、セマフォ現在カウント値ｓｅｍｃｎｔ４４が０であるか否かを判定する（Ｓ４４）。セマフォ現在カウント値ｓｅｍｃｎｔ４４が０である場合（Ｓ４４：Ｙｅｓ）、リアルタイムＯＳは、後述のＳ５９から処理を行う。
【００５８】
セマフォ現在カウント値ｓｅｍｃｎｔ４４が０ではない場合（Ｓ４４：Ｎｏ）、リアルタイムＯＳは、セマフォ現在カウント値ｓｅｍｃｎｔ４４の値を１減少する（Ｓ４５）。リアルタイムＯＳは、Ｓ４５のデクリメントの後にサブロックｓｕｂ＿ｌｏｃｋ４５を解放する（Ｓ４６）。
【００５９】
リアルタイムＯＳは、セマフォ待ちキューｗａｉｔ＿ｑｕｅｕｅ４１の先頭タスクのタスク管理ブロックＴＣＢを取得する（Ｓ４７）。そして、リアルタイムＯＳは、タスクロックｔｓｋ＿ｌｏｃｋ３１の取得する（Ｓ４８）。続いて、リアルタイムＯＳは、セマフォ待ちキューｗａｉｔ＿ｑｕｅｕｅ４１の先頭タスクを削除、すなわち待ち状態を解除する（Ｓ４９）。
【００６０】
リアルタイムＯＳは、待ち解除の対象となったタスクのタスク状態ｔｓｔａｔ２２の値を参照して、ディスパッチが必要か否かを判定する（Ｓ５０）。ディスパッチが必要である場合（Ｓ５０：Ｙｅｓ）、リアルタイムＯＳは、ディスパッチが必要であるという情報を保持する（Ｓ５１）。ディスパッチが必要ではない場合（Ｓ５０：Ｎｏ）、リアルタイムＯＳは、ディスパッチが必要であるという情報を保持しない。その後、リアルタイムＯＳは、タスクロックｔｓｋ＿ｌｏｃｋ３１を解放し（Ｓ５２）、サブロックｓｕｂ＿ｌｏｃｋ４５を取得する（Ｓ５３）。
【００６１】
リアルタイムＯＳは、セマフォ現在カウント値ｓｅｍｃｎｔ４４が１以上であり、かつセマフォ待ちキューｗａｉｔ＿ｑｕｅｕｅ４１が空でない、という条件を満たすか否かを判定する（Ｓ５４）。条件を満たす場合（Ｓ５４：Ｙｅｓ）、リアルタイムＯＳは、後述のＳ５９の処理を実行する。一方、条件を満たさない場合（Ｓ５４：Ｎｏ）、リアルタイムＯＳは、Ｓ４５から処理を実行する。
【００６２】
次に、セマフォ待ちキューｗａｉｔ＿ｑｕｅｕｅ４１が空ではある場合（Ｓ４３：Ｙｅｓ）の一連の処理について説明する。リアルタイムＯＳは、サービスコールｓｉｇ＿ｓｅｍの戻り値が"Ｅ＿ＱＯＶＲ"であるか否かを判定する（Ｓ５５）。当該判定により、Ｓ２６の処理が実行されたか否かを判定することができる。
【００６３】
戻り値が"Ｅ＿ＱＯＶＲ"である場合（Ｓ５５：Ｙｅｓ）、すなわちＳ２６の処理が実行された場合、リアルタイムＯＳは、セマフォ現在カウント値ｓｅｍｃｎｔ４４と、セマフォ最大資源数ｍａｘｓｅｍ４９と、を比較する（Ｓ５６）。セマフォ最大資源数ｍａｘｓｅｍ４９がセマフォ現在カウント値ｓｅｍｃｎｔ４４よりも大きくない場合（Ｓ５６：Ｎｏ）、リアルタイムＯＳは、後述のＳ５９の処理を実行する。
【００６４】
セマフォ最大資源数ｍａｘｓｅｍ４９がセマフォ現在カウント値ｓｅｍｃｎｔ４４よりも大きい場合（Ｓ５６：Ｙｅｓ）、リアルタイムＯＳは、セマフォ現在カウント値ｓｅｍｃｎｔ４４を１減少させる（Ｓ５７）。そして、リアルタイムＯＳは、戻り値を"Ｅ＿ＯＫ"に設定する（Ｓ５８）。
【００６５】
リアルタイムＯＳは、Ｓ４４の判定（Ｓ４４:Ｙｅｓ）、Ｓ５４の判定（Ｓ５４：Ｎｏ）、Ｓ５５の判定（Ｓ５５：Ｎｏ）、Ｓ５６の判定（Ｓ５６:Ｎｏ）、Ｓ５８の処理、またはＳ５９の処理の後にＳｅｍＭＮ４６の値を０に設定する（Ｓ５９）。リアルタイムＯＳは、Ｓ４２の判定（Ｓ４２：Ｙｅｓ）またはＳ５９の処理の後にサブロックｓｕｂ＿ｌｏｃｋ４５を解放する（Ｓ６０）。
【００６６】
続いて、２つのプロセッサがほぼ同時にサービスコールｓｉｇ＿ｓｅｍを呼び出した場合における、本実施の形態にかかるリアルタイムシステムの動作を、図６及び上述のフローチャート（図２〜図５）を参照して説明する。
【００６７】
プロセッサＡのリアルタイムＯＳは、プロセッサＡのタスクでサービスコールｓｉｇ＿ｓｅｍの呼び出しが生じると（図６  Ｔ０）、カーネル処理を開始する（図６  Ｔ１）。リアルタイムＯＳは、オブジェクトロックｏｂｊ＿ｌｏｃｋ４３の取得を試みる（図２  Ｓ１２）。オブジェクトロックを取得できた（図２  Ｓ１２：Ｙｅｓ）場合、プロセッサＡのリアルタイムＯＳは、通常の処理を行う（図６  Ｔ２〜Ｔ３）。
【００６８】
一方、プロセッサＢがプロセッサＡに遅れてサービスコールｓｉｇ＿ｓｅｍを呼び出している（図６  Ｔ５）。この場合、プロセッサＡがすでにオブジェクトロックｏｂｊ＿ｌｏｃｋ４３を取得しているため、プロセッサＢはオブジェクトロックｏｂｊ＿ｌｏｃｋ４３を取得できない（図２  Ｓ１２：Ｎｏ）。
【００６９】
プロセッサＢのリアルタイムＯＳは、サブロックｓｕｂ＿ｌｏｃｋ４５を取得し（図２Ｓ１３）、セマフォ現在カウント値ｓｅｍｃｎｔ４４をインクリメントする（図２  Ｓ１５）。そして、カウンタ操作を行ったことを他のプロセッサ（本例ではプロセッサＡ）から判別可能にするためのマジックナンバー変数ＳｅｍＭＮ４６を１に更新する（図２  Ｓ１６）。プロセッサＢのリアルタイムＯＳは、サブロックｓｕｂ＿ｌｏｃｋ４５を解放し（図２  Ｓ１９）、割り込みを許可し（図２  Ｓ３７）、サービスコールｓｉｇ＿ｓｅｍの処理を終了する（図６  Ｔ７）。
【００７０】
プロセッサＢのリアルタイムＯＳは、このような処理によりオブジェクトロックｏｂｊ＿ｌｏｃｋ４３を取得するまでの待ち時間が生じない、すなわちスピンロックが生じない。
【００７１】
オブジェクトロックｏｂｊ＿ｌｏｃｋ４３を取得しているプロセッサＡのリアルタイムＯＳは、通常処理（図２  Ｓ２０〜図３  Ｓ３４、図２  Ｓ２０〜図３  Ｓ２５、図２  Ｓ２０〜図３  Ｓ２６のいずれか）を実行する。その後、プロセッサＡのリアルタイムＯＳは、他のプロセッサの代替処理（図３  Ｓ３５）を実行する。
【００７２】
プロセッサＡのリアルタイムＯＳは、サブロックｓｕｂ＿ｌｏｃｋ４５を取得し（図４Ｓ４１）、マジックナンバー変数ＳｅｍＭＮ４６の値を確認する（図４  Ｓ４２、図６  Ｔ３）。
【００７３】
マジックナンバー変数ＳｅｍＭＮ４６の値が１であった場合、プロセッサＡのリアルタイムＯＳは、他のプロセッサによるセマフォ操作が行われたと判定する。この場合、プロセッサＡのリアルタイムＯＳは、他のプロセッサの肩代わり処理を実行する（図６  Ｔ３〜Ｔ４、図３及び図４  Ｓ４３〜Ｓ５８）。肩代わり処理とは、セマフォ現在カウント値ｓｅｍｃｎｔ４４が０となるか、セマフォ待ちキューｗａｉｔ＿ｑｕｅｕｅ４１が空となるまで、セマフォ待ちキューｗａｉｔ＿ｑｕｅｕｅ４１に登録されているタスクのセマフォ待ち状態の解除処理を実行することである。
【００７４】
セマフォ待ちキューｗａｉｔ＿ｑｕｅｕｅ４１が空であるかの判定（図４  Ｓ４３）及びセマフォ現在カウント値ｓｅｍｃｎｔ４４が０か否かの判定（図４  Ｓ４４）の後に、プロセッサＡのリアルタイムＯＳは、一連のセマフォ待ち解除処理（図４  Ｓ４５〜図５  Ｓ５３）を実行する。
【００７５】
その後に、プロセッサＡのリアルタイムＯＳは、セマフォ現在カウント値ｓｅｍｃｎｔ４４が１以上であり、かつセマフォ待ちキューｗａｉｔ＿ｑｕｅｕｅ４１が空でない、という条件を満たすか否かを判定する（図５  Ｓ５４）。条件を満たす場合（図５  Ｓ５４：Ｙｅｓ）、プロセッサＡのリアルタイムＯＳは、再び一連のセマフォ待ち解除処理（図４  Ｓ４５〜図５  Ｓ５３）を実行する。
【００７６】
続いて、本実施の形態にかかるリアルタイムシステムの効果について図６を参照して説明する。オブジェクトロックを取得できなかったプロセッサＢは、セマフォ現在カウント値ｓｅｍｃｎｔ４４とマジックナンバー変数ＳｅｍＭＮ４６の更新のみを行い、処理を終了できる。また、オブジェクトロックｏｂｊ＿ｌｏｃｋ４３を取得したプロセッサＡは、自身の処理に加えてプロセッサＢの処理も肩代わりして実行する。これにより、プロセッサＢの待ち時間が減少、すなわちスピンロックが生じなくなり、かつ所望の処理を実行することができる。
【００７７】
さらに、本実施の形態にかかるリアルタイムシステムでは、上述のセマフォ現在カウント値ｓｅｍｃｎｔ４４とマジックナンバー変数ＳｅｍＭＮ４６の更新の際に、サブロックｓｕｂ＿ｌｏｃｋ４５を取得する必要がある。これにより、セマフォ現在カウント値ｓｅｍｃｎｔ４４とマジックナンバー変数ＳｅｍＭＮ４６の更新を正確に行うことができる。
【００７８】
さらに、プロセッサＡは、自身の処理を実行（図６  Ｔ２〜Ｔ３）した後に、プロセッサＢの肩代わり処理（図６  Ｔ３〜Ｔ４）を実行する。このように、オブジェクトロックｏｂｊ＿ｌｏｃｋ４３の取得要求を発行したプロセッサの順序が保たれたまま処理を実行することができる。
【００７９】
なお、本発明は上記実施の形態に限られたものではなく、趣旨を逸脱しない範囲で適宜変更することが可能である。例えば、上述の説明ではセマフォに関するサービスコールｓｉｇ＿ｓｅｍを扱う例を説明したが、必ずしもこれに限られない。本発明は、キュー構造を用いて実現しているオブジェクトであるメールボックス、データキュー、イベントフラグ等に関するサービスコールに関しても応用することが可能である。
【００８０】
さらに、上述の説明では、プロセッサＡ及びプロセッサＢを含むリアルタイムシステムについて説明したが必ずしもこれに限られず、本発明を３以上のプロセッサを含むリアルタイムシステムに応用することも可能である。
【符号の説明】
【００８１】
１  カーネル管理ブロック、２  タスク情報、３  プロセッサ情報、４  セマフォ情報、２１  タスクキュー、２２  タスク状態、２３  待ち解除時のエラーコード、２４  タイムイベントブロック、２５  待ちオブジェクトの管理ブロック、３１  タスクロック、４１  タスクキュー、４２  初期化ブロック、４３  オブジェクトロック、４４  セマフォ現在カウント値、４５  サブロック、４６  マジックナンバー変数、４７  セマフォ属性、４８  セマフォ資源数の初期値、４９  セマフォ最大資源数
【図１】
2012221402.tif 000003
【図２】
2012221402.tif 000004
【図３】
2012221402.tif 000005
【図４】
2012221402.tif 000006
【図５】
2012221402.tif 000007
【図６】
2012221402.tif 000008
【図７】
2012221402.tif 000009
【図８】
2012221402.tif 000010
【図９】
2012221402.tif 000011
【図１０】
2012221402.tif 000012