以下,本実施の形態について,図を用いて説明する。
まず,本実施の形態によるデータ入出力制御の技術を説明する前に,一般的なデータ入出力の技術について,簡単に説明する。
図1は,データ入出力のモデルの分類例を示す図である。
一般的なデータ入出力のモデルは,例えば図1に示すように,同期(synchronous )か非同期(asynchronous)か,またはブロッキング(blocking)が行われるか行われないかで分類することができる。
同期のデータ入出力モデルには,例えば,readやwrite などのシステムコールを用いたデータ入出力のモデルがある。同期のデータ入出力モデルでは,アプリケーションのスレッドは,カーネルへのI/Oリクエスト発行後に,カーネルからの応答を待つ。このような同期のデータ入出力モデルには,カーネルでの入出力処理が完了するまでアプリケーションのスレッドがブロックされるブロッキングのモデルと,カーネルでの入出力が完了しなくてもアプリケーションのスレッドに処理が返される非ブロッキング(non-blocking)のモデルとがある。
非同期のデータ入出力モデルには,例えば,ブロッキングを行う多重I/Oや,ブロッキングを行わない非同期I/Oなどがある。
図2は,多重I/Oを説明する図である。
図2において,アプリケーション500は,データ入出力処理が含まれるユーザプログラムである。カーネル600は,OSの中核として,コンピュータのハードウェアリソースの管理・制御や,ハードウェア−ソフトウェア間のやり取りの制御,プロセス間通信などの基本機能を提供する。
多重I/Oは,単一のスレッドによって,read/writeでブロックすることなく,複数のI/Oを同時に扱う技術である。多重I/Oでは,アプリケーション500は,select(2) ,poll(2) ,epoll(2)などのシステムコールを実行し,カーネル600からのI/O実行可能状態の通知を待つ。
例えば,図2に示すように,アプリケーション500がreadまたはwrite を実行し(S900),カーネル600からEAGAINでエラー復帰する(S901)。なお,EAGAINは,read/writeの非ブロッキングのデータ入出力において,読み取り/書き込みの準備ができたデータがないことを示す。アプリケーション500は,システムコールのselect()を発行し(S902),カーネル600からのI/O実行可能状態の通知を待つ。アプリケーション500は,カーネル600からのI/O実行可能状態の通知を受けた後(S903),readまたはwrite によりデータ転送を行う(S904)。
このように,多重I/Oでは,アプリケーション500は,I/O実行可能状態の通知待ちの間にブロックされ,他の処理が一切行えない。そのため,通知の待ち時間が無駄になり,データ入出力の性能向上が望めない。
図3は,非同期I/Oを説明する図である。
図3において,システムライブラリ700は,OSによって提供される関数のライブラリである。システムライブラリ700に含まれる非同期I/Oの関数としては,例えば,POSIX(Portable Operating System Interface )のAIO関数などがある。なお,POSIXは,登録商標である。
非同期I/Oでは,AIO関連のシステムコールやPOSIXのAIO関数などを使用し,ブロッキングすることなしに,データ入出力が実行される。ブロッキングしないため,アプリケーション500がread/write発行後も他の処理を並列に行えることが特徴である。非同期I/Oには,例えば,システムで共通にサポートされるPOSIXの非同期I/Oや,Linuxカーネルがサポートする非同期I/Oなどがある。なお,Linuxは,登録商標である。
図3において,アプリケーション500は,システムライブラリ700のAIO関数を呼び出す(S910)。システムライブラリ700では,AIO関数によって,カーネル600に対するデータ入出力のシステムコールが発行される(S911)。なお,このときアプリケーション500では,AIO関数の呼び出しによって処理がブロックされないため,カーネル600でのデータ入出力処理と並行に,他の処理が実行可能となる。
カーネル600でのデータ入出力処理が完了すると,カーネル600からシステムライブラリ700にI/O完了通知が送られ(S912),システムライブラリ700からアプリケーション500に処理が返される(S913)。
このように,非同期I/Oでは,ブロッキングせずにデータの入出力を行うことが可能であるため,データ入出力処理の性能は向上する。
ただし,非同期I/Oでは,同時に待ち行列に入れる非同期I/Oの操作数や非同期I/O転送中にロック可能な最大メモリ容量制限が,システム全体で適用される値に依存する。非同期I/Oでは,システムリソースを他のアプリケーションと共有しているため,並行に動作する他のアプリケーションの動作によっては,待ち行列やロック可能な最大メモリ容量が制限を超えて待ち状態となり,データ入出力の性能劣化が余儀なくされる可能性がある。
図4は,非同期I/O時のデータのバッファリングを説明する図である。
データのバッファリングは,カーネル600とアプリケーション500との間でデータのやり取りを行う場合に,データをアプリケーション500側が保持するバッファに一旦コピーして,いくつかのデータをまとめる方法である。この方法を行うことにより,システムコールの発行回数を減らすことができる。
例えば,図4において,アプリケーション500は,バッファリング処理により,ファイルに出力するデータを,メモリ領域からバッファに転送する(S920)。
ファイルに出力するデータがバッファにまとめられたところで,アプリケーション500は,システムライブラリ700のAIO関数を呼び出す(S921)。システムライブラリ700では,AIO関数によって,カーネル600に対するデータ入出力のシステムコールが発行される(S922)。カーネル600の処理によって,バッファのデータがファイルに出力される。
カーネル600でのデータ出力処理が完了すると,カーネル600からシステムライブラリ700にI/O完了通知が送られ(S923),システムライブラリ700からアプリケーション500に処理が返される(S924)。
このようなバッファリング処理によって,システムコールの発行回数を減らすことにより,システムコールの待ち行列を減らすことができる。ただし,非同期I/Oにおいてバッファリング処理を行う場合には,I/Oを発行してから完了待ちまでの時間が無駄になる可能性がある。
以下では,これらのようなデータ入出力技術の問題の解決を図った,本実施の形態のデータ入出力制御の技術について,説明する。
図5は,本実施の形態によるコンピュータシステムの構造を示す図である。
コンピュータ1は,CPU(Central Processing Unit )31,RAM(Random Access Memory)やROM(Read Only Memory)などのメモリ32,HDD(Hard Disk Drive )などのディスク33等のハードウェア30を備える。
図5において,システム領域20は,OS21などのシステムが稼動する領域である。図5に示すシステム領域20には,OS21が提供する関数のライブラリであるシステムライブラリ22が用意されている。システム領域20のプログラムは,ハードウェア30を利用して実行される。
図5において,ユーザ領域10は,ユーザがアプリケーション11の稼動に利用できる領域である。また,図5に示すユーザ領域10では,プログラミング言語で書かれたアプリケーション11のソースプログラムから,実行形式のプログラムを作成するソフトウェアのパッケージであるコンパイラ/ライブラリ12が稼動する。本実施の形態では,コンパイラ/ライブラリ12は,Fortranでプログラミングされたソースプログラムから実行形式のプログラムを作成するコンパイラのパッケージであるものとする。ユーザ領域10のプログラムは,システム領域20のOS21等を介することにより,ハードウェア30を利用して実行される。
図6は,CPUの例を示す図である。
本実施の形態のCPU31は,例えば,図6に示すようなCPUチップ310で提供される。CPUチップ310は,CPU31の物理的なパッケージである。CPUチップ310は,複数のCPUコア311を持つマルチコアプロセッサである。また,システムが提供するマルチスレッド機構により,ソフトウェアプログラムからは,1つのCPUコア311が複数の論理CPU312に見える。
図7は,本実施の形態によるコンパイルを説明する図である。
ここでは,図5に示すアプリケーション11のソースプログラム111を,図5に示すコンパイラ/ライブラリ12を用いてコンパイルし,アプリケーション11の実行形式プログラム114を生成する例を説明する。なお,図7において,コンパイラ121,アセンブラ122,リンカ123と,実行時ライブラリ124の一部とは,図5に示すコンパイラ/ライブラリ12に含まれる。
実行時ライブラリ124は,ユーザ領域10で実行されるアプリケーション11で汎用的に用いられるプログラムの集合である。図7に示す本実施の形態の実行時ライブラリ124には,OS21が提供するシステムライブラリ22や,コンパイラ/ライブラリ12にパッケージされた言語提供ライブラリ,ユーザが過去に作成したプログラムで汎用的に使用するために保持されたアプリケーションライブラリ等が含まれる。
なお,本実施の形態のデータ入出力制御機能を提供するプログラムは,実行時ライブラリ124に含まれる。例えば,本実施の形態のデータ入出力制御機能を提供するプログラムは,コンパイラ/ライブラリ12にパッケージされた言語提供ライブラリにより提供される。
ソースプログラム111は,アプリケーション11のソースコードである。本実施の形態では,ソースプログラム111は,Fortranでプログラミングされており,Fortranの非同期入出力文を含んでいるものとする。なお,Fortranは,科学技術計算向きに開発された手続き型のプログラミング言語である。
本実施の形態では,ソースプログラム111のコンパイルが実行されると,コンパイラ121は,ソースプログラム111を,中間的にアセンブラソース112に変換する。アセンブラ122は,アセンブラソース112をアセンブルし,オブジェクトコード113を生成する。リンカ123は,アプリケーション11のオブジェクトコード113に対して,実行時ライブラリ124に含まれる必要な関数等のプログラムをリンクし,アプリケーション11の実行形式プログラム114を生成する。
なお,本実施の形態では,リンクとして,動的リンクが用いられているものとする。すなわち,本実施の形態では,リンカ123は,オブジェクトコード113に対して,実行時ライブラリ124に含まれる必要なプログラムへの呼び出し解決を行い,実行形式プログラム114を生成する。実行時ライブラリ124のプログラムは,アプリケーション11の実行形式プログラム114の実行時に,ユーザ領域10のメモリ領域上に呼び出される。
図8は,非同期入出力文を含むソースプログラムの例を示す図である。
図8に示すソースプログラム111は,Fortranで記述されており,データの非同期入出力を指定する非同期入出力文を含んでいる。
図8に示すソースプログラム111において,“PROGRAM MAIN”の次の2行は,変数の宣言が記述された部分である。その次の4行は,変数の初期化が記述された部分である。さらに次のOPEN文からCLOSE文までの5行が,データ入出力が記述された部分である。
図8に示すソースプログラム111のデータ入出力の部分において,OPEN文,WRITE文,READ文に記述された“ASYNCHRONOUS='YES'”が,データの非同期入出力を指定する記述である。すなわち,図8に示すソースプログラム111において,“ASYNCHRONOUS='YES'”を含む入出力文が,非同期入出力文となる。
図9は,本実施の形態によるデータ入出力制御機能を説明する機能構成例を示す図である。
コンピュータ1において,アプリケーション11のソースプログラム111は,コンパイラ121,リンカ123等により,アプリケーション11の実行形式プログラム114に変換される。このとき,アプリケーション11の実行形式プログラム114から実行時ライブラリ124の呼び出しに必要なインタフェースの生成などが行われる。また,実行形式プログラム114を起動するための実行コマンドも生成される。
実行時ライブラリ124では,アプリケーション11の実行形式プログラム114から呼び出される関数等のプログラムによって,スレッド生成部125,使用データ入出力決定部126,スレッド利用入出力処理部127,システム利用入出力処理部128が実現される。本実施の形態によるデータ入出力制御機能を提供するこれらの各機能部は,コンピュータ1が備えるCPU31,メモリ32,ディスク33等のハードウェア30と,ソフトウェアプログラムとによって実現される。
実行コマンドによって,アプリケーション11の実行形式プログラム114が起動されると,実行開始処理が行われる。実行形式プログラム114の実行開始処理において,実行時ライブラリ124のスレッド生成部125は,アプリケーション11の実行で利用する,所定数のスレッドを生成する。
ユーザは,ソースプログラム111のコンパイル時に,アプリケーション11をマルチスレッドで実行するか,シングルスレッドで実行するかを指定する。スレッド生成部125は,コンパイル時にマルチスレッドが指定されている場合に,複数スレッドの生成を行う。スレッド生成部125により生成するスレッドの数は,CPU31やメモリ32の性能等を鑑みて妥当とされる数があらかじめ設定されている。本実施の形態では,アプリケーション11の実行形式プログラム114の実行開始処理において,スレッド生成部125によって生成するスレッドの数は,アプリケーション11のメインスレッドを含めて8個に設定されているものとする。なお,例えば実行形式プログラム114の実行時などにユーザが生成するスレッド数を指定できるようにしてもよい。
スレッド生成部125は,アプリケーション11の実行で利用するスレッドの管理情報を生成し,スレッド管理情報記憶部131に記憶する。スレッド管理情報記憶部131は,アプリケーション11の実行で利用するスレッドの管理情報を記憶する,コンピュータ1がアクセス可能な記憶装置である。スレッド管理情報記憶部131には,実行されたアプリケーション11のプロセスID,アプリケーション11の実行に利用するために生成されたスレッドの数,各スレッドの状態などの情報が記憶されている。
アプリケーション11の実行において並列処理が必要な場合には,原則として,スレッド生成部125により生成されたスレッドを利用して処理を実行する。このとき,並列処理を行うプログラムは,スレッド管理情報記憶部131に記憶されたスレッドの管理情報を参照し,未使用のスレッドを選択して並列処理を行う。このとき利用するスレッドについては,スレッド管理情報記憶部131に記憶されたスレッドの管理情報において,使用状態に設定する。例えば,図8に示すソースプログラム111において4行目〜6行目のDOループ文に対応する処理で,既生成スレッドを利用した並列処理が行われる。
アプリケーション11の実行形式プログラム114による非同期データ入出力開始処理において,実行時ライブラリ124の使用データ入出力決定部126は,使用するデータ入出力ロジックを決定する。本実施の形態では,データ入出力ロジックとして,スレッド利用入出力処理部127による既生成スレッドを利用するロジックと,システム利用入出力処理部128によるシステムコールまたはシステムライブラリの非同期I/Oを利用するロジックとが,実行時ライブラリ124で提供されている。非同期データ入出力開始処理は,例えば図8に示すソースプログラム111のOPEN文に応じた処理である。
アプリケーション11の実行形式プログラム114による非同期データ入出力実行処理において,実行時ライブラリ124のスレッド利用入出力処理部127またはシステム利用入出力処理部128は,データ入出力処理を実行する。
スレッド利用入出力処理部127は,スレッド生成部125によりすでに生成されているスレッドに空きがある場合に,その空き状態のスレッドを利用するデータ入出力処理を実行する。
システム利用入出力処理部128は,システムコールまたはシステムライブラリによって提供される非同期I/Oを利用するデータ入出力処理を実行する。
バッファ管理情報記憶部132は,ユーザ領域10に用意されたバッファの管理情報を記憶する,コンピュータ1がアクセス可能な記憶装置である。スレッド利用入出力処理部127またはシステム利用入出力処理部128によるデータ入出力処理において,ユーザ領域10に用意されたバッファを使用する場合がある。このとき,スレッド利用入出力処理部127やシステム利用入出力処理部128は,バッファ管理情報記憶部132に記憶されたバッファの管理情報を参照しながら,ユーザ領域10のバッファを使用する。
図10は,本実施の形態のスレッド管理情報記憶部に格納された情報の例を示す図である。
図10に示すスレッド管理テーブル135は,スレッド管理情報記憶部131に記憶された,アプリケーション11の実行のために生成されたスレッドの管理情報の例である。図10に示すスレッド管理テーブル135では,プロセスIDが“01”で,生成されたスレッドの数がメインスレッドを含めてN個であるアプリケーション11についてのスレッドの情報が管理されている。なお,プロセスIDは,プロセスを一意に識別する識別情報である。
スレッド管理テーブル135は,スレッド番号,スレッド状態などの情報を持つ。スレッド番号は,スレッドを一意に識別する識別情報である。スレッド状態は,スレッドが実行状態か,待ち状態かまたは未使用状態かを示す情報である。図10に示すスレッド管理テーブル135において,スレッド状態が“未使用”であるスレッドが,空き状態のスレッドである。
図11は,本実施の形態のバッファ管理情報記憶部に格納された情報の例を示す図である。
図11に示すバッファ管理テーブル136は,バッファ管理情報記憶部132に記憶された,アプリケーション11が利用可能なユーザ領域10のバッファを管理する情報の例である。図11に示すバッファ管理テーブル136では,M個のバッファの情報が管理されている。
バッファ管理テーブル136は,バッファ番号,バッファ使用状況などの情報を持つ。バッファ番号は,バッファを一意に識別する識別情報である。バッファ使用状況は,バッファが使用中であるか否かを示す情報である。図11に示すバッファ管理テーブル136のバッファ使用状況において,“ON”が使用中を示し,“OFF”が使用していないことを示す。
図12は,本実施の形態の使用データ入出力決定部による使用データ入出力決定処理フローチャートである。
使用データ入出力決定部126は,ソースプログラム111の非同期入出力文に対応したデータ入出力処理の実行開始時に,使用するデータ入出力ロジックを決定する。例えば,図8に示すソースプログラム111では,OPEN文に非同期入出力を示す“ASYNCHRONUS='YES' ”が設定されている。このような“ASYNCHRONUS='YES' ”が設定されたOPEN文に対応した処理として,使用データ入出力決定部126は,使用するデータ入出力ロジックを決定する。
使用データ入出力決定部126は,上述したように,既生成スレッドを利用するデータ入出力のロジックと,システムコールまたはシステムライブラリ22の非同期I/Oを利用するデータ入出力のロジックとから,使用するデータ入出力ロジックを決定する。以下,図12のフローチャートを用いて,使用データ入出力決定部126による使用データ入出力決定処理の一例を説明する。
使用データ入出力決定部126は,スレッド管理情報記憶部131に記憶された,スレッド管理テーブル135等のスレッドの管理情報を参照する(ステップS10)。使用データ入出力決定部126は,処理の並列実行が可能であるかを判定する(ステップS11)。ここでは,使用データ入出力決定部126は,例えば,複数スレッドが生成されているかなどを判定する。また,使用データ入出力決定部126は,空き状態のスレッドがあるかを判定する(ステップS12)。ここでは,使用データ入出力決定部126は,例えば,図10に示すスレッド管理テーブル135において,スレッド状態が“未使用”であるスレッドがあるかを判定する。
並列実行が可能であり(ステップS11のYES),かつ空き状態のスレッドがあれば(ステップS12のYES),使用データ入出力決定部126は,使用するデータ入出力ロジックとして,スレッド利用データ入出力処理を決定する(ステップS13)。このとき,使用データ入出力決定部126は,スレッド利用データ入出力処理を実現するモジュールのアドレス登録を行う。スレッド利用データ入出力処理は,スレッド利用入出力処理部127による既生成スレッドを利用するデータ入出力処理である。使用データ入出力決定部126は,空き状態のスレッドからデータ入出力に利用するスレッドを決定し,スレッド管理情報記憶部131に記憶されたスレッド管理テーブル135において,該当スレッドの状態を使用状態に設定する(ステップS14)。なお,スレッドを利用するデータ入出力処理の場合には,図8に示すソースプログラム111のCLOSE文に対応する処理の実行時に,スレッド管理情報記憶部131に記憶されたスレッド管理テーブル135において,該当スレッドの状態が未使用状態に戻される。
並列実行が不可能である(ステップS11のNO),または空き状態のスレッドがない場合には(ステップS12のNO),使用データ入出力決定部126は,使用するデータ入出力処理ロジックとして,システム利用データ入出力処理を決定する(ステップS15)。このとき,使用データ入出力決定部126は,システム利用データ入出力処理を実現するモジュールのアドレス登録を行う。システム利用データ入出力処理は,システム利用入出力処理部128によるシステムコールまたはシステムライブラリ22の非同期I/Oを利用するデータ入出力処理である。
本実施の形態では,既生成スレッドに空き状態のスレッドがあれば,優先的に,スレッド利用入出力処理部127によるスレッド利用データ入出力処理を選択する。データ入出力処理に利用する既生成スレッドは,自身のアプリケーション11の処理実行用に生成されたスレッドである。
上述したように,システムライブラリ22やシステムコールの非同期I/Oを利用するデータ入出力処理では,同時に待ち行列に入れる非同期I/Oの操作数や非同期I/O転送中にロック可能な最大メモリ容量制限が,システム全体で適用される値に依存する。そのため,他のアプリケーションの動作によっては,待ち行列やロック可能な最大メモリ容量が制限を超えて待ち状態となり,データ入出力の性能劣化が余儀なくされる可能性がある。
これに対して,アプリケーション11の処理実行用に生成されたスレッドを利用したデータ入出力処理では,ロック可能な最大メモリ容量などをアプリケーション11側で管理できる。そのため,ロック可能な最大メモリ容量が制限を超えて待ち状態となってしまうことを回避でき,また処理性能が他のアプリケーションの動作に左右されることが少ない。このように,既生成スレッドに空き状態のスレッドがある場合に,そのスレッドを利用してデータ入出力を優先することで,データ入出力の性能向上を図れる。
図13,図14を用いて,使用データ入出力決定部126によりスレッド利用データ入出力処理が決定された場合の,スレッド利用入出力処理部127による既生成スレッドを利用するデータ入出力処理の例を説明する。
図13は,本実施の形態による既生成スレッドを利用するデータ入出力処理の例を説明する図である。
図13において,メインスレッド115は,アプリケーション11のメインスレッドを示す。サブスレッドA116,サブスレッドB117,サブスレッドC118は,アプリケーション11の実行開始時に生成され,データ入出力処理の開始段階で,空き状態であったスレッドである。カーネル211は,OS21の中核として,コンピュータ1のハードウェア30の管理・制御や,ハードウェア30−ユーザ領域10間のやり取りの制御,プロセス間通信などの基本機能を提供する。なお,ユニットはファイルを示す。
ユニットAに対する非同期入出力処理が実行されるときに,スレッド利用入出力処理部127は,メインスレッド115ではなく,空きスレッドであるサブスレッドA116を利用して,データ入出力を行う。
アプリケーション11のサブスレッドA116は,システムライブラリ22のデータ入出力処理を行う関数を呼び出す(S100)。ここでは,システムライブラリ22に含まれる同期入出力処理の関数が呼び出される。呼び出された同期入出力処理の関数によって,ユニットAに対するデータ入出力のシステムコールが発行される(S101)。
ユニットAに対するデータ入出力処理は,サブスレッドA116によって実行されるので,アプリケーション11のメインスレッド115は,サブスレッドA116によるデータ入出力処理とは並列に,他の処理が実行できる。なお,図13に示す例ではサブスレッドA116でデータ入出力処理を行っているが,メインスレッド115でデータ入出力処理を行い,サブスレッドA116で他の処理を実行するようにしてもよい。
同様に,ユニットBに対する非同期入出力処理,ユニットCに対する非同期入出力処理が実行される場合に,空き状態のサブスレッドB117,サブスレッドC118があれば,スレッド利用入出力処理部127は,サブスレッドB117,サブスレッドC118を利用してデータ入出力を行う。すなわち,アプリケーション11のサブスレッドB117は,システムライブラリ22に含まれる同期入出力処理の関数を呼び出す(S102)。呼び出されたシステムライブラリ22に含まれる同期入出力処理の関数によって,ユニットBに対するデータ入出力のシステムコールが発行される(S103)。同様に,アプリケーション11のサブスレッドC118は,システムライブラリ22に含まれる同期入出力処理の関数を呼び出す(S104)。呼び出されたシステムライブラリ22に含まれる同期入出力処理の関数によって,ユニットCに対するデータ入出力のシステムコールが発行される(S105)。
サブスレッドA116,サブスレッドB117,サブスレッドC118によってデータ入出力処理を行っている間に,アプリケーションのメインスレッド115は,それらのデータ入出力処理とは並列に,他の処理が実行できる。
また,データ入出力処理に,ユーザ領域10に用意されたバッファを使用してもよい。例えば,サブスレッドA116は,出力データが記憶されたアプリケーション11のメモリ領域からバッファに転送する。サブスレッドA116は,システムライブラリ22のデータ出力処理の関数を呼び出して,バッファからファイルAへのデータ出力処理を行う。サブスレッドA116は,メモリ領域上のすべての該当データを出力するまで,これらの処理を繰り返す。なお,バッファを複数個用意して,それらの複数のバッファを交互に使用しながら,バッファへのデータ転送とシステムライブラリ22の関数の呼び出しとを実行するようにしてもよい。
図14は,本実施の形態のスレッド利用入出力処理部によるスレッド利用データ入出力処理フローチャートである。
スレッド利用入出力処理部127は,図14に示すフローチャートによる処理を,データ入出力処理の実行に割り当てられた,空き状態の既生成スレッドに実行させる。ここでは,データ入出力処理の実行に割り当てられたスレッドを,データ入出力用スレッドと呼ぶものとする。なお,実行時ライブラリ124に含まれるスレッド利用入出力処理部127を実現するプログラムは,引数として,入出力を行うメモリ領域上のデータまたは変数領域のアドレス,入出力するデータの長さ,入出力する変数の数等を受ける。
実行する処理がデータ入力処理であれば(ステップS20の入力),データ入出力用スレッドは,システムコールまたはシステムライブラリ22により,ディスク33からユーザ領域10のバッファへのデータ読み出しを行う(ステップS21)。データ入出力用スレッドは,バッファ上にあるデータを,アプリケーション11のメモリ領域に転送する(ステップS22)。データ入出力用スレッドは,ステップS21,S22の処理を,全入力変数について終了するまで繰り返す(ステップS23)。
実行する処理がデータ出力処理であれば(ステップS20の出力),データ入出力用スレッドは,アプリケーション11のメモリ領域上の出力対象となるデータを,ユーザ領域10のバッファに転送する(ステップS24)。データ入出力用スレッドは,システムコールまたはシステムライブラリ22により,バッファからディスク33へのデータ書き出しを行う(ステップS25)。データ入出力用スレッドは,ステップS24,S25の処理を,メモリ領域上の出力対象となる全データについて終了するまで繰り返す(ステップS26)。
本実施の形態では,スレッドを利用したデータ入出力処理の開始時に,スレッドの生成を行わない。データ入出力処理に利用するスレッドは,アプリケーション11の実行開始時に,アプリケーション11の実行で汎用的に使用するためにスレッド生成部125によって生成されたスレッドのうちの,空き状態のスレッドである。データ入出力処理の開始時に,データ入出力のためのスレッドを生成するコストが省けるため,データ入出力処理実行時の性能が向上する。また,スレッドを利用したデータ入出力処理を行うのは,既生成スレッドに空き状態のスレッドがある場合のみであり,データ入出力処理のために新たなスレッドを増やさない。そのため,データ入出力のためにスレッドを増やし過ぎて,処理性能が劣化することはない。
図15〜図17を用いて,使用データ入出力決定部126によりシステム利用データ入出力処理が決定された場合の,システム利用入出力処理部128によるシステムコールまたはシステムライブラリ22の非同期I/Oを利用するデータ入出力の例を説明する。
本実施の形態のシステム利用入出力処理部128によるシステム利用データ入出力処理では,OS21等のシステム側から提供されるシステムコールやシステムライブラリ22がサポートする非同期I/Oを利用したデータ入出力が行われる。
ただし,本実施の形態のシステム利用入出力処理部128は,データの入力と出力とで,ユーザ領域10のバッファの使用と不使用とを使い分ける。すなわち,システムが提供する非同期I/Oを利用したデータ入力処理では複数のバッファを使用し,システムが提供する非同期I/Oを利用したデータ出力処理ではバッファを使用しない。
システムコールやシステムライブラリ22の非同期I/Oを利用したデータ入出力処理において,データ入力とデータ出力とで,ユーザ領域10のバッファの使用と不使用とを切り替えることで,より高速なデータ入出力が可能となる。
図15は,本実施の形態によるシステムの非同期I/Oを利用したデータ入力処理の例を説明する図である。
図15に示す非同期I/Oを利用したデータ入力処理では,システムライブラリ22が提供するAIO関数と,M個のバッファとを利用することにより,バッファへのデータ入力と,バッファからアプリケーション11のメモリ領域へのデータ転送とを,並行して行う。バッファは,バッファ管理情報記憶部132に記憶されたバッファ管理テーブル136によって管理されている。
バッファ#0を指定した非同期入力が実行されると,アプリケーション11は,システムライブラリ22のデータ入力処理を行うAIO関数を呼び出す(S110)。呼び出されたデータ入力処理を行うAIO関数によって,データ入力のシステムコールが発行される(S111)。なお,非同期I/Oなので,アプリケーション11は,バッファ#0へのデータ入力の完了を待たずに,別の処理を実行できる。
同様に,バッファ#1〜バッファ#M−1を指定した非同期入力が順に実行されると,アプリケーション11からシステムライブラリ22のデータ入力処理を行うAIO関数の呼び出し(S112,... S114),AIO関数からデータ入力のシステムコールの発行(S113,... ,S115)が行われる。
バッファ#0へのデータ入力が完了すると,カーネル211は,システムライブラリ22のAIO関数にバッファ#0についてのI/O完了通知を返す(S116)。システムライブラリ22のAIO関数は,アプリケーション11に処理を返す(S117)。
バッファ#0へのデータ入力完了を受けたアプリケーション11は,他のバッファへのデータ入力処理と並行に,バッファ#0からアプリケーション11のメモリ領域へのデータ転送の処理を実行する。なお,他のバッファにも収まらない入力データがまだある場合には,バッファ#0からメモリ領域へのデータ転送完了後,バッファ#0を指定した次のデータの非同期入力が実行される。
同様に,バッファ#1へのデータ入力が完了すると,カーネル211は,システムライブラリ22のAIO関数にバッファ#1についてのI/O完了通知を返し(S118),AIO関数はアプリケーション11に処理を返す(S119)。バッファ#1へのデータ入力完了を受けたアプリケーション11は,他のバッファへのデータ入力処理と並行に,バッファ#1からアプリケーション11のメモリ領域へのデータ転送の処理を実行する。以下,バッファ#2以降も,同様の処理が行われる。
このように,本実施の形態のシステムライブラリ22の非同期I/Oを利用したデータ入力では,一度にできるだけ多くのデータをアプリケーション11側で処理するために,複数のバッファを交互に用いたデータの入力を行う。アプリケーション11はシステムライブラリ22のAIO関数に対して必要な分だけの入力要求を行い,データがバッファに転送された時点で,アプリケーション11側でデータの処理を実施することができる。これにより,例えばディスク33からバッファへのデータ入力と,アプリケーション11での入力したデータの処理とを,並列に実行することができる。そのため,システムの非同期I/Oを用いたデータ入力時の性能が,向上する。
図16は,本実施の形態によるシステムの非同期I/Oを利用したデータ出力処理の例を説明する図である。
図16に示す非同期I/Oを利用したデータ出力処理では,バッファを使用せずに,アプリケーション11のメモリ領域上の出力対象となるデータを,システムライブラリ22が提供するAIO関数を利用して出力する。ここでは,入力変数X,Y,Zのそれぞれについて,非同期I/Oを利用したデータ出力を行うものとする。
入力変数Xについての非同期出力が実行されると,アプリケーション11は,システムライブラリ22のデータ出力処理を行うAIO関数を呼び出す(S120)。このとき,データ出力処理を行うAIO関数には,出力対象となるデータが記憶されているメモリ領域のアドレスや出力対象となるデータの長さ等の情報が渡される。呼び出されたデータ出力処理を行うAIO関数によって,データ出力のシステムコールが発行される(S121)。なお,非同期I/Oなので,アプリケーション11は,入力変数Xについてのデータ出力の完了を待たずに,別の処理を実行できる。
同様に,入力変数Y,入力変数Zについての非同期出力が順に実行されると,アプリケーション11からシステムライブラリ22のデータ出力処理を行うAIO関数の呼び出し(S122,... S123),AIO関数からデータ出力のシステムコールの発行(S124,... ,S125)が行われる。
入力変数Xについてのデータ出力が完了すると,カーネル211は,システムライブラリ22のAIO関数に入力変数XについてのI/O完了通知を返す(S126)。システムライブラリ22のAIO関数は,アプリケーション11に処理を返す(S127)。
同様に,入力変数Y,入力変数Zについてのデータ出力が完了すると,カーネル211は,システムライブラリ22のAIO関数に入力変数Y,入力変数ZについてのI/O完了通知を返し(S128,S130),AIO関数はアプリケーション11に処理を返す(S129,S131)。
このように,本実施の形態のシステムライブラリ22の非同期I/Oを利用したデータ出力では,バッファを使用せずに,アプリケーション11のメモリ領域上にあるデータをそのまま出力する。非同期I/Oを利用したデータ出力では,バッファにデータをコピーすると,コピーしたデータをシステムコールに渡す間に,待ち状態が発生する。バッファを使用せずに,アプリケーション11のメモリ領域から直接にシステムライブラリ22にデータを渡すことにより,アプリケーション11の処理待ちの状態を減らすことができる。
図17は,本実施の形態のシステム利用入出力処理部によるシステム利用データ入出力処理フローチャートである。
実行する処理がデータ入力処理であれば(ステップS30の入力),システム利用入出力処理部128は,バッファ管理情報記憶部132に記憶されたバッファ管理テーブル136を参照し,バッファ使用状況がOFFのバッファごとに,以下のステップS31〜S34の処理を繰り返す。
システム利用入出力処理部128は,システムコールまたはシステムライブラリ22により,ディスク33からユーザ領域10の該当バッファへのデータ読み出しを行う(ステップS31)。システム利用入出力処理部128は,バッファ管理情報記憶部132に記憶されたバッファ管理テーブル136において,該当バッファのバッファ使用状況をONに設定する(ステップS32)。システム利用入出力処理部128は,バッファ上にあるデータを,アプリケーション11のメモリ領域に転送する(ステップS33)。システム利用入出力処理部128は,I/O完了通知受領後,バッファ管理情報記憶部132に記憶されたバッファ管理テーブル136において,該当バッファのバッファ使用状況をOFFに設定する(ステップS34)。
システム利用入出力処理部128は,ステップS31〜S34のバッファごとの処理を,全入力変数について終了するまで繰り返す(ステップS35)。
実行する処理がデータ出力処理であれば(ステップS30の出力),システム利用入出力処理部128は,システムコールまたはシステムライブラリ22により,アプリケーション11のメモリ領域にあるデータをディスク33に書き出す(ステップS36)。システム利用入出力処理部128は,ステップS36の処理を,メモリ領域上の出力対象となる全データについて終了するまで繰り返す(ステップS37)。
以上説明した,本実施の形態の非同期入出力文に対応するデータ入出力制御の技術によって,データ入出力処理開始時に適切な実行モデルを判断して,高速にデータ入出力を実行することが可能となる。
以上説明した本実施の形態のアプリケーション11または実行時ライブラリ124による処理は,コンピュータが備えるCPU31,メモリ32等のハードウェア30とソフトウェアプログラムとにより実現することができ,そのプログラムをコンピュータ読み取り可能な記録媒体に記録することも,ネットワークを通して提供することも可能である。
以上,本実施の形態について説明したが,本発明はその主旨の範囲において種々の変形が可能であることは当然である。