(57)【要約】【課題】ユーザ権限以外の権限でスレッドが動作した場合において、プログラムの実行速度が低下することを防止することができるマルチスレッドプロセッサを提供する。【解決手段】マルチスレッドプロセッサは、各スレッドがサイクルごとにユーザ権限またはユーザ権限以外の権限で動作する。スレッドスケジューラ１６０は、サイクル単位で実行するスレッドを切り換える。スケジュール調整部１９２は、オペレーティングシステムまたはハイパーバイザによって実行するスレッドが設定される第１期間以外の第２期間に実行するスレッドを設定する。スケジュール調整部１９２は、ユーザ権限以外の権限で動作したスレッドが、第２期間において、補充的に実行されるように調整する。【選択図】図１
2014153860.tif 000002
【特許請求の範囲】
【請求項１】
各スレッドがサイクルごとにユーザ権限またはユーザ権限以外の権限で動作するマルチスレッドプロセッサであって、
サイクル単位で実行するスレッドを切り換えるスケジューラと、
オペレーティングシステムまたはハイパーバイザによって実行するスレッドが設定される第１期間以外の第２期間に実行するスレッドを設定するスケジュール調整部とを備え、
前記スケジュール調整部は、ユーザ権限以外の権限で動作したスレッドが、前記第２期間において、補充的に実行されるように調整する、マルチスレッドプロセッサ。
【請求項２】
スレッドごとに、ユーザ権限以外の第１の権限で動作したサイクル数を第１の権限サイクル数として記憶する第１の記憶部と、
所定数のサイクルについて、サイクルごとに実行するスレッドを定めたスケジュールを記憶する第２の記憶部と、
前記スケジュールは、前記第１期間で実行するスレッドを定めた第１スケジュールと、前記第２期間で実行するスレッドを定めた第２スケジュールとを含み、
前記スケジュール調整部は、前記所定数のサイクルごとに、前記第１の記憶部に記憶された前記スレッドごとの前記第１の権限サイクル数に基づいて、前記第２スケジュールのスレッドを設定する、請求項１記載のマルチスレッドプロセッサ。
【請求項３】
サイクルごとに、ユーザ権限以外の権限で動作したスレッドがある場合に、前記第１の記憶部に記憶されている前記スレッドの前記第１の権限サイクル数を１つインクリメントする実行サイクル数加算部を備え、
前記スケジュール調整部は、所定数のサイクルごとに、前記第２スケジュールに設定した各スレッドの個数を前記第１の記憶部に記憶されている前記各スレッドの前記第１の権限サイクル数から減算する、請求項２記載のマルチスレッドプロセッサ。
【請求項４】
前記スケジュール調整部は、前記第１の記憶部に記憶されている各スレッドの前記第１の権限サイクル数の和が前記第２スケジュールに設定可能なスレッド数以下場合には、前記第２スケジュールに設定する各スレッドの個数を前記各スレッドの前記第１の権限サイクル数とする、請求項３記載のマルチスレッドプロセッサ。
【請求項５】
前記スケジュール調整部は、前記第１の記憶部に記憶される各スレッドの前記第１の権限サイクル数の和が前記第２スケジュールに設定可能なスレッド数よりも大きい場合には、前記第２スケジュールに設定可能なスレッド数の前記第１の権限サイクル数の和に対する比率を計算し、さらに、前記各スレッドの前記第１の権限サイクル数と前記比率とを乗算して、前記各スレッドの前記第１の権限サイクル数の修正値を計算し、前記第２スケジュールに設定する各スレッドの個数を前記各スレッドの前記第１の権限サイクル数の修正値とする、請求項４記載のマルチスレッドプロセッサ。
【請求項６】
スレッドごとの優先度を記憶する第３の記憶部を備え、
前記スケジュール調整部は、前記所定数のサイクルごとに、前記第１の記憶部に記憶された前記スレッドごとの前記第１の権限サイクル数と、前記第３の記憶部に記憶された前記スレッドごとの優先度に基づいて、前記第２スケジュールのスレッドを設定する、請求項２記載のマルチスレッドプロセッサ。
【請求項７】
スレッドごとに前記第２スケジュールに設定可能な個数の上限値を記憶する第３の記憶部を備え、
前記スケジュール調整部は、前記所定数のサイクルごとに、前記第１の記憶部に記憶された前記スレッドごとの前記第１の権限サイクル数と、前記第３の記憶部に記憶された前記スレッドごとの前記設定可能な個数の上限値に基づいて、前記第２スケジュールのスレッドを設定する、請求項２記載のマルチスレッドプロセッサ。
【請求項８】
前記第１の権限が、ハイパーバイザ権限である、請求項１記載のマルチスレッドプロセッサ。
【請求項９】
前記第１の権限が、スーパーバイザ権限である、請求項１記載のマルチスレッドプロセッサ。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、マルチスレッドプロセッサに関し、特に各スレッドがサイクルごとにユーザ権限またはユーザ権限以外の権限で動作するマルチスレッドプロセッサに関する。
【背景技術】
【０００２】
制御システムのような高い信頼性・リアルタイム性が求められるコンピュータシステムでは、要求される機能ごとに機器が用意され、これら複数の機器が連携動作することにより１つのシステムを構成している。近年では、複数の機能を１つのプロセッサにて統合実行する技術が知られている。
【０００３】
たとえば、特許文献１（特開２０１１−１２８７６７号公報）のマルチスレッド処理装置は、複数のスレッドに対して、スレッドの作動割合である帯域を設定する帯域設定手段と、各スレッドの処理負荷を監視し、各スレッドの処理負荷が平準化するような帯域変更を帯域設定手段に指示する帯域制御手段とを備える。
【０００４】
特許文献２（特開２０１０−２８６８９８号公報）のマルチスレッド実行装置は、プログラム毎に、命令の目標実行速度情報を記憶するとともに、命令の実行完了速度を監視する。フィードバック制御手段が、実行完了速度が目標実行速度情報に略一致するように、命令発行手段に命令を発行させる。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開２０１１−１２８７６７号公報
【特許文献２】特開２０１０−２８６８９８号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
マルチスレッド環境で動作する各プログラムは、対応のスレッドに割り当てられる。各スレッドには、対応のプログラムの優先度などを考慮して、実行サイクルが割り当てられる。
【０００７】
しかしながら、スレッドにて動作するプログラムからスーパーバイザやハイパーバイザを呼び出すことによって、スーパーバイザやハイパーバイザがスレッドに割当てられた実行サイクルを消費する。その結果、ユーザ権限以外のスーパーバイザ権限やハイパーバイザ権限で動作したサイクル数だけプログラムが動作するサイクル数が減らされる。そのため、プログラムの実行速度が低下するという問題がある。
【０００８】
それゆえに、本発明の目的は、ユーザ権限以外の権限でスレッドが動作した場合において、プログラムの実行速度が低下することを防止することができるマルチスレッドプロセッサを提供することである。
【課題を解決するための手段】
【０００９】
上記課題を解決するために、本発明のマルチスレッドプロセッサは、各スレッドがサイクルごとにユーザ権限またはユーザ権限以外の権限で動作するマルチスレッドプロセッサであって、サイクル単位で実行するスレッドを切り換えるスケジューラと、オペレーティングシステムまたはハイパーバイザによって実行するスレッドが設定される第１期間以外の第２期間に実行するスレッドを設定するスケジュール調整部とを備える。スケジュール調整部は、ユーザ権限以外の権限で動作したスレッドが、第２期間において、補充的に実行されるように調整する。
【発明の効果】
【００１０】
本発明のマルチスレッドプロセッサによれば、ユーザ権限以外の権限でスレッドが動作した場合において、プログラムの実行速度が低下することを防止することができる。
【図面の簡単な説明】
【００１１】
【図１】第１の実施形態のマルチスレッドプロセッサの概略構成の一例である。
【図２】スケジュールテーブルの例を表わす図である。
【図３】実行サイクル数テーブルの例を表わす図である。
【図４】実行サイクル数加算部の各サイクルでの動作手順を示すフローチャートである。
【図５】第１の実施形態のスケジュール調整部のスケジュール更新周期ごとの動作手順を示すフローチャートである。
【図６】第１の実施形態におけるスケジュール調整の第１の例を説明するための図である。
【図７】第１の実施形態におけるスケジュール調整の第２の例を説明するための図である。
【図８】第２の実施形態のマルチスレッドプロセッサの概略構成の一例である。
【図９】調整管理テーブルの例を表わす図である。
【図１０】第２の実施形態のスケジュール調整部のスケジュール更新周期ごとの動作手順を示すフローチャートである。
【図１１】第２の実施形態のスケジュール調整部のスケジュール更新周期ごとの動作手順を示すフローチャートである。
【図１２】第２の実施形態のスケジュール調整部のスケジュール更新周期ごとの動作手順を示すフローチャートである。
【図１３】第２の実施形態におけるスケジュール調整の例を説明するための図である。
【図１４】（ａ）および（ｂ）は、スケジュールテーブルの別の例を表わす図である。
【発明を実施するための形態】
【００１２】
以下、本発明の実施の形態について、図面を用いて説明する。
［第１の実施形態］
図１は、第１の実施形態のマルチスレッドプロセッサの概略構成の一例である。
【００１３】
図１に示すように、このマルチスレッドプロセッサは、命令バス１００と、主記憶部１０１と、第０命令バッファ１１０と、第１命令バッファ１１１と、命令フェッチ部１４５と、セレクタ１２０と、デコーダ１３０と、実行部１４０と、スレッドスケジューラ１６０と、スケジュールレジスタ１８０と、スケジュール調整部１９２と、実行サイクル数加算部１９０と、実行サイクル数テーブル記憶部１９１と、データバス１７０と、主記憶部１０２と、第０レジスタセット１５０と、第１レジスタセット１５１と、セレクタ１２１と、セレクタ１２２とを備える。
【００１４】
本実施の形態のマルチスレッドプロセッサは、スレッド０およびスレッド１からなるマルチスレッドの実行環境を有する。このマルチスレッドプロセッサは、各スレッドがサイクルごとにユーザ権限またはユーザ権限以外の権限で動作する。
【００１５】
マルチスレッド実行環境では、複数のスレッドが、ハードウエアの一部を共有して処理を行なうものである。ここで、スレッドとは、ハードウエアを部分的に共有して処理を行なう仮想的な処理主体をいう。本実施の形態では、第０命令バッファ１１０および第０レジスタセット１５０は、スレッド０で用いられ、第１命令バッファ１１１および第１レジスタセット１５１は、スレッド１で用いられる。プロセッサにおけるその他の構成要素はスレッド０およびスレッド１の間で共用される。
【００１６】
プロセッサが基本的な動作を行なう最小単位である１サイクル毎に、スレッド０またはスレッド１が実行スレッドとして順に選択される。以下、実行スレッドとは、処理を実行中のスレッドをいうものとする。実行スレッドの切り替えは、スレッドスケジューラ１６０によって制御される。
【００１７】
命令バス１００は、接続された回路間で命令データが伝送されるバスである。データバス１７０は、接続された回路間でデータが伝送されるバスである。
【００１８】
主記憶部１０１は、命令バス１００と接続されている。主記憶部１０１は、プログラムＡ、プログラムＢ、プログラムＡで利用されるＯＳ＿Ａ、プログラムＢで利用されるＯＳ＿Ｂ、およびＯＳ＿ＡとＯＳ＿Ｂ間の保護や調停を行なうソフトウエアであるハイパーバイザを保持している。主記憶部１０１は、例えば、ＦＤ（Floppy Disk）、ＨＤＤ（Hard Disk  Drive）、ＲＯＭ（Read Only Memory)、ＲＡＭ(Random Access Memory)、ＣＤ(Compact Disk)、ＤＶＤ(Digital Versatile Disk)などである。
【００１９】
スレッド０は、ユーザプログラムＡ、ＯＳ＿Ａ、またはハイパーバイザを実行する。
スレッド１は、ユーザプログラムＢ、ＯＳ＿Ｂ、またはハイバーバイザを実行する。
【００２０】
スレッド０がユーザプログラムＡを実行するときには、実行部１４０によって、第０レジスタセット１５０にスレッド０の権限情報として「ユーザ権限」が設定され、スレッド０が「ユーザ権限」で動作する。スレッド０がＯＳ＿Ａの機能（サービス）を実行するときには、実行部１４０によって、第０レジスタセット１５０にスレッド０の権限情報として「スーパーバイザ権限」が設定され、スレッド０が「スーパーバイザ権限」で動作する。スレッド０がハイパーバイザを実行するときには、実行部１４０によって、第０レジスタセット１５０にスレッド０の権限情報として「ハイパーバイザ権限」が設定され、スレッド０が「ハイパーバイザ権限」で動作する。
【００２１】
また、同様に、スレッド１がユーザプログラムＢを実行するときには、実行部１４０によって、第１レジスタセット１５１にスレッド１の権限情報として「ユーザ権限」が設定され、スレッド１が「ユーザ権限」で動作する。スレッド１がＯＳ＿Ｂの機能（サービス）を実行するときには、実行部１４０によって、第１レジスタセット１５１にスレッド１の権限情報として「スーパーバイザ権限」が設定され、スレッド１が「スーパーバイザ権限」で動作する。スレッド１がハイパーバイザを実行するときには、実行部１４０によって、第１レジスタセット１５１にスレッド１の権限情報として「ハイパーバイザ権限」が設定され、スレッド１が「ハイパーバイザ権限」で動作する。
【００２２】
主記憶部１０２は、データバス１７０と接続されている。主記憶部１０２は、プログラムＡおよびプログラムＢが利用するデータを保持している。主記憶部１０２は、例えば、ＦＤ、ＨＤＤ、ＲＡＭなどである。なお、主記憶部１０１と主記憶部１０２は同一の主記憶部であってもよい。また、プログラムＡ用およびプログラムＢ用にそれぞれ個別に主記憶部１０１、主記憶部１０２があってもよい。
【００２３】
第０命令バッファ１１０および第１命令バッファ１１１は、それぞれ命令バス１００と接続されている。命令バス１００は、主記憶部１０１と接続されている。
【００２４】
命令フェッチ部１４５は、第０命令バッファ１１０用のプログラムカウンタと、第１命令バッファ１１１用のプログラムカウンタを有する。実行部１４０は、第０命令バッファ１１０のプログラムカウンタのアドレスを命令バス１００に出力して、主記憶部１０１から第０命令バッファ１１０にプログラムＡの命令を１つずつ読み出す。命令フェッチ部１４５は、第１命令バッファ１１１のプログラムカウンタのアドレスを命令バス１００に出力して、主記憶部１０１から第１命令バッファ１１１にプログラムＢの命令を１つずつ読み出す。
【００２５】
第０命令バッファ１１０および第１命令バッファ１１１は、セレクタ１２０に接続されている。セレクタ１２０は、第０命令バッファ１１０および第１命令バッファ１１１のうち、１つの命令バッファを選択して、選択した命令バッファをデコーダ１３０に接続する。セレクタ１２０が選択する命令バッファは、スレッドスケジューラ１６０によって制御される。
【００２６】
デコーダ１３０は、セレクタ１２０から出力される第０命令バッファ１１０または第１命令バッファ１１１の命令を解読し、解読結果を実行部１４０に送出する。
【００２７】
第０レジスタセット１５０は、複数の汎用レジスタ、システムレジスタ（権限情報を含む）などを含む。第１レジスタセット１５１は、複数の汎用レジスタ、システムレジスタ（権限情報を含む）などを含む。
【００２８】
セレクタ１２１は、第０レジスタセット１５０または第１レジスタセット１５１を選択し、選択したレジスタセットのデータを実行部１４０へ送る。セレクタ１２２は、第０レジスタセット１５０または第１レジスタセット１５１を選択し、実行部１４０による実行結果を表わすデータを選択したレジスタセットへ送る。
【００２９】
実行部１４０は、デコーダ１３０から送られる解読された命令を実行する。実行部１４０は、演算の種類に応じて第０レジスタセット１５０または第１レジスタセット１５１に記憶されたデータに対して演算を行う。演算の内容は、加算、乗算、除算、ロード、ストア、または分岐などであり、実行部１４０は、それぞれの演算に応じた回路を含む。ロード（もしくはストア）の場合、実行部１４０からデータバス１７０にアドレスを出力して主記憶部１０２からデータを読込む（もしくは書込む）。読み込んだデータは第０レジスタセット１５０または第１レジスタセット１５１に格納する。実行部１４０が使用するレジスタセットは、セレクタ１２１と１２２によって選択される。セレクタ１２１、１２２はスレッドスケジューラ１６０によって制御される。
【００３０】
スケジュールレジスタ１８０は、図２に示すようなスケジュールテーブル２００を記憶する。スケジュールテーブル２００の各エントリには、番号が付されているとともに、実行するスレッド番号が設定される。スケジュールテーブル２００は、１５個のエントリを有し、１５個のサイクルについて、実行するスレッドを定める。
【００３１】
スケジュールテーブル２００は、第０〜第９のエントリを含むコアスケジュールテーブル２０１と、第１０〜第１４のエントリを含む補填用スケジュールテーブル２０２とを含む。
【００３２】
コアスケジュールテーブル２０１は、コア期間に実行されるスレッドを定める。コアスケジュールテーブル２０１は、スケジュール調整部１９２以外のＯＳまたはハイバーバイザによって設定される。たとえば、実行部１４０が、スレッド０およびスレッド１の実行順序および実行比率を定めるハイバーバイザを実行したときに、第１４エントリのスレッドを実行後に、コアスケジュールテーブル２０１の各エントリのスレッド番号が設定される。
【００３３】
補填用スケジュールテーブル２０２は、補填用期間に実行されるスレッドを定める。補填用スケジュールテーブル２０２は、スケジュール調整部１９２によってスケジュール更新周期ごとに設定される。本実施の形態では、スケジュール更新周期は、１５サイクルである。
【００３４】
スレッドスケジューラ１６０は、１サイクルごとにスケジュールテーブル２００の１つのエントリを読み出す。スレッドスケジューラ１６０は、番号０のエントリから順にエントリを読み出し、最後のエントリを読み出したら、再度番号０のエントリから順に読み出す（循環すると記す）。
【００３５】
スレッドスケジューラ１６０は、スケジュールレジスタ１８０に設定された順番で各スレッドを１サイクル毎に切り替えて実行する。これにより、物理的に１つのプロセッサであるが、仮想的な複数のプロセッサを有するように振舞う。ここでの「サイクル」とは、１命令毎であってもよいし、まとまった命令ごとであっても良いし、一定時間であっても良い。
【００３６】
スレッドスケジューラ１６０は、読みだしたエントリに設定されたスレッド番号が「０」の場合には、セレクタ１２０に第０命令バッファ１１０からの命令の出力を選択させ、セレクタ１２１に第０レジスタセット１５０からのデータの読出しを選択させ、セレクタ１２２に第０レジスタセット１５０へのデータの書込みを選択させる。
【００３７】
スレッドスケジューラ１６０は、読みだしたエントリに設定されたスレッド番号が「１」の場合には、セレクタ１２０に第１命令バッファ１１１からの命令の出力を選択させ、セレクタ１２１に第１レジスタセット１５１からのデータの読出しを選択させ、セレクタ１２２に第１レジスタセット１５１へのデータの書込みを選択させる。
【００３８】
スレッドスケジューラ１６０は、読みだしたエントリに存在しないスレッド番号が設定されている場合、セレクタ１２０に第０命令バッファ１１０および第１命令バッファ１１１からのいずれの命令も選択させず、実行部１４０に、何も命令を実行させない（ＮＯＰ（no operation）命令を実行する）。
【００３９】
実行サイクル数テーブル記憶部１９１は、図３に示すような実行サイクル数テーブル３００を有する。実行サイクル数テーブル３００の列３０１は、本実施の形態のスレッドの権限を示す。本実施の形態のスレッド０およびスレッド１は、「ハイパーバイザ権限」、「スーパーバイザ権限」、または「ユーザ権限」を有する。図３に示すように、実行サイクル数テーブル３００の列３０２は、スレッド０用の実行サイクル数を格納する列である。実行サイクル数テーブル３００の列３０３は、スレッド１用の実行サイクル数を格納する列である。実行サイクル数テーブル３００の行３１１は、スレッド０、スレッド１のユーザ権限の実行サイクル数を格納する行である。  実行サイクル数テーブル３００の行３１２は、スレッド０、スレッド１のスーパーバイザ権限の実行サイクル数を格納する行である。実行サイクル数テーブル３００の行３１３は、スレッド０、スレッド１のハイパーバイザ権限の実行サイクル数を格納する行である。
【００４０】
実行サイクル数加算部１９０は、スレッドスケジューラ１６０と連携して、それぞれのスレッドにて実行されたハイパーバイザの実行サイクル数を実行サイクル数テーブル記憶部１９１に記録する。
【００４１】
（実行サイクル数加算部１９０の動作）
図４は、実行サイクル数加算部１９０の各サイクルでの動作手順を示すフローチャートである。初期状態では、実行サイクル数テーブル記憶部１９１に記憶される実行サイクル数はすべて「０」である。
【００４２】
実行サイクル数加算部１９０は、スレッドスケジューラ１６０から実行しているスレッド番号を取得する（ステップＳ１００）。
【００４３】
次に、実行サイクル数加算部１９０は、実行しているスレッドがスレッド０の場合には（ステップＳ１０１でＹＥＳ）、第０レジスタセット１５０からスレッド０の権限情報を取得する（ステップＳ１０２）。
【００４４】
次に、実行サイクル数加算部１９０は、実行サイクル数テーブル記憶部１９１に記憶された実行サイクル数テーブル３００におけるスレッド０の取得した権限の実行サイクル数に「１」を加算する。実行サイクル数加算部１９０は、たとえば、取得した権限がハイパーバイザ権限であった場合、実行サイクル数テーブル３００の列３０２の行３１３に記録された実行サイクル数に「１」を加算する（ステップＳ１０３）。
【００４５】
次に、実行サイクル数加算部１９０は、実行しているスレッドがスレッド０でない場合には（ステップＳ１０１でＮＯ）、第１レジスタセット１５１からスレッド１の権限情報を取得する（ステップＳ１０４）。
【００４６】
次に、実行サイクル数加算部１９０は、実行サイクル数テーブル記憶部１９１に記憶された実行サイクル数テーブル３００におけるスレッド１の取得した権限の実行サイクル数に「１」を加算する。実行サイクル数加算部１９０は、たとえば、取得した権限がハイパーバイザ権限であった場合、実行サイクル数テーブル３００の列３０３の行３１３に記録された実行サイクル数に「１」を加算する（ステップＳ１０５）。
【００４７】
（スケジュール調整部１９２の動作）
スケジュール調整部１９２は、スレッドスケジューラ１６０と連携して、実行サイクル数テーブル３００のスレッドごとのハイパーバイザ権限の実行サイクル数に基づいて、スケジュール更新周期ごとにスケジュールテーブル２００の補填用スケジュールテーブル２０２を変更する。これによって、スケジュール調整部１９２は、ハイパーバイザ権限などのユーザ権限以外で動作したスレッドが、後の補填用期間において、補充的に実行されるように調整する。
【００４８】
図５は、第１の実施形態のスケジュール調整部１９２のスケジュール更新周期ごとの動作手順を示すフローチャートである。
【００４９】
まず、スケジュール調整部１９２は、実行サイクル数テーブル記憶部１９１からスレッド０のハイパーバイザ権限の実行サイクル数ｎ０を取得する。具体的には、スケジュール調整部１９２は、実行サイクル数テーブル３００の列３０２、行３１３に記録された実行サイクル数ｎ０を取得する（ステップＳ２００）。
【００５０】
次に、スケジュール調整部１９２は、実行サイクル数テーブル記憶部１９１からスレッド１のハイパーバイザ権限の実行サイクル数ｎ１を取得する。具体的には、スケジュール調整部１９２は、実行サイクル数テーブル３００の列３０３、行３１３に記録された実行サイクル数ｎ１を取得する（ステップＳ２０１）。
【００５１】
次に、スケジュール調整部１９２は、ステップＳ２００で取得した実行サイクル数ｎ０と、ステップＳ２０１で取得した実行サイクル数ｎ１との総和Ｎ（＝ｎ０＋ｎ１）を求める（ステップＳ２０２）。
【００５２】
次に、スケジュール調整部１９２は、求めた総和Ｎが、補填用スケジュールテーブル２０２のエントリ数Ｍと同等もしくは少ないか判断する。
【００５３】
判断した結果、同等もしくは少ない場合（ステップＳ２０３のＹＥＳの場合）、ステップＳ２０４に進む。判断した結果、多い場合（ステップＳ２０３のＮＯの場合）、ステップＳ２２０に進む。
【００５４】
ステップＳ２０３でＹＥＳの場合は、スケジュール調整部１９２は、補填用スケジュールテーブル２０２の第１０エントリを起点としてステップＳ２００で取得した実行サイクル数ｎ０個のエントリに「０」を設定する（ステップＳ２０４）。さらに、スケジュール調整部１９２は、実行サイクル数テーブル記憶部１９１に記録された実行サイクル数テーブル３００におけるスレッド０のハイパーバイザ権限の実行サイクル数を０に設定する。具体的には、スケジュール調整部１９２は、実行サイクル数テーブル３００の列３０２、行３１３の実行サイクル数を０に設定する（ステップＳ２０５）。
【００５５】
次に、スケジュール調整部１９２は、補填用スケジュールテーブル２０２におけるステップＳ２０４にて「０」を追加した最後のエントリの直後のエントリを起点としてステップＳ２０１で取得した実行サイクル数ｎ１個のエントリに「１」を設定する（ステップＳ２０６）。さらに、スケジュール調整部１９２は、実行サイクル数テーブル記憶部１９１に記憶された実行サイクル数テーブル３００におけるスレッド１のハイパーバイザ権限の実行サイクル数を０に設定する。具体的には、スケジュール調整部１９２は、実行サイクル数テーブル３００の列３０３、行３１３の実行サイクル数を０に設定する（ステップＳ２０７）。
【００５６】
次に、スケジュール調整部１９２は、補填用スケジュールテーブル２０２に残りのエントリがある場合には、ステップＳ２０６にて「１」追加した最後のエントリの直後のエントリを起点として最後のエントリ（第１４エントリ）まで、「−１」を設定する（ステップＳ２０８）。
【００５７】
ステップＳ２０３でＮＯの場合は、スケジュール調整部１９２は、補填用スケジュールテーブル２０２のエントリ数ＭとステップＳ２０２で求めた実行サイクル数の総和Ｎとの割合Ｒ（＝Ｍ／Ｎ）を計算する（ステップＳ２２０）。
【００５８】
次に、スケジュール調整部１９２は、割合Ｒに基づいて、スレッド０のハイパーバイザ権限の実行サイクル数ｎ０を修正した修正実行サイクル数ｎ０′（＝ｎ０×Ｒ）を算出する。この算出において、小数点以下は切り捨てされる（ステップＳ２２１）。
【００５９】
次に、スケジュール調整部１９２は、割合Ｒに基づいて、スレッド１のハイパーバイザ権限の実行サイクル数ｎ１を修正した修正実行サイクル数ｎ１′（＝ｎ１×Ｒ）を算出する。この算出において、小数点以下は切り捨てされる（ステップＳ２２２）。
【００６０】
次に、スケジュール調整部１９２は、補填用スケジュールテーブル２０２のエントリ１０を起点としてステップＳ２２１で算出した修正実行サイクル数ｎ０′個のエントリに「０」を設定する（ステップＳ２２３）。さらに、スケジュール調整部１９２は、実行サイクル数テーブル記憶部１９１に記憶された実行サイクル数テーブル３００のスレッド０のハイパーバイザ権限の実行サイクル数を修正実行サイクル数ｎ０′だけ減じる。具体的には、スケジュール調整部１９２は、実行サイクル数テーブル３００の列３０２、行３１３の実行サイクル数から修正実行サイクル数ｎ０′を減算して、減算した値で上書きする（ステップＳ２２４）。
【００６１】
次に、スケジュール調整部１９２は、補填用スケジュールテーブル２０２においてステップＳ２２３にて「０」を追加した最後のエントリの直後のエントリを起点としてステップＳ２２２で取得した修正実行サイクル数ｎ１′個のエントリに「１」を設定する（ステップＳ２２５）。さらに、スケジュール調整部１９２は、実行サイクル数テーブル記憶部１９１に記憶された実行サイクル数テーブル３００のスレッド１のハイパーバイザ権限の実行サイクル数を修正実行サイクル数ｎ１′だけ減じる。具体的には、スケジュール調整部１９２は、実行サイクル数テーブル３００の列３０３、行３１３の実行サイクル数から修正実行サイクル数ｎ１′を減算して、減算した値で上書きする（ステップＳ２２６）。
【００６２】
次に、スケジュール調整部１９２は、補填用スケジュールテーブル２０２の残りのエントリがある場合には、すなわちステップＳ２２６にて「１」追加した最後のエントリの直後のエントリを起点として最後のエントリ（エントリ１４）まで、「−１」を設定する（ステップＳ２２７）。
【００６３】
（スケジュール調整の第１の例）
図６は、第１の実施形態におけるスケジュール調整の第１の例を説明するための図である。
【００６４】
ステップＳ２００にて取得したスレッド０の実行サイクル数ｎ０が「０」とする。
ステップＳ２０１にて取得したスレッド１の実行サイクル数ｎ１が「３」とする。
【００６５】
ステップＳ２０２にて総和Ｎが「３」となる。その結果、ステップＳ２０３において、Ｎ≦Ｍ（＝５）となり、ステップＳ２０４に進む。
【００６６】
ステップＳ２０４では、ｎ０が「０」によって、補填用スケジュールテーブル２０２には「０」が設定されない。
【００６７】
ステップＳ２０５では、ｎ０が「０」によって、スレッド０のハイパーバイザ権限の実行サイクル数は「０」のまま変化しない。  
【００６８】
ステップＳ２０６では、ｎ１が「３」によって、補填用スケジュールテーブル２０２の「３」個のエントリ（第１０、第１１、第１２エントリ）には「１」が設定される。
【００６９】
ステップＳ２０７では、ｎ１が「３」によって、スレッド１のハイバーバイザ権限の実行サイクル数が「０」に設定される。
【００７０】
ステップＳ２０８では、補填用スケジュールテーブル２０２の残りのエントリである第１３〜第１４エントリに「−１」が設定される。
【００７１】
（スケジュール調整の第２の例）
図７は、第１の実施形態におけるスケジュール調整の第２の例を説明するための図である。
【００７２】
ステップＳ２００にて取得したスレッド０の実行サイクル数ｎ０が「４」とする。
ステップＳ２０１にて取得したスレッド１の実行サイクル数ｎ１が「３」とする。
【００７３】
ステップＳ２０２にて総和Ｎが「７」となる。その結果、ステップＳ２０３において、Ｎ＞Ｍ（＝５）となり、ステップＳ２２０に進む。
【００７４】
ステップＳ２２０では、Ｒ＝５／７となる。
ステップＳ２２１では、４×５／７の整数部分が２なので、ｎ０′は「２」となる。
【００７５】
ステップＳ２２２では、３×５／７の整数部分が２なので、ｎ１′は「２」となる。
ステップＳ２２３では、ｎ０′が「２」によって、補填用スケジュールテーブル２０２の「２」個のエントリ（第１０、第１１エントリ）に「０」が設定される。
【００７６】
ステップＳ２２４では、ｎ０′が「２」によって、スレッド０のハイパーバイザ権限の実行サイクル数は「４」から「２」だけ小さい「２」に設定される。  
【００７７】
ステップＳ２２５では、ｎ１′が「２」によって、補填用スケジュールテーブル２０２の「２」個のエントリ（第１２、第１３エントリ）には「１」が設定される。
【００７８】
ステップＳ２２６では、ｎ１′が「２」によって、スレッド１のハイバーバイザ権限の実行サイクル数が「３」から「２」だけ小さい「１」に設定される。
【００７９】
ステップＳ２２７では、補填用スケジュールテーブル２０２の残りのエントリである第１４エントリに「−１」が設定される。
【００８０】
以上のように、本実施の形態では、スレッドごとに、ハイパーバイザ権限でハイパーバイザが動作した実行サイクル数を記録し、補填用期間において、各スレッドが、記録されたハイパー権限の実行サイクル数に応じたサイクル数だけ実行されるようにする。
【００８１】
これによって、プログラムが本来動作する予定であったサイクル数の実行が補填され、プログラムへ配分された処理時間を維持することができる。
【００８２】
なお、本実施の形態では、実行サイクル数テーブル３００におけるスレッドごとのハイパーバイザ権限の実行サイクル数に基づいて、補填用スケジュールテーブル２０２に設定するスレッドを決めたが、これに限定するものではない。たとえば、実行サイクル数テーブル３００におけるスレッドごとのユーザ権限およびスーパーバイザ権限の実行サイクル数を用いて、ハイパー権限の実行サイクル数を算出して、算出したハイパー権限の実行サイクル数に基づいて、補填用スケジュールテーブル２０２に設定するスレッドを決めてもよい。
【００８３】
［第１の実施の形態の変形例］
第１の実施形態では、実行サイクル数テーブル３００におけるスレッドごとのハイパーバイザ権限の実行サイクル数に基づいて、補填用スケジュールテーブル２０２に設定するスレッドを決めたが、これに限定するものではない。実行サイクル数テーブル３００におけるスレッドごとのスーパーバイザ権限の実行サイクル数に基づいて、補填用スケジュールテーブル２０２を設定するスレッド決めるものとしてもよい。
【００８４】
また、実行サイクル数テーブル３００におけるスレッドごとのスーパーバイザ権限の実行サイクル数とハイパーバイザ権限の実行サイクル数の和に基づいて、補填用スケジュールテーブル２０２を設定するスレッド決めるものとしてもよい。
【００８５】
［第２の実施形態］
第１の実施形態では、ハイパーバイザの動作サイクル数をそのスレッド分として追加するようにしたものである。本実施の形態では、さらに、スレッドの優先度や追加上限値によって、追加するサイクル数を変える。
【００８６】
図８は、第２の実施形態のマルチスレッドプロセッサの概略構成の一例である。
第２の実施形態のマルチスレッドプロセッサが、第１の実施形態のマルチスレッドプロセッサと相違する点は、第２の実施形態のマルチスレッドプロセッサが、調整管理テーブル記憶部６００を有する点と、第２の実施形態のスケジュール調整部５９２が第１の実施形態のスケジュール調整部１９２と機能が相違する点である。
【００８７】
調整管理テーブル記憶部６００は、図９のような調整管理テーブル５９３を記憶する。
調整管理テーブル５９３の列６０１は、スケジュール調整部５９２が利用するデータの種類を示す。「優先度」は、スレッド０の優先度である。優先度の値が大きいほど優先される（優先度が高い）。「上限サイクル数」は、スレッドでハイパーバイザが動作した場合に割当てるスロット数の上限である。スレッドごとに「上限サイクル数」を設けた理由は、補填用スケジュールテーブル２０２に優先度の高いスレッドばかりが設定されることによって、優先度の低いスレッドが補填用期間で実行されなくなるのを防止するためである。
【００８８】
調整管理テーブル５９３の列６０２は、スレッド０用の優先度および上限サイクル数を格納する列であり、調整管理テーブル５９３の列６０３はスレッド１用の優先度および上限サイクル数を格納する列である。
【００８９】
調整管理テーブル５９３の行６１１は、スレッド０、スレッド１の優先度を格納する行である。調整管理テーブル５９３の行６１２は、スレッド０、スレッド１の上限サイクル数を格納する行である。
【００９０】
（スケジュール調整部５９２の動作）
スケジュール調整部５９２は、スレッドスケジューラ１６０と連携して、実行サイクル数テーブル３００のスレッドごとのハイパーバイザ権限の実行サイクル数と、調整管理テーブル５９３のスレッドごとの上限サイクル数および優先度に基づいて、スレッド更新周期ごとにスケジュールテーブル２００の補填用スケジュールテーブル２０２を変更する。
【００９１】
図１０〜図１２は、第２の実施形態のスケジュール調整部５９２のスケジュール更新周期ごとの動作手順を示すフローチャートである。
【００９２】
まず、スケジュール調整部５９２は、実行サイクル数テーブル記憶部１９１の実行サイクル数テーブル３００からスレッド０のハイパーバイザ権限の実行サイクル数ｎ０を取得する。具体的には、スケジュール調整部５９２は、実行サイクル数テーブル３００の列３０２、行３１３に記憶された実行サイクル数ｎ０を取得する（ステップＳ５００）。
【００９３】
次に、スケジュール調整部５９２は、実行サイクル数テーブル記憶部１９１の実行サイクル数テーブル３００からスレッド１のハイパーバイザ権限の実行サイクル数ｎ１を取得する。具体的には、スケジュール調整部５９２は、実行サイクル数テーブル３００の列３０３、行３１３に記憶された実行サイクル数ｎ１を取得する（ステップＳ５０１）。
【００９４】
次に、スケジュール調整部５９２は、調整管理テーブル５９３からスレッド０の上限サイクル数を取得する。具体的には、スケジュール調整部５９２は、調整管理テーブル５９３の列６０２、行６１２に記憶された上限サイクル数ｕ０を取得する（ステップＳ５０２）。
【００９５】
スケジュール調整部５９２は、ステップＳ５００にて取得した実行サイクル数ｎ０とステップＳ５０２で取得した上限サイクル数ｕ０のうち小さい方を要求サイクル数ｓ０として決定する（ステップＳ５０３）。
【００９６】
次に、スケジュール調整部５９２は、調整管理テーブル５９３からスレッド１の上限サイクル数を取得する。具体的には、スケジュール調整部５９２は、調整管理テーブル５９３の列６０３、行６１２に記憶された上限サイクル数ｕ１を取得する（ステップＳ５０４）。
【００９７】
スケジュール調整部５９２は、ステップＳ５０１にて取得した実行サイクル数ｎ１とステップＳ５０４で取得した上限サイクル数ｕ１のうち小さい方を要求サイクル数ｓ１として決定する（ステップＳ５０５）。
【００９８】
次に、スケジュール調整部５９２は、ステップＳ５０３で決定した要求サイクル数ｓ０と、ステップＳ５０５で決定した要求サイクル数ｓ１との総和Ｓ（＝ｓ０＋ｓ１）を求める（ステップＳ５０６）。
【００９９】
次に、スケジュール調整部１９２は、求めた総和Ｓが、補填用スケジュールテーブル２０２のエントリ数Ｍと同等もしくは少ないか判断する。
【０１００】
判断した結果、同等もしくは少ない場合（ステップＳ５０７のＹＥＳの場合）、ステップＳ５１０に進む。判断した結果、多い場合（ステップＳ５０７のＮＯの場合）、ステップＳ５２０に進む。
【０１０１】
ステップＳ５０７でＹＥＳの場合は、スケジュール調整部５９２は、補填用スケジュールテーブル２０２の第１０エントリを起点としてステップＳ５０３で決定した要求サイクル数ｓ０個のエントリに「０」を設定する（ステップＳ５１０）。さらに、スケジュール調整部５９２は、実行サイクル数テーブル記憶部１９１に記憶された実行サイクル数テーブル３００のスレッド０のハイパーバイザ権限の実行サイクル数を要求サイクル数ｓ０だけ減じる。具体的には、スケジュール調整部５９２は、実行サイクル数テーブル３００の列３０２、行３１３の実行サイクル数から要求サイクル数ｓ０だけを減算して、減算した値で上書きする（ステップＳ５１１）。
【０１０２】
次に、スケジュール調整部５９２は、補填用スケジュールテーブル２０２においてステップＳ５１０にて「０」を追加した最後のエントリの直後のエントリを起点としてステップＳ５０５で決定した要求サイクル数ｓ１個のエントリに「１」を設定する（ステップＳ５１２）。さらに、スケジュール調整部５９２は、実行サイクル数テーブル記憶部１９１に記憶された実行サイクル数テーブル３００のスレッド１のハイパーバイザ権限の実行サイクル数を要求サイクル数ｓ１だけ減じる。具体的には、スケジュール調整部５９２は、実行サイクル数テーブル３００の列３０３、行３１３の実行サイクル数から要求サイクル数ｓ１だけを減算して、減算した値で上書きする（ステップＳ５１３）。
【０１０３】
次に、スケジュール調整部５９２は、補填用スケジュールテーブル２０２の残りのエントリがある場合には、ステップＳ５１２にて「１」を追加した最後のエントリの直後のエントリを起点として最後のエントリ（第１４エントリ）まで、「−１」を設定する（ステップＳ５１４）。
【０１０４】
ステップＳ５０７でＮＯの場合、スケジュール調整部５９２は、調整管理テーブル５９３からスレッド０の優先度を取得する。具体的には、スケジュール調整部５９２は、調整管理テーブル５９３の列６０２、行６１１に記憶されたスレッド０の優先度を取得する（ステップＳ５２０）。
【０１０５】
次に、スケジュール調整部５９２は、調整管理テーブル５９３からスレッド１の優先度を取得する。具体的には、スケジュール調整部５９２は、調整管理テーブル５９３の列６０３、行６１１に記憶されたスレッド１の優先度を取得する（ステップＳ５２１）。
【０１０６】
スケジュール調整部５９２が、スレッド０の優先度とスレッド１の優先度を比較し、スレッド０の優先度がスレッド１の優先度と同等もしくは高い場合には（ステップＳ５２２でＹＥＳ）、ステップＳ５３０に進み、スレッド０の優先度がスレッド１の優先度よりも低い場合には（ステップＳ５２２でＮＯ）、ステップＳ５４０に進む。
【０１０７】
ステップＳ５２２でＹＥＳの場合、スケジュール調整部５９２は、補填用スケジュールテーブル２０２のエントリ数Ｍと要求サイクル数ｓ０のうち小さい方を要求サイクル可能数ｐ０に設定する（ステップＳ５３０）。
【０１０８】
スケジュール調整部５９２は、補填用スケジュールテーブル２０２の第１０エントリを起点としてステップＳ５３０で決定した要求サイクル可能数ｐ０だけエントリに「０」を設定する（ステップＳ５３１）。さらに、スケジュール調整部５９２は、実行サイクル数テーブル記憶部１９１に記憶された実行サイクル数テーブル３００のスレッド０のハイパーバイザ権限の実行サイクル数を要求サイクル可能数ｐ０だけ減じる。具体的には、スケジュール調整部５９２は、実行サイクル数テーブル３００の列３０２、行３１３の実行サイクル数から要求サイクル可能数ｐ０だけを減算して、減算した値で上書きする（ステップＳ５３２）。
【０１０９】
スケジュール調整部５９２は、補填用スケジュールテーブル２０２において現在の更新周期において、未設定のエントリがあるか否かを判断する。未設定のエントリがある場合には（ステップＳ５３３でＹＥＳ）、ステップＳ５３４に進む。未設定のエントリがない場合には（ステップＳ５３３でＮＯ）、処理を終了する。
【０１１０】
ステップＳ５３３でＹＥＳの場合、スケジュール調整部５９２は、未設定のエントリの数ＭＵと要求サイクル数ｓ１のうち、小さい方を要求サイクル可能数ｐ１として決定する（ステップＳ５３４）。
【０１１１】
スケジュール調整部５９２は、補填用スケジュールテーブル２０２のステップＳ５３１にて「０」を追加した最後のエントリの直後のエントリを起点としてステップＳ５３４で決定した要求サイクル可能数ｐ１個のエントリに「１」を設定する（ステップＳ５３５）。さらに、スケジュール調整部５９２は、実行サイクル数テーブル記憶部１９１に記憶された実行サイクル数テーブル３００のスレッド１のハイパーバイザ権限の実行サイクル数を要求サイクル可能数ｐ１だけ減じる。具体的には、スケジュール調整部５９２は、実行サイクル数テーブル３００の列３０３、行３１３の実行サイクル数から要求サイクル可能数ｐ１だけを減算して、減算した値で上書きする（ステップＳ５３６）。
【０１１２】
次に、スケジュール調整部５９２は、補填用スケジュールテーブル２０２の残りのエントリがある場合には、ステップＳ５３７にて「１」を追加した最後のエントリの直後のエントリを起点として最後のエントリ（第１４エントリ）まで、「−１」を設定する（ステップＳ５３７）。
【０１１３】
ステップＳ５２２でＮＯの場合、スケジュール調整部５９２は、補填用スケジュールテーブル２０２のエントリ数Ｍと要求サイクル数ｓ１のうち小さい方を要求サイクル可能数ｐ１として決定する（ステップＳ５４０）。
【０１１４】
スケジュール調整部５９２は、補填用スケジュールテーブル２０２の第１０エントリを起点としてステップＳ５４０で決定した要求サイクル可能数ｐ１個のエントリに「１」を設定する（ステップＳ５４１）。さらに、スケジュール調整部５９２は、実行サイクル数テーブル記憶部１９１に記憶された実行サイクル数テーブル３００のスレッド１のハイパーバイザ権限の実行サイクル数を要求サイクル可能数ｐ１だけ減じる。具体的には、スケジュール調整部５９２は、実行サイクル数テーブル３００の列３０３、行３１３の実行サイクル数から要求サイクル可能数ｐ１だけを減算して、減算した値で上書きする（ステップＳ５４２）。
【０１１５】
スケジュール調整部５９２は、補填用スケジュールテーブル２０２に、現在の更新周期において、未設定のエントリがあるか否かを判断する。未設定のエントリがある場合には（ステップＳ５４３でＹＥＳ）、ステップＳ５４４に進む。未設定のエントリがない場合には（ステップＳ５４３でＮＯ）、処理を終了する。
【０１１６】
ステップＳ５４３でＹＥＳの場合、スケジュール調整部５９２は、未設定のエントリの数ＭＵと要求サイクル数ｓ０のうち、小さい方を要求サイクル可能数ｐ０として決定する（ステップＳ５４４）。
【０１１７】
スケジュール調整部５９２は、補填用スケジュールテーブル２０２のステップＳ５４１にて「０」を追加した最後のエントリの直後のエントリを起点としてステップＳ５４４で決定した要求サイクル可能数ｐ０個のエントリに「０」を設定する（ステップＳ５４５）。さらに、スケジュール調整部５９２は、実行サイクル数テーブル記憶部１９１に記憶された実行サイクル数テーブル３００のスレッド０のハイパーバイザ権限の実行サイクル数を要求サイクル可能数ｐ０だけ減じる。具体的には、スケジュール調整部５９２は、実行サイクル数テーブル３００の列３０２、行３１３の実行サイクル数から要求サイクル可能数ｐ０だけを減算して、減算した値で上書きする（ステップＳ５４６）。
【０１１８】
次に、スケジュール調整部５９２は、補填用スケジュールテーブル２０２の残りのエントリがある場合には、ステップＳ５４７にて「０」を追加した最後のエントリの直後のエントリを起点として最後のエントリ（第１４エントリ）まで、「−１」を設定する（ステップＳ５４７）。
（スケジュール調整の例）
図１３は、第２の実施形態におけるスケジュール調整の例を説明するための図である。
【０１１９】
ステップＳ５００にて取得したスレッド０の実行サイクル数ｎ０が「５」とする。
ステップＳ５０１にて取得したスレッド１の実行サイクル数ｎ１が「２」とする。
【０１２０】
ステップＳ５０２にて取得したスレッド０の上限サイクル数ｕ０が「４」とする。
ステップＳ５０３にて、ｎ０＞ｕ０より、要求サイクル数ｓ０は「４」となる。
【０１２１】
ステップＳ５０４にて取得したスレッド１の上限サイクル数ｕ１が「２」とする。
ステップＳ５０５にて、ｎ１＝ｕ１より、要求サイクル数ｓ１は「２」となる。
【０１２２】
ステップＳ５０６にて、ｓ０とｓ１の総和Ｓは「６」となる。
ステップＳ５０７にて、Ｓ＞Ｍ（＝５）によって、ステップＳ５２０に進む。
【０１２３】
ステップＳ５２０にて取得したスレッド０の優先度を「１００」とする。
ステップＳ５２１にて取得したスレッド１の優先度を「４０」とする。
【０１２４】
ステップＳ５２２にて、スレッド０の優先度＞スレッド１の優先度によって、ステップＳ５３０に進む。
【０１２５】
ステップＳ５３０にて、ｓ０＜Ｍによって、要求サイクル可能数ｐ０が「４」となる。
ステップＳ５３１にて、補填用スケジュールテーブル２０２の「４」個のエントリ（第１０〜第１３エントリ）が「０」に設定される。
【０１２６】
ステップＳ５３２にて、スレッド０のハイパーバイザ権限の実行サイクル数が「５」から「４」だけ小さい「１」に設定される。  
【０１２７】
ステップＳ５３３にて、未設定のエントリ（第１４エントリ）があるので、ステップＳ５３４に進む。
【０１２８】
ステップＳ５３４にて、未設定のエントリ数ＭＵが「１」なので、ｓ１＞ＭＵによって、要求サイクル可能数ｐ１が「１」となる。
【０１２９】
ステップＳ５３５にて、補填用スケジュールテーブル２０２の「１」個のエントリ（第１４エントリ）が「１」に設定される。
【０１３０】
ステップＳ５３６にて、スレッド１のハイパーバイザ権限の実行サイクル数は「２」から「１」だけ小さい「１」に設定される。  
【０１３１】
ステップＳ５３７では、補填用スケジュールテーブル２０２の残りのエントリがないので、「−１」が設定されない。
【０１３２】
以上のように、本実施の形態では、スレッドごとに、ハイパーバイザ権限でハイパーバイザが動作した実行サイクル数を記録し、補填用期間において、各スレッドが、記録されたハイパー権限の実行サイクル数、優先度および上限サイクル数に応じたサイクル数だけ実行されるようにする。
【０１３３】
これによって、第１の実施形態と同様に、プログラムが本来動作する予定であったサイクル数の実行が補填され、プログラムへ配分された処理時間を維持することができる。さらに、本実施の形態では、スレッド上で動作するプログラムの優先度順に補填されることによって、優先度の高いプログラムのデッドラインが守れるようにすることができる。また、本実施の形態では、補填されるスレッドのサイクル数に上限値を設定できるため、優先度の低いプログラムであっても補填することができ、プログラムの時間制約が守れない（デッドラインミス）ことが発生しにくくなる。
（第１および第２の実施形態の変形例）
スケジュールテーブル２００、コアスケジュールテーブル２０１、補填用スケジュールテーブル２０２のエントリ数は、図２に示すものに限定されるものではなく、任意の数が可能である。
【０１３４】
また、コアスケジュールテーブル２０１、補填用スケジュールテーブル２０２に含まれるエントリも、図２にしめすものに限定されるものではなく、図１４（ａ）、図１４（ｂ）に示すものであってもよい。
【０１３５】
図１４（ａ）に示すように、スケジュールテーブル２３０は、第５〜第１４エントリを含むコアスケジュールテーブル２３１と、第０〜第４エントリを含む補填用スケジュールテーブル２３２とを含む。
【０１３６】
また、  図１４（ｂ）に示すように、スケジュールテーブル２４０は、第０、１、３、４、６、７、９、１０、１２、１３エントリを含むコアスケジュールテーブル２４１と、第２、第５、第８、第１１、第１４エントリを含む補填用スケジュールテーブル２４２とを含む。
【０１３７】
今回開示された実施の形態はすべての点で例示であって制限的なものではないと考えられるべきである。本発明の範囲は上記した説明ではなくて特許請求の範囲によって示され、特許請求の範囲と均等の意味および範囲内でのすべての変更が含まれることが意図される。
【符号の説明】
【０１３８】
１００  命令バス、１０１，１０２  主記憶部、１１０  第０命令バッファ、１１１  第１命令バッファ、１２０，１２１，１２２  セレクタ、１３０  デコーダ、１４０  実行部、１４５  命令フェッチ部、１５０  第０レジスタセット、１５１  第１レジスタセット、１６０  スレッドスケジューラ、１７０  データバス、１８０  スケジュールレジスタ、１９０  実行サイクル数加算部、１９１  実行サイクル数テーブル記憶部、１９２，５９２  スケジュール調整部、２００，２３０，２４０  スケジュールテーブル、２０１，２３１，２４１  コアスケジュールテーブル、２０２，２３２，２４２  補填用スケジュールテーブル、３００  実行サイクル数テーブル、５９３  調整管理テーブル、６００  調整管理テーブル記憶部。
【図１】
2014153860.tif 000003
【図２】
2014153860.tif 000004
【図３】
2014153860.tif 000005
【図４】
2014153860.tif 000006
【図５】
2014153860.tif 000007
【図６】
2014153860.tif 000008
【図７】
2014153860.tif 000009
【図８】
2014153860.tif 000010
【図９】
2014153860.tif 000011
【図１０】
2014153860.tif 000012
【図１１】
2014153860.tif 000013
【図１２】
2014153860.tif 000014
【図１３】
2014153860.tif 000015
【図１４】
2014153860.tif 000016