(57)【特許請求の範囲】
【請求項１】
プログラミング言語の非同期入出力文を含むソースプログラムによって作成されたアプリケーションの前記非同期入出力文に対応する処理を実行するデータ入出力制御方法であって，
スレッド生成部が，前記アプリケーションの実行開始の際に，前記アプリケーションの実行に使用する所定数のスレッドを生成し，
スレッド管理情報記憶部が，前記生成したスレッドを管理する管理情報を記憶し，
使用データ入出力決定部が，前記アプリケーションにおける前記非同期入出力文に対応するデータ入出力処理の開始の際に，前記管理情報を参照して，前記生成したスレッド中に未使用状態のスレッドがある場合には，前記非同期入出力文に対応するデータ入出力処理としてスレッド利用データ入出力処理を行うと決定し，前記生成したスレッド中に未使用状態のスレッドがない場合には，前記非同期入出力文に対応するデータ入出力処理として非同期Ｉ／Ｏ利用データ入出力処理を行うと決定し，
スレッド利用入出力処理部が，前記管理情報においてデータ入出力処理に利用する前記未使用状態のスレッドの状態をデータ入出力処理が終了するまで使用状態に設定し，前記未使用状態のスレッドを利用するデータ入出力処理である前記スレッド利用データ入出力処理を実行し，
システム利用入出力処理部が，システムコールまたはシステムライブラリにより提供される非同期Ｉ／Ｏを利用するデータ入出力処理である前記非同期Ｉ／Ｏ利用データ入出力処理を実行する
ことを特徴とするデータ入出力制御方法。
【請求項２】
前記システムコールまたはシステムライブラリにより提供される非同期Ｉ／Ｏを利用するデータ入出力処理を実行する処理では，データ入力処理では前記コンピュータのユーザ領域に用意された複数のバッファを使用したデータの入力を行い，データ出力処理では前記コンピュータのユーザ領域に用意されたバッファを使用しないデータの出力を行う
ことを特徴とする請求項１記載のデータ入出力制御方法。
【請求項３】
プログラミング言語の非同期入出力文を含むソースプログラムによって作成されたアプリケーションの前記非同期入出力文に対応する処理を，コンピュータに実行させるためのプログラムであって，
前記コンピュータに，
スレッド生成部が，前記アプリケーションの実行開始の際に，前記アプリケーションの実行に使用する所定数のスレッドを生成する手順と，
スレッド管理情報記憶部が，前記生成したスレッドを管理する管理情報を記憶する手順と，
前記アプリケーションにおける前記非同期入出力文に対応するデータ入出力処理の開始の際に，前記管理情報を参照して，前記生成したスレッド中に未使用状態のスレッドがある場合には，前記非同期入出力文に対応するデータ入出力処理としてスレッド利用データ入出力処理を行うと決定し，前記非同期入出力文に対応するデータ入出力処理として前記生成したスレッド中に未使用状態のスレッドがない場合には，非同期Ｉ／Ｏ利用データ入出力処理を行うと決定する手順と，
スレッド利用入出力処理部が，前記管理情報においてデータ入出力処理に利用する前記未使用状態のスレッドの状態をデータ入出力処理が終了するまで使用状態に設定し，前記未使用状態のスレッドを利用するデータ入出力処理である前記スレッド利用データ入出力処理を実行する手順と，
システム利用入出力処理部が，システムコールまたはシステムライブラリにより提供される非同期Ｉ／Ｏを利用するデータ入出力処理である前記非同期Ｉ／Ｏ利用データ入出力処理を実行する手順とを
実行させるためのデータ入出力制御プログラム。
【請求項４】
プログラミング言語の非同期入出力文を含むソースプログラムによって作成されたアプリケーションの前記非同期入出力文に対応する処理を実行するデータ入出力制御装置であって，
前記アプリケーションの実行開始の際に，前記アプリケーションの実行に使用する所定数のスレッドを生成するスレッド生成部と，
前記生成したスレッドを管理する管理情報を記憶するスレッド管理情報記憶部と，
前記アプリケーションにおける前記非同期入出力文に対応するデータ入出力処理の開始の際に，前記管理情報を参照して，前記生成したスレッド中に未使用状態のスレッドがある場合には，前記非同期入出力文に対応するデータ入出力処理としてスレッド利用データ入出力処理を行うと決定し，前記生成したスレッド中に未使用状態のスレッドがない場合には，前記非同期入出力文に対応するデータ入出力処理として非同期Ｉ／Ｏ利用データ入出力処理を行うと決定する使用データ入出力決定部と，
スレッド利用データ入出力処理を行うと決定した場合に，前記管理情報においてデータ入出力処理に利用する前記未使用状態のスレッドの状態をデータ入出力処理が終了するまで使用状態に設定し，前記未使用状態のスレッドを利用するデータ入出力処理を実行するスレッド利用入出力処理部と，
非同期Ｉ／Ｏ利用データ入出力処理を行うと決定した場合に，システムコールまたはシステムライブラリにより提供される非同期Ｉ／Ｏを利用するデータ入出力処理を実行するシステム利用入出力処理部とを備える
ことを特徴とするデータ入出力制御装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は，アプリケーションにおける非同期入出力文に応じたデータの入出力処理を制御するデータ入出力制御方法，データ入出力制御プログラムおよびデータ入出力制御装置に関するものである。
【背景技術】
【０００２】
例えば，プログラミング言語のＦｏｒｔｒａｎには，非同期なデータの入出力処理を指定する非同期入出力文がある。このような非同期入出力文で指定されたデータ入出力処理の実行モデルとしては，例えば，ＯＳ（Operating System）などのシステムが提供するシステムコールやシステムライブラリなどを利用したデータ入出力モデルや，スレッドを利用したデータ入出力モデルなどがある。なお，非同期入出力文は，ＣやＣ++などのプログラミング言語にもある。
【０００３】
システムが提供するシステムコールやシステムライブラリなどを利用したデータ入出力モデルでは，例えば多重Ｉ／Ｏ（Input/Output）や非同期Ｉ／Ｏ（ＡＩＯ：Asynchronous Input/Output ）の技術を利用し，非同期なデータ入出力を実現する。また，スレッドを利用したデータ入出力モデルでは，例えばアプリケーションのメインスレッドとは別にサブスレッドを生成し，生成したサブスレッドを用いて並列にデータ入出力を実行する。
【０００４】
なお，プログラムで１つのサブタスク（プロセス）を生成し，生成したプロセスで非同期入出力文を実行する技術が知られている。また，ファイルごとに新規のスレッドを生成して，非同期入出力文を実行させる技術が知られている。また，キーアクセスされる頻度を管理し，頻度の高い順にデータをバッファリングして，システムコールの発行回数を減少させる非同期入出力の技術が知られている。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特許第２５８５７９７号公報
【特許文献２】特開２０００―１９４５７４号公報
【特許文献３】特開平４―３４２０１１号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
上述のシステムが提供するシステムコールやシステムライブラリなどを利用したデータ入出力において，多重Ｉ／Ｏでは，ブロッキングによる待ちの問題がある。また，非同期Ｉ／Ｏでは，システムリソースを他のアプリケーションと共有するため，他のアプリケーションの動作によっては性能劣化を余儀なくされる可能性がある。スレッドを利用したデータ入出力では，スレッドの生成コストの問題や，スレッドの立て過ぎによるリソースの枯渇という問題がある。
【０００７】
アプリケーションの非同期入出力文で指定されたデータ入出力を高速に実行するためには，システムリソースを効率的に利用することや，状況に応じた効率的なデータ入出力処理を実行することが要求される。
【０００８】
本発明は，上記の問題の解決を図り，システムリソースを効率的に使用し，状況に応じた効率的なデータ入出力処理を実行することにより，アプリケーションの非同期入出力文に対応するデータ入出力を高速に実行することが可能となる技術を提供することを目的とする。
【課題を解決するための手段】
【０００９】
プログラミング言語の非同期入出力文を含むソースプログラムによって作成されたアプリケーションの非同期入出力文に対応する処理を実行するデータ入出力制御方法は，スレッド生成部が，アプリケーションの実行開始の際に，アプリケーションの実行に使用する所定数のスレッドを生成し，スレッド管理情報記憶部が，生成したスレッドを管理する管理情報を記憶し，使用データ入出力決定部が，アプリケーションにおける非同期入出力文に対応するデータ入出力処理の開始の際に，管理情報を参照して，生成したスレッド中に未使用状態のスレッドがある場合には，非同期入出力文に対応するデータ入出力処理としてスレッド利用データ入出力処理を行うと決定し，生成したスレッド中に未使用状態のスレッドがない場合には，非同期入出力文に対応するデータ入出力処理として非同期Ｉ／Ｏ利用データ入出力処理を行うと決定し，スレッド利用入出力処理部が，管理情報においてデータ入出力処理に利用する未使用状態のスレッドの状態をデータ入出力処理が終了するまで使用状態に設定し，未使用状態のスレッドを利用するデータ入出力処理であるスレッド利用データ入出力処理を実行し，システム利用入出力処理部が，システムコールまたはシステムライブラリにより提供される非同期Ｉ／Ｏを利用するデータ入出力処理である非同期Ｉ／Ｏ利用データ入出力処理を実行することを特徴とする。
【発明の効果】
【００１０】
上記の技術によって，データ入出力処理の実行時に，適切な実行モデルを判断することで，アプリケーションの非同期入出力文の実行において，高速にデータ入出力を実行することが可能となる。
【図面の簡単な説明】
【００１１】
【図１】データ入出力のモデルの分類例を示す図である。
【図２】多重Ｉ／Ｏを説明する図である。
【図３】非同期Ｉ／Ｏを説明する図である。
【図４】非同期Ｉ／Ｏ時のデータのバッファリングを説明する図である。
【図５】本実施の形態によるコンピュータシステムの構造を示す図である。
【図６】ＣＰＵの例を示す図である。
【図７】本実施の形態によるコンパイルを説明する図である。
【図８】非同期入出力文を含むソースプログラムの例を示す図である。
【図９】本実施の形態によるデータ入出力制御機能を説明する機能構成例を示す図である。
【図１０】本実施の形態のスレッド管理情報記憶部に格納された情報の例を示す図である。
【図１１】本実施の形態のバッファ管理情報記憶部に格納された情報の例を示す図である。
【図１２】本実施の形態の使用データ入出力決定部による使用データ入出力決定処理フローチャートである。
【図１３】本実施の形態による既生成スレッドを利用するデータ入出力処理の例を説明する図である。
【図１４】本実施の形態のスレッド利用入出力処理部によるスレッド利用データ入出力処理フローチャートである。
【図１５】本実施の形態によるシステムの非同期Ｉ／Ｏを利用したデータ入力処理の例を説明する図である。
【図１６】本実施の形態によるシステムの非同期Ｉ／Ｏを利用したデータ出力処理の例を説明する図である。
【図１７】本実施の形態のシステム利用入出力処理部によるシステム利用データ入出力処理フローチャートである。
【発明を実施するための形態】
【００１２】
以下，本実施の形態について，図を用いて説明する。
【００１３】
まず，本実施の形態によるデータ入出力制御の技術を説明する前に，一般的なデータ入出力の技術について，簡単に説明する。
【００１４】
図１は，データ入出力のモデルの分類例を示す図である。
【００１５】
一般的なデータ入出力のモデルは，例えば図１に示すように，同期（synchronous ）か非同期（asynchronous）か，またはブロッキング（blocking）が行われるか行われないかで分類することができる。
【００１６】
同期のデータ入出力モデルには，例えば，readやwrite などのシステムコールを用いたデータ入出力のモデルがある。同期のデータ入出力モデルでは，アプリケーションのスレッドは，カーネルへのＩ／Ｏリクエスト発行後に，カーネルからの応答を待つ。このような同期のデータ入出力モデルには，カーネルでの入出力処理が完了するまでアプリケーションのスレッドがブロックされるブロッキングのモデルと，カーネルでの入出力が完了しなくてもアプリケーションのスレッドに処理が返される非ブロッキング（non-blocking）のモデルとがある。
【００１７】
非同期のデータ入出力モデルには，例えば，ブロッキングを行う多重Ｉ／Ｏや，ブロッキングを行わない非同期Ｉ／Ｏなどがある。
【００１８】
図２は，多重Ｉ／Ｏを説明する図である。
【００１９】
図２において，アプリケーション５００は，データ入出力処理が含まれるユーザプログラムである。カーネル６００は，ＯＳの中核として，コンピュータのハードウェアリソースの管理・制御や，ハードウェア−ソフトウェア間のやり取りの制御，プロセス間通信などの基本機能を提供する。
【００２０】
多重Ｉ／Ｏは，単一のスレッドによって，read/writeでブロックすることなく，複数のＩ／Ｏを同時に扱う技術である。多重Ｉ／Ｏでは，アプリケーション５００は，select(2) ，poll(2) ，epoll(2)などのシステムコールを実行し，カーネル６００からのＩ／Ｏ実行可能状態の通知を待つ。
【００２１】
例えば，図２に示すように，アプリケーション５００がreadまたはwrite を実行し（Ｓ９００），カーネル６００からEAGAINでエラー復帰する（Ｓ９０１）。なお，EAGAINは，read/writeの非ブロッキングのデータ入出力において，読み取り／書き込みの準備ができたデータがないことを示す。アプリケーション５００は，システムコールのselect()を発行し（Ｓ９０２），カーネル６００からのＩ／Ｏ実行可能状態の通知を待つ。アプリケーション５００は，カーネル６００からのＩ／Ｏ実行可能状態の通知を受けた後（Ｓ９０３），readまたはwrite によりデータ転送を行う（Ｓ９０４）。
【００２２】
このように，多重Ｉ／Ｏでは，アプリケーション５００は，Ｉ／Ｏ実行可能状態の通知待ちの間にブロックされ，他の処理が一切行えない。そのため，通知の待ち時間が無駄になり，データ入出力の性能向上が望めない。
【００２３】
図３は，非同期Ｉ／Ｏを説明する図である。
【００２４】
図３において，システムライブラリ７００は，ＯＳによって提供される関数のライブラリである。システムライブラリ７００に含まれる非同期Ｉ／Ｏの関数としては，例えば，ＰＯＳＩＸ（Portable Operating System Interface ）のＡＩＯ関数などがある。なお，ＰＯＳＩＸは，登録商標である。
【００２５】
非同期Ｉ／Ｏでは，ＡＩＯ関連のシステムコールやＰＯＳＩＸのＡＩＯ関数などを使用し，ブロッキングすることなしに，データ入出力が実行される。ブロッキングしないため，アプリケーション５００がread/write発行後も他の処理を並列に行えることが特徴である。非同期Ｉ／Ｏには，例えば，システムで共通にサポートされるＰＯＳＩＸの非同期Ｉ／Ｏや，Ｌｉｎｕｘカーネルがサポートする非同期Ｉ／Ｏなどがある。なお，Ｌｉｎｕｘは，登録商標である。
【００２６】
図３において，アプリケーション５００は，システムライブラリ７００のＡＩＯ関数を呼び出す（Ｓ９１０）。システムライブラリ７００では，ＡＩＯ関数によって，カーネル６００に対するデータ入出力のシステムコールが発行される（Ｓ９１１）。なお，このときアプリケーション５００では，ＡＩＯ関数の呼び出しによって処理がブロックされないため，カーネル６００でのデータ入出力処理と並行に，他の処理が実行可能となる。
【００２７】
カーネル６００でのデータ入出力処理が完了すると，カーネル６００からシステムライブラリ７００にＩ／Ｏ完了通知が送られ（Ｓ９１２），システムライブラリ７００からアプリケーション５００に処理が返される（Ｓ９１３）。
【００２８】
このように，非同期Ｉ／Ｏでは，ブロッキングせずにデータの入出力を行うことが可能であるため，データ入出力処理の性能は向上する。
【００２９】
ただし，非同期Ｉ／Ｏでは，同時に待ち行列に入れる非同期Ｉ／Ｏの操作数や非同期Ｉ／Ｏ転送中にロック可能な最大メモリ容量制限が，システム全体で適用される値に依存する。非同期Ｉ／Ｏでは，システムリソースを他のアプリケーションと共有しているため，並行に動作する他のアプリケーションの動作によっては，待ち行列やロック可能な最大メモリ容量が制限を超えて待ち状態となり，データ入出力の性能劣化が余儀なくされる可能性がある。
【００３０】
図４は，非同期Ｉ／Ｏ時のデータのバッファリングを説明する図である。
【００３１】
データのバッファリングは，カーネル６００とアプリケーション５００との間でデータのやり取りを行う場合に，データをアプリケーション５００側が保持するバッファに一旦コピーして，いくつかのデータをまとめる方法である。この方法を行うことにより，システムコールの発行回数を減らすことができる。
【００３２】
例えば，図４において，アプリケーション５００は，バッファリング処理により，ファイルに出力するデータを，メモリ領域からバッファに転送する（Ｓ９２０）。
【００３３】
ファイルに出力するデータがバッファにまとめられたところで，アプリケーション５００は，システムライブラリ７００のＡＩＯ関数を呼び出す（Ｓ９２１）。システムライブラリ７００では，ＡＩＯ関数によって，カーネル６００に対するデータ入出力のシステムコールが発行される（Ｓ９２２）。カーネル６００の処理によって，バッファのデータがファイルに出力される。
【００３４】
カーネル６００でのデータ出力処理が完了すると，カーネル６００からシステムライブラリ７００にＩ／Ｏ完了通知が送られ（Ｓ９２３），システムライブラリ７００からアプリケーション５００に処理が返される（Ｓ９２４）。
【００３５】
このようなバッファリング処理によって，システムコールの発行回数を減らすことにより，システムコールの待ち行列を減らすことができる。ただし，非同期Ｉ／Ｏにおいてバッファリング処理を行う場合には，Ｉ／Ｏを発行してから完了待ちまでの時間が無駄になる可能性がある。
【００３６】
以下では，これらのようなデータ入出力技術の問題の解決を図った，本実施の形態のデータ入出力制御の技術について，説明する。
【００３７】
図５は，本実施の形態によるコンピュータシステムの構造を示す図である。
【００３８】
コンピュータ１は，ＣＰＵ（Central Processing Unit ）３１，ＲＡＭ（Random Access Memory）やＲＯＭ（Read Only Memory）などのメモリ３２，ＨＤＤ（Hard Disk Drive ）などのディスク３３等のハードウェア３０を備える。
【００３９】
図５において，システム領域２０は，ＯＳ２１などのシステムが稼動する領域である。図５に示すシステム領域２０には，ＯＳ２１が提供する関数のライブラリであるシステムライブラリ２２が用意されている。システム領域２０のプログラムは，ハードウェア３０を利用して実行される。
【００４０】
図５において，ユーザ領域１０は，ユーザがアプリケーション１１の稼動に利用できる領域である。また，図５に示すユーザ領域１０では，プログラミング言語で書かれたアプリケーション１１のソースプログラムから，実行形式のプログラムを作成するソフトウェアのパッケージであるコンパイラ／ライブラリ１２が稼動する。本実施の形態では，コンパイラ／ライブラリ１２は，Ｆｏｒｔｒａｎでプログラミングされたソースプログラムから実行形式のプログラムを作成するコンパイラのパッケージであるものとする。ユーザ領域１０のプログラムは，システム領域２０のＯＳ２１等を介することにより，ハードウェア３０を利用して実行される。
【００４１】
図６は，ＣＰＵの例を示す図である。
【００４２】
本実施の形態のＣＰＵ３１は，例えば，図６に示すようなＣＰＵチップ３１０で提供される。ＣＰＵチップ３１０は，ＣＰＵ３１の物理的なパッケージである。ＣＰＵチップ３１０は，複数のＣＰＵコア３１１を持つマルチコアプロセッサである。また，システムが提供するマルチスレッド機構により，ソフトウェアプログラムからは，１つのＣＰＵコア３１１が複数の論理ＣＰＵ３１２に見える。
【００４３】
図７は，本実施の形態によるコンパイルを説明する図である。
【００４４】
ここでは，図５に示すアプリケーション１１のソースプログラム１１１を，図５に示すコンパイラ／ライブラリ１２を用いてコンパイルし，アプリケーション１１の実行形式プログラム１１４を生成する例を説明する。なお，図７において，コンパイラ１２１，アセンブラ１２２，リンカ１２３と，実行時ライブラリ１２４の一部とは，図５に示すコンパイラ／ライブラリ１２に含まれる。
【００４５】
実行時ライブラリ１２４は，ユーザ領域１０で実行されるアプリケーション１１で汎用的に用いられるプログラムの集合である。図７に示す本実施の形態の実行時ライブラリ１２４には，ＯＳ２１が提供するシステムライブラリ２２や，コンパイラ／ライブラリ１２にパッケージされた言語提供ライブラリ，ユーザが過去に作成したプログラムで汎用的に使用するために保持されたアプリケーションライブラリ等が含まれる。
【００４６】
なお，本実施の形態のデータ入出力制御機能を提供するプログラムは，実行時ライブラリ１２４に含まれる。例えば，本実施の形態のデータ入出力制御機能を提供するプログラムは，コンパイラ／ライブラリ１２にパッケージされた言語提供ライブラリにより提供される。
【００４７】
ソースプログラム１１１は，アプリケーション１１のソースコードである。本実施の形態では，ソースプログラム１１１は，Ｆｏｒｔｒａｎでプログラミングされており，Ｆｏｒｔｒａｎの非同期入出力文を含んでいるものとする。なお，Ｆｏｒｔｒａｎは，科学技術計算向きに開発された手続き型のプログラミング言語である。
【００４８】
本実施の形態では，ソースプログラム１１１のコンパイルが実行されると，コンパイラ１２１は，ソースプログラム１１１を，中間的にアセンブラソース１１２に変換する。アセンブラ１２２は，アセンブラソース１１２をアセンブルし，オブジェクトコード１１３を生成する。リンカ１２３は，アプリケーション１１のオブジェクトコード１１３に対して，実行時ライブラリ１２４に含まれる必要な関数等のプログラムをリンクし，アプリケーション１１の実行形式プログラム１１４を生成する。
【００４９】
なお，本実施の形態では，リンクとして，動的リンクが用いられているものとする。すなわち，本実施の形態では，リンカ１２３は，オブジェクトコード１１３に対して，実行時ライブラリ１２４に含まれる必要なプログラムへの呼び出し解決を行い，実行形式プログラム１１４を生成する。実行時ライブラリ１２４のプログラムは，アプリケーション１１の実行形式プログラム１１４の実行時に，ユーザ領域１０のメモリ領域上に呼び出される。
【００５０】
図８は，非同期入出力文を含むソースプログラムの例を示す図である。
【００５１】
図８に示すソースプログラム１１１は，Ｆｏｒｔｒａｎで記述されており，データの非同期入出力を指定する非同期入出力文を含んでいる。
【００５２】
図８に示すソースプログラム１１１において，“PROGRAM MAIN”の次の２行は，変数の宣言が記述された部分である。その次の４行は，変数の初期化が記述された部分である。さらに次のＯＰＥＮ文からＣＬＯＳＥ文までの５行が，データ入出力が記述された部分である。
【００５３】
図８に示すソースプログラム１１１のデータ入出力の部分において，ＯＰＥＮ文，ＷＲＩＴＥ文，ＲＥＡＤ文に記述された“ASYNCHRONOUS='YES'”が，データの非同期入出力を指定する記述である。すなわち，図８に示すソースプログラム１１１において，“ASYNCHRONOUS='YES'”を含む入出力文が，非同期入出力文となる。
【００５４】
図９は，本実施の形態によるデータ入出力制御機能を説明する機能構成例を示す図である。
【００５５】
コンピュータ１において，アプリケーション１１のソースプログラム１１１は，コンパイラ１２１，リンカ１２３等により，アプリケーション１１の実行形式プログラム１１４に変換される。このとき，アプリケーション１１の実行形式プログラム１１４から実行時ライブラリ１２４の呼び出しに必要なインタフェースの生成などが行われる。また，実行形式プログラム１１４を起動するための実行コマンドも生成される。
【００５６】
実行時ライブラリ１２４では，アプリケーション１１の実行形式プログラム１１４から呼び出される関数等のプログラムによって，スレッド生成部１２５，使用データ入出力決定部１２６，スレッド利用入出力処理部１２７，システム利用入出力処理部１２８が実現される。本実施の形態によるデータ入出力制御機能を提供するこれらの各機能部は，コンピュータ１が備えるＣＰＵ３１，メモリ３２，ディスク３３等のハードウェア３０と，ソフトウェアプログラムとによって実現される。
【００５７】
実行コマンドによって，アプリケーション１１の実行形式プログラム１１４が起動されると，実行開始処理が行われる。実行形式プログラム１１４の実行開始処理において，実行時ライブラリ１２４のスレッド生成部１２５は，アプリケーション１１の実行で利用する，所定数のスレッドを生成する。
【００５８】
ユーザは，ソースプログラム１１１のコンパイル時に，アプリケーション１１をマルチスレッドで実行するか，シングルスレッドで実行するかを指定する。スレッド生成部１２５は，コンパイル時にマルチスレッドが指定されている場合に，複数スレッドの生成を行う。スレッド生成部１２５により生成するスレッドの数は，ＣＰＵ３１やメモリ３２の性能等を鑑みて妥当とされる数があらかじめ設定されている。本実施の形態では，アプリケーション１１の実行形式プログラム１１４の実行開始処理において，スレッド生成部１２５によって生成するスレッドの数は，アプリケーション１１のメインスレッドを含めて８個に設定されているものとする。なお，例えば実行形式プログラム１１４の実行時などにユーザが生成するスレッド数を指定できるようにしてもよい。
【００５９】
スレッド生成部１２５は，アプリケーション１１の実行で利用するスレッドの管理情報を生成し，スレッド管理情報記憶部１３１に記憶する。スレッド管理情報記憶部１３１は，アプリケーション１１の実行で利用するスレッドの管理情報を記憶する，コンピュータ１がアクセス可能な記憶装置である。スレッド管理情報記憶部１３１には，実行されたアプリケーション１１のプロセスＩＤ，アプリケーション１１の実行に利用するために生成されたスレッドの数，各スレッドの状態などの情報が記憶されている。
【００６０】
アプリケーション１１の実行において並列処理が必要な場合には，原則として，スレッド生成部１２５により生成されたスレッドを利用して処理を実行する。このとき，並列処理を行うプログラムは，スレッド管理情報記憶部１３１に記憶されたスレッドの管理情報を参照し，未使用のスレッドを選択して並列処理を行う。このとき利用するスレッドについては，スレッド管理情報記憶部１３１に記憶されたスレッドの管理情報において，使用状態に設定する。例えば，図８に示すソースプログラム１１１において４行目〜６行目のＤＯループ文に対応する処理で，既生成スレッドを利用した並列処理が行われる。
【００６１】
アプリケーション１１の実行形式プログラム１１４による非同期データ入出力開始処理において，実行時ライブラリ１２４の使用データ入出力決定部１２６は，使用するデータ入出力ロジックを決定する。本実施の形態では，データ入出力ロジックとして，スレッド利用入出力処理部１２７による既生成スレッドを利用するロジックと，システム利用入出力処理部１２８によるシステムコールまたはシステムライブラリの非同期Ｉ／Ｏを利用するロジックとが，実行時ライブラリ１２４で提供されている。非同期データ入出力開始処理は，例えば図８に示すソースプログラム１１１のＯＰＥＮ文に応じた処理である。
【００６２】
アプリケーション１１の実行形式プログラム１１４による非同期データ入出力実行処理において，実行時ライブラリ１２４のスレッド利用入出力処理部１２７またはシステム利用入出力処理部１２８は，データ入出力処理を実行する。
【００６３】
スレッド利用入出力処理部１２７は，スレッド生成部１２５によりすでに生成されているスレッドに空きがある場合に，その空き状態のスレッドを利用するデータ入出力処理を実行する。
【００６４】
システム利用入出力処理部１２８は，システムコールまたはシステムライブラリによって提供される非同期Ｉ／Ｏを利用するデータ入出力処理を実行する。
【００６５】
バッファ管理情報記憶部１３２は，ユーザ領域１０に用意されたバッファの管理情報を記憶する，コンピュータ１がアクセス可能な記憶装置である。スレッド利用入出力処理部１２７またはシステム利用入出力処理部１２８によるデータ入出力処理において，ユーザ領域１０に用意されたバッファを使用する場合がある。このとき，スレッド利用入出力処理部１２７やシステム利用入出力処理部１２８は，バッファ管理情報記憶部１３２に記憶されたバッファの管理情報を参照しながら，ユーザ領域１０のバッファを使用する。
【００６６】
図１０は，本実施の形態のスレッド管理情報記憶部に格納された情報の例を示す図である。
【００６７】
図１０に示すスレッド管理テーブル１３５は，スレッド管理情報記憶部１３１に記憶された，アプリケーション１１の実行のために生成されたスレッドの管理情報の例である。図１０に示すスレッド管理テーブル１３５では，プロセスＩＤが“０１”で，生成されたスレッドの数がメインスレッドを含めてＮ個であるアプリケーション１１についてのスレッドの情報が管理されている。なお，プロセスＩＤは，プロセスを一意に識別する識別情報である。
【００６８】
スレッド管理テーブル１３５は，スレッド番号，スレッド状態などの情報を持つ。スレッド番号は，スレッドを一意に識別する識別情報である。スレッド状態は，スレッドが実行状態か，待ち状態かまたは未使用状態かを示す情報である。図１０に示すスレッド管理テーブル１３５において，スレッド状態が“未使用”であるスレッドが，空き状態のスレッドである。
【００６９】
図１１は，本実施の形態のバッファ管理情報記憶部に格納された情報の例を示す図である。
【００７０】
図１１に示すバッファ管理テーブル１３６は，バッファ管理情報記憶部１３２に記憶された，アプリケーション１１が利用可能なユーザ領域１０のバッファを管理する情報の例である。図１１に示すバッファ管理テーブル１３６では，Ｍ個のバッファの情報が管理されている。
【００７１】
バッファ管理テーブル１３６は，バッファ番号，バッファ使用状況などの情報を持つ。バッファ番号は，バッファを一意に識別する識別情報である。バッファ使用状況は，バッファが使用中であるか否かを示す情報である。図１１に示すバッファ管理テーブル１３６のバッファ使用状況において，“ＯＮ”が使用中を示し，“ＯＦＦ”が使用していないことを示す。
【００７２】
図１２は，本実施の形態の使用データ入出力決定部による使用データ入出力決定処理フローチャートである。
【００７３】
使用データ入出力決定部１２６は，ソースプログラム１１１の非同期入出力文に対応したデータ入出力処理の実行開始時に，使用するデータ入出力ロジックを決定する。例えば，図８に示すソースプログラム１１１では，ＯＰＥＮ文に非同期入出力を示す“ASYNCHRONUS='YES' ”が設定されている。このような“ASYNCHRONUS='YES' ”が設定されたＯＰＥＮ文に対応した処理として，使用データ入出力決定部１２６は，使用するデータ入出力ロジックを決定する。
【００７４】
使用データ入出力決定部１２６は，上述したように，既生成スレッドを利用するデータ入出力のロジックと，システムコールまたはシステムライブラリ２２の非同期Ｉ／Ｏを利用するデータ入出力のロジックとから，使用するデータ入出力ロジックを決定する。以下，図１２のフローチャートを用いて，使用データ入出力決定部１２６による使用データ入出力決定処理の一例を説明する。
【００７５】
使用データ入出力決定部１２６は，スレッド管理情報記憶部１３１に記憶された，スレッド管理テーブル１３５等のスレッドの管理情報を参照する（ステップＳ１０）。使用データ入出力決定部１２６は，処理の並列実行が可能であるかを判定する（ステップＳ１１）。ここでは，使用データ入出力決定部１２６は，例えば，複数スレッドが生成されているかなどを判定する。また，使用データ入出力決定部１２６は，空き状態のスレッドがあるかを判定する（ステップＳ１２）。ここでは，使用データ入出力決定部１２６は，例えば，図１０に示すスレッド管理テーブル１３５において，スレッド状態が“未使用”であるスレッドがあるかを判定する。
【００７６】
並列実行が可能であり（ステップＳ１１のＹＥＳ），かつ空き状態のスレッドがあれば（ステップＳ１２のＹＥＳ），使用データ入出力決定部１２６は，使用するデータ入出力ロジックとして，スレッド利用データ入出力処理を決定する（ステップＳ１３）。このとき，使用データ入出力決定部１２６は，スレッド利用データ入出力処理を実現するモジュールのアドレス登録を行う。スレッド利用データ入出力処理は，スレッド利用入出力処理部１２７による既生成スレッドを利用するデータ入出力処理である。使用データ入出力決定部１２６は，空き状態のスレッドからデータ入出力に利用するスレッドを決定し，スレッド管理情報記憶部１３１に記憶されたスレッド管理テーブル１３５において，該当スレッドの状態を使用状態に設定する（ステップＳ１４）。なお，スレッドを利用するデータ入出力処理の場合には，図８に示すソースプログラム１１１のＣＬＯＳＥ文に対応する処理の実行時に，スレッド管理情報記憶部１３１に記憶されたスレッド管理テーブル１３５において，該当スレッドの状態が未使用状態に戻される。
【００７７】
並列実行が不可能である（ステップＳ１１のＮＯ），または空き状態のスレッドがない場合には（ステップＳ１２のＮＯ），使用データ入出力決定部１２６は，使用するデータ入出力処理ロジックとして，システム利用データ入出力処理を決定する（ステップＳ１５）。このとき，使用データ入出力決定部１２６は，システム利用データ入出力処理を実現するモジュールのアドレス登録を行う。システム利用データ入出力処理は，システム利用入出力処理部１２８によるシステムコールまたはシステムライブラリ２２の非同期Ｉ／Ｏを利用するデータ入出力処理である。
【００７８】
本実施の形態では，既生成スレッドに空き状態のスレッドがあれば，優先的に，スレッド利用入出力処理部１２７によるスレッド利用データ入出力処理を選択する。データ入出力処理に利用する既生成スレッドは，自身のアプリケーション１１の処理実行用に生成されたスレッドである。
【００７９】
上述したように，システムライブラリ２２やシステムコールの非同期Ｉ／Ｏを利用するデータ入出力処理では，同時に待ち行列に入れる非同期Ｉ／Ｏの操作数や非同期Ｉ／Ｏ転送中にロック可能な最大メモリ容量制限が，システム全体で適用される値に依存する。そのため，他のアプリケーションの動作によっては，待ち行列やロック可能な最大メモリ容量が制限を超えて待ち状態となり，データ入出力の性能劣化が余儀なくされる可能性がある。
【００８０】
これに対して，アプリケーション１１の処理実行用に生成されたスレッドを利用したデータ入出力処理では，ロック可能な最大メモリ容量などをアプリケーション１１側で管理できる。そのため，ロック可能な最大メモリ容量が制限を超えて待ち状態となってしまうことを回避でき，また処理性能が他のアプリケーションの動作に左右されることが少ない。このように，既生成スレッドに空き状態のスレッドがある場合に，そのスレッドを利用してデータ入出力を優先することで，データ入出力の性能向上を図れる。
【００８１】
図１３，図１４を用いて，使用データ入出力決定部１２６によりスレッド利用データ入出力処理が決定された場合の，スレッド利用入出力処理部１２７による既生成スレッドを利用するデータ入出力処理の例を説明する。
【００８２】
図１３は，本実施の形態による既生成スレッドを利用するデータ入出力処理の例を説明する図である。
【００８３】
図１３において，メインスレッド１１５は，アプリケーション１１のメインスレッドを示す。サブスレッドＡ１１６，サブスレッドＢ１１７，サブスレッドＣ１１８は，アプリケーション１１の実行開始時に生成され，データ入出力処理の開始段階で，空き状態であったスレッドである。カーネル２１１は，ＯＳ２１の中核として，コンピュータ１のハードウェア３０の管理・制御や，ハードウェア３０−ユーザ領域１０間のやり取りの制御，プロセス間通信などの基本機能を提供する。なお，ユニットはファイルを示す。
【００８４】
ユニットＡに対する非同期入出力処理が実行されるときに，スレッド利用入出力処理部１２７は，メインスレッド１１５ではなく，空きスレッドであるサブスレッドＡ１１６を利用して，データ入出力を行う。
【００８５】
アプリケーション１１のサブスレッドＡ１１６は，システムライブラリ２２のデータ入出力処理を行う関数を呼び出す（Ｓ１００）。ここでは，システムライブラリ２２に含まれる同期入出力処理の関数が呼び出される。呼び出された同期入出力処理の関数によって，ユニットＡに対するデータ入出力のシステムコールが発行される（Ｓ１０１）。
【００８６】
ユニットＡに対するデータ入出力処理は，サブスレッドＡ１１６によって実行されるので，アプリケーション１１のメインスレッド１１５は，サブスレッドＡ１１６によるデータ入出力処理とは並列に，他の処理が実行できる。なお，図１３に示す例ではサブスレッドＡ１１６でデータ入出力処理を行っているが，メインスレッド１１５でデータ入出力処理を行い，サブスレッドＡ１１６で他の処理を実行するようにしてもよい。
【００８７】
同様に，ユニットＢに対する非同期入出力処理，ユニットＣに対する非同期入出力処理が実行される場合に，空き状態のサブスレッドＢ１１７，サブスレッドＣ１１８があれば，スレッド利用入出力処理部１２７は，サブスレッドＢ１１７，サブスレッドＣ１１８を利用してデータ入出力を行う。すなわち，アプリケーション１１のサブスレッドＢ１１７は，システムライブラリ２２に含まれる同期入出力処理の関数を呼び出す（Ｓ１０２）。呼び出されたシステムライブラリ２２に含まれる同期入出力処理の関数によって，ユニットＢに対するデータ入出力のシステムコールが発行される（Ｓ１０３）。同様に，アプリケーション１１のサブスレッドＣ１１８は，システムライブラリ２２に含まれる同期入出力処理の関数を呼び出す（Ｓ１０４）。呼び出されたシステムライブラリ２２に含まれる同期入出力処理の関数によって，ユニットＣに対するデータ入出力のシステムコールが発行される（Ｓ１０５）。
【００８８】
サブスレッドＡ１１６，サブスレッドＢ１１７，サブスレッドＣ１１８によってデータ入出力処理を行っている間に，アプリケーションのメインスレッド１１５は，それらのデータ入出力処理とは並列に，他の処理が実行できる。
【００８９】
また，データ入出力処理に，ユーザ領域１０に用意されたバッファを使用してもよい。例えば，サブスレッドＡ１１６は，出力データが記憶されたアプリケーション１１のメモリ領域からバッファに転送する。サブスレッドＡ１１６は，システムライブラリ２２のデータ出力処理の関数を呼び出して，バッファからファイルＡへのデータ出力処理を行う。サブスレッドＡ１１６は，メモリ領域上のすべての該当データを出力するまで，これらの処理を繰り返す。なお，バッファを複数個用意して，それらの複数のバッファを交互に使用しながら，バッファへのデータ転送とシステムライブラリ２２の関数の呼び出しとを実行するようにしてもよい。
【００９０】
図１４は，本実施の形態のスレッド利用入出力処理部によるスレッド利用データ入出力処理フローチャートである。
【００９１】
スレッド利用入出力処理部１２７は，図１４に示すフローチャートによる処理を，データ入出力処理の実行に割り当てられた，空き状態の既生成スレッドに実行させる。ここでは，データ入出力処理の実行に割り当てられたスレッドを，データ入出力用スレッドと呼ぶものとする。なお，実行時ライブラリ１２４に含まれるスレッド利用入出力処理部１２７を実現するプログラムは，引数として，入出力を行うメモリ領域上のデータまたは変数領域のアドレス，入出力するデータの長さ，入出力する変数の数等を受ける。
【００９２】
実行する処理がデータ入力処理であれば（ステップＳ２０の入力），データ入出力用スレッドは，システムコールまたはシステムライブラリ２２により，ディスク３３からユーザ領域１０のバッファへのデータ読み出しを行う（ステップＳ２１）。データ入出力用スレッドは，バッファ上にあるデータを，アプリケーション１１のメモリ領域に転送する（ステップＳ２２）。データ入出力用スレッドは，ステップＳ２１，Ｓ２２の処理を，全入力変数について終了するまで繰り返す（ステップＳ２３）。
【００９３】
実行する処理がデータ出力処理であれば（ステップＳ２０の出力），データ入出力用スレッドは，アプリケーション１１のメモリ領域上の出力対象となるデータを，ユーザ領域１０のバッファに転送する（ステップＳ２４）。データ入出力用スレッドは，システムコールまたはシステムライブラリ２２により，バッファからディスク３３へのデータ書き出しを行う（ステップＳ２５）。データ入出力用スレッドは，ステップＳ２４，Ｓ２５の処理を，メモリ領域上の出力対象となる全データについて終了するまで繰り返す（ステップＳ２６）。
【００９４】
本実施の形態では，スレッドを利用したデータ入出力処理の開始時に，スレッドの生成を行わない。データ入出力処理に利用するスレッドは，アプリケーション１１の実行開始時に，アプリケーション１１の実行で汎用的に使用するためにスレッド生成部１２５によって生成されたスレッドのうちの，空き状態のスレッドである。データ入出力処理の開始時に，データ入出力のためのスレッドを生成するコストが省けるため，データ入出力処理実行時の性能が向上する。また，スレッドを利用したデータ入出力処理を行うのは，既生成スレッドに空き状態のスレッドがある場合のみであり，データ入出力処理のために新たなスレッドを増やさない。そのため，データ入出力のためにスレッドを増やし過ぎて，処理性能が劣化することはない。
【００９５】
図１５〜図１７を用いて，使用データ入出力決定部１２６によりシステム利用データ入出力処理が決定された場合の，システム利用入出力処理部１２８によるシステムコールまたはシステムライブラリ２２の非同期Ｉ／Ｏを利用するデータ入出力の例を説明する。
【００９６】
本実施の形態のシステム利用入出力処理部１２８によるシステム利用データ入出力処理では，ＯＳ２１等のシステム側から提供されるシステムコールやシステムライブラリ２２がサポートする非同期Ｉ／Ｏを利用したデータ入出力が行われる。
【００９７】
ただし，本実施の形態のシステム利用入出力処理部１２８は，データの入力と出力とで，ユーザ領域１０のバッファの使用と不使用とを使い分ける。すなわち，システムが提供する非同期Ｉ／Ｏを利用したデータ入力処理では複数のバッファを使用し，システムが提供する非同期Ｉ／Ｏを利用したデータ出力処理ではバッファを使用しない。
【００９８】
システムコールやシステムライブラリ２２の非同期Ｉ／Ｏを利用したデータ入出力処理において，データ入力とデータ出力とで，ユーザ領域１０のバッファの使用と不使用とを切り替えることで，より高速なデータ入出力が可能となる。
【００９９】
図１５は，本実施の形態によるシステムの非同期Ｉ／Ｏを利用したデータ入力処理の例を説明する図である。
【０１００】
図１５に示す非同期Ｉ／Ｏを利用したデータ入力処理では，システムライブラリ２２が提供するＡＩＯ関数と，Ｍ個のバッファとを利用することにより，バッファへのデータ入力と，バッファからアプリケーション１１のメモリ領域へのデータ転送とを，並行して行う。バッファは，バッファ管理情報記憶部１３２に記憶されたバッファ管理テーブル１３６によって管理されている。
【０１０１】
バッファ＃０を指定した非同期入力が実行されると，アプリケーション１１は，システムライブラリ２２のデータ入力処理を行うＡＩＯ関数を呼び出す（Ｓ１１０）。呼び出されたデータ入力処理を行うＡＩＯ関数によって，データ入力のシステムコールが発行される（Ｓ１１１）。なお，非同期Ｉ／Ｏなので，アプリケーション１１は，バッファ＃０へのデータ入力の完了を待たずに，別の処理を実行できる。
【０１０２】
同様に，バッファ＃１〜バッファ＃Ｍ−１を指定した非同期入力が順に実行されると，アプリケーション１１からシステムライブラリ２２のデータ入力処理を行うＡＩＯ関数の呼び出し（Ｓ１１２，... Ｓ１１４），ＡＩＯ関数からデータ入力のシステムコールの発行（Ｓ１１３，... ，Ｓ１１５）が行われる。
【０１０３】
バッファ＃０へのデータ入力が完了すると，カーネル２１１は，システムライブラリ２２のＡＩＯ関数にバッファ＃０についてのＩ／Ｏ完了通知を返す（Ｓ１１６）。システムライブラリ２２のＡＩＯ関数は，アプリケーション１１に処理を返す（Ｓ１１７）。
【０１０４】
バッファ＃０へのデータ入力完了を受けたアプリケーション１１は，他のバッファへのデータ入力処理と並行に，バッファ＃０からアプリケーション１１のメモリ領域へのデータ転送の処理を実行する。なお，他のバッファにも収まらない入力データがまだある場合には，バッファ＃０からメモリ領域へのデータ転送完了後，バッファ＃０を指定した次のデータの非同期入力が実行される。
【０１０５】
同様に，バッファ＃１へのデータ入力が完了すると，カーネル２１１は，システムライブラリ２２のＡＩＯ関数にバッファ＃１についてのＩ／Ｏ完了通知を返し（Ｓ１１８），ＡＩＯ関数はアプリケーション１１に処理を返す（Ｓ１１９）。バッファ＃１へのデータ入力完了を受けたアプリケーション１１は，他のバッファへのデータ入力処理と並行に，バッファ＃１からアプリケーション１１のメモリ領域へのデータ転送の処理を実行する。以下，バッファ＃２以降も，同様の処理が行われる。
【０１０６】
このように，本実施の形態のシステムライブラリ２２の非同期Ｉ／Ｏを利用したデータ入力では，一度にできるだけ多くのデータをアプリケーション１１側で処理するために，複数のバッファを交互に用いたデータの入力を行う。アプリケーション１１はシステムライブラリ２２のＡＩＯ関数に対して必要な分だけの入力要求を行い，データがバッファに転送された時点で，アプリケーション１１側でデータの処理を実施することができる。これにより，例えばディスク３３からバッファへのデータ入力と，アプリケーション１１での入力したデータの処理とを，並列に実行することができる。そのため，システムの非同期Ｉ／Ｏを用いたデータ入力時の性能が，向上する。
【０１０７】
図１６は，本実施の形態によるシステムの非同期Ｉ／Ｏを利用したデータ出力処理の例を説明する図である。
【０１０８】
図１６に示す非同期Ｉ／Ｏを利用したデータ出力処理では，バッファを使用せずに，アプリケーション１１のメモリ領域上の出力対象となるデータを，システムライブラリ２２が提供するＡＩＯ関数を利用して出力する。ここでは，入力変数Ｘ，Ｙ，Ｚのそれぞれについて，非同期Ｉ／Ｏを利用したデータ出力を行うものとする。
【０１０９】
入力変数Ｘについての非同期出力が実行されると，アプリケーション１１は，システムライブラリ２２のデータ出力処理を行うＡＩＯ関数を呼び出す（Ｓ１２０）。このとき，データ出力処理を行うＡＩＯ関数には，出力対象となるデータが記憶されているメモリ領域のアドレスや出力対象となるデータの長さ等の情報が渡される。呼び出されたデータ出力処理を行うＡＩＯ関数によって，データ出力のシステムコールが発行される（Ｓ１２１）。なお，非同期Ｉ／Ｏなので，アプリケーション１１は，入力変数Ｘについてのデータ出力の完了を待たずに，別の処理を実行できる。
【０１１０】
同様に，入力変数Ｙ，入力変数Ｚについての非同期出力が順に実行されると，アプリケーション１１からシステムライブラリ２２のデータ出力処理を行うＡＩＯ関数の呼び出し（Ｓ１２２，... Ｓ１２３），ＡＩＯ関数からデータ出力のシステムコールの発行（Ｓ１２４，... ，Ｓ１２５）が行われる。
【０１１１】
入力変数Ｘについてのデータ出力が完了すると，カーネル２１１は，システムライブラリ２２のＡＩＯ関数に入力変数ＸについてのＩ／Ｏ完了通知を返す（Ｓ１２６）。システムライブラリ２２のＡＩＯ関数は，アプリケーション１１に処理を返す（Ｓ１２７）。
【０１１２】
同様に，入力変数Ｙ，入力変数Ｚについてのデータ出力が完了すると，カーネル２１１は，システムライブラリ２２のＡＩＯ関数に入力変数Ｙ，入力変数ＺについてのＩ／Ｏ完了通知を返し（Ｓ１２８，Ｓ１３０），ＡＩＯ関数はアプリケーション１１に処理を返す（Ｓ１２９，Ｓ１３１）。
【０１１３】
このように，本実施の形態のシステムライブラリ２２の非同期Ｉ／Ｏを利用したデータ出力では，バッファを使用せずに，アプリケーション１１のメモリ領域上にあるデータをそのまま出力する。非同期Ｉ／Ｏを利用したデータ出力では，バッファにデータをコピーすると，コピーしたデータをシステムコールに渡す間に，待ち状態が発生する。バッファを使用せずに，アプリケーション１１のメモリ領域から直接にシステムライブラリ２２にデータを渡すことにより，アプリケーション１１の処理待ちの状態を減らすことができる。
【０１１４】
図１７は，本実施の形態のシステム利用入出力処理部によるシステム利用データ入出力処理フローチャートである。
【０１１５】
実行する処理がデータ入力処理であれば（ステップＳ３０の入力），システム利用入出力処理部１２８は，バッファ管理情報記憶部１３２に記憶されたバッファ管理テーブル１３６を参照し，バッファ使用状況がＯＦＦのバッファごとに，以下のステップＳ３１〜Ｓ３４の処理を繰り返す。
【０１１６】
システム利用入出力処理部１２８は，システムコールまたはシステムライブラリ２２により，ディスク３３からユーザ領域１０の該当バッファへのデータ読み出しを行う（ステップＳ３１）。システム利用入出力処理部１２８は，バッファ管理情報記憶部１３２に記憶されたバッファ管理テーブル１３６において，該当バッファのバッファ使用状況をＯＮに設定する（ステップＳ３２）。システム利用入出力処理部１２８は，バッファ上にあるデータを，アプリケーション１１のメモリ領域に転送する（ステップＳ３３）。システム利用入出力処理部１２８は，Ｉ／Ｏ完了通知受領後，バッファ管理情報記憶部１３２に記憶されたバッファ管理テーブル１３６において，該当バッファのバッファ使用状況をＯＦＦに設定する（ステップＳ３４）。
【０１１７】
システム利用入出力処理部１２８は，ステップＳ３１〜Ｓ３４のバッファごとの処理を，全入力変数について終了するまで繰り返す（ステップＳ３５）。
【０１１８】
実行する処理がデータ出力処理であれば（ステップＳ３０の出力），システム利用入出力処理部１２８は，システムコールまたはシステムライブラリ２２により，アプリケーション１１のメモリ領域にあるデータをディスク３３に書き出す（ステップＳ３６）。システム利用入出力処理部１２８は，ステップＳ３６の処理を，メモリ領域上の出力対象となる全データについて終了するまで繰り返す（ステップＳ３７）。
【０１１９】
以上説明した，本実施の形態の非同期入出力文に対応するデータ入出力制御の技術によって，データ入出力処理開始時に適切な実行モデルを判断して，高速にデータ入出力を実行することが可能となる。
【０１２０】
以上説明した本実施の形態のアプリケーション１１または実行時ライブラリ１２４による処理は，コンピュータが備えるＣＰＵ３１，メモリ３２等のハードウェア３０とソフトウェアプログラムとにより実現することができ，そのプログラムをコンピュータ読み取り可能な記録媒体に記録することも，ネットワークを通して提供することも可能である。
【０１２１】
以上，本実施の形態について説明したが，本発明はその主旨の範囲において種々の変形が可能であることは当然である。
【符号の説明】
【０１２２】
１  コンピュータ
１０  ユーザ領域
１１  アプリケーション
１１１  ソースプログラム
１１２  アセンブラソース
１１３  オブジェクトコード
１１４  実行形式プログラム
１２  コンパイラ／ライブラリ
１２１  コンパイラ
１２２  アセンブラ
１２３  リンカ
１２４  実行時ライブラリ
１２５  スレッド生成部
１２６  使用データ入出力決定部
１２７  スレッド利用入出力処理部
１２８  システム利用入出力処理部
１３１  スレッド管理情報記憶部
１３２  バッファ管理情報記憶部
２０  システム領域
２１  ＯＳ
２１１  カーネル
２２  システムライブラリ
３０  ハードウェア
３１  ＣＰＵ
３２  メモリ
３３  ディスク
【図１】
0005540799.tif 000002
【図２】
0005540799.tif 000003
【図３】
0005540799.tif 000004
【図４】
0005540799.tif 000005
【図５】
0005540799.tif 000006
【図６】
0005540799.tif 000007
【図７】
0005540799.tif 000008
【図８】
0005540799.tif 000009
【図９】
0005540799.tif 000010
【図１０】
0005540799.tif 000011
【図１１】
0005540799.tif 000012
【図１２】
0005540799.tif 000013
【図１３】
0005540799.tif 000014
【図１４】
0005540799.tif 000015
【図１５】
0005540799.tif 000016
【図１６】
0005540799.tif 000017
【図１７】
0005540799.tif 000018