(57)【要約】【課題】転送速度を一定に保つことを可能にする手段を提供する。【解決手段】所定の送信周期で所定の送信データ量のデータを送信する送信処理手段と、仮想回線を確立する送信側仮想回線管理手段と、１本の仮想回線を用いて、前記送信処理手段から前記送信データ量の第１のデータを送信し、前記第１のデータの送信が終了するまでの周期数に基づいて、仮想回線数ｍを決定する仮想回線数決定手段であって、前記第１のデータは前記送信周期を含む、仮想回線数決定手段と、を備えた送信クライアント、および所定の受信周期で前記送信クライアントからのデータを受信する受信処理手段であって、前記第１のデータに含まれる送信周期より短い受信周期を設定し、前記第１のデータの前記送信データ量およびヘッダーサイズを加算した値より大きい受信用バッファサイズを設定する、受信処理手段を備えた受信サーバとを有する。【選択図】図２１
2014036280.tif 000002
【特許請求の範囲】
【請求項１】
メモリに格納されたクロック駆動プログラミング（ＣＤＰ）プログラムを実行することにより、所定の送信周期で所定の送信データ量のデータを送信する送信処理手段を備えた送信クライアントと、メモリに格納されたＣＤＰプログラムを実行することにより、所定の受信周期で前記送信クライアントからのデータを受信する受信処理手段を備えた受信サーバとを有するシステムにおいて、一定の転送速度で転送する方法であって、
前記送信クライアントの仮想回線数決定手段が、前記送信クライアントの送信側仮想回線管理手段に指示して、仮想回線をｍ本確立するステップと、
前記送信処理手段が、前記送信データ量の第１のデータを送信するステップであって、前記第１のデータは、前記送信周期を含む、ステップと、
前記受信処理手段が、前記第１のデータに含まれる送信周期より短い受信周期を設定するステップと、
前記受信処理手段が、前記第１のデータの前記送信データ量およびヘッダーサイズを加算した値より大きい値を受信用バッファサイズとして設定するステップと、
前記送信処理手段が、前記送信周期で、前記ｍ本の仮想回線のうち送信可能な仮想回線を探して、前記送信データ量のデータを送信するステップと、
前記受信処理手段が、前記受信周期で、前記送信クライアントからのデータを受信するステップと
を含むことを特徴とする方法。
【請求項２】
前記仮想回線をｍ本確立するステップは、
前記仮想回線数決定手段が、前記送信側仮想回線管理手段に指示して、仮想回線を１本確立するステップと、
前記送信処理手段が、前記送信データ量の第１のデータを送信するステップと、
前記仮想回線数決定手段が、前記第１のデータの送信が終了するまでの周期数に基づいて、仮想回線数ｍを決定するステップと、
前記仮想回線数決定手段が、前記送信側仮想回線管理手段に指示して、ｍ−１本の仮想回線を確立するステップと
を含むことを特徴とする請求項１に記載の方法。
【請求項３】
前記仮想回線数決定手段は、前記第１のデータの送信が終了するまでの周期数に、マージンとして正の整数を掛けて前記仮想回線数ｍを決定することを特徴とする請求項２に記載の方法。
【請求項４】
前記送信周期で、前記ｍ本の仮想回線のうち送信可能な仮想回線を探して、前記信データ量のデータを送信するステップにおいて、前記送信処理手段は、前記ｍ本の仮想回線のうち送信可能な仮想回線を探し、確立済みのすべての仮想回線で送信を拒否される場合は、前記送信側仮想回線管理手段に指示して、仮想回線を増やすことを特徴とする請求項１に記載の方法。
【請求項５】
前記送信処理手段は、仮想回線を所定の上限まで増やしても送信可能な仮想回線がない場合、前記送信周期を長くすることにより、データ送出速度を下げることを特徴とする請求項４に記載の方法。
【請求項６】
前記送信クライアントのパラメータ管理手段が、周期パラメータおよびデータ量パラメータを受信するステップと、
前記パラメータ管理手段が、前記周期パラメータに基づいて前記送信周期を、および前記データ量パラメータに基づいて前記送信データ量を決定するステップと
をさらに含むことを特徴とする請求項１乃至５のいずれかに記載の方法。
【請求項７】
前記送信クライアントのパラメータ管理手段が、転送速度を指定する入力を受信するステップと、
前記パラメータ管理手段が、前記転送速度に基づいて前記送信周期および前記送信データ量を決定するステップと
をさらに含むことを特徴とする１乃至５のいずれかに記載の方法。
【請求項８】
前記パラメータ管理手段は、ＯＳのタイムスライスの整数倍の送信周期を決定し、４キロバイトの整数倍の送信データ量を決定することを特徴とする請求項６または７に記載の方法。
【請求項９】
メモリに格納されたクロック駆動プログラミング（ＣＤＰ）プログラムを実行することにより、所定の送信周期で、複数の仮想回線のうち送信可能な仮想回線を探して、所定の送信データ量のデータを送信する送信処理手段であって、前記送信周期を含む、前記送信データ量の第１のデータを送信する、送信処理手段と、
仮想回線を確立する送信側仮想回線管理手段と、
仮想回線数ｍを決定する仮想回線数決定手段と
を備えた送信クライアント、および
メモリに格納されたＣＤＰプログラムを実行することにより、所定の受信周期で前記送信クライアントからのデータを受信する受信処理手段であって、前記第１のデータに含まれる送信周期より短い受信周期を設定し、前記第１のデータの前記送信データ量およびヘッダーサイズを加算した値より大きい値を受信用バッファサイズとして設定する、受信処理手段を備えた受信サーバとを有することを特徴とするシステム。
【請求項１０】
メモリに格納されたクロック駆動プログラミング（ＣＤＰ）プログラムを実行することにより、所定の送信周期で所定の送信データ量のデータを送信する送信処理手段を備えた送信クライアントと、メモリに格納されたＣＤＰプログラムを実行することにより、所定の受信周期で前記送信クライアントからのデータを受信する受信処理手段を備えた受信サーバとを有するシステムに、一定の転送速度で転送させるプログラムであって、
前記送信クライアントの仮想回線数決定手段が、前記送信クライアントの送信側仮想回線管理手段に指示して、仮想回線をｍ本確立するステップと、
前記送信処理手段が、前記送信データ量の第１のデータを送信するステップであって、前記第１のデータは、前記送信周期を含む、ステップと、
前記受信処理手段が、前記第１のデータに含まれる送信周期より短い受信周期を設定するステップと、
前記受信処理手段が、前記第１のデータの前記送信データ量およびヘッダーサイズを加算した値より大きい値を受信用バッファサイズとして設定するステップと、
前記送信処理手段が、前記送信周期で、前記ｍ本の仮想回線のうち送信可能な仮想回線を探して、前記送信データ量のデータを送信するステップと、
前記受信処理手段が、前記受信周期で、前記送信クライアントからのデータを受信するステップと
を含むことを特徴とするプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ファイル転送方法、そのシステムおよびプログラムに関し、より詳細には、ＴＣＰなどのトランスポートプロトコルを用いたファイル転送において、転送速度を一定に保つことを可能にする方法、そのシステムおよびプログラムに関する。
【背景技術】
【０００２】
ＴＣＰなどのトランスポートプロトコルにより提供される通信回線では、その転送速度はウィンドウサイズ（ＷＩＮ）とネットワークの往復遅延時間（ＲＴＴ）を用いて、次式で求めることができる。
転送速度上限［bps］＝ＷＩＮ［byte］×８／ＲＴＴ［ms］×１０００  
【０００３】
ここでウィンドウサイズは、輻輳制御、フロー制御、ネットワーク遅延対応制御などのため、トランスポート層ソフトウェアにより、動的に変更される。そのため、転送速度も動的に変化し、一定ではないことが常識である。
【０００４】
ファイル転送においては、決まった時間内に転送完了を要求されることがある。例えば、ディザスタリカバリ（ＤＲ）を目的としてシステムのバックアップファイルを転送する場合、目標復旧時点（ＲＰＯ）および目標復旧時間（ＲＴＯ）を守るために、決まった時刻までにバックアップファイルの転送を完了する必要がある。例として、ＲＰＯおよびＲＴＯをそれぞれ６時間、３０分に設定するクラウドサービスを提供する場合を考える。
【０００５】
まず、定常運用時に、稼働システムはそのシステムイメージおよびユーザデータを、ＲＰＯとして設定した６時間の半分、３時間ごとに取得して、ＤＲ中継センタに３時間以内に転送する必要がある。さらに、災害発生時には、ＤＲ中継センタは被災システムの受入先クラウドを決定し、決定した受入先クラウドに合わせてシステムイメージを変換し、変換したシステムイメージおよびユーザデータを受入先クラウドへ転送して、受入先クラウドにおいてシステムを再稼働するまでの時間が３０分なので、転送に許される時間は多くとも１５分程度に抑える必要がある。
【０００６】
ファイル転送に共用ベストエフォート回線を用いた場合、転送速度が変動するため、転送完了時刻を守れない可能性がある。
【０００７】
これに対して、帯域保証の専用回線を用いた場合、転送速度は確保されるので、転送完了時刻を守ることができる。しかし、帯域制御装置や専用回線サービスの契約が必要となるため、コストが高くなる。さらに、帯域制御装置の設定や専用回線サービスの契約により回線速度が決まるため、柔軟に転送速度を調整することができない。そのため、本来は決まった時刻までに最低限の帯域でファイル転送を完了すれば十分であるにもかかわらず、最大ファイルサイズの転送速度に合わせた広い帯域を常に用意する必要があり、コストはさらに高くなる。
【０００８】
本件出願人は、実行環境を固定できないクラウドコンピューティングにおいて、システムとしての性能（スループット）を保証する手段を提供することに成功した（特願２０１２−０６８０３３）。システムとしての性能を保証するために、当該技術では、タイマーにより、定められた一定の処理を実行し、それが終了すると、次にタイマーにより駆動されるまで休むよう動作するクロック駆動プログラミング（ＣＤＰ）のプログラムを処理する。高速マシンを使うと、実行時間は減少するが、その分休止時間が増える。低速マシンを使うと、実行時間が増加し、その分休止時間が減少する。すなわち、高速マシンおよび低速マシンのいずれを用いても、時間当たりの実行ステップ数は同じになる。従って、性能（スループット）はハードウェアには依存せずに同一になる。
【０００９】
ただし、周期Ｔを保ってプログラムを実行するために、以下の式で示されるデューティ率（Ｄ）は１未満である必要がある。τは実行時間である。
【００１０】
【数１】
2014036280.tif 000003
【発明の概要】
【発明が解決しようとする課題】
【００１１】
従来のファイル転送方法では、帯域保証の専用回線を用いなければ、転送速度は確保されなかった。また、帯域保証の専用回線を用いた場合であっても、遠距離（高遅延）で転送した場合は、速度を一定に保つことができなかった。そのため、ファイル転送に要する時間を見積もることもできなかった。
【００１２】
本発明は、このような問題に鑑みてなされたもので、その目的とするところは、転送地点間の距離に関わらず、転送速度を一定に保つことを可能にする手段を提供することにある。
【課題を解決するための手段】
【００１３】
転送速度は、送信クライアントのデータ送出速度（ＶS）、仮想回線の転送速度上限（ＶC）および受信サーバのデータ受取速度（ＶR）の計３つの要因により決まる。すなわち、この３つの要因のうち、最遅速度が転送速度となる。
【００１４】
従来のファイル転送では、送信クライアントにおいて、blocking I/OのSEND関数を用いてデータ送信を行っている。blocking I/Oを用いてプログラムがＯＳに対して読み書き（送受信）要求を行うと、読み書きの準備が整っていない場合、ＯＳはプログラムの実行を待ち状態に設定し、読み書き可能になるまでプログラムの実行を抑制する。
【００１５】
すなわち、仮想回線の転送速度上限（ＶC）が送信クライアントのデータ送出速度（ＶS）より遅い場合には、送信クライアントのデータ送出速度（ＶS）は、仮想回線の転送速度上限（ＶC）に合わせて調整される。その後、仮想回線の転送速度上限（ＶC）が速くなると、ＯＳによるプログラムの実行抑制から解放されるので、送信クライアントのデータ送出速度（ＶS）も速くなる。
【００１６】
このように、仮想回線の転送速度上限（ＶC）に従って送信クライアントのデータ送出速度（ＶS）が変化する状況で転送速度を一定に保つためには、仮想回線の転送速度上限（ＶC）を一定に保つ必要がある。しかし、仮想回線の転送速度上限（ＶC）は、伝送誤り訂正のための再送、輻輳制御、スロースタート、フロー制御など、ＴＣＰの基本機能により必然的に変動するものである。この変動を許容しないことは、ＴＣＰの基本機能を諦めることに等しく、ファイル転送においてはこれらＴＣＰの基本機能を諦める選択はできない。
【００１７】
そこで、本発明では、送信クライアントのデータ送出速度（ＶS）を一定に保ち、さらに、送信クライアントのデータ送出速度（ＶS）が律速段階となるように、仮想回線の転送速度上限（ＶC）および受信サーバのデータ受取速度（ＶR）を制御することにより、転送速度を一定に保つ。
【発明の効果】
【００１８】
本発明は、送信クライアントのデータ送出速度を一定に保ち、さらに、送信クライアントのデータ送出速度が律速段階となるように、仮想回線の転送速度上限および受信サーバのデータ受取速度を制御することにより、転送速度を一定に保つことができる。帯域保証の専用回線を用いずに上記の効果を得られるので、コストも抑えることができる。
【００１９】
本発明は、また、転送速度を一定に保つことができるので、その転送速度からファイルの転送時間を見積もることができる。要求するファイルの転送時間から転送速度を設定することも可能となり、必要最低限の帯域で転送することができる。
【００２０】
本発明は、また、ファイル転送時に回線が足りなくなった場合に、動的に回線を増やすことができるので、テスト時の仮想回線の転送速度上限から想定以上の速度低下が起こった場合であっても、転送速度を一定に保つことができる。
【００２１】
さらに、本発明は、ネットワーク環境の帯域限界と判断される場合に、データ送出速度を下げることにより転送速度を制御することができるので、パケットロスの大量発生に伴う転送速度の低下などを抑制し、提供可能な最大限の転送速度を実現することができる。
【図面の簡単な説明】
【００２２】
【図１】ディザスタリカバリの概念図である。
【図２】本発明の一実施形態に係るネットワーク構成を示す図である。
【図３】本発明の一実施形態に係るタスクのプログラム記述例を示す図である。
【図４】本発明の一実施形態に係る別のタスクを利用するタスクのプログラム記述例を示す図である。
【図５】本発明の一実施形態に係るタスク配列のプログラム記述例を示す図である。
【図６】本発明の一実施形態に係るタスクのコールグラフを示す図である。
【図７】本発明の一実施形態に係るタスクのＰＥＲＴ図である。
【図８】本発明の一実施形態に係るタスクのコールグラフを示す図である。
【図９Ａ】ポーリングを用いたタスクのプログラム記述例を示す。
【図９Ｂ】ポーリングを用いたタスクのプログラム記述例を示す。
【図１０】本発明の一実施形態に係るタスクのＰＥＲＴ図である。
【図１１】本発明の一実施形態に係るタスク間の先行関係を示す先行関係表である。
【図１２Ａ】変数リネーム技法を適用する前のプログラム記述例を示す図である。
【図１２Ｂ】変数リネーム技法を適用する後のプログラム記述例を示す図である。
【図１３】個別化技法を適用する前後のコールグラフを示す図である。
【図１４Ａ】抽選化技法を適用したタスクのプログラム記述例を示す図である。
【図１４Ｂ】抽選化技法を適用したタスクのプログラム記述例を示す図である。
【図１５】本発明の一実施形態に係るタスクのＰＥＲＴ図である。
【図１６】本発明の一実施形態に係るタスクを実行するプログラム記述例を示す図である。
【図１７】本発明の一実施形態に係るタスクを実行するプログラム記述例を示す図である。
【図１８】本発明の一実施形態に係るタスクを並列実行するシーケンス図である。
【図１９】本発明の一実施形態に係る送信クライアントの構成を示すブロック図である。
【図２０】本発明の一実施形態に係る転送速度記憶手段に格納された情報の一例を示す図である。
【図２１】本発明の一実施形態に係る受信サーバの構成を示すブロック図である。
【図２２】本発明の一実施形態に係る送信クライアントおよび受信サーバのデータのファイル転送処理工程を示すフローチャートである。
【発明を実施するための形態】
【００２３】
（ネットワーク構成）
図２は、本発明の一実施形態に係るネットワーク構成を示す図である。複数の送信クライアント１０１ａ、１０１ｂ、・・・、１０１ｎ（以下、送信クライアント１０１と呼ぶ）が、インターネット１０２を介して、複数の受信サーバ１０３ａ、１０３ｂ、・・・、１０３ｎ（以下、受信サーバ１０３と呼ぶ）と相互に通信可能に接続される。
【００２４】
送信クライアント１０１は、転送対象のファイルを格納するメモリを有し、利用者の要求に応答して、利用者が指定した速度でファイル転送を行う。本発明の送信クライアント１０１により実行される送信処理手段は、所定の条件を満たすよう構成されたＣＤＰプログラムを用いて構成される。
【００２５】
受信サーバ１０３は、ファイルの転送先となるコンピュータである。送信クライアント１０１が転送したファイルを受信して、受信したファイルをメモリに格納する。本発明の受信サーバ１０３により実行される受信処理手段は、送信処理手段と同様、所定の条件を満たすように構成されたＣＤＰプログラムを用いて構成される。
【００２６】
（ＣＤＰプログラム）
初めに、ＣＤＰプログラムについて説明する。ＣＤＰは、イベント駆動プログラミング（ＥＤＰ）の一部である。従って、ＣＤＰは、ＥＤＰをサポートする任意のプログラミング言語、およびＯＳで実践できる。本実施形態では、C言語、およびWindows（登録商標）を用いるが、これに限定されるものではない。
【００２７】
ＣＤＰとＥＤＰとの違いは、イベントハンドラーの使い方にある。ＥＤＰでは、任意の数のタイマーを利用することができるのに対し、ＣＤＰでは、タイマーイベントハンドラーを提供するタイマーを、必ず１つ利用することが要求される。
【００２８】
また、ＥＤＰでは、タイマーイベントハンドラーを含むすべてのイベントハンドラーにおいて、イベントに対応する処理を行う。一方、ＣＤＰでは、タイマーイベントハンドラー以外のイベントハンドラーにおいて、状態を示すフラグをセットすることにより、イベントの発生を記録するのみで、イベントに対応する処理は、ここでは行わない。ＣＤＰでは、タイマーイベントハンドラーにおいて、状態を示すフラグに基づいて、イベントの発生に対応するタスクを実行する。
【００２９】
ＣＤＰプログラムは、以下の手順で作成される。１）タスクを洗い出し、記述する。２）タスク間の先行関係を把握し、ＰＥＲＴ図を作成する。３）ＰＥＲＴ図によって与えられた先行関係の制約を満たすスケジュールを作成する。タスクの記述、ＰＥＲＴ図の作成、スケジュールの作成を順に説明する。
【００３０】
（タスクの記述）
ＣＤＰのタスクを、図３のプログラム記述例に基づいて説明する。ＣＤＰのタスクは、以下の要素を用いて定義される。
内部変数：ステート間で値を引継ぐために使用する１以上の変数
インタフェース関数：内部変数を他のタスクが参照または更新するための０以上の関数
リセット関数：内部変数を初期化するための関数
タスク本体関数：タイマーイベントハンドラーによって呼び出される関数
【００３１】
ＣＤＰのタスクは、状態により、実行する動作が変化するステートマシンである。ステート間で値を引継ぐために、内部変数を用いる。図３の例では、行番号L5に、taskA_data_t構造体型の内部変数taskA_dataが定義されている。なお、taskA_data_t構造体型は、同図の行番号L2からL4により示されるように、taskA_state_t列挙型の変数state、int型のx、y、resultをメンバとして含む。
【００３２】
ＣＤＰのタスクは、前述の内部変数を他のタスクが参照または更新するためのインタフェース関数を必要に応じて定義する。図３の例では、行番号L13からL31で定義されるcalcメソッド、行番号L33からL43で定義されるget_resultメソッドがインタフェース関数である。calcメソッドは、図３に記述されるTaskAに処理を要求するための関数、get_resultメソッドは、処理結果を要求するための関数である。
【００３３】
ＣＤＰのタスクはまた、内部変数を初期化するためのリセット関数を定義する。図３の例では、行番号L45からL48で定義されるtaskA_RSTメソッドがリセット関数である。本実施形態では、リセット関数において内部変数taskA_dataのメンバ変数stateを初期化している。
【００３４】
そして、ＣＤＰのタスクは、タイマーイベントハンドラーによって呼び出されるタスク本体関数を定義する。図３の例では、行番号L50からL84で定義されるtaskA_CLKメソッドがタスク本体関数である。図３に示されるように、タスク本体関数は、taskA_data.stateの値に従って計算を実行する。stateがcalc1の場合、Ｆ（ｘ）を計算する。ここで、関数Fは、行番号L11で定義されるように、標準ライブラリなどの他のモジュールで定義される外部関数である。stateがcalc2の場合、定数LIMITを上限として、Ｆ（ｘ）yを計算する。
【００３５】
ここで、タスクの実行時間は、タイマーの周期より短い必要がある。そのため、タスクは次の２つの要求を満たす必要がある。１）タスクは、実行ステップの上限を有する。２）タスクの各ステートメントは、実行時間の上限を有する。
【００３６】
要求１）を満たすために、各関数は、構文的に停止性が保証される形で書く。すなわち、選択(if then else)および順次（;) の組み合わせに展開可能となるように記述する。ループに関しては、反復回数に上限があるものだけが記述可能であり、実行時に反復回数が決まるループを書くことは許されない。不定回数のループは、図３のtaskA_CLKメソッドのように、固定回数のループを周期的に実行することにより実現する。この場合、選択（if then else)によりステップ数は変化するが、１周期で実行されるステップ数には上限が存在するので、要求１）が満たされる。
【００３７】
要求２）を満たすために問題となるのは、ステートメントが関数呼び出しを含む場合である。呼び出す関数が他のタスクのインタフェース関数である場合は、呼び出し先の関数についても実行ステップ数に上限があり、結果として実行時間に上限があるので、問題はない。一方、呼び出す関数が、ライブラリ関数やＯＳの機能を呼び出すＡＰＩなど、ＣＤＰに従わない関数である場合、実行時間に上限がない場合がある。
【００３８】
特に問題となるのが、ＯＳのＡＰＩに存在するblocking I/Oである。例えば、blocking I/O のREAD関数を用いてファイルの読み出しをする場合、ファイルの読み出しが完了するまで、呼び出し側プログラムに制御を戻さない。これでは、要求２）を満たすことができない。そこで、ＣＤＰのタスクでは、原則としてblocking I/Oの代わりに、non-blocking I/Oを用いる。あるいは、select関数等を用いてブロックされないことを確認した上でblocking I/Oを用いる。
【００３９】
続いて、図４に、図３に記載のtaskAを利用するtaskBのプログラム記述例を示す。taskBは、列挙型の変数state、int型のa、b、zをメンバとして含む構造体型の内部変数taskB_dataを持つ。taskBのタスク本体関数では、図４の行番号L34に示されるように、stateがstate_10の場合、calcメソッドを呼ぶことによりtaskAに処理を要求する。図３の行番号L23に示されるように、taskAの状態に従って要求が受け入れられる場合のみ、戻り値として0が返される。従って、taskBは、要求が受け入れられるまでリトライし、要求が受け入れられると、state_11に遷移する。
【００４０】
また、図４の行番号L40に示されるように、stateがstate_11の場合、get_resultメソッドを呼ぶことにより処理結果の取得を試みる。ここでも、図３の行番号L40に示されるように、taskAの状態に従って計算が終わっている場合のみ、戻り値として0が返される。従って、taskBは、戻り値として0が得られるまで、クロック毎にget_resultメソッドを呼び出し、処理結果を取得すると、state_12に遷移する。
【００４１】
（タスクの配列化）
図３の行番号L18に示されるように、taskAはstateがfreeである場合のみ、計算要求を受け入れる。つまり、taskAが先行する計算要求を受け入れ、計算を実行している間は、他のタスクからの計算要求を受け入れることはできない。そこで、同時に複数の計算要求を処理したい場合には、同一機能を持つ複数のタスクを用意するために、タスクを配列化したタスク配列を定義する。図５に、図３に記載のtaskAを配列化したタスク配列のプログラム記述例を示す。
【００４２】
図５の行番号L4に示されるように、タスク配列では、内部変数を配列化する。そして、行番号L7に示されるように、インタフェース関数calcの引数としてインデクスを受け取り、内部変数の参照、更新時には受け取ったインデクスを指定して行う。他の関数においても、同様に引数としてインデクスを受け取り、受け取ったインデクスを指定して内部変数の参照更新を行うことにより、タスクを配列化することができる。内部変数配列の要素数をタスク配列の多重度と呼び、配列化されていないタスク（例えば、図３のtaskA）の多重度は１である。
【００４３】
（ＰＥＲＴ図の作成）
タスクを記述したら、次にタスク間の先行関係を把握しＰＥＲＴ図を作成する。タイマーイベントハンドラーが呼び出すのは、タスク本体関数であり、タスク間の先行関係とは、タスク本体関数間の先行関係である。あるタスクは、そのタスク本体関数において、他のタスクのインタフェース関数を呼び出して、他のタスクの処理結果を取得する。例えば、図４に示すtaskBは、タスク本体関数において、taskAのget_resultメソッドを呼び出して、taskAの処理結果Ｆ（ｘ）yを取得する。このインタフェース関数の静的呼び出し関係を示したものが、図６のコールグラフである。
【００４４】
ここで、taskBが処理結果を得るためには、taskAのタスク本体関数がtaskBのタスク本体関数の実行の前に完了している必要がある。この場合、taskAはtaskBに先行する。完了順序を示すＰＥＲＴ図は、コールグラフの矢印の向きを逆転することにより得ることができる（図７）。しかし、全てのコールグラフからＰＥＲＴ図を得ることができるわけではない。
【００４５】
ＰＥＲＴ図を得るためには、コールグラフがacyclicである（ループがない）必要がある。図８に示すように、コールグラフがacyclicでない場合は、ポーリング（polling）を用いてタスク間のインタフェースの向きを入れ替える必要がある。taskAとtaskBとのコールグラフはacyclicであるので、タスク間のインタフェースの向きを入れ替える必要はない。ポーリングを用いる参考例として、図９Ａおよび図９Ｂに、インタフェース方向を変えたtaskAおよびtaskBのプログラム記述例を示す。
【００４６】
得られたＰＥＲＴ図から、同時実行され得るタスクを判断することができる。コールグラフに基づいて、図１０に示すＰＥＲＴ図が得られたものとする。ここで、図１０に示すＰＥＲＴ図のグラフＧは、１から９のタスクに対応するノードの集合、およびタスク間の先行関係を表す矢印の集合により構成される。ＰＥＲＴ図には、本来のタスク１から９に対応するノードに加えて、プログラム全体のスタートとフィニッシュをそれぞれ表す端点sと端点tが記されている。
【００４７】
図１１に、図１０のＰＥＲＴ図に含まれるタスク間の先行関係を示す先行関係表を示す。図中の◎は、２つのタスクが、直接の先行関係を有することを示す。例えば、タスク１と（タスク１のインタフェース関数を呼び出す）タスク４、タスク１と（タスク１のインタフェース関数を呼び出す）タスク６などは、直接の先行関係を有する。図中の○は、２つのタスクが、間接の先行関係を有することを示す。例えば、タスク１とタスク７、タスク１とタスク８、タスク１とタスク９などは、間接の先行関係を有する。図中の×は、２つのタスクが、先行関係を有し得ないことを示す。
【００４８】
間接の先行関係は、直接の先行関係を有さないが、１または複数のタスクを経由して先行関係を有する２つのタスク間において生じる。例えば、タスク１とタスク７は、タスク１のインタフェース関数を呼び出し、かつタスク７によりそのインタフェース関数を呼び出されるタスク４を経由して、先行関係を有する。同様に、タスク１とタスク８も、タスク４を経由して先行関係を有する。また、タスク１とタスク９は、タスク４およびタスク７を経由して、あるいはタスク６を経由して、先行関係を有する。
【００４９】
ここで、特定のタスクｖのインタフェース関数を呼び出すタスクｕ、およびタスクｗが、直接または間接の先行関係を有する場合、タスクｕとタスクｗとは、同時実行されることはない。例えば、タスク１のインタフェース関数を呼び出すタスク４およびタスク６は、図１１に示されるように直接の先行関係を有するので、同時実行されることはない。一方、タスク３のインタフェース関数を呼び出すタスク５およびタスク８は、図１１に示されるように先行関係を有さないので、同時実行され得る。
【００５０】
複数のタスクが同時に同じタスクのインタフェース関数を呼び出す場合、タスクの実行される順序やインタフェース関数の実行される順序により、結果が変わってしまう可能性がある。そこで、複数のタスクから同時に呼び出され得るインタフェース関数は、Bernstein's conditionsを満たす必要がある。Bernstein's conditionsは、プログラムの断片が並列実行できるための、周知の十分条件である。
【００５１】
例えば、タスク５およびタスク８から同時に呼び出され得る、タスク３に含まれる関数ｆ、ｇは、関数ｆの中で構文的に参照される内部変数の集合（Ｒ（ｆ））、関数ｆの中で構文的に代入される内部変数の集合（Ｗ（ｆ））、関数ｇの中で構文的に参照される内部変数の集合（Ｒ（ｇ））、および関数ｇの中で構文的に代入される内部変数の集合（Ｗ（ｇ））について以下の(1)から(3)が成り立つ場合、Bernstein's conditionsを満たし、並列実行することができる。
R(f) ∩ W(g) ＝ φ・・・(1)  
R(g) ∩ W(f) ＝ φ・・・(2)  
W(f) ∩ W(g) ＝ φ・・・(3)
【００５２】
（Bernstein's conditionsを満たすプログラムへの書き換え技法）
同時実行され得るタスクがBernstein's conditionsを満たさない場合、書き替え技法を用いてプログラムを修正する必要がある。代表的な３つの書き換え技法を以下で紹介する。
【００５３】
第１の書き替え技法として、変数リネーム技法がある。図１２Ａおよび図１２Ｂに、変数リネーム技法を適用する前後のプログラム記述例を示す。適用前のプログラム記述例では、図１２Ａに示されるように、インタフェース関数read、writeにおいて、Ｒ（read） ∩ Ｗ（write） ＝ {taskA_x} ≠ φであり、Bernstein's conditionsを満たさない。一方、適用後のプログラム記述例では、図１２Ｂに示されるように、別途内部変数を用いてプログラムを修正することにより、Ｒ（read） ∩ Ｗ（write） ＝φとなり、Bernstein's conditionsを満たすことができる。
【００５４】
第２の書き替え技法として、個別化技法がある。個別化技法では、Bernstein's conditionsを満たさないインタフェース関数を有するタスクを、配列化する。図１３に、個別化技法を適用する前後のコールグラフを示す。適用前のコールグラフでは、図１３（左）に示されるように、インタフェース関数calc_Fの競合がおき、Ｒ（calc_F） ∩ Ｗ（calc_F） ＝ {taskB_data} ≠ φであり、Bernstein's conditionsを満たさない。一方、適用後のコールグラフでは、図１３（右）に示されるように、taskBを配列化することにより、Ｒ（calc_F(0)) ∩ ）Ｗ（calc_F(1)） ＝ {taskB_data[0]} ∩ {taskB_data[1]} ＝ φとなり、Bernstein's conditionsを満たすことができる。
【００５５】
第３の書き替え技法として、抽選化技法がある。前述した個別化技法は、唯一のリソースを使用する場合には適用することができない。この場合、内部変数のみを配列化し、タスクは配列化しない抽選化技法により、インタフェース関数の競合を防ぐ。具体的には、図１４Ａに示されるように、競合対象であるtaskBのタスク本体関数において、複数のインタフェース関数呼び出しのうちの１つを選択し（抽選）、選択された（当選した）呼び出しのみ処理を実行し、選択されなかった（落選した）呼び出しについてはエラーを返す。また、図１４Ｂに示されるように、呼び出し側タスクであるtaskC（およびtaskD（図示せず））では、当選するまでインタフェース関数の呼び出しを繰り返す。
【００５６】
（スケジュールの作成）
ＰＥＲＴ図が得られたら、次にスケジュールを作成する。スケジュールは、どのタイミングでどのリソースにタスクを割り当てるかを、ＰＥＲＴ図で与えられた先行関係を満たすように定めたものである。利用可能なリソースの制約の元で、完了時間が最小となるスケジュールを作成することが望ましい。図１５に示すＰＥＲＴ図に基づいて、スケジュールを作成する。
【００５７】
（スケジュールの作成−逐次実行）
逐次実行する場合、ＰＥＲＴ図を既知のアルゴリズムでトポロジカルソートすることにより、容易にスケジュールを作成することができる。図１５のＰＥＲＴ図の場合、以下の３つのスケジュールが作成される。taskX、taskY、taskZ、taskWのタスク本体関数が、それぞれ、taskX_CLK()、taskY_CLK()、taskZ_CLK()、taskW_CLK()であるものとする。  
スケジュール１＝taskX_CLK(); taskY_CLK(); taskW_CLK(); taskZ_CLK();
スケジュール２＝taskX_CLK(); taskY_CLK(); taskZ_CLK(); taskW_CLK();
スケジュール３＝taskX_CLK(); taskZ_CLK(); taskY_CLK(); taskZ_CLK();
【００５８】
ＰＥＲＴ図の先行関係を満たす限り、どの順序で実行しても同一の結果を得ることができ、また、同一の完了時間となる。従って、任意のスケジュールを選択することができる。図１６に、スケジュール１でタスクを実行するプログラム記述例を示す。図１６の行番号L25において、第３引数（presiod）で指定した100ミリ秒ごとに、第４引数（OnTimer）で指定した関数が呼ばれるよう、タイマーの設定が行われている。本実施形態ではスケジュール１を実行するために、図１６の行番号L6からL9に示されるように、タスクの実行順序を定義する。
【００５９】
（スケジュールの作成−並列実行）
並列実行する場合、タスク間の先行関係は同期プリミティブを用いて実現する。本実施形態では、同期プリミティブとして、Windowsの提供するEvent Objectを用いる。Event Objectは、２つの状態（シグナル状態／非シグナル状態）を持つ。SetEvent(e)を呼び出すことにより、引数eのハンドルにより特定されるEvent Objectはシグナル状態になる。WaitForSingleObject(e)を呼び出すと、引数eのハンドルにより特定されるEvent Objectが非シグナル状態である場合、シグナル状態になるまでWaitForSingleObject(e)の呼び出し側スレッドは待機し続ける。他のスレッドによりSetEvent(e)が呼ばれ、eにより特定されるEvent Objectがシグナル状態になると、制御が戻され、呼び出し側スレッドは後続の処理を実行することができる。
【００６０】
例えば、図１５のＰＥＲＴ図を、並列度４で実行する場合を考える。  
スケジュール４−０＝taskX_CLK(); SetEvent(e1); SetEvent(e2);
スケジュール４−１＝WaitForSingleObject(e1); taskZ_CLK();
スケジュール４−２＝WaitForSingleObject(e2); taskY_CLK(); SetEvent(e3);
スケジュール４−３＝WaitForSingleObject(e3); taskW_CLK();
【００６１】
スケジュール４−０では、taskX_CLKメソッドが完了すると、e1およびe2により特定されるEvent Objectをシグナル状態にする。スケジュール４−１では、WaitForSingleObject(e1)を呼び出し、e1により特定されるEvent Objectがシグナル状態になるまで、待機し続ける。taskX_CLKメソッドの完了によりSetEvent(e1)が呼ばれると、スケジュール４−１に対応するスレッドに制御が戻され、taskZ_CLKメソッドが実行される。同様に、スケジュール４−２では、WaitForSingleObject(e2)を呼び出し、e2により特定されるEvent Objectがシグナル状態になるまで、待機し続ける。taskX_CLKメソッドの完了によりSetEvent(e2)が呼ばれると、スケジュール４−２に対応するスレッド制御が戻され、taskY_CLKメソッドが実行される。スケジュール４−２では、taskY_CLKメソッドが完了すると、e3により特定されるEvent Objectをシグナル状態にする。スケジュール４−３も、WaitForSingleObject(e3)を呼び出し、e3により特定されるEvent Objectがシグナル状態になるまで、待機し続ける。taskY_CLKメソッドの完了によりSetEvent(e3)が呼ばれると、スケジュール４−３に対応するスレッドに制御が戻され、taskW_CLKメソッドが実行される。
【００６２】
図１７に、スケジュール４−０から４−３でタスクを実行するプログラム記述例を示す。図１７の行番号L43において、第３引数（presiod）で指定した100ミリ秒ごとに、第４引数（OnTimer）で指定した関数が呼ばれるよう、タイマーの設定が行われている。本実施形態では、図１７の行番号L3からL14に示されるように、スケジュール４−１から４−３に対応するスレッドを用意する。
【００６３】
OnTimerメソッドでは、まず、スレッド１、スレッド２、スレッド３にそれぞれ対応するs[0]、s[1]、s[2]により特定されるEvent Objectをシグナル状態にする。その後、メインスレッドでスケジュール４−０を実行し、スレッド１、スレッド２、スレッド３にそれぞれ対応するt[0]、t[1]、t[2]により特定されるEvent Object のWaitForSingleObjectメソッドを呼び出すことで、Event Objectがシグナル状態になるまで、すなわち該当のスレッドが完了するまで待機し続ける。図１８に、並列実行のシーケンス図を示す。
【００６４】
スケジュール４−１に対応するスレッド１では、WaitForSingleObject(s[0])を呼び出し、s[0]により特定されるEvent Objectがシグナル状態になるまで、待機し続ける。図１７の行番号L18に示されるように、OnTimerメソッド内でSetEvent(s[0])が呼ばれると、スレッド１に制御が戻され、WaitForSingleObject(e1)を呼び出す。その後、e1により特定されるEvent Objectがシグナル状態になるまで、待機し続ける。taskX_CLKメソッドの完了によりSetEvent(e1)が呼ばれると、スレッド１に制御が戻され、taskZ_CLKメソッドが実行される。スレッド１では、taskZ_CLKメソッドが完了すると、t[0]により特定されるEvent Objectをシグナル状態にすることで、スレッドの完了を通知する。
【００６５】
スケジュール４−２に対応するスレッド２（図示せず）においても、スレッド１同様、WaitForSingleObject(s[1])を呼び出し、s[1]により特定されるEvent Objectがシグナル状態になるまで、待機し続ける。図１７の行番号L19に示されるように、OnTimerメソッド内でSetEvent(s[1])が呼ばれると、スレッド２に制御が戻され、WaitForSingleObject(e2)を呼び出す。その後、e2により特定されるEvent Objectがシグナル状態になるまで、待機し続ける。taskX_CLKメソッドの完了によりSetEvent(e2)が呼ばれると、スレッド２に制御が戻され、taskY_CLKメソッドが実行される。スレッド２では、taskY_CLKメソッドが完了すると、taskYの完了を通知するSetEvent(e3)を呼び出し、その後、t[1]により特定されるEvent Objectをシグナル状態にすることで、スレッドの完了を通知する。
【００６６】
スケジュール４−３に対応するスレッド３（図示せず）においても、スレッド１同様、WaitForSingleObject(s[2])を呼び出し、s[2]により特定されるEvent Objectがシグナル状態になるまで、待機し続ける。図１７の行番号L20に示されるように、OnTimerメソッド内でSetEvent(s[2])が呼ばれると、スレッド３に制御が戻され、WaitForSingleObject(e3)を呼び出す。その後、e3により特定されるEvent Objectがシグナル状態になるまで、待機し続ける。taskY_CLKメソッドの完了によりSetEvent(e3)が呼ばれると、スレッド３に制御が戻され、taskW_CLKメソッドが実行される。スレッド３では、taskW_CLKメソッドが完了すると、t[2]により特定されるEvent Objectをシグナル状態にすることで、スレッドの完了を通知する。
【００６７】
（スケジュールの作成−タスク配列）
タスク配列内の各タスク間に先行関係は存在しない。そのため、各タスクをどのような順序でスケジューリングしてもよい。また、タスク配列は、コードは全て同じで、内部変数の場所だけが異なるので、タスク配列内の各タスクの平均の実行時間は、同一であることが期待できる。従って、タスクの多重度がｍ、利用可能なＣＰＵ数がｎである場合、各ＣＰＵにｍ／ｎ個ずつタスクを分配する。
【００６８】
図１５に示すＰＥＲＴ図のtaskYが多重度４のタスク配列で、利用可能なＣＰＵ数が５である場合、以下のスケジュールを作成することができる。  
スケジュール５−０＝taskX_CLK(); SetEvent(e1); SetEvent(e21); SetEvent(e22);
スケジュール５−１＝WaitForSingleObject(e1); taskZ_CLK();
スケジュール５−２＝WaitForSingleObject(e21); taskY_CLK(0); taskY_CLK(2); 
SetEvent(e31);
スケジュール５−３＝WaitForSingleObject(e22); taskY_CLK(1); taskY_CLK(3); 
SetEvent(e32);
スケジュール５−４＝WaitForSingleObject(e31); WaitForSingleObject(e32); 
taskW_CLK();
【００６９】
このように、多重度の数だけ存在するタスク本体関数をインデックス指定して、各ＣＰＵに分配することにより、利用可能なＣＰＵ数に応じてスケジュールを作成することができる。
【００７０】
（ＣＤＰプログラムの性能）
上述のＣＤＰプログラムの性能は、プログラムを代表するタスクのスループットＰ（tps）として、以下の式で求めることができる。
【００７１】
【数２】
2014036280.tif 000004
【００７２】
mはタスクの多重度（同一機能を有するタスクの数）、ｃは一単位処理あたりに呼ばれるタスク本体関数の数(Clocks Per Transaction：ＣＰＴ)、ｆはプログラム駆動周波数（タイマーの周期Ｔの逆数）であり、ここで、周期Ｔを保ってタスク本体関数を呼び出すために、デューティ率は１未満である必要がある。
【００７３】
図３に記述されるtaskAのように、ＣＰＴが変動する場合、平均値を用いる。taskAは、前述のように、固定回数のループを周期的に実行することにより、不定回数のループを実現する。本実施形態では、stateがcalc2の場合にＦ（ｘ）yを計算するが、図３の行番号L62に示されるように、calcメソッドの第２引数yにより指定される不定回数のループを、定数LIMITにより指定される上限で周期的に実行する。
【００７４】
従って、１≦y≦１０１の場合、タスク本体関数は、stateがcalc1で１回、stateがcalc2で１回、合計２回呼ばれ、ＣＰＴは２となる。１０１≦y≦２０１の場合、タスク本体関数は、stateがcalc1で１回、stateがcalc2で２回、合計３回呼ばれ、ＣＰＴは３となる。例えば、ＣＰＴが２となる確率が５０％、ＣＰＴが３となる確率が５０％の場合、ＣＰＴは２．５となる。
【００７５】
ＣＤＰでは、デューティ率が１未満である限り、プログラム駆動周波数ｆに比例するスループットを保証することができる。ＣＤＰでの実行環境の性能差は、デューティ率の差として現れる。プログラムを同一のプログラム駆動周波数で実行する場合、低速ＣＰＵでは、高速ＣＰＵと比べてデューティ率が高くなる。しかし、デューティ率に差はあっても、同一のプログラム駆動周波数であれば、性能は同じである。
【００７６】
ここまで、ＣＤＰプログラムについて詳述してきた。特に、ＣＤＰプログラムの性能の章では、デューティ率が１未満である限り、ＣＤＰプログラムは、プログラム駆動周波数ｆに比例するスループットを保証することができる点について述べている。以降の章では、ファイル転送において、転送速度を一定に保つ技術を開示する。
【００７７】
（システム構成−送信クライアント）
図１９のブロック図を参照して、送信クライアント１０１の構成を詳細に説明する。なお、図１９では、単一のコンピュータシステムを想定し、必要な機能構成だけを示しているが、送信クライアント１０１を、複数のコンピュータシステムによる多機能の分散システムの一部として構成することもできる。
【００７８】
送信クライアント１０１は、ＣＰＵ２０１に、システムバス２０２を介してＲＡＭ２０３、入力装置２０４、出力装置２０５、通信制御装置２０６および不揮発性記憶媒体（ＲＯＭやＨＤＤなど）で構成される記憶装置２０７が接続された構成を有する。記憶装置２０７は、上記した機能を奏するためのソフトウェアプログラムを格納するプログラム格納領域と、随時取得するデータや処理結果としてのデータ等を格納するデータ格納領域とを備えている。以下に説明するプログラム格納領域の各手段は、実際は独立したソフトウェアプログラム、そのルーチンやコンポーネントなどであり、ＣＰＵ２０１によって記憶装置２０７から呼び出されＲＡＭ２０３のワークエリアに展開されて、データベース等を適宜参照しながら順次実行されることで、各機能を奏するものである。
【００７９】
データ格納領域は、転送ファイル記憶手段２０８および転送速度記憶手段２０９を備える。何れも、記憶装置２０７内に確保された一定の記憶領域である。
【００８０】
転送ファイル記憶手段２０８は、転送対象のファイルを格納する。
【００８１】
転送速度記憶手段２０９は、図２０に示されるように、後述する送信処理手段のデータ送信処理を呼び出す周期Ｔ［ms］を指定する周期パラメータ、送信処理手段が１回の送信処理で送信するデータ量Ａ［KB］を指定するデータ量パラメータにより求められる、転送速度Ｖ［bit/sec］を格納する。周期パラメータは、１から６４の整数の値をとる。ここで、タスク本体関数の呼び出し周期は、ＯＳのタイムスライス刻みとなる。現行のWindowsの標準タイムスライスは15.6[ms]なので、送信処理を呼び出す周期Ｔ［ms］を、周期パラメータ×15.6[ms]により指定する。
【００８２】
データ量パラメータは、１から１２の整数の値をとる。現行のハードディスクの標準的なセクタサイズは4[KB]なので、送信データ量が4KBの倍数となるように、送信データ量Ａ［KB］を、データ量パラメータ×256[KB]により指定する。
【００８３】
よって、図２１に示されるように、周期パラメータとして６４、データ量パラメータとして１を指定した場合、転送速度Ｖ［bit/sec］は、（１×256[KB]×1024[byte/KB]×８（byteからbitへの変換係数））÷（６４×15.6[ms]÷１０００）により、2,100,513[bit/sec]となる。
【００８４】
プログラム格納領域に格納されているソフトウェアプログラムは、本発明に関連するものだけを列挙すると、パラメータ管理手段２１０、仮想回線数決定手段２１１、送信側仮想回線管理手段２１２および送信処理手段２１３を備えている。
【００８５】
パラメータ管理手段２１０は、転送速度に関連する周期パラメータ、データ量パラメータ、周期パラメータに基づく送信周期Ｔおよびデータ量パラメータに基づく送信データ量Ａを管理し、必要に応じて他の手段にパラメータ情報を渡す。
【００８６】
一実施形態では、パラメータ管理手段２１０は、入力装置２０４を介して、周期パラメータおよびデータ量パラメータを受信し、受信した周期パラメータに基づく送信周期Ｔ、および受信したデータ量パラメータに基づく送信データ量Ａを決定する。
【００８７】
別の実施形態では、パラメータ管理手段２１０は、入力装置２０４を介して転送速度を指定する入力を受信し、転送速度記憶手段２０９を参照して、ユーザー指定の転送速度を満たすパラメータを決定することもできる。
【００８８】
仮想回線数決定手段２１１は、ファイル転送を開始する前に、ファイル転送に用いる仮想回線数ｍを決定する。本実施形態では、１本の仮想回線を用いて、後述する送信処理手段２１３から、Ａ［KB］（実際のファイル転送時に、１周期あたりに送信するデータ量）のテストデータを送信する。周期毎に、仮想回線を用いたテストデータの送信が許可されるか否かを確認し、１周期目でテストデータを送信した後、何週目で次のテストデータの送信が許可されるかに基づいて、１つの送信を開始してからその送信が終了するまでの周期数を求める。
【００８９】
例えば、１周期目でテストデータを送信した後、２から４周期目の送信が拒否され、５周期目で送信が許可される場合、４週目の周期で送信が終了しているので、周期数は４となる。本実施形態では、仮想回線数決定手段２１１は、上記手順により求めた周期数に、マージンとして２を掛けることにより、仮想回線数ｍを決定する。このようにマージンをもたせることにより、実際のファイル転送時に、仮想回線の転送速度上限（ＶC）がテスト時の１／２に低下した場合であっても、いずれかの仮想回線を用いてデータ送信を行うことができる。
【００９０】
なお、ファイル名やファイル属性（ファイルサイズなど）をテストデータに含めることにより、テストデータを用いて、ファイル転送の際に送信すべきコンテンツ以外のデータを効率的に送信することができる。本実施形態では、また、パラメータ管理手段２１０が保持する周期パラメータをテストデータに含める。別の実施形態では、周期パラメータの代わりに送信周期を含めることもできる。
【００９１】
また、ソケットに割り当てられる送信用バッファサイズを０に設定する。送信用バッファがある場合、送信用バッファへの書き込みが終わったことにより次の送信が許可されてしまうため、実際のデータ送信が終了したことは保証されない。よって、転送時間を正確に計測するために、送信用バッファサイズを０に設定する。例えば、Windowsが提供するWinsockのSO_SNDBUF関数を使用することにより、送信用バッファサイズを０に設定することができる。
【００９２】
送信側仮想回線管理手段２１２は、仮想回線の確立および切断を行う。まず、ファイル転送を開始する前に、仮想回線数決定手段２１１からの指示によって、テスト用の仮想回線を１本確立する。その後、仮想回線数決定手段２１１が仮想回線数ｍを決定した後、送信側仮想回線管理手段２１２は、仮想回線数ｍ−１本の仮想回線を確立する。最後に、すべてのデータ送信が終了すると、送信側仮想回線管理手段２１２は、送信が終わった回線を順次切断する。
【００９３】
送信処理手段２１３は、周期Ｔ［ms］で、データ量Ａ［KB］のデータを受信サーバ１０３に送信する。本発明の送信処理手段２１３は、前述したblocking I/Oの代わりに、non-blocking I/Oを用いるが、non-blocking I/Oを用いることで、blocking I/Oが果たしていた実行速度調整機能が失われてしまう。そこで、送信処理手段２１３を、ＣＤＰプログラムを用いて構成することで、タイマーによって送信クライアントの実行速度を調整する。このとき、送信処理手段２１３が要求する転送速度ＶSは、ＶS＝Ａ／Ｔとなる。
【００９４】
non-blocking I/Oを用いてプログラムがＯＳに対して読み書き（送受信）要求を行うと、読み書きの準備が整っていない場合、ＯＳはプログラムの読み書き要求を拒否して、エラーコードを返す。プログラムの実行自体を抑制するblocking I/Oとは異なり、non-blocking I/Oを用いることで一定の周期でデータ送信を要求することができるが、送信クライアントのデータ送出速度（ＶS）が仮想回線の転送速度上限（ＶC）を上回る場合は、実際の転送Ｖtは、仮想回線の転送速度上限（ＶC）となる。
【００９５】
しかし、たとえ仮想回線の転送速度上限（ＶC）が様々な要因で変動しようとも、送信クライアントのデータ送出速度（ＶS）が仮想回線の転送速度上限（ＶC）を下回る場合は、実際の転送Ｖtは、送信クライアントのデータ送出速度（ＶS）となる。
【００９６】
前述したように、仮想回線数決定手段２１１は、テスト時に正確な転送時間を計測し、実際のファイル転送時に、仮想回線の転送速度上限（ＶC）がテスト時の１／２に低下した場合であっても、いずれかの仮想回線を用いてデータ送信を行うことができるように仮想回線数ｍを決定している。よって、ウィンドウサイズが変更されても、ネットワーク遅延に変動が生じても、仮想回線の転送速度上限（ＶC）の低下がテスト時の１／２までであれば、送信クライアントのデータ送出速度（ＶS）により、一定の速度でデータ転送を行うことができる。
【００９７】
複数の仮想回線を用いてデータ転送を行う場合、各回線の速度は必ずしも一致しないので、送信処理手段２１３が送り出したデータの順と、受信サーバが受け取る順とが異なる可能性がある。受信順序の逆転に適切に対処するために、送信処理手段２１３は、送信順を表すシーケンス番号をヘッダーに付与したデータを送信する。
【００９８】
なお、送信要求の戻り値からデータ送信中に仮想回線が切断されたことを検出した場合、送信処理手段２１３は、送信側仮想回線管理手段２１２に指示して、仮想回線を張りなおし、送信中であったシーケンス番号のデータを再送する。仮想回線が切断された場合、送信中のデータが受信サーバ１０３に届いていることが保障されないからである。
【００９９】
送信処理手段２１３は、また、ソケットを配列で管理することにより、各仮想回線が関連付けられているソケットの配列順で、複数の仮想回線のうち送信可能な仮想回線を探す。確立済みのすべての仮想回線で送信を拒否される場合は、仮想回線の転送速度上限（ＶC）が想定を超えて減速しているといえる。この場合、送信処理手段２１３は、送信側仮想回線管理手段２１２に指示して、仮想回線を増やすことができる。
【０１００】
ただし、送信処理手段２１３は、仮想回線を上限まで増やしても送信可能な仮想回線がない場合、ネットワーク環境の帯域限界と判断して、周期Ｔを長くすることによりデータ送出速度を下げる。送信クライアントのデータ送出速度（ＶS）がネットワーク環境の帯域限界を超えている場合、仮想回線の数を増やしても仮想回線１本の転送速度が減少するので、仮想回線数が足りない状態は解消されない。そのため、本実施形態では、仮想回線数の上限として１２０を設定し、上限まで仮想回線を増やしても仮想回線数不足が解消されない場合には、タイマーの周期Ｔを長くして、送信クライアントのデータ送出速度（ＶS）を下げる。
【０１０１】
（システム構成−受信サーバ）
次に、図２１のブロック図を参照して、受信サーバ１０３の構成を詳細に説明する。なお、図２１では、単一のコンピュータシステムを想定し、必要な機能構成だけを示しているが、受信サーバ１０３を、複数のコンピュータシステムによる多機能の分散システムの一部として構成することもできる。
【０１０２】
受信サーバ１０３は、ＣＰＵ３０１に、システムバス３０２を介してＲＡＭ３０３、入力装置３０４、出力装置３０５、通信制御装置３０６および不揮発性記憶媒体（ＲＯＭやＨＤＤなど）で構成される記憶装置３０７が接続された構成を有する。記憶装置３０７は、上記した機能を奏するためのソフトウェアプログラムを格納するプログラム格納領域と、随時取得するデータや処理結果としてのデータ等を格納するデータ格納領域とを備えている。以下に説明するプログラム格納領域の各手段は、実際は独立したソフトウェアプログラム、そのルーチンやコンポーネントなどであり、ＣＰＵ３０１によって記憶装置３０７から呼び出されＲＡＭ３０３のワークエリアに展開されて、データベース等を適宜参照しながら順次実行されることで、各機能を奏するものである。
【０１０３】
データ格納領域は、受信したファイルを格納する受信ファイル記憶手段３０８を備える。受信ファイル記憶手段３０８は、記憶装置３０７内に確保された一定の記憶領域である。
【０１０４】
プログラム格納領域に格納されているソフトウェアプログラムは、本発明に関連するものだけを列挙すると、受信周期決定手段３０９、受信側仮想回線管理手段３１０および受信処理手段３１１を備えている。
【０１０５】
受信周期決定手段３０９は、テストデータに含まれる周期パラメータに基づいて、受信周期を決定する。前述したように、送信周期ＴはWindowsの標準タイムスライスに従って、周期パラメータ×15.6[ms]により指定されているので、送信クライアントのデータ送出速度（ＶS）＜受信サーバのデータ受取速度（ＶR）となるように、本実施形態では、（テストデータに含まれる周期パラメータ−１）×15.6[ms]を受信周期とする。送信クライアントのデータ送出速度（ＶS）＜受信サーバのデータ受取速度（ＶR）とすることで、前述したように、送信クライアントのデータ送出速度（ＶS）を律速段階とすることができる。
【０１０６】
受信周期決定手段３０９は、また、テストデータの送信データ量Ａに基づいて、受信用バッファサイズを決定する。受信用バッファサイズを、（送信処理手段２１３が１回の送信処理で送信するデータ量Ａ＋ヘッダーサイズ）より大きく設定することで、受信用バッファのオーバーフローを避けることができるからである。
【０１０７】
受信側仮想回線管理手段３１０は、仮想回線の確立および切断を行う。なお、ｍ本の仮想回線が確立された後、送信クライアント１０１の送信処理手段２１３の指示により仮想回線が増えた場合、受信側仮想回線管理手段３１０は、後述する受信処理手段３１１に、接続済の仮想回線数を通知する。
【０１０８】
受信処理手段３１０は、受信周期決定手段３０９が決定した受信周期で、送信クライアント１０１からのデータを受信する。本発明の受信処理手段３１０は、送信処理手段２１３と同様、non-blocking I/Oを用いる。また、non-blocking I/Oを用いることで、blocking I/Oが果たしていた実行速度調整機能が失われてしまうので、受信処理手段３１０も、ＣＤＰプログラムを用いて構成する。
【０１０９】
なお、受信処理手段３１０は、受信周期決定手段３０９の指示に応答して、受信用バッファサイズを事前に設定する。例えば、Windowsが提供するWinsockのSO_RCVBUF関数を使用することにより、受信用バッファサイズを設定することができる。
【０１１０】
仮想回線１本当たりで送信されるデータ量よりも大きい受信用バッファを用意し、受信処理手段３１０が、送信周期Ｔよりも速い速度で読み出しを行うので、受信用バッファにデータが溜まることはない。受信用バッファのオーバーフローを避けることができるので、フロー制御によりウィンドウサイズが減らされることはない。
【０１１１】
受信処理手段３１０は、また、ヘッダーに含まれるシーケンス番号を確認して、シーケンス番号に抜けがある場合は、抜けているシーケンス番号のデータが届くまでデータをバッファリングして、シーケンス番号に抜けがなくなった時点で、バッファリングしていたデータをファイルに追記する。シーケンス番号を用いて受信データの順を送信データの順と一致させる手法は、スライディングウィンドウの制御と同様である。
【０１１２】
なお、仮想回線が切断されるなど、ヘッダーで指定されるサイズのデータが取得できない場合、受信処理手段３１０は、受信途中のデータを破棄する。また、既に受信済みのシーケンス番号のデータを再度受信した場合も、受信処理手段３１０は、再度受信したデータを破棄する。
【０１１３】
（ファイル転送方法）
次に、図２２のフローチャートを参照して、本実施形態に係るファイル転送工程を説明する。送信クライアント１０１と受信サーバ１０３との間で仮想回線を確立する前に、受信サーバ１０３は、スタンバイ周期（例えば、500[ms]）で、仮想回線の確立待ちをしているものとする（Ｓ０）。
【０１１４】
処理Ｓ１において、送信クライアント１０１のパラメータ管理手段２１０は、入力装置２０４を介して、周期パラメータおよびデータ量パラメータを受信する。本実施形態では、周期パラメータとして６４、データ量パラメータとして１を受信したものとする。
【０１１５】
処理Ｓ２において、パラメータ管理手段２１０は、受信した周期パラメータに基づく送信周期Ｔ、および受信したデータ量パラメータに基づく送信データ量Ａを決定する。本実施形態では、送信周期998.4（６４×15.6）［ms］および送信データ量256（１×256）[KB]が求められる。また、パラメータ管理手段２１０は、決定した送信周期Ｔを送信処理手段２１３に渡し、送信処理手段２１３は、受信した送信周期Ｔをタイマーの周期として設定する。
【０１１６】
処理Ｓ３において、送信クライアント１０１の仮想回線数決定手段２１１は、送信側仮想回線管理手段２１２に指示して、仮想回線を１本確立する。仮想回線が確立されると、処理Ｓ４において、仮想回線数決定手段２１１は、送信処理手段２１３に指示して、パラメータ管理手段２１０が決定した送信データ量Ａのテストデータを送信する。本実施形態では、転送対象のファイル名「転送ファイル.doc」、ファイルサイズ「9MB」、パラメータ管理手段２１０が保持する周期パラメータ「６４」を含むデータ量256[KB]のテストデータが送信されるものとする。
【０１１７】
処理Ｓ５において、受信サーバ１０３の受信周期決定手段３０９は、テストデータに含まれる周期パラメータに基づいて受信周期を決定し、また、決定した受信周期を受信処理手段３１０に渡し、受信処理手段３１０は、タイマーの周期を受信した受信周期に変更する。本実施形態では、周期パラメータとして６４を受信しているので、（６４−１）×15.6[ms]により求めた982.8[ms]を受信周期とする。
【０１１８】
また、受信周期決定手段３０９は、テストデータの送信データ量Ａに基づいて、受信用バッファサイズを決定し、また、決定した受信用バッファサイズを受信処理手段３１０に渡し、受信処理手段３１０は、受信した受信用バッファサイズを設定する。本実施形態では、送信データ量256[KB]およびヘッダーサイズ20[byte]に基づいて、256[KB]×1024[byte/KB]＋20[byte]により求めた262164[byte]を受信用バッファサイズとする。
【０１１９】
処理Ｓ６において、仮想回線数決定手段２１１は、テストデータの送信が終了するまでの周期数に基づいて、仮想回線数ｍを決定する。本実施形態では、テストデータの送信が終了するまでの周期数が２であり、仮想回線数決定手段２１１は、周期数２にマージンとして２を掛けて、仮想回線数４を決定する。
【０１２０】
処理Ｓ７において、仮想回線数決定手段２１１は、送信側仮想回線管理手段２１２に指示して、決定した仮想回線数ｍから既に確立済みの１本を引いたｍ−１本の仮想回線を確立する。本実施形態では、仮想回線数４−１の、３本の仮想回線を確立する。
【０１２１】
処理Ｓ８において、送信クライアントの送信処理手段２１３は、送信周期Ｔで、送信データ量Ａのデータを受信サーバ１０３に送信する。前述したように、送信処理手段２１３は、送信順を表すシーケンス番号をヘッダーに付与したデータを送信し、データ送信中に仮想回線が切断されたことを検出した場合、送信側仮想回線管理手段２１２に指示して仮想回線を張りなおし、送信中であったシーケンス番号のデータを再送する。
【０１２２】
処理Ｓ９において、受信サーバ１０３の受信処理手段３１０は、受信周期決定手段３０９が決定した受信周期で、送信クライアント１０１からのデータを受信する。前述したように、受信処理手段３１０は、ヘッダーに含まれるシーケンス番号を確認して、シーケンス番号に抜けがある場合は、抜けているシーケンス番号のデータが届くまでデータをバッファリングして、シーケンス番号に抜けがなくなった時点で、バッファリングしていたデータをファイルに追記する。
【０１２３】
なお、処理Ｓ８において、送信処理手段２１３は、各仮想回線が関連付けられているソケットの配列順で複数の仮想回線のうち送信可能な仮想回線を探し、確立済みのすべての仮想回線で送信を拒否される場合は、送信側仮想回線管理手段２１２に指示して、仮想回線を増やす。本実施形態では、仮想回線の転送速度上限（ＶC）が想定を超えて減速することはなく、４本の仮想回線のいずれかを用いてすべてのデータ送信が終了したものとする。
【０１２４】
処理Ｓ１０において、送信処理手段２１３は、送信側仮想回線管理手段２１２にすべてのデータ送信が終了したことを通知して、送信側仮想回線管理手段２１２は、送信が終わった仮想回線を順次切断する。
【０１２５】
すべての仮想回線を切断することで、処理Ｓ１１において、送信クライアント１０１は転送処理を終了する。また、受信サーバ１０３は、すべての仮想回線が切断されたことを受信側仮想回線管理手段３１０が検出すると、受信側仮想回線管理手段３１０は、受信処理手段３１１に通知して、受信処理手段３１１は、タイマーの周期をスタンバイ周期に変更する（Ｓ０に戻る）。
【０１２６】
このように、送信クライアントのデータ送出速度を一定に保ち、さらに、送信クライアントのデータ送出速度が律速段階となるように、仮想回線の転送速度上限および受信サーバのデータ受取速度を制御することにより、転送速度を一定に保つことができる。帯域保証の専用回線を用いずに上記の効果を得られるので、コストも抑えることができる。
【０１２７】
また、転送速度を一定に保つことができるので、その転送速度からファイルの転送時間を見積もることができる。要求するファイルの転送時間から転送速度を設定することも可能となり、必要最低限の帯域で転送することができる。
【０１２８】
なお、処理Ｓ８において、確立済みのすべての仮想回線で送信を拒否される場合は、送信処理手段２１３は、送信側仮想回線管理手段２１２に指示して、仮想回線を増やす。このような特徴により、テスト時の仮想回線の転送速度上限から想定以上の速度低下が起こった場合であっても、転送速度を一定に保つことができる。
【０１２９】
ただし、送信処理手段２１３は、仮想回線を上限まで増やしても送信可能な仮想回線がない場合、ネットワーク環境の帯域限界と判断して、データ送出速度を下げる。本実施形態では、仮想回線数の上限として１２０を設定し、上限まで仮想回線を増やしても仮想回線数不足が解消されない場合には、タイマーの送信周期Ｔを長くして、送信クライアントのデータ送出速度（ＶS）を下げる。このような特徴により、パケットロスの大量発生に伴う転送速度の低下などを抑制し、提供可能な最大限の転送速度を実現することができる。
【図１】
2014036280.tif 000005
【図２】
2014036280.tif 000006
【図３】
2014036280.tif 000007
【図４】
2014036280.tif 000008
【図５】
2014036280.tif 000009
【図６】
2014036280.tif 000010
【図７】
2014036280.tif 000011
【図８】
2014036280.tif 000012
【図９Ａ】
2014036280.tif 000013
【図９Ｂ】
2014036280.tif 000014
【図１０】
2014036280.tif 000015
【図１１】
2014036280.tif 000016
【図１２Ａ】
2014036280.tif 000017
【図１２Ｂ】
2014036280.tif 000018
【図１３】
2014036280.tif 000019
【図１４Ａ】
2014036280.tif 000020
【図１４Ｂ】
2014036280.tif 000021
【図１５】
2014036280.tif 000022
【図１６】
2014036280.tif 000023
【図１７】
2014036280.tif 000024
【図１８】
2014036280.tif 000025
【図１９】
2014036280.tif 000026
【図２０】
2014036280.tif 000027
【図２１】
2014036280.tif 000028
【図２２】
2014036280.tif 000029