(57)【要約】【課題】高速なI/O処理とCPUの高い処理効率の情報処理装置を提供する。【解決手段】メモリと、メモリにアクセス可能な複数のプロセッサコアとを有し、複数のプロセッサコアそれぞれは、プロセッサコアによる実行対象のプロセスを、プロセスの実行優先度に基づいて実行し、入出力処理の受信データを受信したか否かをポーリングにより繰り返し判定するポーリングプロセスが、複数のプロセッサコアのいずれかにより実行されている場合、ポーリングプロセスにより受信データを受信したことが判定されることに応答して、入出力処理を実行し、ポーリングプロセスが複数のプロセッサコアにより実行されていない場合、受信データを受信したときに発行されるプロセッサ割込みに応答して、入出力処理を実行する情報処理装置。【選択図】図１１
2019114173.tif 000002
【特許請求の範囲】
【請求項１】
メモリと、
前記メモリにアクセス可能な複数のプロセッサコアとを有し、
前記複数のプロセッサコアそれぞれは、
前記プロセッサコアによる実行対象のプロセスを、前記プロセスの実行優先度に基づいて実行し、
入出力処理の受信データを受信したか否かをポーリングにより繰り返し判定するポーリングプロセスが、前記複数のプロセッサコアのいずれかにより実行されている場合、前記ポーリングプロセスにより前記受信データを受信したことが判定されることに応答して、前記入出力処理を実行し、
前記ポーリングプロセスが前記複数のプロセッサコアにより実行されていない場合、前記受信データを受信したときに発行されるプロセッサ割込みに応答して、前記入出力処理を実行する、情報処理装置。
【請求項２】
前記複数のプロセッサコアそれぞれは、
入出力処理の受信データを受信したか否かをポーリングにより繰り返し判定するポーリングプロセスが、前記複数のプロセッサコアのいずれかにより実行されている場合、前記ポーリングプロセスによる入出力要求を入出力要求先に発行し、
前記ポーリングプロセスが前記複数のプロセッサコアにより実行されていない場合、前記プロセッサ割込みによる入出力要求を入出力要求先に発行する、請求項１に記載の情報処理装置。
【請求項３】
前記ポーリングプロセスは、複数の前記実行優先度のうち、いずれかの実行優先度に設定され、
前記複数のプロセッサコアそれぞれは、
前記複数のプロセッサコア全てが前記ポーリングプロセスの実行優先度より高い実行優先度のプロセスを実行中の場合、前記ポーリングプロセスを実行せず、前記複数のプロセッサコアの少なくとも一つが前記ポーリングプロセスの実行優先度より高い実行優先度のプロセスを実行中でない場合、前記ポーリングプロセスを実行する、請求項１に記載の情報処理装置。
【請求項４】
前記ポーリングプロセスは、前記複数の実行優先度のうち最低の実行優先度に設定され、
前記複数のプロセッサコアそれぞれは、
前記複数のプロセッサコア全てが前記ポーリングプロセス以外のプロセスを実行中の場合、前記ポーリングプロセスを実行せず、前記複数のプロセッサコアの少なくとも一つが前記ポーリングプロセス以外のプロセスを実行中でない場合、前記ポーリングプロセスを実行する、請求項１に記載の情報処理装置。
【請求項５】
前記複数のプロセッサコアそれぞれは、
入出力要求の発生に応答して、前記複数のプロセッサコアのいずれかが前記ポーリングプロセスを実行中か否か判定し、
前記ポーリングプロセスが実行中の場合、前記ポーリングプロセスによる入出力要求を要求先に発行し、
前記ポーリングプロセスが実行中でない場合、前記プロセッサ割込みによる入出力要求を要求先に発行する、請求項１に記載の情報処理装置。
【請求項６】
前記複数のプロセッサコアそれぞれは、
前記ポーリングプロセスによる入出力要求を発行した場合、前記ポーリングプロセスによるポーリング先の第１の受信キューでの前記受信データの受信判定を待って、前記入出力処理を実行し、
前記プロセッサ割込みによる入出力要求を発行した場合、前記プロセッサ割込みによる入出力要求に対応する第２の受信キューでの前記受信データの受信時に発行される前記プロセッサ割込みに応答して、割込み処理後に前記入出力処理を実行する、請求項５に記載の情報処理装置。
【請求項７】
前記複数のプロセッサコアそれぞれは、
前記入出力要求の複数の入出力要求先にそれぞれ対応した複数のポーリングプロセスを、互いに異なる実行優先度で、実行する、請求項２に記載の情報処理装置。
【請求項８】
メモリと、
前記メモリにアクセス可能な複数のプロセッサコアとを有し、
前記複数のプロセッサコアそれぞれが、
前記プロセッサコアによる実行対象のプロセスを、前記プロセスの実行優先度に基づいて実行し、
入出力処理の受信データを受信したか否かをポーリングにより繰り返し判定するポーリングプロセスが、前記複数のプロセッサコアのいずれかにより実行されている場合、前記ポーリングプロセスにより前記受信データを受信したことが判定されることに応答して、前記入出力処理を実行し、
前記ポーリングプロセスが前記複数のプロセッサコアにより実行されていない場合、前記受信データを受信したときに発行されるプロセッサ割込みに応答して、前記入出力処理を実行する、情報処理方法。
【請求項９】
複数のプロセッサコアによる実行対象のプロセスを、前記プロセスの実行優先度に基づいて実行し、
入出力処理の受信データを受信したか否かをポーリングにより繰り返し判定するポーリングプロセスが、前記複数のプロセッサコアのいずれかにより実行されている場合、前記ポーリングプロセスにより前記受信データを受信したことが判定されることに応答して、前記入出力処理を実行し、
前記ポーリングプロセスが前記複数のプロセッサコアにより実行されていない場合、前記受信データを受信したときに発行されるプロセッサ割込みに応答して、前記入出力処理を実行する、処理を複数のプロセッサコアのいずれかに実行させるプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は，情報処理装置、情報処理方法及びプログラムに関する。
【背景技術】
【０００２】
コンピュータやサーバなどの情報処理装置は、周辺デバイスや他のノード（コンピュータやサーバ）からデータを受信するI/O処理を実行する。I/O処理において、周辺デバイスや他のノードからのデータの受信イベントを検出する方法として、所定時間毎に受信キューをポーリングする処理と、データの受信イベント時にCPU割込みを発生させる処理とがある。
【０００３】
I/O処理については、以下の特許文献に記載がある。但し、特許文献５は公知例ではない。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特表２０１４−５３１０８１号公報
【特許文献２】国際公開第２００９／０６０５３０号
【特許文献３】特開２００９−２３８００１号公報
【特許文献４】国際公開第２００８／１２６１３８号
【特許文献５】特願２０１７−１３６５１４（２０１７年７月１２日出願）
【発明の概要】
【発明が解決しようとする課題】
【０００５】
ポーリングによる受信イベントの発生の検出処理は、OS（Operating System）のカーネルで実行され、CPU割り込みのようなCPU内のレジスタ等のコンテキストの切り替え（コンテキストスイッチ）処理が発生せず、受信から高速にI/O処理を行うことができる。但し、CPUがポーリング処理を繰り返し実行するためCPUの負担が大きく、他の処理の効率低下を招く。
【０００６】
一方、CPU割り込みによる受信イベントの発生の検出処理は、ポーリング処理のようにCPUが繰り返し実行する必要がなく、CPUの負担が小さいので、他の処理の効率が向上する。但し、受信イベントが発生するとCPU割り込みが発生し、割込みハンドラによりCPUのコンテキストスイッチ処理が行われるので、受信後高速にI/O処理を行うことができない。
【０００７】
そこで，実施の形態の第1の側面の目的は，高速なI/O処理とCPUの高い処理効率を有する情報処理装置、情報処理方法及びプログラムを提供することにある。
【課題を解決するための手段】
【０００８】
本実施の形態の第１の側面は，メモリと、前記メモリにアクセス可能な複数のプロセッサコアとを有し、前記複数のプロセッサコアそれぞれは、
前記プロセッサコアによる実行対象のプロセスを、前記プロセスの実行優先度に基づいて実行し、
入出力処理の受信データを受信したか否かをポーリングにより繰り返し判定するポーリングプロセスが、前記複数のプロセッサコアのいずれかにより実行されている場合、前記ポーリングプロセスにより前記受信データを受信したことが判定されることに応答して、前記入出力処理を実行し、
前記ポーリングプロセスが前記複数のプロセッサコアにより実行されていない場合、前記受信データを受信したときに発行されるプロセッサ割込みに応答して、前記入出力処理を実行する、情報処理装置である。
【発明の効果】
【０００９】
第１の側面によれば，高速なI/O処理とCPUの高い処理効率を有する情報処理装置を提供できる。
【図面の簡単な説明】
【００１０】
【図１】本実施の形態における情報処理装置の概略構成を示す図である。
【図２】コンピュータ１のプロセッサCPU_0、CPU_1の内部構成を示す図である。
【図３】本実施の形態例におけるプロセッサが実行するOS内のカーネルのプログラム例を示す図である。
【図４】第1の実施の形態における通常のプロセスとポーリングプロセスの関係を示す図である。
【図５】プロセッサのコアが２個の場合の通常のプロセスとポーリングプロセスの関係を示す図である。
【図６】プロセス・スケジューラの処理のフローチャートを示す図である。
【図７】プロセス・スケジューラとディスパッチャの制御例を示す図である。
【図８】プロセス・スケジューラとディスパッチャの制御例を示す図である。
【図９】デバイス・ドライバ内のI/Oドライバの処理のフローチャートを示す図である。
【図１０】ポーリングプロセスの処理のフローチャートを示す図である。
【図１１】ポーリングプロセスによるI/O処理を行う例を示す図である。
【図１２】ポーリングプロセスによるI/O処理を行う場合の、I/O要求からI/O処理までのシーケンスフローチャートを示す図である。
【図１３】CPU割り込みによるI/O処理を行う例を示す図である。
【図１４】CPU割り込みによるI/O処理を行う場合の、I/O要求からI/O処理までのシーケンスフローチャートを示す図である。
【図１５】第２の実施の形態における通常のプロセスとポーリングプロセスの関係を示す図である。
【図１６】第３の実施の形態における通常のプロセスとポーリングプロセスの関係を示す図である。
【図１７】第４の実施の形態における通常のプロセスとポーリングプロセスの関係を示す図である。
【図１８】第５の実施の形態における通常のプロセスとポーリングプロセスの関係を示す図である。
【発明を実施するための形態】
【００１１】
図1は、本実施の形態における情報処理装置の概略構成を示す図である。情報処理装置（コンピュータ、サーバまたはノード）１は、演算処理装置であるCPU(Central Processing Unit)チップ１０と、DRAM等のメインメモリ１２と、周辺デバイスインターフェース１４と、それらを接続するバス１６とを有する。CPUチップ１０は、以下プロセッサと称する。また、コンピュータ１は、ノードNODE_0でもある。
【００１２】
コンピュータ１は、更に、ハードディスクHDDやSSD（Solid State Device）などの大容量のストレージデバイス20、20_1、20_2を有し、ストレージデバイスは周辺デバイスインターフェース１４に接続される。ストレージデバイス20_1、20_2には、それぞれOSとアプリケーションプログラム等が記憶され、コンピュータ１が起動する時、これらのOSとアプリケーションプログラムはメインメモリに展開され、プロセッサ１０により実行される。
【００１３】
周辺デバイスインターフェース１４には、更に、ネットワークデバイスである高速インターコネクタ２２が接続され、ネットワークインタフェースカード（NIC）などの別の周辺デバイス３２や、他のノード３０が、高速インターコネクタ２２を介してコンピュータ１に接続される。
【００１４】
スーパーコンピュータなどのHPC（High Performance Computer）では、複数のノードNODE_0、３０が、InfiniBand等のネットワークデバイスである高速インターコネクタを介して互いに接続され、ノード間でデータを高速に転送することが行われる。また、HPCは、ハードディスクに代替されているSSD（Solid State Device）を、NVM Express（Non-Volatile Memory Express、NVMe）などの高速インターフェースを介して周辺デバイスインターフェース１４に接続し、SSDに対するレイテンシを短縮する。
【００１５】
上記のように、HPCは、高速インターコネクタや高速インターフェースを介して周辺デバイスや他のノードと高速のI/O処理を行う。
【００１６】
I/O処理において、プロセッサ１０が発行したI/O要求に対するデータやパケットの受信を検出する方法として、第1に、プロセッサが実行するOS内のカーネルが、受信キューへのデータやパケットの受信を定期的にチェックするポーリングプロセスと、第２に、周辺デバイスやプロセッサ内のメモリ制御回路が受信キューへの受信完了時に発行するCPU割り込みによる処理とがある。
【００１７】
ポーリングプロセスによる受信イベントの検出処理は、OSのカーネルで実行され、CPU割り込みで行われるCPU内のレジスタ等のコンテキストスイッチの処理がなく、高速にI/O処理を行うことができる。但し、CPUがポーリングプロセスを実行するためCPUの負担増となり、他の処理の実行効率の低下を招く。
【００１８】
一方、CPU割り込みによる受信イベントの検出処理は、ポーリングプロセスのようにCPUが繰り返し実行する必要がなくCPUの負担が小さい。但し、受信イベントが発生するとCPU割り込みが発生し、割込みハンドラによりCPUのコンテキストスイッチが行われ、I/O処理の高速化が実現できない。
【００１９】
したがって、HPCは、高速のI/O処理を実現するためには、カーネルのポーリングプロセスにより受信イベントを検出することが望ましい。但し、CPUの負担増となり他のプロセスの実行効率の低下を招く。
【００２０】
図２は、コンピュータ１のプロセッサCPU_0、CPU_1の内部構成を示す図である。プロセッサCPU_0は、複数のコアCORE_0, CORE_1を有し、コアは、命令をフェッチし、デコードし、データをI/O要求でロードし、データに対して演算処理を実行する。図２のコアの数は一例である。また、プロセッサCPU_0は、キャッシュ制御回路とキャッシュメモリを有するキャッシュCACHEと、メインメモリ１２へのアクセスを制御するメモリコントローラMCと、プロセッサ外部の周辺デバイスや他のノードとのI/O要求のインターフェースであるI/O制御回路１１とを有する。
【００２１】
図２の例では、周辺デバイスインターフェース１４には、高速インターフェースを有するSSDである高速ストレージ２４が接続され、さらに、図１と同様に高速インターコネクタ２２が接続される。高速インターコネクタ２２には、周辺デバイス３２や他のノード３０が接続される。
【００２２】
図２において、コアCORE_0, CORE_1がI/O要求を発行すると、キャッシュCACHEでキャッシュミスになると、キャッシュ制御回路がI/O要求先にI/O要求を発行する。I/O要求先がメインメモリの場合は、メモリコントローラMCを介してメインメモリM_MEMにI/O要求のコマンドを発行する。一方、I/O要求先が高速ストレージ２４や周辺デバイス３２や他のノード３０の場合は、メモリコントローラMCを介してI/O要求先にI/O要求が発行される。
【００２３】
I/O要求先がメインメモリの場合、メインメモリからリードされたデータはキャッシュCACHE内のキャッシュ制御回路に応答され、キャッシュメモリに登録されると共に、I/O要求元のコアにデータ応答される。また、I/O要求先が周辺デバイスや他のノードの場合、I/O要求先からリードされたデータは、I/O制御回路１１とメモリコントローラMCを介して、メインメモリ内の受信キューに記憶される。
【００２４】
図３は、本実施の形態例におけるプロセッサが実行するOS内のカーネルのプログラム例を示す図である。カーネルは、前述のストレージ２0_1内に記憶され、コンピュータの起動時にメインメモリに展開されプロセッサのコアにより実行される。
【００２５】
カーネルは、例えば、プロセス・スケジューラ４１と、プロセスのディスパッチャ４２と、アイドルプロセス４３と、割込みルーティン４４と、ポーリングプロセス４５とを有する。本実施の形態では、CPUの各コアが実行する処理単位を「プロセス」と称する。「プロセス」は「タスク」とも称される。
【００２６】
プロセス・スケジューラ４１は、プロセッサにより実行され、アプリケーションプログラムから生成される様々なプロセスの実行順を、例えばその優先度（実行優先度）に基づいてスケジューリングし、実行キュー（RUNキュー）RUN_QUE_0, RUN_QU_1のスロットにプロセスへのリンク（リンク先情報）を登録する。RUNキューの各スロットは実行可能なプロセスの実行優先度に対応付けられる。プロセス・スケジューラは、例えば新たなプロセスの実行優先度に対応するスロットがない場合、新たなスロットに新たなプロセスを対応付け、他のスロットとの順番をリシャッフルする。また、RUNキューは、例えばコア毎に設けられるが、複数のコアを有するプロセッサ毎に設けられても良い。RUNキューは、メインメモリM_MEM内に格納されてもよい。
【００２７】
ディスパッチャ４２は、プロセッサにより実行され、RUNキューに登録されたプロセスを所定の条件が満たされたときに、プロセッサのコアにディスパッチし実行させる。
【００２８】
アイドルプロセス４３は、プロセッサのコアが実行すべきプロセスが存在しない場合に、そのプロセッサのコアにより実行される。アイドルプロセスは、例えば省電力モードでの動作などを実行する。
【００２９】
割込みルーティン４４は、プロセッサにより実行され、プロセッサに割込みが発生すると、割込みの原因を判定し、割込み原因に対応する処理を実行する。プロセッサ割込みが発生すると、プロセッサのコア内のコンテキストの切り替えが行われ、そのコアにより割込みルーティンが実行される。
【００３０】
ポーリングプロセス４５は、プロセッサにより実行され、I/O要求先からのデータやパケットが格納される受信キューを定期的にチェックし、データやパケットの受信イベントを検出し、例えば、対応するI/O処理の関数をコールする、または自らI/O処理を実行する。そのためポーリングプロセス４５は、ポーリング先のアドレスを有するポーリングリストPOL_LST_0〜POL＿LST_2を参照して、ポーリング先の受信イベントの発生を判定する。ポーリングリストは、例えば、初期設定でメインメモリM_MEM内に格納されてもよい。
【００３１】
コンピュータの周辺デバイスインターフェース１４に周辺デバイスが接続される場合、その周辺デバイスを制御するプログラムであるデバイス・ドライバDDR_0〜DDR_2が、カーネル内に追加される。デバイス・ドライバは、自分宛てのI/O要求に応答して、周辺デバイスを制御する。周辺デバイスから受信するデータやパケットは、I/O要求に対応する受信キューRCV_QUE_0〜RCV_QUE_2に格納する。受信キューRCV_QUE_0〜RCV_QUE_2は、メインメモリM_MEM内に格納されてもよい。
【００３２】
メインメモリM_MEM内には、上記以外に例えば、プロセスPR#のタスク構造体などを記憶する。
【００３３】
前述のポーリングプロセス４５が、デバイス・ドライバが管理する受信キューRCV_QUE_0〜RCV_QUE_2をポーリング先とする場合、ポーリングプロセスのポーリングリストPOL_LST_0〜POL＿LST_2は、受信キューそれぞれのアドレスを有する。
【００３４】
［特願２０１７−１３６５１４］
前述の特願２０１７−１３６５１４には、ポーリング専用のタスクを優先度が最低のアイドルルーティン（またはアイドルプロセス）に含め、優先度の高いタスクが少なくプロセッサがアイドルルーティンを実行する場合、ポーリング専用タスクを実行し、高速I/O処理をおこなうことが開示されている。アイドルルーティンは、カーネル内に含められ、通常、RUNキューには割り当てられない。そして、実行すべきタスクがなくなると、スケジューラがアイドルルーティンを実行対象に選択し、実行すべきタスクがないプロセッサはアイドルルーティンを実行する。
【００３５】
しかし、アイドルルーティンより優先度の高い他のタスクが複数存在し、複数のプロセッサが全てこれらの他のタスクを実行中になると、アイドルルーティンが実行されなくなる。その場合、ポーリングプロセスが実行されず、I/O処理の性能悪化を招く。
【００３６】
［第１の実施の形態］
図４は、第1の実施の形態における通常のプロセスとポーリングプロセスの関係を示す図である。本実施の形態では、プロセス・スケジューラが、通常のプロセスに加えてI/O処理のポーリングプロセスの実行順をスケジューリングする。すなわち、プロセス・スケジューラは、プロセスの実行優先度に基づいてRUNキューに登録する。そして、プロセッサの各コアが、スケジューリングされた通常プロセスまたはポーリングプロセスを実行する。
【００３７】
図４には、RUNキューRUN_QUEの各スロットSL1-SL4にリンクされた通常のプロセスPR1,PR2,PR3とポーリングプロセスP_PRとが示される。縦軸は、プロセスの実行優先度を示し、上にいくほど実行優先度が高い。RUNキューの実行優先度が最も高いスロットSL1には３つのプロセスPR1が順番にリンクで結合される。図中、〇はプロセスのタスク構造体を、矢印はリンクを意味する。同様に、次に実行優先度が高いスロットSL2には２つのプロセスPR2が、次のスロットSL3には４つのプロセスPR3がそれぞれ順番にリンクで結合される。そして、第1の実施の形態では、ポーリングプロセスP_PRに通常プロセスよりも低い実行優先度PRY_Pが設定されている。そのため、最も低い実行優先度のスロットSL4にポーリングプロセスP_PRがリンクされる。但し、後述するとおり、ポーリングプロセスはより高い実行優先度に設定されてもよい。
【００３８】
そして、ディスパッチャは、RUNキューに登録されたプロセスのうち、最高の実行優先度のプロセスを例えばリンクの順に、プロセッサCPUのコアに実行させる。
【００３９】
したがって、図４の（Ａ）のように、RUNキュー内にポーリングプロセスP_PRの実行優先度PRY_Pより高い実行優先度のプロセスPR1、PR2、PR3が登録中の場合、プロセッサのコアはポーリングプロセスP_PRを実行しない。つまり、図４（Ａ）ではコアは高負荷状態であるので、コアはポーリングプロセス以外のプロセスPR1〜PR3を実行する。この場合、デバイス・ドライバ内のI/Oドライバは、I/O要求をCPU割り込みでI/O要求先に発行する。そのため、プロセッサのコアは、I/O要求に対するデータの受信をCPU割り込みで知らされ、CPU割り込みでI/O処理を実行する。
【００４０】
一方、図４の（Ｂ）のように、ポーリングプロセスP_PRの実行優先度PRY_Pより高い実行優先度のプロセスが存在しない場合、RUNキューのスロットSL1にポーリングプロセスP_PRが登録される。そのため、プロセッサのコアは、スロットSL1のポーリングプロセスを実行する。つまり、図４（Ｂ）ではコアは低負荷状態であり、ポーリングプロセス以外の通常プロセスを実行する必要がないので、実行優先度PRY_Pのポーリングプロセスを実行する。この場合、デバイス・ドライバ内のI/Oドライバは、I/O要求をポーリングプロセスでI/O要求先に発行する。そのため、プロセッサのコアは、ポーリングプロセスを実行して、I/O要求に対するデータの受信を検出する。この場合、ポーリングプロセスがデータ受信を検出すると、CPU割り込みは発生せず、ポーリングプロセスが、例えばI/O処理を実行する関数をコールするか、または自らI/O処理を実行する。CPU割り込みが発生しないため高速I/O処理が可能になる。
【００４１】
図５は、プロセッサのコアが２個の場合の通常のプロセスとポーリングプロセスの関係を示す図である。２つのコアCORE_0, CORE_1それぞれがスケジューラSCH_0, SCH_1を実行し、２つのコアそれぞれのRUNキューRUN_QUE_0, RUN_QUE_1に登録するプロセスPR#（#=1-3, 11-14）、ポーリングプロセスP_PRをスケジューリングする。図３で示したとおり、RUNキューRUN_QUE_0, RUN_QUE_1、及びプロセスPR#とポーリングプロセスP_PRは、メモリ領域に格納されている。また、プロセス、ポーリングプロセスの場合、プロセスIDやプロセスが使用するメモリなどを有するタスク構造体（task structure）がメモリ領域に格納される。
【００４２】
コアCORE_0のRUNキューRUN_QUE_0は、図４の（Ａ）の状態と同じである。すなわち、スケジューラSCH_0は、RUNキューRUN_QUE_0の最高優先度のスロットSL1に３つのプロセスPR1をリンクにより登録し、同様に、スロットSL2に２つのプロセスPR2を、スロットSL3に４つのプロセスPR3を、そして最低優先度のスロットSL4にポーリングプロセスP_PRをそれぞれリンクにより登録する。ポーリングプロセスが他のプロセスより低い優先度のスロットに登録されるのは、ポーリングプロセスの優先度が最低に設定されているからである。
【００４３】
同様に、コアCORE_1のスケジューラSCH_1は、RUNキューRUN_QUE_1のスロットSL1〜SL4にプロセスPR11〜PR14がリンクによりそれぞれ登録している。
【００４４】
スケジューラは、実行すべきプロセスを、その実行優先度に基づいてRUNキューの実行優先度に対応するスロットに登録する。どのコアのRUNキューに登録するかの制御は、例えば、RUNキュー間の負荷のバランスを取るなどのルールに基づいて、他のプロセスにより行われる。
【００４５】
そして、図示しないディスパッチャが、コアにより実行中のプロセスが終了または所定時間継続したなど、新たなプロセスを実行する条件が整った場合、RUNキュー内の最も高い実行優先度のプロセスを順番にコアにディスパッチする。これに応答して、コアがディスパッチされたプロセスを実行する。
【００４６】
図５の例では、上記のスケジューラのプロセススケジューリングとディスパッチャによるディスパッチ対象プロセスの選択から分かるとおり、２つのRUNキューのいずれかの最上位のスロットにポーリングプロセスが登録されると、いずれかのコアがポーリングプロセスを実行する。
【００４７】
図６は、プロセス・スケジューラの処理のフローチャートを示す図である。プロセス・スケジューラは、各コアにより実行され、例えばアプリケーションプログラムにより新しいプロセスが生成されると（S1 YES）、そのプロセスの実行優先度に基づいて、対応するRUNキューのプロセスの実行優先度に対応するスロットに、そのプロセスを登録する（プロセスへのリンクを生成する）（S2）。RUNキューの複数のスロットは実行優先度順に並べられる。新しいプロセスの実行優先度に対応するスロットがRUNキュー内にない場合、プロセス・スケジューラは、新たにスロットを既存のスロットの間に割り当てて、新たなスロットに新しいプロセスを登録する。その結果、既存のスロットにリンクされていた登録済みプロセスがリスケジュールされる。
【００４８】
上記のようにプロセス・スケジューラが実行対象のプロセスをその実行優先度に基づいてRUNキュー内のスロットに登録するので、ディスパッチャは、単に、RUNキュー内の最も高い優先度のスロットのプロセスを順番に選択してコアにディスパッチするだけでよい。この結果、プロセッサのコアは、実行対象のプロセスをその実行優先度の高い順に実行することになる。
【００４９】
図７、図８は、プロセス・スケジューラとディスパッチャの制御例を示す図である。ここでは、プロセスを実行するコアが例えば８個である。そして、図中、各コアのRUNキューは省略され、８個のコアそれぞれのRUNキューに登録される全プロセスが、優先度の軸に沿って並べて示される。前述と同様に、〇はプロセスのタスク構造体、矢印はリンクを意味する。また、垂直方向に時間軸を示し、各時間T1-T3でのプロセスの状態が優先度軸に対応して示される。
【００５０】
図７の時間T1では、ポーリングプロセスP_PRと、ポーリングプロセスの実行優先度PRY_Pより高い優先度を有するプロセスPR1とPR2及び低い優先度を有するプロセスPR3が、RUNキューに登録されている。最高優先度のプロセスPR1は５個、PR2は３個、PR3は４個で、ポーリングプロセスP_PRは1個である。
【００５１】
この場合、プロセス・スケジューラが、最高優先度の５個のプロセスPR1を、例えば５つのコアCORE1,CORE2,CORE5-CORE7それぞれのRUNキューに登録し、ディスパッチャが、５個のプロセスPR1をそれぞれのコアにディスパッチし実行させる。また、次の優先度の３個のプロセスPR2は、３つのコアCORE3,CORE4,CORE8それぞれのRUNキューに登録され、実行される。そのため、実行優先度PRY_PのポーリングプロセスP_PRは、いずれのコアも実行しない。
【００５２】
図７の時間T2では、コアCORE8によるプロセスPR2の実行が完了する。その結果、コアCORE8のRUNキューにはポーリングプロセスP_PRが最高優先度として登録され、コアCORE8は、プロセスPR2からポーリングプロセスP_PRにプロセススイッチする。そして、時間T2後は、コアCORE8がポーリングプロセスP_PRの実行を継続する。
【００５３】
図８の時間T2は、図７の時間T2と同じである。その後、図８の時間T3では、ポーリングプロセスP_PRの実行優先度PRY_Pより高い優先度のプロセスPR2が追加される。その結果、プロセス・スケジューラは、コアCORE8のRUNキュー内のプロセスをリスケジュールし、ポーリングプロセスP_PRより高い優先度のスロットに新たに発生したプロセスPR2を登録する。その結果、ディスパッチャは、コアCORE8によるポーリングプロセスP_PRの実行を中断し、追加されたプロセスPR2をコアCORE8にディスパッチし実行させる。時間T3後は、ポーリングプロセスの実行は中断状態のままとなる。
【００５４】
このように、ポーリングプロセスP_PRの実行優先度PRY_Pより高い実行優先度のプロセスの数がコアの数以上になると、ポーリングプロセスP_PRは実行されない。この状態は、コア群が通常のプロセスPR1-PR2による高負荷状態である。一方、ポーリングプロセスP_PRの実行優先度PRY_Pより高い実行優先度のプロセスの数がコアの数未満になると、ポーリングプロセスP_PRが実行される。この状態は、コア群がポーリングプロセスを実行できる低負荷状態である。
【００５５】
したがって、ポーリングプロセスの実行優先度PRY_Pを所定の優先度に設定すると、その実行優先度PRY_Pに応じて、コアがポーリングプロセスを実行する頻度または確率を変更できる。
【００５６】
［ポーリングプロセスとCPU割り込みをハイブリッド化したI/O処理］
次に、本実施の形態におけるポーリングプロセスとCPU割り込みをハイブリッド化したI/O処理について説明する。以下、デバイス・ドライバのI/Oドライバの処理、ポーリングプロセスの処理を説明した後、ポーリングプロセスによりI/O処理と、CPU割り込みによるI/O処理を説明する。
【００５７】
本実施の形態では、プロセス・スケジューラのスケジューリングにより、コアがその負荷状態に応じてポーリングプロセスを実行する。そして、コアがポーリングプロセスを実行中か否かに対応して、I/O処理におけるデータの受信完了チェックをポーリングプロセスで行うかCPU割り込みで行うかの切替制御が行われる。
【００５８】
つまり、ポーリングプロセスより実行優先度が高いプロセスが多く存在する高負荷の状況下では、高実行優先度のプロセスの実行がポーリングプロセスより優先され、I/O処理はCPU割り込みで行われる。この場合、I/O処理は低速になる。一方、ポーリングプロセスより実行優先度が高いプロセスが少なく存在するまたは存在しない低負荷の状況下では、ポーリングプロセスが実行され、I/O処理はポーリングプロセスで行われる。この場合、I/O処理は高速になる。
【００５９】
図９は、デバイス・ドライバ内のI/Oドライバの処理のフローチャートを示す図である。図３に示したとおり、デバイス・ドライバは、周辺デバイスに対応してカーネル内にインストールされる。そして、コアが周辺デバイス等へのI/O要求を発行すると、I/O要求先のデバイス・ドライバはコアにより実行される。
【００６０】
図９に示すとおり、デバイス・ドライバのI/Oドライバは、コアにより実行され、I/O要求が発行されると（S10のYES）、コアからのI/O要求を受信する（S11）。そして、I/Oドライバは、各コアがポーリングプロセスを実行中か否かを示すポーリング・フラグをチェックする（S12）。例えば、ポーリングプロセスは、コアによる実行開始時にポーリング・フラグを「１」に設定する処理を有する。
【００６１】
I/Oドライバは、ポーリング・フラグが「１」の場合（S13のYES）、つまり、コアがポーリングプロセスを実行中の場合、I/O要求の受信に応答して、ポーリングプロセスによるI/O要求を要求先に発行する（S14）。一方、I/Oドライバは、ポーリング・フラグが「０」の場合（S13のNO）、つまり、コアがポーリングプロセスを実行中でない場合、I/O要求の受信に応答して、CPU割り込みによるI/O要求を要求先に発行する（S15）。ポーリングプロセスによるI/O要求では、I/O要求に対するデータやパケットの受信確認はポーリングプロセスにより行われる。一方、CPU割り込みによるI/O要求では、受信確認はCPU割り込みにより行われる。詳細な処理については後述する。
【００６２】
図１０は、ポーリングプロセスの処理のフローチャートを示す図である。ポーリングプロセスは、プロセッサのコアにより実行され、ポーリング先の受信キューにデータが受信されたかをチェックし（S21）、データの受信があれば（S22のYES）、受信キューに対応するI/O処理を実行するI/O関数をコールする（S23）。ポーリングプロセスは、上記の処理S21〜S23を、例えば所定クロック数経過する度に（S24のYES）、繰り返す。
【００６３】
ポーリングプロセスは、複数の周辺デバイスの受信キューについてデータ受信チェックを行うよう設定されてもよく、または、単一の周辺デバイスの受信キューについてデータ受信チェックを行うよう設定されてもよい。また、ポーリングプロセスは、データ受信を検出した場合（S22のYES）、I/O要求に対応するI/O処理を実行するI/O関数をコールするが（S23）、ポーリングプロセスが自ら、I/O処理を実行してもよい。
【００６４】
［ポーリングプロセスによるI/O処理］
図１１は、ポーリングプロセスによるI/O処理を行う例を示す図である。図１２は、ポーリングプロセスによるI/O処理を行う場合の、I/O要求からI/O処理までのシーケンスフローチャートを示す図である。図１１では、プロセッサのコアが３個の例であり、各コアCORE_0〜CORE_2に対して、RUNキューRUN_QUE_0〜RUN_QUE_2が、メモリ領域M_MEM内に設けられる。また、各コアの各RUNキューに対応して、対応するコアがポーリングプロセス実行中を示すポーリング・フラグPF_0〜PF_2が、メモリ領域内に設けられる。ポーリング・フラグPFは、例えば、コアがポーリングプロセスを実行開始するとき「１」に設定され、ポーリングプロセスが中断するとき「０」に変更される。
【００６５】
更に、メモリ領域内には、ポーリングプロセスによるI/O要求に対する受信キューRCV_QUE_pと、CPU割り込みによるI/O要求に対する受信キューRCV_QUE_intと、受信キュー毎に設けられた受信キューフラグRQF_p、RQF_intとが記憶される。受信キューRCV_QUE_pは、例えば４つの周辺デバイスに対応してそれぞれ設けられている。受信キューRCV_QUE_intは１つ設けられているが、周辺デバイスに対応して複数個でもよい。受信キューフラグRQF_p、RQF_intは、例えば、受信キューにデータが受信すると「１」に設定され、受信データが処理されると「０」に戻される。
【００６６】
図１１、図１２を参照して、ポーリングプロセスによるI/O処理を行う場合の処理例を説明する。前提として、図１１に示すとおり、コアCORE_0がポーリングプロセスを実行中であり、コアCORE_2がI/O要求先の周辺デバイスのデバイス・ドライバのI/Oドライバを実行中である。
【００６７】
コアCORE_2が、I/Oドライバを実行して、いずれかのコアからのI/O要求を受信し（S11）、プーリングフラグPF_0〜PF_2をチェックしいずれかのコアがポーリングプロセスを実行中か否かを判定する（S12）。この判定でポーリングプロセスが実行中と判定され（S13のYES）、I/Oドライバが、ポーリングプロセスによるI/O要求を、要求先に発行する（S14）。このとき、コアCORE_0がポーリングプロセスを実行中である（S20_1）。
【００６８】
I/Oドライバは、ポーリングプロセスによるI/O要求に、I/O要求のIDに加えて、ポーリングプロセス対象のI/O要求であることを示すフラグ、返信データを受信する受信キューIDなどが含めてもよい。または、発行するI/O要求の情報を記憶するI/O要求バッファ内に、I/O要求のIDと上記のフラグと受信キューIDを記憶してもよい。何らかの方法で、ポーリングプロセスによるI/O要求であり、データを受信する受信キューがどれかを記録する。
【００６９】
発行されたI/O要求は、例えばキャッシュメモリでキャッシュミスとなり、メモリコントローラMC、I/O制御回路１１、周辺デバイスインターフェース１４を経由して、要求先の周辺デバイス（または他のノード）２４，３２，３１に送信される。このI/O要求に応答して、要求先の周辺デバイスまたは他のノードは、データを返信する（S30）。
【００７０】
返信されたデータは、逆に周辺デバイスインターフェース１４、I/O制御回路１１を経由して、メモリコントローラMCに入力する。そこで、メモリコントローラMCは、メモリ内のポーリングプロセスによるI/O要求の受信キューに受信データをライトする（S31,S32）。この受信データのライトは、例えばメモリコントローラMCがダイレクトメモリアクセス処理によりメインメモリ内の受信キューに受信データをライトしてもよい。
【００７１】
一方、コアCORE_0はポーリングプロセスを実行中であるので（S20_1）、定期的に受信キューの受信キューフラグRQFをチェックする。そのため、メインメモリの受信キューへの受信データのライトが完了してその受信キューフラグRQFが「１」になると（S33）、コアCORE_0のポーリングプロセスが受信キューフラグRQFの「１」を検出し（S21,S22）、I/O要求に対応するI/O関数をコールする（S23）。このI/O関数の実行に応答して、I/O要求元のコアCORE_0が受信キュー内の受信データに対して所定の処理を実行する（S34）。
【００７２】
上記のI/O要求の処理例では、ポーリングプロセスの実行優先度より高い実行優先度のプロセスの数が少ない軽負荷状態にあり、いずれかのコアがポーリングプロセスを実行している。したがって、ポーリングプロセスを実行するコアがI/O要求のデータ受信完了を検出すると、CPU割り込みによるコアのプロセス切り替えに要する遅延なしで、所定のI/O処理を開始することができ、高速I/O処理が行われる。
【００７３】
［CPU割り込みによるI/O処理］
図１３は、CPU割り込みによるI/O処理を行う例を示す図である。図１４は、CPU割り込みによるI/O処理を行う場合の、I/O要求からI/O処理までのシーケンスフローチャートを示す図である。図１３は図１１と同様の構成である。図１４は図１２と同じ構成の処理を示す。
【００７４】
図１３、図１４を参照して、CPU割り込みによるI/O処理を行う場合の処理例を説明する。前提として、図１３に示すとおり、いずれのコアCORE_0〜CORE_2もポーリングプロセスを実行しておらず、コアCORE_2がI/O要求先の周辺デバイスのデバイス・ドライバのI/Oドライバを実行中である。
【００７５】
コアCORE_2が、I/Oドライバを実行して、いずれかのコアからのI/O要求を受信し（S11）、ポーリング・フラグPF_0〜PF_2をチェックしいずれかのコアがポーリングプロセスを実行中か否かを判定する（S12）。この判定でポーリングプロセスが実行中でないと判定され（S13のNO）、I/Oドライバが、CPU割り込みによるI/O要求を、要求先に発行する（S15）。
【００７６】
I/Oドライバは、CPU割り込みによるI/O要求に、I/O要求のIDに加えて、CPU割り込み対象のI/O要求であることを示すフラグ、返信データを受信する受信キューIDなどが含めても良い。または、発行するI/O要求の情報を記憶するI/O要求バッファ内に、I/O要求のIDと上記のフラグと受信キューIDを記憶してもよい。何らかの方法で、CPU割り込みによるI/O要求であり、データを受信する受信キューがどれかを記録する。
【００７７】
発行されたI/O要求は、例えばキャッシュメモリでキャッシュミスとなり、メモリコントローラMC、I/O制御回路１１、周辺デバイスインターフェース１４を経由して、要求先の周辺デバイス（または他のノード）２４，３２，３１に送信される。このI/O要求に応答して、要求先の周辺デバイスまたは他のノードは、データを返信する（S30）。
【００７８】
返信されたデータは、逆に周辺デバイスインターフェース１４、I/O制御回路１１を経由して、メモリコントローラMCに入力する。そこで、メモリコントローラMCは、メモリ内のCPU割り込みに対応する受信キューに受信データをライトする（S31,S32）。この受信データのライトは、図１２と同様にメモリコントローラMCによるダイレクトメモリアクセスで行われても良い。
【００７９】
一方、メインメモリ内の受信キューへの受信データのライトが完了すると、メモリコントローラMCがCPU割り込みを発行する（S40）。このCPU割り込みは、I/O要求元のコアCORE_2に発行される。コアCORE_2は、CPU割り込みの原因がI/O要求に対するデータ受信完了であることを検出し、CPU割り込みの処理を実行する（S41）。そして、I/O要求元のコアCORE_2は、受信キュー内の受信データに対する処理を実行する（S42）。
【００８０】
上記のI/O要求の処理例では、ポーリングプロセスの実行優先度より高い実行優先度のプロセスの数が多い重負荷状態にあり、いずれかのコアもポーリングプロセスを実行していない。したがって、コアはポーリングプロセスの実行による負荷を回避し、高い実行優先度のプロセスの処理に専念できる。一方、I/O要求のデータ受信が完了するとCPU割り込みが発行されるので、I/O要求元のコアは、I/O要求に対するI/O処理を実行することができる。但し、この場合、コアCORE_2ではCPU割込み処理へのプロセススイッチを伴うので低速I/O処理になる。
【００８１】
［第２の実施の形態］
第１の実施の形態では、ポーリングプロセスの実行優先度を他のプロセスより低い最低優先度に設定した。しかし、ポーリングプロセスの実行優先度を、他の一部のプロセスより高く設定してもよい。または、他の全てのプロセスの最も高い優先度に設定してもよいし、他の全てのプロセスの実行優先度より高い優先度に設定してもよい。
【００８２】
図１５は、第２の実施の形態における通常のプロセスとポーリングプロセスの関係を示す図である。図１５では、図４と同様に、１個のコアに対応するRUNキューRUN_QUEにプロセスPR1,PR2とポーリングプロセスP_PRとプロセスPR3が、それぞれの優先度のスロットSL1〜SL3に登録されている。そして、第２の実施の形態では、図１５（Ａ）に示されるとおり、ポーリングプロセスP_PRの実行優先度PRY_Pを、プロセスPR2より低くプロセスPR3より高く設定する。
【００８３】
そのため、図１５（Ａ）の状況下では、１個のコアは最も実行優先度の高いプロセスPR1を実行し、ポーリングプロセスP_PRは実行しない。しかし、図１５（Ｂ）の状況下では、ポーリングプロセスP_PRの実行優先度PRY_Pより高い実行優先度のプロセスはRUNキューに登録されていない。したがって、実行優先度PRY_Pより低い実行優先度のプロセスPR3が登録されていても、1個のコアは最も高い実行優先度のポーリングプロセスP_PRを実行する。これにより、図４のポーリングプロセスの実行優先度を最低に設定した場合よりも、コアがポーリングプロセスを実行する頻度または確率が高くなる。
【００８４】
そして、第２の実施の形態でも、I/Oドライバは、ポーリングプロセスが実行中であれば、ポーリングプロセスによるI/O要求を要求先に発行し、ポーリングプロセスが実行中でないなら、CPU割り込みによるI/O要求を要求先に発行する。
【００８５】
第２の実施の形態によれば、I/O処理をどの程度高速にするかの要求に応じて、ポーリングプロセスの実行優先度PRY_Pを設定することで、I/O処理の速度を所望の速度に制御できる。
【００８６】
［第３の実施の形態］
図１６は、第３の実施の形態における通常のプロセスとポーリングプロセスの関係を示す図である。図１６では、複数のコアの複数または共通のRUNキューに登録されるプロセスが優先度の軸に沿って示される。特に、ポーリングプロセスは、図２に示した高速インターコネクタ用のポーリングプロセスP_PR1と高速インターフェースSSD用のポーリングプロセスP_PR2とを有する。そして、両ポーリングプロセスはプロセスPR3より高い実行優先度であり、高速インターコネクタ用のポーリングプロセスP_PR1は、高速インターフェースSSD用のポーリングプロセスP_PR2よりも高い実行優先度PRY1_Pに設定される。
【００８７】
図１６（Ａ）では、高速インターコネクタ用のポーリングプロセスP_PR1と高速インターフェースSSD用のポーリングプロセスP_PR2が隣接する実行優先度PRY1_P, PRY2_Pに設定される。一方、図１６（Ｂ）では、高速インターコネクタ用のポーリングプロセスP_PR1は、プロセスPR2より高い実行優先度PRY1_Pに、高速インターフェースSSD用のポーリングプロセスP_PR2は、プロセスPR2より低い実行優先度PRY2_Pにそれぞれ設定される。
【００８８】
したがって、図１６（Ａ）（Ｂ）において、プロセス・スケジューラとディスパッチャの制御により、例えば２つのコアのRUNキューにプロセスPR1,PR2のいずれも登録されない場合、２つのコアは、両ポーリングプロセスP_PR1,P_PR2を実行する。この場合、高速インターコネクタへのI/O要求と高速インターフェースSSDへのI/O要求は、いずれもポーリングプロセスによるI/O要求となる。
【００８９】
また、図１６（Ａ）において、プロセスPR1またはプロセスPR2のうち１つのプロセスがRUNキューに登録される場合、２つのコアは、その１つのプロセスPR1またはPR2と、より高い実行優先度PRY1_Pの高速インターコネクタ用のポーリングプロセスP_PR1とを実行する。この場合、高速インターフェースSSD用のポーリングプロセスP_PR2は実行されないので、高速インターフェースSSDへのI/O要求は、CPU割り込みによるI/O要求となる。
【００９０】
同様に、図１６（Ｂ）において、１つのプロセスPR1がRUNキューに登録される場合、２つのコアは、プロセスPR1と高速インターコネクタ用のポーリングプロセスP_PR1を実行し、高速インターフェースSSD用のポーリングプロセスP_PR2は実行されない。また、プロセスPR1がRUNキューに登録されず、少なくとも１つのプロセスPR2が登録される場合も、同様にポーリングプロセスが実行及び不実行となる。
【００９１】
このように複数の周辺デバイスそれぞれへのI/O要求に対応する複数のポーリングプロセスを異なる実行優先度に設定することで、I/Oドライバは、それぞれのI/O要求に対して、異なる頻度または確率でポーリングプロセスによるI/O要求を発行する。それにより、複数の周辺デバイスそれぞれのI/O処理速度を、所望の速度に調整できる。
【００９２】
［第４の実施の形態］
図１７は、第４の実施の形態における通常のプロセスとポーリングプロセスの関係を示す図である。図１７では、複数のコアの複数または共通のRUNキューに登録されるプロセスが優先軸に沿って示される。この例では、ポーリングプロセスP_PRの複数のタスク構造体が同じ実行優先度PRY＿Pに設定される。この場合、複数のコアのいずれかがポーリングプロセスP_PRを実行する確率が高まる。また、複数のコアがポーリングプロセスP_PRを実行する場合、プロセス・スケジューラが１つのコアが実行中のポーリングプロセスを中断して別のプロセスにスイッチしても、他のコアがポーリングプロセスの実行を継続することが起こりうる。
【００９３】
図１７において、実行優先度PRY_Pの複数のポーリングプロセスが、複数の周辺デバイス宛てのI/O要求に対するポーリングプロセスP_PR1,P_PR2,P_PR3を含むようにしても良い。この場合、プロセスPR1,PR2が存在しない場合、複数のコアが３個以上であれば、３種類のポーリングプロセスP_PR1, P_PR2, P_PR3を実行し、プロセスPR1,PR2の数に応じて３種類のポーリングプロセスの一部が実行される。
【００９４】
［第５の実施の形態］
図１８は、第５の実施の形態における通常のプロセスとポーリングプロセスの関係を示す図である。図１８では、複数のコアの複数または共通のRUNキューに登録されるプロセスが示される。
【００９５】
図１８（Ａ）の例では、第１のポーリングプロセスP_PR1の複数のタスク構造体に実行優先度PRY1_Pが設定され、第２のポーリングプロセスP_PR2の複数のタスク構造体に異なる実行優先度PRY2_Pが設定される。また、図１８（Ｂ）の例も（Ａ）と同様であるが、実行優先度PRY1_PはプロセスPR2の実行優先度より高く、実行優先度PRY2_PはプロセスPR2の実行優先度より低い。
【００９６】
つまり、第５の実施の形態は、図１６（Ａ）（Ｂ）の第３の実施の形態に、図１７の第４の実施の形態（同じ実行優先度が複数のポーリングプロセスまたは複数のタスク構造体に設定されること）を適用した例である。
【００９７】
以上の通り、第１乃至第５の実施の形態によれば、プロセッサのコアがポーリングプロセスを実行できる場合、ポーリングプロセスによるI/O処理が行われ、高速I/O処理を行うことができる。一方、プロセッサのコアがポーリングプロセスを実行できない場合、CPU割り込みによるI/O処理が行われ、低速ではあるがI/O要求に対するI/O処理を実行することができる。
【００９８】
そして、プロセッサのコアがポーリングプロセスを実行できるか否かは、ポーリングプロセスに設定した実行優先度に依存するので、適切な実行優先度に設定することで、プロセッサのコアの負荷のレベルに対応した最適なI/O処理の実行が可能になる。
【００９９】
以上の実施の形態をまとめると，次の付記のとおりである。
【０１００】
（付記１）
メモリと、
前記メモリにアクセス可能な複数のプロセッサコアとを有し、
前記複数のプロセッサコアそれぞれは、
前記プロセッサコアによる実行対象のプロセスを、前記プロセスの実行優先度に基づいて実行し、
入出力処理の受信データを受信したか否かをポーリングにより繰り返し判定するポーリングプロセスが、前記複数のプロセッサコアのいずれかにより実行されている場合、前記ポーリングプロセスにより前記受信データを受信したことが判定されることに応答して、前記入出力処理を実行し、
前記ポーリングプロセスが前記複数のプロセッサコアにより実行されていない場合、前記受信データを受信したときに発行されるプロセッサ割込みに応答して、前記入出力処理を実行する、情報処理装置。
【０１０１】
（付記２）
前記複数のプロセッサコアそれぞれは、
入出力処理の受信データを受信したか否かをポーリングにより繰り返し判定するポーリングプロセスが、前記複数のプロセッサコアのいずれかにより実行されている場合、前記ポーリングプロセスによる入出力要求を入出力要求先に発行し、
前記ポーリングプロセスが前記複数のプロセッサコアにより実行されていない場合、前記プロセッサ割込みによる入出力要求を入出力要求先に発行する、付記１に記載の情報処理装置。
【０１０２】
（付記３）
前記ポーリングプロセスは、複数の前記実行優先度のうち、いずれかの実行優先度に設定され、
前記複数のプロセッサコアそれぞれは、
前記複数のプロセッサコア全てが前記ポーリングプロセスの実行優先度より高い実行優先度のプロセスを実行中の場合、前記ポーリングプロセスを実行せず、前記複数のプロセッサコアの少なくとも一つが前記ポーリングプロセスの実行優先度より高い実行優先度のプロセスを実行中でない場合、前記ポーリングプロセスを実行する、付記１に記載の情報処理装置。
【０１０３】
（付記４）
前記ポーリングプロセスは、前記複数の実行優先度のうち最低の実行優先度に設定され、
前記複数のプロセッサコアそれぞれは、
前記複数のプロセッサコア全てが前記ポーリングプロセス以外のプロセスを実行中の場合、前記ポーリングプロセスを実行せず、前記複数のプロセッサコアの少なくとも一つが前記ポーリングプロセス以外のプロセスを実行中でない場合、前記ポーリングプロセスを実行する、付記１に記載の情報処理装置。
【０１０４】
（付記５）
前記複数のプロセッサコアそれぞれは、
入出力要求の発生に応答して、前記複数のプロセッサコアのいずれかが前記ポーリングプロセスを実行中か否か判定し、
前記ポーリングプロセスが実行中の場合、前記ポーリングプロセスによる入出力要求を要求先に発行し、
前記ポーリングプロセスが実行中でない場合、前記プロセッサ割込みによる入出力要求を要求先に発行する、付記１に記載の情報処理装置。
【０１０５】
（付記６）
前記複数のプロセッサコアそれぞれは、
前記ポーリングプロセスによる入出力要求を発行した場合、前記ポーリングプロセスによるポーリング先の第１の受信キューでの前記受信データの受信判定を待って、前記入出力処理を実行し、
前記プロセッサ割込みによる入出力要求を発行した場合、前記プロセッサ割込みによる入出力要求に対応する第２の受信キューでの前記受信データの受信時に発行される前記プロセッサ割込みに応答して、割込み処理後に前記入出力処理を実行する、付記５に記載の情報処理装置。
【０１０６】
（付記７）
前記複数のプロセッサコアそれぞれは、
前記入出力要求の複数の入出力要求先にそれぞれ対応した複数のポーリングプロセスを、互いに異なる実行優先度で、実行する、付記２に記載の情報処理装置。
【０１０７】
（付記８）
前記複数のプロセッサコアそれぞれは、
前記実行対象のプロセスを、前記プロセスの実行優先度に基づいてランキュー内に登録し、
前記ランキュー内に登録されたプロセスを前記実行優先度に基づいて実行する、付記１に記載の情報処理装置。
【０１０８】
（付記９）
前記複数のプロセッサコアそれぞれは、
前記入出力要求の複数の要求先にそれぞれ対応した複数のポーリングプロセスを、互いに異なる実行優先度で、前記ランキュー内に登録する、付記８に記載の情報処理装置。
【０１０９】
（付記１０）
メモリと、
前記メモリにアクセス可能な複数のプロセッサコアとを有し、
前記複数のプロセッサコアそれぞれが、
前記プロセッサコアによる実行対象のプロセスを、前記プロセスの実行優先度に基づいて実行し、
入出力処理の受信データを受信したか否かをポーリングにより繰り返し判定するポーリングプロセスが、前記複数のプロセッサコアのいずれかにより実行されている場合、前記ポーリングプロセスにより前記受信データを受信したことが判定されることに応答して、前記入出力処理を実行し、
前記ポーリングプロセスが前記複数のプロセッサコアにより実行されていない場合、前記受信データを受信したときに発行されるプロセッサ割込みに応答して、前記入出力処理を実行する、情報処理方法。
【０１１０】
（付記１１）
複数のプロセッサコアによる実行対象のプロセスを、前記プロセスの実行優先度に基づいて実行し、
入出力処理の受信データを受信したか否かをポーリングにより繰り返し判定するポーリングプロセスが、前記複数のプロセッサコアのいずれかにより実行されている場合、前記ポーリングプロセスにより前記受信データを受信したことが判定されることに応答して、前記入出力処理を実行し、
前記ポーリングプロセスが前記複数のプロセッサコアにより実行されていない場合、前記受信データを受信したときに発行されるプロセッサ割込みに応答して、前記入出力処理を実行する、処理を複数のプロセッサコアのいずれかに実行させるプログラム。
【符号の説明】
【０１１１】
CPU:プロセッサ
CORE：プロセッサのコア
MC：メモリコントローラ
１２、M_MEM：メインメモリ
１１：I/O制御回路
１４：周辺デバイスインターフェース
２２：高速インターコネクタ
２４：高速インターフェースストレージ
１、３０：ノード、情報処理装置
３２：周辺デバイス
４５、P_PR：ポーリングプロセス
PR#：プロセス
RUN_QUE：RUNキュー、実行キュー
PRY_P：ポーリングプロセスの実行優先度
４１、SCH_#：プロセス・スケジューラ
４４：割込みルーティン
DDR_#：デバイス・ドライバ、I/Oドライバ
【図１】
2019114173.tif 000003
【図２】
2019114173.tif 000004
【図３】
2019114173.tif 000005
【図４】
2019114173.tif 000006
【図５】
2019114173.tif 000007
【図６】
2019114173.tif 000008
【図７】
2019114173.tif 000009
【図８】
2019114173.tif 000010
【図９】
2019114173.tif 000011
【図１０】
2019114173.tif 000012
【図１１】
2019114173.tif 000013
【図１２】
2019114173.tif 000014
【図１３】
2019114173.tif 000015
【図１４】
2019114173.tif 000016
【図１５】
2019114173.tif 000017
【図１６】
2019114173.tif 000018
【図１７】
2019114173.tif 000019
【図１８】
2019114173.tif 000020