(57)【特許請求の範囲】
【請求項１】
複数の実行単位を実行する複数のプロセッサを制御するマルチプロセッサ制御プログラムにおいて、
コンピュータに、
いずれかのプロセッサの処理機能が開放状態のとき、実行待ちをしている実行単位の属性を取得し、
実行単位の属性ごとにプロセッサを占有できる上限数を登録したテーブルから、前記取得した属性に対応する前記上限数を取得し、
前記取得した属性と同じ属性を持つ実行単位を実行しているプロセッサの実行数を取得し、
前記上限数が前記実行数より多い場合、実行単位の属性ごとに実行できるプロセッサを決めることなく、前記開放状態のプロセッサに前記実行待ちをしている実行単位を実行させ、
プロセッサによって実行されている実行単位の排他資源に対する競合回数を実行単位の属性ごとに取得し、
前記属性ごとに取得した競合回数に応じて、前記テーブルの前記属性に対応するプロセッサを占有できる上限数を変更する、
処理を実行させることを特徴とするマルチプロセッサ制御プログラム。
【請求項２】
前記実行待ちをしている実行単位はキュー構造により管理され、前記上限数が前記実行数以下の場合、前記実行待ちをしている実行単位を前記キュー構造のそのままの位置で実行待ちをさせ、前記実行待ちをしている実行単位の次に実行待ちをしている実行単位を前記実行待ちしている実行単位とすることを特徴とする請求項１記載のマルチプロセッサ制御プログラム。
【請求項３】
実行単位の属性はオペレーティングシステムの種別であることを特徴とする請求項１記載のマルチプロセッサ制御プログラム。
【請求項４】
複数の実行単位を実行する複数のプロセッサを制御するマルチプロセッサ制御方法において、
いずれかのプロセッサの処理機能が開放状態のとき、実行待ちをしている実行単位の属性を取得し、
実行単位の属性ごとにプロセッサを占有できる上限数を登録したテーブルから、前記取得した属性に対応する前記上限数を取得し、
前記取得した属性と同じ属性を持つ実行単位を実行しているプロセッサの実行数を取得し、
前記上限数が前記実行数より多い場合、実行単位の属性ごとに実行できるプロセッサを決めることなく、前記開放状態のプロセッサに前記実行待ちをしている実行単位を実行させ、
プロセッサによって実行されている実行単位の排他資源に対する競合回数を実行単位の属性ごとに取得し、
前記属性ごとに取得した競合回数に応じて、前記テーブルの前記属性に対応するプロセッサを占有できる上限数を変更する、
ことを特徴とするマルチプロセッサ制御方法。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明はマルチプロセッサ制御プログラム及びマルチプロセッサ制御方法に関し、特に属性が付与された複数の実行単位を実行する複数のプロセッサを制御するマルチプロセッサ制御プログラム及びマルチプロセッサ制御方法に関する。
【０００２】
【従来の技術】
現在、コンピュータのデータ処理能力を向上させるための様々な技術が存在する。その技術の中にデータ処理を複数のＣＰＵ(Central Processing Unit)で分担して並列処理させることによりデータ処理能力を向上させるマルチＣＰＵシステムがある。
【０００３】
マルチＣＰＵシステムにデータの並列処理をさせる方法として次の２通りがある。その１は、プロセスやスレッドなどのプログラムの実行単位を複数のＣＰＵに実行させ、実行が終了したＣＰＵに次々と実行待ちをしている実行単位を実行させる方法である。その２は、実行単位に属性を持たせ、属性ごとに実行単位を実行する複数のＣＰＵを決めて実行単位をＣＰＵに実行させ、実行が終了したＣＰＵから順に、そのＣＰＵが実行できる属性をもつ実行待ちをしている実行単位を実行させる方法である。
【０００４】
図１２は従来のマルチＣＰＵシステムの動作（その１）を説明する図である。図に示すマルチＣＰＵシステムは、４つのＣＰＵ４０〜４３を有する。ＣＰＵ４０〜４３はプログラムの実行単位であるプロセス４０ａ〜４３ａを実行している。また、プロセス４４，４５はＣＰＵ４０〜４３の実行待ちをしている。
【０００５】
ＣＰＵ４１がプロセス４１ａの実行を終了したとすると、実行待ちをしているプロセス４４がＣＰＵ４１よって実行される。また、ＣＰＵ４２がプロセス４２ａの実行を終了したとすると、実行待ちをしているプロセス４５がＣＰＵ４２によって実行される。このように、プロセスの実行を終了しプロセスを切り離したＣＰＵは、実行待ちをしているプロセスを順に実行していく。
【０００６】
図１３は従来のマルチＣＰＵシステムの動作（その２）を説明する図である。図に示すマルチＣＰＵシステムは、属性‘＃Ａ’を持つプロセスを実行するＣＰＵ５０，５１と、属性‘＃Ｂ’をもつプロセスを実行するＣＰＵ５２，５３とを有する。ＣＰＵ５０，ＣＰＵ５１は、属性‘＃Ａ’を持つプロセス５０ａ，５１ｂを実行し、ＣＰＵ５２，ＣＰＵ５３は、属性‘＃Ｂ’を持つプロセス５２ａ，５３ａを実行している。また、属性‘＃Ａ’を持つプロセス５４，５５は、ＣＰＵ５０，５１の実行待ちをしており、属性‘＃Ｂ’を持つプロセス５６，５７は、ＣＰＵ５２，５３の実行待ちをしている。
【０００７】
ＣＰＵ５０がプロセス５０ａの実行を終了したとすると、実行待ちをしている属性‘＃Ａ’を持つプロセス５４がＣＰＵ５０によって実行される。また、ＣＰＵ５２がプロセス５２ａの実行を終了したとすると、実行待ちをしている属性‘＃Ｂ’を持つプロセス５６がＣＰＵ５２によって実行される。このように、プロセスに属性を持たせ、属性ごとにプロセスを実行するＣＰＵを決め、プロセスの実行を終了しプロセスを切り離したＣＰＵは、決められた属性の実行待ちをしているプロセスを順に実行していく。
【０００８】
【発明が解決しようとする課題】
ここで、図１２において、ＣＰＵ４０が実行しているプロセス４０ａが、排他資源を利用しているとする。また、ＣＰＵ４１，４２が実行しているプロセス４１ａ，４２ａも排他資源を利用しようとしたとする。このとき、ＣＰＵ４１，４２は、プロセス４０ａの排他資源の利用が終了するまで、プロセス４１ａ，４２ａの実行を進めることができない（排他資源の競合）。このため、ＣＰＵ４３のみが、プロセス４３ａの実行を終了し、実行待ちのプロセス４４，４５を実行できる状態にあり並列動作性が低下してしまう。
【０００９】
このように、実行が終了したＣＰＵに次々と実行待ちをしている実行単位を実行させる方法では、排他資源の競合機会が増加した場合、並列動作性が低下してしまうという問題点があった。
【００１０】
また、図１３において、属性‘＃Ａ’を持つプロセス５０ａ，５１ａの排他資源の競合が起こったとする。属性‘＃Ｂ’を持つプロセス５２ａ，５３ａは、ＣＰＵ５２，５３によって実行が確保される。しかし、属性‘＃Ｂ’を持つプロセス５２ａ，５３ａ，５６，５７のＣＰＵ５２，５３による実行が終了しても、実行待ちをしている属性‘＃Ａ’をもつプロセス５４，５５がＣＰＵ５２，５３によって実行されることはなく、ＣＰＵの使用効率が悪い。
【００１１】
このように、実効単位に属性を持たせ、属性ごとに実行単位をＣＰＵに実行させる方法では、排他資源の競合機会を減らすことはできるが、ＣＰＵの使用効率を低下させるという問題点があった。
【００１２】
本発明はこのような点に鑑みてなされたものであり、プロセッサの並列動作性の低下、及び、プロセッサの使用効率の低下を抑えるマルチプロセッサ制御プログラムを提供することを目的とする。
【００１３】
【課題を解決するための手段】
上記課題を解決するために、複数の実行単位を実行する複数のプロセッサを制御するマルチプロセッサ制御プログラムにおいて、コンピュータに、いずれかのプロセッサの処理機能が開放状態のとき、実行待ちをしている実行単位の属性を取得し、実行単位の属性ごとにプロセッサを占有できる上限数を登録したテーブルから、前記取得した属性に対応する前記上限数を取得し、前記取得した属性と同じ属性を持つ実行単位を実行しているプロセッサの実行数を取得し、前記上限数が前記実行数より多い場合、実行単位の属性ごとに実行できるプロセッサを決めることなく、前記開放状態のプロセッサに前記実行待ちをしている実行単位を実行させ、プロセッサによって実行されている実行単位の排他資源に対する競合回数を実行単位の属性ごとに取得し、前記属性ごとに取得した競合回数に応じて、前記テーブルの前記属性に対応するプロセッサを占有できる上限数を変更する、処理を実行させることを特徴とするマルチプロセッサ制御プログラムが提供される。
【００１４】
このようなマルチプロセッサ制御プログラムによれば、実行単位の属性ごとに、実行単位がプロセッサを占有できる上限数を設け、実行単位の属性ごとに実行できるプロセッサを決めることなく、開放状態になったプロセッサに実行単位を実行させる。また、実行単位の排他資源に対する競合回数を実行単位の属性ごとに取得し、属性ごとに取得した競合回数に応じて、プロセッサを占有できる上限数を変更する。
【００１５】
【発明の実施の形態】
以下、本発明の実施の形態を図面を参照して説明する。
図１は、本発明の原理を説明する原理図である。
【００１６】
この図においてコンピュータ１は、属性取得手段１０、上限数取得手段１１、テーブル１２、実行数取得手段１３、実行手段１４、属性を有する実行単位１５ａ〜１５ｈ、及び、プロセッサ１６ａ〜１６ｆを有する。
【００１７】
属性取得手段１０は、プロセッサの処理機能が開放状態のとき、実行待ちをしている実行単位の属性を取得する。
上限数取得手段１１は、属性取得手段１０によって取得された実行待ちをしている実行単位の属性に対応する、プロセッサを占有できる上限数をテーブル１２から取得する。
【００１８】
テーブル１２には、実行単位の属性ごとにプロセッサを占有できる上限数が予め登録される。
実行数取得手段１３は、属性取得手段１０によって取得された実行待ちをしている実行単位の属性と、同じ属性を持つ実行単位を実行しているプロセッサの数である実行数を取得する。
【００１９】
実行手段１４は、上限数取得手段１１によって取得されたプロセッサを占有できる上限数が、実行数取得手段１３によって取得されたプロセッサの実行数より多い場合、処理機能が開放状態となっているプロセッサに実行待ちをしていた実行単位を実行させる。
【００２０】
実行単位１５ａ〜１５ｈは、プロセッサによって実行されるプログラム実行単位である。実行単位１５ａは属性‘＃１’を有する。実行単位１５ｂは属性‘＃１’を有する。実行単位１５ｃは属性‘＃２’を有する。実行単位１５ｄは属性‘＃１’を有する。実行単位１５ｅは属性‘＃２’を有する。実行単位１５ｆは属性‘＃１’を有する。実行単位１５ｇは属性‘＃１’を有する。実行単位１５ｈは属性‘＃２’を有する。
【００２１】
プロセッサ１６ａ〜１６ｆは、実行手段１４によって割り当てられる実行単位を実行する。
以下、図１の原理図の動作について説明する。
【００２２】
図１に示すように、プロセッサ１６ａは実行単位１５ａを実行しているとする。プロセッサ１６ｂは実行単位１５ｂを実行しているとする。プロセッサ１６ｃは実行単位１５ｃを実行しているとする。プロセッサ１６ｄは実行単位１５ｄを実行しているとする。プロセッサ１６ｅは実行単位１５ｅを実行しているとする。プロセッサ１６ｆは実行単位１５ｆを実行しているとする。また、実行単位１５ｇ、１５ｈはプロセッサ１６ａ〜１６ｆの実行待ちをしているとする。
【００２３】
ここで、プロセッサ１６ｂが、実行単位１５ｂの実行を終了したとする。プロセッサ１６ｂは、処理機能が開放状態となり、属性取得手段１０は、実行待ちをしている実行単位１５ｇの属性‘＃１’を取得する。
【００２４】
上限数取得手段１１は、実行単位１５ｇの属性＃１に対応する、プロセッサを占有できる上限数をテーブル１２から取得する。ここで、テーブル１２には、属性‘＃１’を有する実行単位がプロセッサを占有できる上限数は‘９９９９’、属性‘＃２’を有する実行単位がプロセッサを占有できる上限数は‘２’と登録されているとする。これによって、上限数取得手段１１は、属性‘＃１’の実行単位がプロセッサを占有できる上限数‘９９９９’を取得する。
【００２５】
ここで、上限数‘９９９９’は、プロセッサ１６ａ〜１６ｆを制限されることなく割り当てられることを示している。これは、コンピュータ１がプロセッサを６個しか搭載していないので、プロセッサを占有できる上限数は最高で‘６’であるためである。
【００２６】
実行数取得手段１３は、属性取得手段１０によって取得された、実行待ちをしている実行単位１５ｇの属性‘＃１’と、同じ実行単位を実行しているプロセッサの実行数を取得する。プロセッサ１６ｂは、開放状態であることを考慮して、属性‘＃１’の実行単位を実行しているプロセッサは、プロセッサ１６ａ，１６ｄ、１６ｆの３個であり、実行数取得手段１３は、実行数‘３’を取得する。
【００２７】
実行手段１４は、上限数取得手段１１によって取得されたプロセッサを占有できる上限数‘９９９９’が、実行数取得手段１３によって取得されたプロセッサの実行数‘３’より多いので、実行待ちをしていた実行単位１５ｇをプロセッサ１６ｂに実行させる。
【００２８】
実行単位１５ｇがプロセッサ１６ｂに割り当てられたことにより、次に、図１において、実行単位１５ｈが実行待ちの状態となる。
ここで、プロセッサ１６ｄが、実行単位１５ｄの実行を終了したとする。すると、プロセッサ１６ｄは、処理機能が開放状態となり、属性取得手段１０は、実行待ちをしている実行単位１５ｈの属性‘＃２’を取得する。
【００２９】
上限数取得手段１１は、実行単位１５ｈの属性‘＃２’に対応する、プロセッサを占有できる上限数をテーブル１２から取得する。先述したように、テーブル１２には、属性‘＃１’を有する実行単位がプロセッサを占有できる上限数は‘９９９９’、属性‘＃２’を有する実行単位がプロセッサを占有できる上限数は‘２’、と登録されている。これによって、上限数取得手段１１は、属性‘＃２’の実行単位がプロセッサを占有できる上限数‘２’を取得する。
【００３０】
実行数取得手段１３は、属性取得手段１０によって取得された、実行待ちをしている実行単位１５ｈの属性‘＃２’と同じ属性を持つ実行単位を実行しているプロセッサの実行数を取得する。プロセッサ１６ｄは、現在、開放状態であること、及び、先述の説明よりプロセッサ１６ｂは、属性‘＃１’の実行単位１５ｇを実行していることを考慮して、属性‘＃２’の実行単位を実行しているプロセッサは、プロセッサ１６ｃ，１６ｅの２個であり、実行数取得手段１３は、実行数‘２’を取得する。
【００３１】
実行手段１４は、上限数取得手段１１によって取得されたプロセッサを占有できる上限数‘２’が、実行数取得手段１３によって取得されたプロセッサの実行数‘２’と同数であるので、実行待ちをしていた実行単位１５ｈをプロセッサ１６ｄに実行させない。
【００３２】
このように、実行単位の属性ごとに、プロセッサを占有できる上限数を設けて、実行単位の競合機会を抑え、実行単位の属性ごとに実行できるプロセッサを決めることなく、開放状態になったプロセッサに実行単位を実行させるようにしたので、プロセッサの並列動作性、及び、使用効率の低下を抑えることができる。
【００３３】
次に、本発明の実施の形態を実現するためのハードウェア構成について説明する。
図２は、本発明の実施の形態を実現するためのコンピュータのハードウェア構成例である。
【００３４】
図に示すように、コンピュータ２は、ＣＰＵ２０ａ〜２０ｆ、各ＣＰＵ２０ａ〜２０ｆに接続されたＲＡＭ(Random Access Memory)２０ａａ〜２０ａｆ、ハードディスクドライブ(ＨＤＤ:Hard Disk Drive)２０ｇ、入力インタフェース２０ｈ、キーボード２０ｉ、グラフィック処理装置２０ｊ、モニタ２０ｋ、通信インタフェース２０ｌ、及び、バス２０ｍとから構成される。
【００３５】
ＲＡＭ２０ａａ〜２０ａｆには、各ＣＰＵ２０ａ〜２０ｆが実行するプログラムの少なくとも一部が一時的に格納される。また、ＲＡＭ２０ａａ〜２０ａｆには、各ＣＰＵ２０ａ〜２０ｆによる処理に必要な各種データが保存される。
【００３６】
ＨＤＤ２０ｇには、ＣＰＵ２０ａ〜２０ｆの並列動作を制御するためのプログラムなどが格納される。ＣＰＵ２０ａ〜２０ｆは、ＨＤＤ２０ｇの並列動作を制御するためのプログラムに従って、スレッドなどのプログラムの実行単位を実行する。
【００３７】
入力インタフェース２０ｈには、キーボード２０ｉが接続されている。入力インタフェース２０ｈは、キーボード２０ｉから送られてくる信号を、バス２０ｍを介してＣＰＵ２０ａ〜２０ｆに送信する。
【００３８】
グラフィック処理装置２０ｊには、モニタ２０ｋが接続されている。グラフィック処理装置２０ｊは、ＣＰＵ２０ａ〜２０ｆからの命令に従って、画像をモニタ２０ｋの表示画面に表示させる。
【００３９】
通信インタフェース２０ｌは、ネットワーク２０ｎに接続されている。通信インタフェース２０ｌは、ネットワーク２０ｎを介して、コンピュータ２を他の装置と通信可能にする。
【００４０】
バス２０ｍは、ＣＰＵ２０ａ〜２０ｆ、ＨＤＤ２０ｇ、入力インタフェース２０ｈ、グラフィック処理装置２０ｊ、及び、通信インタフェース２０ｌを接続する。
【００４１】
なお、上記説明では各ＣＰＵにＲＡＭが接続されたハードウェア構成を示したが、ＣＰＵ全体に対し１個のＲＡＭを共有するハードウェア構成でもよく、また、ＣＰＵの数より少ない複数のＲＡＭを用いたハードウェア構成でもよい。
【００４２】
次に、本発明の実施の形態を実現するためのコンピュータの機能について説明する。
図３は、本発明の実施の形態を実現するためのコンピュータの機能ブロック図である。
【００４３】
図に示すコンピュータ２は、ＣＰＵ２０ａ〜２０ｆ、属性取得部２１、上限数取得部２２、上限数テーブル２３、実行数取得部２４、ＣＰＵ割り当て制御部２５、カーネルＡ２６ａ、カーネルＢ２６ｂ、競合計数部２７、設定情報テーブル２８、実行待ちキュー２９、ＯＳ(Operating System)３０ａ、ＯＳ３０ｂ、及び、属性を有するスレッド３１ａ〜３１ｊとを有する。
【００４４】
属性取得部２１は、ＣＰＵ２０ａ〜２０ｆが開放状態のとき、実行待ちキュー２９の先頭（詳細は後述）で実行待ちをしているスレッドの属性を取得する。
上限数取得部２２は、属性取得部２１によって取得された、実行待ちをしているスレッドの属性に対応する、ＣＰＵを占有できる数である上限数を上限数テーブル２３から取得する。
【００４５】
上限数テーブル２３は、スレッドの属性ごとにＣＰＵを占有できる上限数を登録する。
実行数取得部２４は、属性取得部２１によって取得された実行待ちのスレッドの属性と同じ属性をもつスレッドを実行しているＣＰＵの数である実行数を取得する。
【００４６】
ＣＰＵ割り当て制御部２５は、上限数取得部２２によって取得された上限数が、実行数取得部２４によって取得された実行数より多い場合、処理機能が開放状態となっているＣＰＵに、実行待ちキュー２９の先頭で実行待ちをしているスレッドを割り当てる。また、ＣＰＵ割り当て制御部２５は、上限数取得部２２によって取得された上限数が、実行数取得部２４によって取得された実行数以下である場合、実行待ちキュー２９の先頭で実行待ちをしているスレッドを末尾で実行待ちをさせる。
【００４７】
カーネルＡ２６ａ、カーネルＢ２６ｂは、スレッドが特定の処理を実現するときに利用するプログラムである。カーネルＡ２６ａ、カーネルＢ２６ｂは、排他資源であり、あるスレッドがカーネルＡ２６ａ、又は、カーネルＢ２６ｂを利用しているとき、他のスレッドは、カーネルＡ２６ａ、カーネルＢ２６ｂを利用することはできず、スレッドの競合が生じる場合がある。
【００４８】
競合計数部２７は、スレッドのカーネルＡ２６ａ、カーネルＢ２６ｂへの単位時間当たりの競合回数を属性ごとにカウントする。また、競合計数部２７は、設定情報テーブル２８を参照し、スレッドのカーネルＡ２６ａ、カーネルＢ２６ｂへの競合回数に応じた、ＣＰＵを占有できる上限数を取得して、上限数テーブル２３のＣＰＵを占有できる上限数を変更する。
【００４９】
設定情報テーブル２８は、スレッドの属性ごとに、カーネルＡ２６ａ、カーネルＢ２６ｂの競合する回数に対応した、ＣＰＵを占有できる上限数を登録する。実行待ちキュー２９は、ＯＳ３０ａ，３０ｂから生成されたスレッドを、ＣＰＵの割り当てが必要となった順にＣＰＵ割り当て制御部２５に処理されるようにスレッドを管理する。ここで、実行待ちキューの構造について説明する。図４は、実行待ちキューの構造を示した図である。図に示すように、実行待ちキュー２９は、キュー管理部２９ａを有する。キュー管理部２９ａは、ＯＳ３０ａ，３０ｂから生成されたスレッドをＣＰＵの割り当てが必要となった順に先頭方向へスレッドを順番に並べる。図４においては、スレッド３１ｇが先にＣＰＵの割り当てが必要となったスレッドであり、スレッド３１ｈが後にＣＰＵの割り当てが必要となったスレッドである。スレッド３１ｇが実行待ちをしている先頭であり、スレッド３１ｈが実行待ちをしている末尾である。
【００５０】
ＯＳ３０ａ，３０ｂは、プログラムの実行単位であるスレッドを生成し、実行待ちキュー２９に送り出す。このとき、ＯＳ３０ａ、３０ｂは、ＯＳ３０ａ、３０ｂの種別を示す‘ＯＳ＃１’，‘ＯＳ＃２’を、スレッドの属性として付与する。
【００５１】
スレッド３１ａ〜３１ｊは、プログラムの実行単位である。スレッド３１ａは属性‘ＯＳ＃２’を有する。スレッド３１ｂは属性‘ＯＳ＃１’を有する。スレッド３１ｃは属性‘ＯＳ＃１’を有する。スレッド３１ｄは属性‘ＯＳ＃２’を有する。スレッド３１ｅは属性‘ＯＳ＃１’を有する。スレッド３１ｆは属性‘ＯＳ＃１’を有する。スレッド３１ｇは属性‘ＯＳ＃２’を有する。スレッド３１ｈは属性‘ＯＳ＃１’を有する。スレッド３１ｉは属性‘ＯＳ＃２’を有する。スレッド３１ｊは属性‘ＯＳ＃１’を有する。
【００５２】
ここで、スレッドの構造について説明する。図５は、スレッドの構造を示した図である。スレッド３１ａは、プログラム管理領域３１ａａとスレッド管理テーブル領域３１ａｂに分かれる。プログラム管理領域３１ａａは、さらにアプリケーションプログラムを格納するプログラム領域３１ａａａと、アプリケーションプログラムが使用するデータを格納するデータ領域３１ａａｂに分かれる。スレッド管理テーブル領域３１ａｂは、さらにスレッドの属性を格納する属性領域３１ａｂａとＣＰＵのレジスタ値を格納するレジスタ退避域３１ａｂｂとＯＳが使用するデータを格納するデータ領域３１ａｂｃに分かれる。レジスタ退避域３１ａｂｂには、例えば、スレッド３１ａの実行が中断されたときのＣＰＵのレジスタ値（例えば、ＣＰＵのレジスタＡ・・・レジスタＥの値）が格納される。そして、次回スレッド３１ａがＣＰＵによって実行されるとき、レジスタ退避域３１ａｂｂに格納されているレジスタ値がＣＰＵのレジスタに展開されて実行される。
【００５３】
以下に、図３に示すコンピュータの機能ブロック図の処理の流れについて説明する。
図３に示すように、ＣＰＵ２０ａはスレッド３１ａを実行しているとする。ＣＰＵ２０ｂはスレッド３１ｂを実行しているとする。ＣＰＵ２０ｃはスレッド３１ｃを実行しているとする。ＣＰＵ２０ｄはスレッド３１ｄを実行しているとする。ＣＰＵ２０ｅはスレッド３１ｅを実行しているとする。ＣＰＵ２０ｆはスレッド３１ｆを実行しているとする。また、スレッド３１ｇ、スレッド３１ｈは、実行待ちキュー２９で実行待ちをしているとする。
【００５４】
ここで、ＣＰＵ２０ｂがスレッド３１ｂの実行を終了し、切り離したとする。するとＣＰＵ２０ｂは、処理機能が開放状態となる。図６は、ＣＰＵのスレッド処理の遷移状態を説明する図（その１）である。ＣＰＵ２０ａ，ＣＰＵ２０ｃ〜２０ｆは、スレッド３１ａ，スレッド３１ｃ〜３１ｆを実行し、ＣＰＵ２０ｂは、スレッドを実行していない状態（開放状態）を示す。
【００５５】
ＣＰＵ２０ｂが開放状態になると、属性取得部２１は、実行待ちキュー２９の先頭で実行待ちをしているスレッド３１ｇの属性‘ＯＳ＃２’を取得する。
上限数取得部２２は、上限数テーブル２３から、実行待ちキュー２９の先頭で実行待ちをしているスレッド３１ｇの属性‘ＯＳ＃２’に対応する、ＣＰＵを占有できる上限数を取得する。図７は、上限数テーブルに登録されている情報の一例を示した図である。図の上限数テーブル２３には、属性‘ＯＳ＃１’に対応するプロセッサを占有できる上限数として‘４’、属性‘ＯＳ＃２’に対応するプロセッサを占有できる上限数として‘２’が登録されている。
【００５６】
図７より、上限数取得部２２は、属性‘ＯＳ＃２’に対応する、ＣＰＵを占有できる上限数‘２’を取得する。
実行数取得部２４は、属性取得部２１によって取得された、実行待ちをしているスレッド３１ｇの属性‘ＯＳ＃２’と同じ属性をもつスレッドを実行しているＣＰＵの数を取得する。図６において、ＣＰＵ２０ａ，２０ｄが属性‘ＯＳ＃２’を有するスレッド３１ａ，３１ｄを実行しているので、実行数取得部２４は、実行数‘２’を取得する。
【００５７】
上限数取得部２２によって取得された上限数は‘２’であり、属性‘ＯＳ＃２’を有するスレッドをＣＰＵに割り当てることのできる数は最大‘２’である。実行数取得部２４によって取得された実行数は‘２’であり、すでにＣＰＵには属性‘ＯＳ＃２’を有するスレッドが‘２’割り当てられている。これによって、ＣＰＵ割り当て制御部２５は、実行待ちをしていたスレッド３１ｇを開放状態にあるＣＰＵ２０ｂに実行させない。
【００５８】
ＣＰＵ割り当て制御部２５は、実行待ちキュー２９の先頭で実行待ちをしていたスレッド３１ｇを、そのままの順番で実行待ちするように保持し、次の実行待ちをしているスレッド３１ｈを見に行く。
【００５９】
ＣＰＵ２０ｂは、まだ開放状態にあるので、属性取得部２１は、実行待ちキュー２９で実行待ちをしているスレッド３１ｈの属性‘ＯＳ＃１’を取得する。
上限数取得部２２は、実行待ちキュー２９で実行待ちをしているスレッド３１ｈの属性‘ＯＳ＃１’に対応する、ＣＰＵを占有できる上限数を上限数テーブル２３から取得する。図７より、上限数取得部２２は、属性‘ＯＳ＃１’に対応するＣＰＵを占有できる上限数‘４’を取得する。
【００６０】
実行数取得部２４は、属性取得部２１によって取得された、実行待ちをしているスレッド３１ｈの属性‘ＯＳ＃１’と同じ属性をもつスレッドを実行しているＣＰＵの数を取得する。図６において、ＣＰＵ２０ｃ，２０ｅ，２０ｆが属性‘ＯＳ＃１’のスレッドを実行しているので、実行数取得部２４は、実行数‘３’を取得する。
【００６１】
上限数取得部２２によって取得された上限数は‘４’であり、属性‘ＯＳ＃１’のスレッドをＣＰＵに割り当てることのできる数は最大‘４’である。実行数取得部２４によって取得された実行数‘３’であり、スレッド３１ｈを開放状態にあるＣＰＵ２０ｂに割り当てることができる。図８は、ＣＰＵのスレッド処理の遷移状態を説明する図（その２）である。図に示すように、ＣＰＵ２０ｂに、スレッド３１ｈが割り当てられる。
【００６２】
次に、図３の機能ブロック図における上限数テーブル２３の上限数の変更処理の流れについて説明する。
競合計数部２７は、スレッド３１ａ〜３１ｆのカーネルＡ２６ａ、カーネルＢ２６ｂへの競合回数をカウントし、設定情報テーブル２８を参照して、上限数テーブル２３のＣＰＵを占有できる上限数を変更する。
【００６３】
図９は、設定情報テーブルに登録されている情報の一例を示した図である。図に示す設定情報テーブル２８には、属性“ＯＳ＃１”を有するスレッドのカーネルＡ２６ａに対する競合が１秒間に５０００回以上であれば、ＣＰＵを占有できる上限数は‘２’という情報が登録されている。同様に、競合が１秒間に１０００回以上５０００回未満であれば上限数は‘３’、競合が１秒間に１０００回未満であれば上限数は‘４’という情報が登録されている。また、属性“ＯＳ＃２”を有するスレッドのカーネルＢ２６ｂに対する競合が１秒間に７０００回以上であれば、ＣＰＵを占有できる上限数は‘２’、競合が１秒間に５０００回未満であれば上限数は‘３’という情報が登録されている。
【００６４】
ここで、図３に示す属性‘ＯＳ＃１’を有するスレッド３１ｂ，３１ｃ，３１ｅ，３１ｆによるカーネルＡ２６ａへの競合が１秒間に５０００回以上発生したとする。競合計数部２７は、設定情報テーブル２８より、属性‘ＯＳ＃１’を有するスレッドの競合回数５０００回以上に対応するＣＰＵ上限数‘２’を取得し、図７に示した上限数テーブル２３の属性‘ＯＳ＃１’に対応するＣＰＵの上限数を‘２’に変更する。同様に、競合回数が１秒間に１０００回以上５０００回未満であれば、競合計数部２７は、設定情報テーブル２８からＣＰＵ上限数‘３’を取得し、上限数テーブル２３の属性‘ＯＳ＃１’に対応するＣＰＵの上限数を‘３’に変更する。１０００回未満であれば、競合計数部２７は、設定情報テーブル２８からＣＰＵ上限数‘４’を取得し、上限数テーブル２３の属性‘ＯＳ＃１’に対応するＣＰＵの上限数を‘４’に変更する。
【００６５】
同様に、競合計数部２７は、カーネルＢ２６ｂに対する属性‘ＯＳ＃２’を有するスレッド３１ａ，３１ｄの競合回数をカウントし、上限数テーブル２３のＣＰＵ上限数を変更する。カーネルＢ２６ｂへの競合が１秒間に７０００回以上であれば、競合計数部２７は、設定情報テーブル２８を参照して、属性‘ＯＳ＃２’の競合回数７０００回以上に対応するＣＰＵ上限数‘２’を取得し、上限数テーブル２３の属性‘ＯＳ＃２’に対応するＣＰＵ上限数を‘２’に変更する。４０００回未満であれば、ＣＰＵ上限数を‘３’に変更する。
【００６６】
属性‘ＯＳ＃２’のカーネルＢ２６ｂに対する競合回数が４０００回以上７０００回未満であれば、競合計数部２７は、上限数テーブル２３のＣＰＵ上限数を変更しない。ＣＰＵ上限数の変更に履歴を持たせ、ＣＰＵの上限数が頻繁に変更されることを防止する。
【００６７】
次に、コンピュータ２の処理の流れについてフローチャートを用いて説明する。
図１０は、コンピュータのスレッドの割り当て処理を示したフローチャートである。このフローチャートが開始されると以下の処理が行われる。
【００６８】
［ステップＳ１０］属性取得部２１は、ＣＰＵ２０ａ〜２０ｆのいずれかの処理機能が開放状態のとき、実行待ちキュー２９の先頭で実行待ちをしているスレッド３１ｇの属性を取得する。
【００６９】
［ステップＳ１１］上限数取得部２２は、スレッドの属性ごとにＣＰＵ２０ａ〜２０ｆを占有できる上限数を登録した上限数テーブル２３から、スレッド３１ｇの属性に対応するＣＰＵ２０ａ〜２０ｆを占有できる上限数を取得する。
【００７０】
［ステップＳ１２］実行数取得部２４は、スレッド３１ｇと同じ属性を持つスレッドを実行しているＣＰＵ２０ａ〜２０ｆの実行数を取得する。
［ステップＳ１３］ＣＰＵ割り当て制御部２５は、ステップＳ１１で取得した上限数と、ステップＳ１２で取得した実行数を比較し、上限数が、実行数より多い場合、ステップＳ１４へ進む。上限数が、実行数以下である場合、ステップＳ１５へ進む。
【００７１】
［ステップＳ１４］ＣＰＵ割り当て制御部２５は、実行待ちキュー２９の先頭で実行待ちをしているスレッド３１ｇを開放状態にあるＣＰＵ２０ａ〜２０ｆに実行させる。
【００７２】
［ステップＳ１５］ＣＰＵ割り当て制御部２５は、実行待ちキュー２９の先頭で実行待ちをしているスレッド３１ｇを実行待ちキュー２９のそのままの位置で実行待ちをさせ、実行待ちキュー２９の次の実行待ちをしているスレッド３１ｈを見に行き、ステップＳ１０に戻る。
【００７３】
図１１は、コンピュータのプロセッサ上限数の変更処理を示したフローチャートである。このフローチャートが開始されると以下の処理が行われる。
［ステップＳ２０］競合計数部２７は、スレッド３１ａ〜３１ｆのカーネルＡ２６ａ、カーネルＢ２６ｂへの競合回数をスレッド３１ａ〜３１ｆの属性ごとに取得する。
【００７４】
［ステップＳ２１］競合計数部２７は、競合回数に応じてＣＰＵ２０ａ〜２０ｆの占有できる上限数を登録した設定情報テーブル２８から、ステップＳ２０で取得した競合回数に対応する、ＣＰＵ２０ａ〜２０ｆを占有できる上限数を取得する。
【００７５】
［ステップＳ２２］競合計数部２７は、上限数テーブル２３のＣＰＵ２０ａ〜２０ｆを占有できる上限数を、ステップＳ２１で取得したＣＰＵ２０ａ〜２０ｆを占有できる上限数に変更する。
【００７６】
このように、スレッドの属性ごとに、ＣＰＵを占有できる上限を設けたので、排他資源の競合機会が増加することがなく、並列動作性の低下を抑制することができ、スレッドの属性ごとに実行できるＣＰＵを決めることなく、開放状態になったＣＰＵにスレッドを割り当てるようにしたのでプロセッサの使用効率の低下を抑えることができる。
【００７７】
また、スレッドの排他資源であるカーネルへの競合をリアルタイムに監視し、競合回数が多い場合、スレッドのＣＰＵを占有できる上限数を減らし、競合回数が少ない場合、スレッドのＣＰＵを占有できる上限数を増加するようにしたので、ＣＰＵの並列動作性、使用効率を最適の状態にコントロールすることができる。また、スレッドの属性に対応したＣＰＵの割り当て数のチューニングを不要とすることができる。
【００７８】
なお、上記の説明において、ＣＰＵが実行する実行単位をスレッドとして説明したが、プロセスや、ＬＷＰ(Light Weight Process)などのプログラム実行単位であってもよい。また、属性をＯＳの種別としたが、ＯＳ上で動作するアプリケーションの種別によって属性を付与してもよい。また、ＯＳ、アプリケーションの種別によらず、プログラムの実行単位の内容に応じたフラグや、特定の値、名前などの属性を付与してもよい。さらに、スレッドの排他資源への競合回数をカウントして、ＣＰＵを占有できる上限数を変更するようにしたが、スレッドが排他資源をロック（あるスレッドが排他資源を利用している状態）している時間を計測し、ロックした時間に応じてＣＰＵを占有できる上限数を変更するようにしてもよい。また、競合回数のカウント、ＣＰＵを占有できる上限数の変更を一定の周期で行うようにしてもよい。
【００７９】
また、上記の各コンピュータが有すべき機能の処理内容は、コンピュータで読み取り可能な記録媒体に記録されたプログラムに記述させておくことができる。このプログラムをコンピュータで実行することにより、上記処理がコンピュータで実現できる。コンピュータで読み取り可能な記録媒体としては、磁気記録装置や半導体メモリなどがある。市場に流通させる場合には、ＣＤ−ＲＯＭやフレキシブルディスクなどの可搬型記録媒体にプログラムを格納して流通させたり、ネットワークを介して接続されたコンピュータの記憶装置に格納しておき、ネットワークを通じて他のコンピュータに転送することもできる。コンピュータで実行する際には、コンピュータ内のハードディスク装置などにプログラムを格納しておき、メインメモリにロードして実行する。
【００８０】
（付記１）  複数の実行単位を実行する複数のプロセッサを制御するマルチプロセッサ制御プログラムにおいて、
コンピュータに、
プロセッサの処理機能が開放状態のとき、実行待ちをしている実行単位の属性を取得し、
実行単位の属性ごとにプロセッサを占有できる上限数を登録したテーブルから、前記取得した属性に対応する前記上限数を取得し、
前記取得した属性と同じ属性を持つ実行単位を実行しているプロセッサの実行数を取得し、
前記上限数が前記実行数より多い場合、前記開放状態のプロセッサに前記実行待ちをしている実行単位を実行させる、
処理を実行させることを特徴とするマルチプロセッサ制御プログラム。
【００８１】
（付記２）  プロセッサによって実行されている実行単位の排他資源に対する競合回数を前記実行単位の属性ごとに取得し、
前記属性ごとに取得した競合回数に応じて、前記テーブルの前記属性に対応するプロセッサを占有できる上限数を変更する、
処理をさらに実行させることを特徴とする付記１記載のマルチプロセッサ制御プログラム。
【００８２】
（付記３）  前記実行待ちをしている実行単位はキュー構造により管理され、前記上限数が前記実行数以下の場合、前記実行待ちをしている実行単位を前記キュー構造のそのままの位置で実行待ちをさせ、前記実行待ちをしている実行単位の次に実行待ちをしている実行単位に前記処理を実行させることを特徴とする付記１記載のマルチプロセッサ制御プログラム。
【００８３】
（付記４）  前記実行単位の属性はオペレーションシステムの種別であることを特徴とする付記１記載のマルチプロセッサ制御プログラム。
（付記５）  複数の実行単位を実行する複数のプロセッサを制御するマルチプロセッサ制御方法において、
プロセッサの処理機能が開放状態のとき、実行待ちをしている実行単位の属性を取得し、
実行単位の属性ごとにプロセッサを占有できる上限数を登録したテーブルから、前記取得した属性に対応する前記上限数を取得し、
前記取得した属性と同じ属性を持つ実行単位を実行しているプロセッサの実行数を取得し、
前記上限数が前記実行数より多い場合、前記開放状態のプロセッサに前記実行待ちをしている実行単位を実行する、
ことを特徴とするマルチプロセッサ制御方法。
【００８４】
（付記６）  複数の実行単位を実行する複数のプロセッサを制御するマルチプロセッサ制御装置において、
プロセッサの処理機能が開放状態のとき、実行待ちをしている実行単位の属性を取得する属性取得手段と、
実行単位の属性ごとにプロセッサを占有できる上限数を登録したテーブルから、前記取得した属性に対応する前記上限数を取得する上限数取得手段と、
前記取得した属性と同じ属性を持つ実行単位を実行しているプロセッサの実行数を取得する実行数取得手段と、
前記上限数が前記実行数より多い場合、前記開放状態のプロセッサに前記実行待ちをしている実行単位を実行する実行手段と、
を有することを特徴とするマルチプロセッサ制御装置。
【００８５】
（付記７）  複数の実行単位を実行する複数のプロセッサを制御するマルチプロセッサ制御プログラムを記録したコンピュータ読み取り可能な記録媒体において、
コンピュータに、
プロセッサの処理機能が開放状態のとき、実行待ちをしている実行単位の属性を取得し、
実行単位の属性ごとにプロセッサを占有できる上限数を登録したテーブルから、前記取得した属性に対応する前記上限数を取得し、
前記取得した属性と同じ属性を持つ実行単位を実行しているプロセッサの実行数を取得し、
前記上限数が前記実行数より多い場合、前記開放状態のプロセッサに前記実行待ちをしている実行単位を実行させる、
処理を実行させることを特徴とするマルチプロセッサ制御プログラムを記録したコンピュータ読み取り可能な記録媒体。
【００８６】
【発明の効果】
以上説明したように本発明では、コンピュータに、実行単位の属性ごとに、実行単位がプロセッサを占有できる上限数を設け、実行単位の属性ごとに実行できるプロセッサを決めることなく、開放状態になったプロセッサに実行単位を実行させる。また、実行単位の排他資源に対する競合回数を実行単位の属性ごとに取得し、属性ごとに取得した競合回数に応じて、プロセッサを占有できる上限数を変更する。これにより、プロセッサの並列動作性の低下及び使用効率の低下を抑えることができ、また、並列動作性及び使用効率を最適の状態に制御することができる。
【図面の簡単な説明】
【図１】本発明の原理を説明する原理図である。
【図２】本発明の実施の形態を実現するためのコンピュータのハードウェア構成例である。
【図３】本発明の実施の形態を実現するためのコンピュータの機能ブロック図である。
【図４】実行待ちキューの構造を示した図である。
【図５】スレッドの構造を示した図である。
【図６】ＣＰＵのスレッド処理の遷移状態を説明する図（その１）である。
【図７】上限数テーブルに登録されている情報の一例を示した図である。
【図８】ＣＰＵのスレッド処理の遷移状態を説明する図（その２）である。
【図９】設定情報テーブルに登録されている情報の一例を示した図である。
【図１０】コンピュータのスレッドの割り当て処理を示したフローチャートである。
【図１１】コンピュータのプロセッサ上限数の変更処理を示したフローチャートである。
【図１２】従来のマルチＣＰＵシステムの動作（その１）を説明する図である。
【図１３】従来のマルチＣＰＵシステムの動作（その２）を説明する図である。
【符号の説明】
１，２  コンピュータ
１０  属性取得手段
１１  上限数取得手段
１２  テーブル
１３  実行数取得手段
１４  実行手段
１５ａ〜１５ｈ  実行単位
１６ａ〜１６ｆ  プロセッサ
２０ａ〜２０ｆ  ＣＰＵ
２１  属性取得部
２２  上限数取得部
２３  上限数テーブル
２４  実行数取得部
２５  ＣＰＵ割り当て制御部
２６ａ  カーネルＡ
２６ｂ  カーネルＢ
２７  競合計数部
２８  設定情報テーブル
２９  実行待ちキュー
３０ａ，３０ｂ  ＯＳ
３１ａ〜３１ｊ  スレッド
【図１】
0004127354.tif 000002
【図２】
0004127354.tif 000003
【図３】
0004127354.tif 000004
【図４】
0004127354.tif 000005
【図５】
0004127354.tif 000006
【図６】
0004127354.tif 000007
【図７】
0004127354.tif 000008
【図８】
0004127354.tif 000009
【図９】
0004127354.tif 000010
【図１０】
0004127354.tif 000011
【図１１】
0004127354.tif 000012
【図１２】
0004127354.tif 000013
【図１３】
0004127354.tif 000014