(57)【要約】【課題】本発明は、メッセージ・リレー・サーバー内にメッセージを効率的に記憶する方法及びシステムに関し、不揮発性メモリにデータを書き込むことから発生する性能ボトルネックを最小にすることができる。【解決手段】本発明では、最も現代的なハード・ディスク・システムの隣接レイアウトを利用するために、データを隣接して及び／又は実質的に隣接してディスクに書き込むことを含む。また、これらの技術はディスク・システムへの書き込み要求の総数を最小にするためにバッチ（一括処理）で書き込み要求を実行すること、及び、同期的ディスク書き込みを非同期的に実行することを可能にするために分離同期化ヘルパー・プロセスを使用することを含む。【選択図】図１
2008501163.tif 000002
【特許請求の範囲】
【請求項１】
書き込み要求を受信し、
前記書き込み要求を、実質的に隣接したディスク書き込みのバッチに追加し、
前記実質的に隣接したディスク書き込みのバッチを不揮発性メモリに書き込むことを決定し、
前記実質的に隣接したディスク書き込みのバッチを前記不揮発性メモリに書き込み、
前記実質的に隣接したディスク書き込みのバッチの書き込み確認を送信し、
前記書き込みの確認に対する確認を受信し、
前記実質的に隣接したディスク書き込みのバッチをクリアする、
ことを含む方法。
【請求項２】
請求項１に記載の方法において、前記書き込み要求を受信することが、
前記実質的に隣接したディスク書き込みのバッチ内のメモリ位置に隣接したメモリ位置に対する前記書き込み要求を受信する、
ことを含む方法。
【請求項３】
請求項１に記載の方法において、前記書き込み要求を受信することが、
処理スレッドから前記書き込み要求を受信する、
ことを含む方法。
【請求項４】
請求項３に記載の方法において、処理スレッドから前記書き込み要求を受信することが、
マルチメディア・メッセージ・ゲートウェイ内にある処理スレッドから前記書き込み要求を受信する、
ことを含む方法。
【請求項５】
請求項１に記載の方法において、前記実質的に隣接したディスク書き込みのバッチを不揮発性メモリに書き込むことを決定することが、
前記実質的に隣接したディスク書き込みのバッチの前記不揮発性メモリへの前の書き込みから予め定められた時間間隔が経過したかを決定する、
ことを含む方法。
【請求項６】
請求項１に記載の方法において、前記実質的に隣接したディスク書き込みのバッチを不揮発性メモリに書き込むことを決定することが、
前記実質的に隣接したディスク書き込みのバッチの予め定められたサイズを超過したかを決定する、
ことを含む方法。
【請求項７】
請求項１に記載の方法において、前記実質的に隣接したディスク書き込みのバッチを不揮発性メモリに書き込むことを決定することが、
前記実質的に隣接したディスク書き込みのバッチが複数の隣接した書き込み要求を含むかを決定する、
ことを含む方法。
【請求項８】
請求項１に記載の方法において、前記実質的に隣接したディスク書き込みのバッチを不揮発性メモリに書き込むことを決定することが、
前記実質的に隣接したディスク書き込みのバッチのサイズが予め定められた最大のバイト数を超過したかを決定する、
ことを含む方法。
【請求項９】
請求項１に記載の方法において、前記実質的に隣接したディスク書き込みのバッチを不揮発性メモリに書き込むことを決定することが、
前記実質的に隣接したディスク書き込みのバッチに格納された書き込み要求の数が予め定められた最大数を超過したかを決定する、
ことを含む方法。
【請求項１０】
請求項１に記載の方法において、前記実質的に隣接したディスク書き込みのバッチを不揮発性メモリに書き込むことを決定することが、
前記実質的に隣接したディスク書き込みのバッチを集めるために予め定められた最大時間が超過したかを決定する、
ことを含む方法。
【請求項１１】
請求項１に記載の方法において、前記実質的に隣接したディスク書き込みのバッチを不揮発性メモリに書き込むことを決定することが、
最後の書き込み要求を受領してから予め定められた最大の時間が超過したかを決定する、
ことを含む方法。
【請求項１２】
請求項１に記載の方法において、前記実質的に隣接したディスク書き込みのバッチを不揮発性メモリに書き込むことを決定することが、
前記書き込み要求が前記実質的に隣接したディスク書き込みのバッチ内の最大可能ページ・オフセットを超過したかを決定する、
ことを含む方法。
【請求項１３】
請求項１に記載の方法において、前記実質的に隣接したディスク書き込みのバッチを不揮発性メモリに書き込むことを決定することが、
前記書き込み要求が前記実質的に隣接したディスク書き込みのバッチ内の最大可能バイト・オフセットを超過したかを決定する、
ことを含む方法。
【請求項１４】
請求項１に記載の方法において、前記実質的に隣接したディスク書き込みのバッチを前記不揮発性メモリに書き込むことが、
前記実質的に隣接したディスク書き込みのバッチを前記不揮発性メモリに非同期的に書き込む、
ことを含む方法。
【請求項１５】
請求項１に記載の方法において、前記実質的に隣接したディスク書き込みのバッチを前記不揮発性メモリに書き込むことが、
前記実質的に隣接したディスク書き込みのバッチがメモリマップされているかを決定し、
もし、前記実質的に隣接したディスク書き込みのバッチがメモリマップされていなければ、前記実質的に隣接したディスク書き込みのバッチをメモリマップし、
前記実質的に隣接したディスク書き込みのバッチを前記不揮発性メモリに書き込む
ことを含む方法。
【請求項１６】
請求項１に記載の方法がさらに、
一時記憶内に未処理の書き込み要求が存在するかどうかを決定し、
もし、前記一時記憶内に未処理の書き込み要求が存在する場合、未処理の書き込み要求を実質的に隣接したディスク書き込みの新しいバッチに追加する、
ことを含む方法。
【請求項１７】
機械読み取り可能な媒体であって、
書き込み要求を受信し、
前記書き込み要求を、実質的に隣接したディスク書き込みのバッチに追加し、
前記実質的に隣接したディスク書き込みのバッチを不揮発性メモリに書き込むことが可能であると決定し、
前記実質的に隣接したディスク書き込みのバッチを前記不揮発性メモリに書き込み、
前記実質的に隣接したディスク書き込みのバッチの書き込み確認を送信し、
前記書き込みの確認に対する確認を受信し、
前記実質的に隣接したディスク書き込みのバッチをクリアする、
ことを含む方法を実行するための複数の実行可能な命令を記憶した機械読み取り可能な媒体。
【請求項１８】
請求項１７に記載の機械読み取り可能な媒体において、前記書き込み要求を受信することが、
前記実質的に隣接したディスク書き込みのバッチ中のメモリ位置に隣接したメモリ位置に対する前記書き込み要求を受信する
ことを含む機械読み取り可能な媒体。
【請求項１９】
請求項１７に記載の機械読み取り可能な媒体において、前記書き込み要求を受信することが、
前記書き込み要求を処理スレッドから受信する
ことを含む機械読み取り可能な媒体。
【請求項２０】
請求項１９に記載の機械読み取り可能な媒体において、前記書き込み要求を処理スレッドから受信することが、
マルチメディア・メッセージ・ゲートウェイ中に位置する処理スレッドから前記書き込み要求を受信する
ことを含む機械読み取り可能な媒体。
【請求項２１】
請求項１７に記載の機械読み取り可能な媒体において、前記実質的に隣接したディスク書き込みのバッチを不揮発性メモリに書き込むことを決定することが、
前記不揮発性メモリへの前記実質的に隣接したディスク書き込みのバッチの前の書き込みから予め定められた時間間隔だけ経過したことを決定する
ことを含む機械読み取り可能な媒体。
【請求項２２】
請求項１７に記載の機械読み取り可能な媒体において、前記実質的に隣接したディスク書き込みのバッチを不揮発性メモリに書き込むことを決定することが、
前記実質的に隣接したディスク書き込みのバッチの予め定められたサイズを超過したかを決定する、
ことを含む機械読み取り可能な媒体。
【請求項２３】
請求項１７に記載の機械読み取り可能な媒体において、前記実質的に隣接したディスク書き込みのバッチを不揮発性メモリに書き込むことが可能かを決定することが、
前記実質的に隣接したディスク書き込みのバッチが複数の隣接した書き込み要求を含むかを決定する、
ことを含む機械読み取り可能な媒体。
【請求項２４】
請求項１７に記載の機械読み取り可能な媒体において、前記実質的に隣接したディスク書き込みのバッチを不揮発性メモリに書き込むことを決定することが、
前記実質的に隣接したディスク書き込みのバッチのサイズが予め定められた最大のバイト数が超過したかを決定する、
ことを含む機械読み取り可能な媒体。
【請求項２５】
請求項１７に記載の機械読み取り可能な媒体において、前記実質的に隣接したディスク書き込みのバッチを不揮発性メモリに書き込むことを決定することが、
前記実質的に隣接したディスク書き込みのバッチに格納された書き込み要求の数が予め定められた最大数を超過したかを決定する、
ことを含む機械読み取り可能な媒体。
【請求項２６】
請求項１７に記載の機械読み取り可能な媒体において、前記実質的に隣接したディスク書き込みのバッチを不揮発性メモリに書き込むことを決定することが、
前記実質的に隣接したディスク書き込みのバッチを集めるために予め定められた最大時間が超過したかを決定する、
ことを含む機械読み取り可能な媒体。
【請求項２７】
請求項１７に記載の機械読み取り可能な媒体において、前記実質的に隣接したディスク書き込みのバッチを不揮発性メモリに書き込むことを決定することが、
最後の書き込み要求の受信から予め定められた最大時間が超過したかを決定する、
ことを含む機械読み取り可能な媒体。
【請求項２８】
請求項１７に記載の機械読み取り可能な媒体において、前記実質的に隣接したディスク書き込みのバッチを不揮発性メモリに書き込むことを決定することが、
前記書き込み要求が前記実質的に隣接したディスク書き込みのバッチ中の最大可能ページ・オフセットを超過したかを決定する、
ことを含む機械読み取り可能な媒体。
【請求項２９】
請求項１７に記載の機械読み取り可能な媒体において、前記実質的に隣接したディスク書き込みのバッチを不揮発性メモリに書き込むことを決定することが、
前記書き込み要求が前記実質的に隣接したディスク書き込みのバッチ内の最大可能バイト・オフセットを超過したかを決定する、
ことを含む機械読み取り可能な媒体。
【請求項３０】
請求項１７に記載の機械読み取り可能な媒体において、前記実質的に隣接したディスク書き込みのバッチを前記不揮発性メモリに書き込むことが、
前記実質的に隣接したディスク書き込みのバッチを前記不揮発性メモリに非同期的に書き込む、
ことを含む機械読み取り可能な媒体。
【請求項３１】
請求項１７に記載の機械読み取り可能な媒体において、前記実質的に隣接したディスク書き込みのバッチを前記不揮発性メモリに書き込むことが、
前記実質的に隣接したディスク書き込みのバッチを前記不揮発性メモリに非同期的に書き込む、
ことを含む機械読み取り可能な媒体。
【請求項３２】
請求項１７に記載の機械読み取り可能な媒体において、前記実質的に隣接したディスク書き込みのバッチを前記不揮発性メモリに書き込むことが、
前記実質的に隣接したディスク書き込みのバッチがメモリマップされているかを決定し、
もし、前記実質的に隣接したディスク書き込みのバッチがメモリマップされていなければ、前記実質的に隣接したディスク書き込みのバッチをメモリマップし、
前記実質的に隣接したディスク書き込みのバッチを前記不揮発性メモリに書き込む
ことを含む機械読み取り可能な媒体。
【請求項３３】
請求項１７に記載の機械読み取り可能な媒体がさらに、
一時記憶内に未処理の書き込み要求が存在するかどうかを決定し、
もし、前記一時記憶内に未処理の書き込み要求が存在する場合、未処理の書き込み要求を実質的に隣接したディスク書き込みの新しいバッチに追加する、
ことを含む機械読み取り可能な媒体。
【請求項３４】
第一スレッド又はプロセスにより共有された相互排除ロックのコントロールを獲得し、
第一書き込み要求を第一スレッド又はプロセスから同期プロセスへ送信し、
同期スレッド又はプロセスにより第一書き込み要求を待ち行列にし、
第一スレッド又はプロセスに第一書き込み要求の受領の確認を送信し、
第一書き込み要求の受領の確認の受領の際、第一スレッド又はプロセスによる共有相互排除ロックのコントロールを開放し、
第二スレッド又はプロセスにより共有された相互排除ロックのコントロールを獲得し、
第二書き込み要求を第二スレッド又はプロセスから同期プロセスへ送信し、
もし、第一及び第二書き込み要求が実質的に隣接したメモリ位置の場合、同期プロセスにより第一書き込み要求と共に第二書き込み要求を待ち行列にし、
第二スレッド又はプロセスに第二書き込み要求の受領の確認を送信し、
第二書き込み要求の受領の確認の受領の際、第二スレッド又はプロセスによる共有された相互排除ロックのコントロールを開放し、
待ち行列された第一及び第二書き込み要求を不揮発性メモリに書き込み、
第一プロセス及び第二プロセスの各々に不揮発性メモリへの書き込みの確認を送信し、
第一プロセス及び第二プロセスの各々から書き込みの確認の受領の確認を送信し、
もし、第一プロセス及び第二プロセスの各々から書き込みの確認の受領の確認を受信した場合、上記ステップを再開する、
ことを含む方法。
【請求項３５】
請求項３４に記載の方法において、待ち行列された第一及び第二書き込み要求を不揮発性メモリに書き込むことが、
所定の条件が発生したかどうかを決定し、
所定の条件が発生した場合、待ち行列された第一及び第二書き込み要求を前記不揮発性メモリに書き込む
ことを含む方法。
【請求項３６】
請求項３４に記載の方法において、所定の条件が、
予め定められた時間間隔が経過された
ことを含む方法。
【請求項３７】
請求項３４に記載の方法において、所定の条件が、
待ち行列された書き込み要求が実質的に互いに隣接している
ことを含む方法。
【請求項３８】
請求項３４に記載の方法において、所定の条件が、
待ち行列された書き込み要求のサイズが予め定められたバイトの最大数を超過している
ことを含む方法。
【請求項３９】
請求項３４に記載の方法において、所定の条件が、
待ち行列された書き込み要求の数が予め定められた最大数を超過している
ことを含む方法。
【請求項４０】
請求項３４に記載の方法において、所定の条件が、
待ち行列された書き込み要求を収集するのに予め定められた最大時間を超過している
ことを含む方法。
【請求項４１】
請求項３４に記載の方法において、所定の条件が、
最後の書き込み要求の受信から予め定められた最大時間を超過している
ことを含む方法。
【請求項４２】
請求項３４に記載の方法において、所定の条件が、
新しい書き込み要求が待ち行列された書き込み要求から最大許容ページ・オフセットを超過している
ことを含む方法。
【請求項４３】
請求項３４に記載の方法において、所定の条件が、
新しい書き込み要求が待ち行列された書き込み要求から最大許容バイト・オフセットを超過している
ことを含む方法。
【請求項４４】
機械読み取り可能な媒体であって、
第一スレッド又はプロセスにより共有された相互排除ロックのコントロールを獲得し、
第一書き込み要求を第一スレッド又はプロセスから同期プロセスへ送信し、
同期スレッド又はプロセスにより第一書き込み要求を待ち行列にし、
第一スレッド又はプロセスに第一書き込み要求の受領の確認を送信し、
第一書き込み要求の受領の確認の受領の際、第一スレッド又はプロセスによる共有相互排除ロックのコントロールを開放し、
第二スレッド又はプロセスにより共有された相互排除ロックのコントロールを獲得し、
第二書き込み要求を第二スレッド又はプロセスから同期プロセスへ送信し、
もし、第一及び第二書き込み要求が実質的に隣接したメモリ位置の場合、同期プロセスにより第一書き込み要求と共に第二書き込み要求を待ち行列にし、
第二スレッド又はプロセスに第二書き込み要求の受領の確認を送信し、
第二書き込み要求の受領の確認の受領の際、第二スレッド又はプロセスによる共有された相互排除ロックのコントロールを開放し、
待ち行列された第一及び第二書き込み要求を不揮発性メモリに書き込み、
第一プロセス及び第二プロセスの各々に不揮発性メモリへの書き込みの確認を送信し、
第一プロセス及び第二プロセスの各々から書き込みの確認の受領の確認を送信し、
もし、第一プロセス及び第二プロセスの各々から書き込みの確認の受領の確認を受信した場合、上記ステップを再開する、
ことを含む方法を実行する複数の実行可能な命令を記憶した機械読み取り可能な媒体。
【請求項４５】
請求項４４に記載の機械読み取り可能な媒体において、第一書き込み要求を待ち行列にすることが、
第一書き込み要求をバッチファイルに記憶する
ことを含む機械読み取り可能な媒体。
【請求項４６】
請求項４５に記載の機械読み取り可能な媒体において、第二書き込み要求を待ち行列にすることが、
第二書き込み要求を前記バッチファイルに記憶する
ことを含む機械読み取り可能な媒体。
【請求項４７】
請求項４４に記載の機械読み取り可能な媒体において、待ち行列された第一及び第二書き込み要求が、所定の条件の発生の際に書き込まれる
ことを含む機械読み取り可能な媒体。
【請求項４８】
請求項４７に記載の機械読み取り可能な媒体において、所定の条件が、
予め定められた時間間隔が経過された
ことを含む機械読み取り可能な媒体。
【請求項４９】
請求項４７に記載の機械読み取り可能な媒体において、所定の条件が、
待ち行列された書き込み要求が互いに隣接している
ことを含む機械読み取り可能な媒体。
【請求項５０】
請求項４４に記載の機械読み取り可能な媒体において、所定の条件が、
待ち行列された書き込み要求のサイズが予め定められたバイトの最大数を超過している
ことを含む機械読み取り可能な媒体。
【請求項５１】
請求項４４に記載の機械読み取り可能な媒体において、所定の条件が、
待ち行列された書き込み要求の数が予め定められた最大数を超過している
ことを含む機械読み取り可能な媒体。
【請求項５２】
請求項４４に記載の機械読み取り可能な媒体において、所定の条件が、
待ち行列された書き込み要求を収集するのに予め定められた最大時間を超過している
ことを含む機械読み取り可能な媒体。
【請求項５３】
請求項４４に記載の機械読み取り可能な媒体において、所定の条件が、
最後の書き込み要求の受信から予め定められた最大時間を超過している
ことを含む機械読み取り可能な媒体。
【請求項５４】
請求項４４に記載の機械読み取り可能な媒体において、所定の条件が、
新しい書き込み要求が待ち行列された書き込み要求から最大許容ページ・オフセットを超過している
ことを含む機械読み取り可能な媒体。
【請求項５５】
請求項４４に記載の機械読み取り可能な媒体において、所定の条件が、
新しい書き込み要求が待ち行列された書き込み要求から最大許容バイト・オフセットを超過している
ことを含む機械読み取り可能な媒体。
【請求項５６】
ゲートウェイと、
前記ゲートウェイに接続された待ち行列データ・ファイルと、
前記ゲートウェイに接続された索引ファイルと、
前記ゲートウェイと前記待ち行列データ・ファイルとに接続された同期化コンポーネントと、を含み、
前記同期化コンポーネントが、
書き込み要求を受信し、
前記書き込み要求を実質的に隣接したディスク書き込みのバッチに追加し、
前記実質的に隣接したディスク書き込みのバッチを不揮発性メモリに書き込むことを決定し、
前記実質的に隣接したディスク書き込みのバッチを前記不揮発性メモリに書き込み、
前記実質的に隣接したディスク書き込みのバッチの書き込み確認を送信し、
前記書き込みの確認に対する確認を受信し、
前記実質的に隣接したディスク書き込みのバッチをクリアする、
ことを含む装置。
【請求項５７】
請求項５６に記載の装置において、前記ゲートウェイが、
マルチメディア・メッセージ・ゲートウェイ
を含む装置。
【請求項５８】
請求項５６に記載の装置において、前記待ち行列データ・ファイル及び前記索引データ・ファイルがディスク待ち行列内に含まれている装置。
【請求項５９】
請求項５６に記載の装置において、前記待ち行列データ・ファイルが、
前記索引ファイル内のレコードの関連エントリイを再構築するのに十分な情報を含んだレコードを含む装置。
【請求項６０】
請求項５６に記載の装置において、前記索引ファイルが、
前記待ち行列データ・ファイル内のレコードに関連したエントリイを含み、前記エントリイは索引コンポーネントとエントリイ情報コンポーネントとを有するデータ構造を含む装置。
【請求項６１】
請求項５６に記載の装置において、前記ゲートウェイは前記待ち行列データ・ファイルを読み出すものであり、前記索引ファイルは前記装置のシステム・クラッシュ前に存在した待ち行列の処理状態を復旧するものである装置。
【請求項６２】
請求項５６に記載の装置において、前記待ち行列データ・ファイルが単一ディスク区分に位置する装置。
【請求項６３】
請求項５６に記載の装置において、前記待ち行列データ・ファイルが複数の隣接したディスク・ブロックを含む装置。
【請求項６４】
書き込み要求を受信し、
前記書き込み要求を、未処理の要求のバッチに追加するかどうかを決定し、
もし、前記書き込み要求を前記バッチに追加すると決定した場合、前記書き込み要求を前記バッチに追加し、
前記バッチを不揮発性メモリに書き込むかどうかを決定し、
もし、前記バッチを前記不揮発性メモリに書き込むと決定した場合、前記バッチが前記不揮発性メモリにメモリマップされているかどうか決定し、
もし、前記バッチが前記不揮発性メモリにメモリマップされていると決定された場合、前記バッチを前記不揮発性メモリに書き込み、
前記バッチの書き込み確認を前記バッチ内の各書き込み要求に関連したプロセスに送信し、
前記バッチの書き込みの全ての確認が受信されたどうかを決定し、
もし、前記バッチの書き込みの全ての確認が受信された場合、前記バッチをクリアし、
書き込み要求がスキップされたか又は一時記憶内に記憶されているかどうかを決定し、
もし、スキップ又は記憶された書き込み要求が存在しないと決定された場合、次の書き込み要求を受信するためにループバックする
ことを含む方法。
【請求項６５】
請求項６４に記載の方法において、
もし、未処理の書き込み要求が前記一時記憶内にあると決定された場合、前記未処理の書き込み要求を未処理の要求の新しいバッチに追加することをさらに含む方法。
【請求項６６】
請求項６４に記載の方法において、
もし、前記書き込み要求を前記一時記憶内に記憶すると決定した場合、前記書き込み要求を前記一時記憶内に記憶し、
もし、前記書き込み要求をスキップすると決定した場合、次の書き込み要求を受信するためにループバックする
ことを含む方法。
【請求項６７】
請求項６４に記載の方法において、さらに
もし、前記バッチを前記不揮発性メモリに書き込まないと決定した場合、次の書き込み要求を受信するためにループバックする
ことを含む方法。
【請求項６８】
請求項６４に記載の方法において、さらに
もし、前記バッチが前記不揮発性メモリにメモリマップされていないと決定された場合、前記バッチを前記不揮発性メモリに書き込む前に、前記バッチを前記不揮発性メモリにメモリマップする
ことを含む方法。
【請求項６９】
請求項６４に記載の方法において、さらに
もし、記憶された書き込み要求が前記一時記憶内にあると決定された場合、前記記憶された書き込み要求を前記不揮発性メモリへ書き込むかどうかを決定する
ことを含む方法。
【請求項７０】
機械読み取り可能な記憶媒体であって、
書き込み要求を受信し、
前記書き込み要求を、未処理の要求のバッチに追加するかどうかを決定し、
もし、前記書き込み要求を前記バッチに追加すると決定した場合、前記書き込み要求を前記バッチに追加し、
前記バッチを不揮発性メモリに書き込むかどうかを決定し、
もし、前記バッチを前記不揮発性メモリに書き込むと決定した場合、前記バッチが前記不揮発性メモリにメモリマップされているかどうか決定し、
もし、前記バッチが前記不揮発性メモリにメモリマップされていると決定された場合、前記バッチを前記不揮発性メモリに書き込み、
前記バッチの書き込み確認を前記バッチ内の各書き込み要求に関連したプロセスに送信し、
前記バッチの書き込みの全ての確認が受信されたどうかを決定し、
もし、前記バッチの書き込みの全ての確認が受信された場合、前記バッチをクリアし、
どんな書き込み要求がスキップされたか又は一時記憶内に記憶されているかどうかを決定し、
もし、スキップ又は記憶された書き込み要求が存在しないと決定された場合、次の書き込み要求を受信するためにループバックする
ことを含む方法を実行するための複数の実行可能な命令を記憶した機械読み取り可能な媒体。
【請求項７１】
請求項７０に記載の機械読み取り可能な媒体において、方法が、
もし、未処理の書き込み要求が前記一時記憶内にあると決定された場合、前記未処理の書き込み要求を未処理の要求の新しいバッチに追加する
ことをさらに含む機械読み取り可能な媒体。
【請求項７２】
請求項７０に記載の機械読み取り可能な媒体において、方法が、
もし、前記書き込み要求を前記一時記憶内に記憶すると決定した場合、前記書き込み要求を前記一時記憶内に記憶し、
もし、前記書き込み要求をスキップすると決定した場合、次の書き込み要求を受信するためにループバックする
ことをさらに含む機械読み取り可能な媒体。
【請求項７３】
請求項７０に記載の機械読み取り可能な媒体において、方法が、
もし、前記バッチを前記不揮発性メモリに書き込まないと決定した場合、次の書き込み要求を受信するためにループバックする
ことをさらに含む機械読み取り可能な媒体。
【請求項７４】
請求項７０に記載の機械読み取り可能な媒体において、方法が、
もし、前記バッチが前記不揮発性メモリにメモリマップされていないと決定された場合、前記バッチを前記不揮発性メモリに書き込む前に、前記バッチを前記不揮発性メモリにメモリマップする
ことをさらに含む機械読み取り可能な媒体。
【請求項７５】
請求項７０に記載の機械読み取り可能な媒体において、方法が、
もし、前記記憶された書き込み要求が前記一時記憶内にあると決定された場合、前記記憶された書き込み要求を前記不揮発性メモリへ書き込むかどうかを決定する
ことをさらに含む機械読み取り可能な媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明の実施の形態は一般的には通信に関する。より詳細には、本発明の実施の形態はメッセージ・リレー・サーバー内にメッセージを効率的に記憶する方法及びシステムに関する。
【背景技術】
【０００２】
インターネットと無線通信の大衆化が成長するにつれて、ネットワーク設計者とサービス・プロバイダにはいくつかのパーフォマンス事業が提供される。特定な事業はメッセージルーティングに関する。メッセージ・ルーターが送り手ホストからメッセージを受信してこれらのメッセージを１つ又はそれ以上の宛先ホストへ転送する。メッセージを受信し送信するプロセスは時々トランザクションと呼ばれていて、いずれのネットワーク・アーキテクチャの重要なコンポーネントである。高性能メッセージ・ルーターが毎秒数百のトランザクションを完了することを要求されることはまれではない。
【０００３】
従来のメッセージング・システムは、メッセージルーティングについて記憶及び転送モデルを使用している。この手法の下では、ルーターがメッセージを受信する際、電力がメモリに供給されない時に内容が保存されるように、メッセージは不揮発性メモリ（ＮＶＭ）に記憶される。ＮＶＭの例は、これらに限定されるものではないが、電気的消去可能プログラマブル読み出し専用メモリ（ＥＥＰＲＯＭ）と磁気ディスクを含む。メッセージをＮＶＭに記憶することはシステムがクラッシュした際又は電源が故障した際にメッセージを復元することを可能にする。ＮＶＭへの書き込み及び読み出しの単純な技術は相対的に遅く、ネットワークの性能のボトルネックとなっている。
【発明の開示】
【０００４】
本発明の実施の形態は、不揮発性メモリにデータを書き込むことから発生する性能ボトルネックを最小にするためのいくつかの技術を組み合わせることができる。これらの技術は、最も現代的なハード・ディスク・システムの隣接レイアウトを利用するために、データを隣接して及び／又は実質的に隣接してディスクに書き込むことを含む。また、これらの技術はディスク・システムへの書き込み要求の総数を最小にするためにバッチ（一括処理）で書き込み要求を実行すること、及び、同期的ディスク書き込みを非同期的に実行することを可能にするために分離同期化ヘルパー・プロセスを使用することを含む。さらに、これらの技術はディスクに同期的に書き込まれるデータを最小にすること及び待ち行列からデータを除去するコストを最小にすることをさらに含む。
【０００５】
本発明の１つの実施の形態によると、十分に大きなサイズの１つ又はそれ以上のファイルが不揮発性メモリ（ＮＶＭ）内に作られて揮発性メモリ内にメモリマップされる。待ち行列されるべきメッセージ及び／又はデータは、待ち行列データ・ファイルと呼ばれるファイルの１つにメモリマップされた領域にコピーされる。索引データ構造が待ち行列データ・ファイルと関連する揮発性メモリに維持され、そして索引データ構造内のエントリイがメッセージ／データが書き込まれている場所の待ち行列データ・ファイル内の位置を記録するために使用される。一般的に、メッセージ／データは書き込み潜伏期を減少するために待ち行列データ・ファイルの連続的領域に書き込まれる。メッセージ／データの処理は、索引データ構造の操作とメモリマップされた待ち行列データ・ファイル領域内のメッセージ／データのアクセスとを含み、メッセージ／データが最初に待ち行列データ・ファイルへ書き込まれた後に本質的に待ち行列データ・ファイルを物理的に触らないようにする。もし、ある理由により、メッセージが即座に処理できない場合、メッセージはスキップされ、そして後で処理されるか又は第二待ち行列へと移動される。データ損失を最小にすること及び復旧効率を改善することを助けるために、索引データ構造は周期的に不揮発性メモリ（ＮＶＭ）へ書き込まれる。
【０００６】
同様にして、本発明の本実施の形態においては、データ損失を防止しそして連続的ディスク書き込みを確保するため、待ち行列データ・ファイル書き込みはディスクへ同期的に書き込まれる。ディスクへデータを同期的に書き込むことは、非同期的入力／出力（Ｉ／Ｏ）環境と両立せず、そして普通は書き込み性能を顕著に減少させるため、同期化ヘルパー・プロセスが、待ち行列データ・ファイル内のメモリマップされた領域が効率的に且つ信頼できる方法でディスクに同期化される（すなわち、物理的に書き込まれる）ように、待ち行列データ・ファイル書き込み要求をソート（分類）してバッチ（一括処理）する。
【発明を実施するための最良の形態】
【０００７】
図１は、本発明の実施の形態による通信システムのブロック図である。図１において、システム１０はゲートウェイ・サーバー１２ａに接続したターミナル１４とゲートウェイ・サーバー１２ｂに接続したターミナル１８とを有する。本実施の形態によると、ターミナル１４はメール・クライアント・ターミナルなどの送り手ホストであり、ターミナル１８はメール・サーバーなどの宛先ホストである。例えば、ターミナル１４、１８はコンピュータ、ワークステーション、パーソナルデジタルアシスタント（ＰＤＡ）、陸上線及び無線電話を含むことができる。送り手ホスト１４はゲートウェイ・サーバー１２ａ（例えば、メール・ゲートウェイ）と通信でき、宛先ホスト１８はゲートウェイ・サーバー１２ｂ（例えば、メール・ゲートウェイ）と通信でき、サーバー１２ａ、１２ｂはネットワーク１６を介して互いに通信できる。ネットワーク１６は、インターネット、ローカルエリアネットワーク（ＬＡＮ）、及び／又はワイドエリアネットワーク（ＷＡＮ）を含むことができる。ゲートウェイ・サーバー１２ａ及び１２ｂは、サーバー、ルーター、スイッチ等である。さらに、システム１０は、省略された追加的な部品、装置及び／又はシステムを含むことができる。
【０００８】
メッセージを宛先ホストへルーティングすることに関してここではある実施例が説明されるが、本発明の実施の形態はそれには限定されない。実際に、ここに説明される原理は本発明の実施の形態の範囲と精神から逸脱することなくどんなタイプの入力データにも容易に適用できる。例えば、イメージ、音声ファイル及びデータの他のタイプもここに説明された原理から利益を受けることができる。しかし、本発明の実施例によく適合するメッセージの多くの観点がある。単一のメッセージが複数の受け手（図示しない）及び／又は宛先ホストに送信されることができ、各宛先ホストはその特定の受け手ホストに接続されている受け手をサービスすることにも注意すべきである。
【０００９】
伝統的なインターネット・プロトコル（ＩＰ）のデータパケットルーティングは、ある量のデータ損失を許容できるように設計されていることに注意すべきである。一方、Ｅメール・メッセージなどのルーティングメッセージは高レベルの信頼性を必要とする。その結果、メッセージ・ルーター又はサーバーは、普通、データ損失に対して許容性がなく、伝統的に上述した記憶及び転送モデルを使用している。上記の１つ又は複数のプロトコルについてある実施の形態が説明されるが、本発明の実施の形態はそれに限定されないことに注意すべきである。実際に、本記憶技術が実現可能ないかなるプロトコルも使用できる。
【００１０】
図２は、本発明の実施の形態による、図１のゲートウェイ・サーバーのブロック図である。図２において、ゲートウェイ・サーバー１２ａはターミナル１４及びネットワーク１６に接続できるマルチメディア・メッセージ・ゲートウェイ（ＭＧＭ）２０を含む。ＭＧＭ２０はまたディスク待ち行列２２、そしてより詳細にはディスク待ち行列２２内の待ち行列データ・ファイル２４及び索引ファイル２６に接続されている。ＭＭＧ２０は同期化コンポーネント２８にさらに接続されていて、同期化コンポーネント２８は次に待ちデータ行列ファイル２４に接続されている。同期化コンポーネント２８は、待ち行列データ・ファイル２４内のメモリマップされた領域が待ち行列データ・ファイル２４のメモリマップされる所のディスク・ファイルへ、効率的及び信頼的に同期化されるよう（すなわち、同期的に物理的に書き込まれるよう）、待ち行列データ・ファイル２４書き込み要求をバッチ（一括）及びソート（分類）するためのプロセスとして実現されている。
【００１１】
図２において、ＭＭＧ２０は全ての送信及び受信メッセージ、例えば、ｅメールメッセージをディスク待ち行列２２内にルーティングされる前に記憶する。例えば、本実施の形態では、待ち行列データ・ファイル２４及び索引データ・ファイル２６を含むディスク待ち行列２２への書き込みはシーケンシャルであり、確認前に各書き込みはディスク待ち行列２２に同期化される。そして、ＭＭＧ２０は待ち行列活動を再開するためにスタートアップの際にディスク待ち行列２２を復旧する。待ち行列データ・ファイル２４内の各メッセージはメモリにメモリマップされ、そしてＭＭＧ２０上の全ての活動プロセスにより共有される。待ち行列データ・ファイル２４内の各メッセージは、システム・クラッシュの場合に待ち行列処理状態が復旧できる付随索引ファイル２６を持つことができる。以降、索引ファイル２６は交換可能に待ち行列索引ファイル２６と呼ぶ。さらに、限られた数のメッセージが待ち行列され、そして、もし待ち行列データ・ファイル２４が一杯ならば新しいメッセージが拒否される。索引エントリイの数はメイン・メモリ、ディスク・サイズ、そして待ち行列ファイル・サイズによって制限される。索引ファイル２６はまたＭＭＧ２０内にメモリマップされて、すべての他のＭＭＧ２０プロセスにより共有される。
【００１２】
本実施の形態によると、待ち行列データ・ファイル２４内の各メッセージは索引ファイル２６内にエントリイを持つ。索引ファイル２６はシステム導入時に専用ディスク区分上に最大可能サイズまで生成できる。索引ファイル２６はＭＭＧ２０によりメモリマップされ、そしてディスク・ファイルとの同期化は周期的に（例えば、各１０秒毎に）発生する。索引ファイル２６の不揮発性メモリ（ＮＶＭ）への周期的な同期化は非同期的に実行でき、そして、ＭＭＧ２０は一般的に書き込みが成功的に完了したという確認を待たない。周期的な同期化は複製のメッセージをルーティングするという結果を生じ、同期化前にシステム・クラッシュが完了した場合、索引ファイル２６は１つの”queue_index”構造からなり、これは”index_entry”構造の１つの配列を含む。共有相互排他的ロックとして動作し、そして索引にアクセスする全ての実行中のＭＭＧ２０プロセスにより共有されるミューテックス変数がまた存在する。ミューテックス変数は二以上のＭＭＧ２０プロセスにより待ち行列索引が同時に変更されることを防止する働きをする。本実施の形態によると、ミューテックスはヘッダー・データのどんな書き込み又は読み出し前に、そして索引エントリイのロッキング前に獲得される。索引ファイル２６は待ち行列されたデータへの効率的なアクセスを提供することに役立つ。特に、索引ファイル２６は待ち行列されたメッセージの場所へのポインタを保持する。メッセージが削除された時、索引ファイル２６はそのエントリイを取り除くために更新され、よって、物理的に待ち行列データ・ファイル２４を修正する必要性を無くする。その結果、コスト、すなわち、ディスク待ち行列２２からデータを取り除くために必要な時間と処理資源を最小化できる。また、索引ファイル２６は、限られた量の状態情報、例えば、ＭＭＧによりしばしば使用されるリトライ・データを維持する。メッセージのリトライ・データは、待ち行列データ・ファイル２４よりも索引ファイル２６からより高速且つより効率的に検索とチェックができる。
【００１３】
本発明の１つの実施の形態によると、索引ファイル２６についてのデータ構造は、次のように定義される。
struct queue_index {
int head;           // index of head of the in-use LL 
int tail;           // index of tail of the in-use LL
// corresponds to the last entry written
int free;           // The head of the free list 
int num_entries; 
time_tlast_sync; 
struct index~entry[];
}
struct index_entry { 
int offset;       // Offset in the queue file.     
int len;                 // Length of data in the queue file. 
int lock;                // pid of process which has this entry locked,
// or 0 if unlocked. 
byte type;          // Type of index entry. e. g., SMS, SMTP 
int status; 
int checksum; 
int retry_count; 
time_t last_retry;     // date of the last.retry, in unix time
int prev;            // index of previous item in linked list 
int next;                   // index of next item in linked list
}
インデックス・ファイル２６についての上記データ構造は１つの可能な代表であり、現在考えられる可能な代替的な実施の形態を制限するものと決して解釈すべきではない。例えば、上記よりも少ない、追加的な上記及び他のフィールドの組み合わせを含む代替的な実施の形態が考えられる。
【００１４】
index_entryからデータをディスクへの書き込みが自動的な操作であることを保障するために、単一のindex_entryは１ディスク・ブロックよりも広がってはいけない。この問題の１つの可能な解決は、そのサイズがオペレーティング・システムのディスク・ブロック・サイズの因数であることを保障するために、index_entry構造にパッディングを追加することである。例えば、ディスク・ブロック・サイズが４０９６バイトである場合、index_entry構造を４０９６バイトの因数であるサイズ、例えば、３２バイトに拡張できる。例えば、もし、索引ファイル２６中の各エントリイが３２バイトである場合、３２メガバイト索引ファイルが１百万索引エントリイをサポートするために必要である。
【００１５】
システム・クラッシュの後、システム・クラッシュ前に存在していた待ち行列処理状態を復旧するために、ＭＭＧ２０により索引ファイル２６及び待ち行列データ・ファイル２４が読み出される。
【００１６】
各ＭＭＧ２０待ち行列は、１つ又は複数の専用データ・ファイル及び専用索引ファイルを使用する。各データ・ファイルは単一ディスク区分上で作成され、一般に、その区分上には他のディスク・ファイルは存在しない。待ち行列索引ファイル２６と一緒に、待ち行列データ・ファイル２４はそれら各々の最大可能サイズまでシステム導入の際に生成できる。これは待ち行列データ・ファイル２４が隣接ディスク・ブロックからなり、待ち行列データ・ファイル２４の隣接ディスク書き込みを可能にすることを保証することに役立つ。複数の待ち行列ファイルが平行性を増大するために別個の物理的ディスク上に置かれることができる。待ち行列データ・ファイル及び待ち行列索引ファイルが、平行性を増大するために、別個の物理的ディスク上に置かれてもよい。ＭＭＧ２０の初期化中、待ち行列データ・ファイル２４はメッセージを記憶するためにＭＭＧ２０によりメモリマップされる。ディスク及びメモリ・ファイルは各メッセージが待ち行列データ・ファイル２４に加えられた後にデータ損失を防止するために同期化される。
【００１７】
単一待ち行列データ・ファイル・サイズは、例えば、２ＧＢ又はそれ以上に制限してもよい。しかし、３２ビット符号無し整数を使用してオフセットが表現される場合４ＧＢが最大のファイル・サイズである。４ＧＢよりも大きい待ち行列データ・ファイル・サイズが可能である。しかし、長い整数、例えば、６４ビット、を使用して待ち行列エントリイ位置（待ち行列データ・ファイル・オフセット）を表現することが必要である。もし、平均入力メッセージ・サイズが４ｋオクテットである場合、２ＧＢ待ち行列データ・ファイル２４が最大約５００ｋ（ｋ＝１０２４）メッセージを記憶できる。実際のメッセージ内容に加えて、ヘッダー情報も待ち行列データ・ファイル２４に同様にして書き込まれる。このようなヘッダー情報はヘッダー番号、書かれたメッセージの生成日と大きさを含む。
【００１８】
本発明の１つの実施の形態によると、各メッセージは待ち行列データ・ファイル２４にあるシーケンスとエンベロープ情報と一緒に書き込まれる。待ち行列復旧プロセスは完全な索引ファイル２６に常に依存できないため、待ち行列データ・ファイル２４は一般にメッセージの索引エントリイを再構築するために十分な情報を含むべきである。従って、例えば、待ち行列データ・ファイル２４エントリイ・フォーマットは次を含む。
2008501163.tif 000003
【００１９】
本発明の１つの実施の形態によると、待ち行列索引ファイル２６が一般にディスクに同期的に書き込まれないため、待ち行列索引ファイル復旧手順が含まれる。復旧手順を容易にするため、待ち行列索引ファイル２６（前述したデータ構造に示されるように）は、ディスクに索引ファイルが書き込まれた最後の時間を示すフィールド”time_t_last_sync”を含む。一般に、time_t_last_syncデータは、ファイルがディスクに同期化される直前にのみ修正される。待ち行列データ・ファイル２４内の各待ち行列エントリイは一般に所定の境界上、例えば、２５６バイト境界上にあるオフセットで開始する。待ち行列データ・ファイル・エントリイは、最初の４バイトのエントリイが、例えば、”＼２５２＼８８＼１３２＼１３３”のように固定の４バイト・シグネチャでプリペンドされ、すなわち、前もって固定されている。それが待ち行列データ・ファイル２４についての正しい索引情報を反映することを保証するために、待ち行列索引ファイル２６は有効化手順を使用して有効化される。例えば、本発明の１つの実施の形態によると、１つの可能な有効化手順は次のような擬似コード手順で示されるように実現できる。
待ち行列索引ファイル「使用中」リンクされたリストを走査する；
もし、ループが発見されたならば、ループを破壊する；
もし、エントリイがロックされているならば、ロック解除する；
もし、エントリイがフリーと印されているならば、「フリー」リストへ移動する；
待ち行列索引ファイル「フリー」リストを走査する；
もし、ループが発見されたならば、ループを破壊する；
もし、エントリイが「使用中」と印されて、エントリイが有効データをポイントしているならば、エントリイを「使用中」リストに移動する；
「使用中」リスト又は「フリー」リスト上にない、エントリイに対して；
もし、ロックされているならば、ロック解除する；
もし、「フリー」と印されていなく、そしてエントリイが有効データをポイントしているならば、エントリイを「使用中」リストへ移動する；
もし、「フリー」と印されていなく、そしてエントリイが無効データをポイントしているならば、エントリイを「フリー」リストへ移動する；
もし、フリーならば、エントリイを「フリー」リストへ移動する。
【００２０】
図３は、本発明の１つの実施の形態による、システム・クラッシュ後の待ち行列索引ファイルの情報を復旧する方法のフローチャートである。図３において、待ち行列データ・ファイル２４上のレコードが、待ち行列索引ファイル２６に対して可能なエントリイについて、例えば、２５６バイト間隔などの所定の境界間隔で走査される（３１０）。待ち行列ファイル索引ファイル２６のエントリイを復旧するのが必要かどうかが決定される（３２０）。復旧が必要な決定するために（３２０）、エントリイが有効かどうかを決定することを含む。エントリイは、もし、次の条件の両方が真実ならば有効であると決定される。１）最初の４バイトが固定の４バイト・ヘッダーと一致する。そして２）エントリイ・チェックサムが正しい。エントリイが復旧される必要があるかどうかの決定（３２０）は、また、有効なエントリイが待ち行列索引ファイル２６から欠けているかどうかを決定することを含む。次の条件のいずれかが真実の場合、有効なエントリイが欠けていると決定される。１）エントリイのデータ・フィールドの日付が、待ち行列索引ファイル２６のlast_sync timeフィールド中に含まれる日付よりも後の日付を含む。又は、２）エントリイが待ち行列索引ファイル２６内に無い。従って、エントリイがもし有効で且つ欠けていると決定されたならば（３２０）、エントリイが待ち行列索引ファイル２６中に加えられる（３３０）。待ち行列データ・ファイル２４上にさらにレコードが存在するかどうかが決定される（３４０）。もし、待ち行列データ・ファイル２４上にさらにレコードがあると決定された場合、方法は走査を待ち行列データ・ファイル２４上の次のレコードへ向けてスキップ（３５０）を発生する。スキップ（３５０）されるべき距離は、所定の境界間隔又は最近の境界間隔に選択的に丸められたエントリイの長さフィールドに等しい距離のいずれかに等しい。一般に、レコードに対するエントリイが存在するかどうかの決定（３２０）にかかわらず、スキップ（３５０）されるべき距離は所定の境界間隔である。しかし、レコードが存在すると決定（３２０）された場合、スキップ（３５０）される距離は、最近の境界間隔へ選択的に丸められたエントリイの長さフィールドにより決定され、これは所定の境界間隔をスキップ（３５０）することについていくらかの性能の改善を与える。方法は、上述したように、待ち行列データ・ファイル２４の走査（３１０）を続けるために戻る。それ以外、待ち行列データ・ファイル２４内にもうレコードがないと決定された場合（３４０）、方法が終了する。
【００２１】
メッセージ・データは、メッセージのタイプに依存して特定のフォーマットを持つ。例えば、本発明の１つの実施の形態によれば、ＳＭＴＰメッセージ・データは次のフォーマットを持つ。
2008501163.tif 000004
同様に、本発明の１つの実施の形態によると、ＳＭＳメッセージは次のフォーマットを持つ。
2008501163.tif 000005
また、ユーザ認証（例えば、軽量ディレクトリイ・アクセス・プロトコル・（ＬＤＡＰ）ルックアップ）が二回実施されることを防止するために、例えば、メール・サーバー・ホスト名、又は、ＳＭＳＣ場所などのルーティング指示をメッセージ・フォーマットに加えることができる。ＭＭＧ２０待ち行列タスク。図２に戻って参照する。本発明の１つの実施の形態によると、ディスク待ち行列２２は、待ち行列データ・ファイル２４（二以上の待ち行列データ・ファイル２４が可能な他の実施の形態が考えられるが）及び索引ファイル２６を含む。本発明では、待ち行列データ・ファイル２４及び索引ファイル２６が１つの物理ディスク上に記憶してよいが、待ち行列データ・ファイル２４のさまざまな部分も処理効率を改善するためにまたメイン・メモリ内にメモリマップしてもよい。
【００２２】
メッセージを待ち行列へ追加。このタスクはメッセージを待ち行列データ・ファイル２４へ追加できる。メッセージがディスクへ書き込まれたという確認が受信された時、追加は成功と考えられる。本発明の１つの実施の形態では、待ち行列索引ファイル２６内のエントリイが成功的に割り当てられた時、そして待ち行列データ・ファイル２４内にメッセージを保持するのに十分なスペースがある時にメッセージが追加できる。それ以外、メッセージは拒絶される。もし、メッセージが追加される場合、メッセージの内容が待ち行列データ・ファイル２４内の予約されたスペースへコピーされ、待ち行列データ・ファイル２４へのコピー操作が完了した後にディスク同期化が実行できる。
【００２３】
記憶利用可能性チェック。一般に、待ち行列記憶可能性チェックを実行する時に２つの場合が考慮される。さらに、待ち行列データ・ファイル２４が読み出され（Ｒ）及び書き込まれる（Ｗ）場所の現オフセット、予約されるサイズ（Ｓ）及び待ち行列データ・ファイル２４の最大サイズ（Ｑ）を知ることが重要である。
【００２４】
本実施の形態では、Ｒは第一待ち行列エントリイのオフセット位置に対応し、Ｗは最後の待ち行列エントリイのオフセットにエントリイの長さを加えたもの等しい。従って、本発明の１つの実施の形態によると、待ち行列索引についてのデータ構造は次のように定義される。
struct queue_index q_index; 
[...] 
R = q_index.index_entry[q_index.head].offset; 
W=q_index.index_entry[q_index.tail].offset+    q_index.index_entry[q_index_tail].len;
読み易さのために詳細さは省略しているが、全ての算術は待ち行列データ・ファイル２４のサイズのモジュロであることに注意する。
【００２５】
第一のケースでは、本発明の実施の形態では、現読み出しオフセットＲは現書き込みオフセットＷよりも少ない。記憶のために利用可能なスペースは、ｓ＝Ｑ−Ｗとして表現でき、割り当てはもしＳがｓよりも少なければ成功である。そうでなければ、Ｗはリセットされ又は待ち行列データ・ファイル２４の始まりにラップアラウンドされて、そしてスペース利用可能性チェックが下に説明するケースのように再び実行される。
【００２６】
第二のケースでは、本発明では、現書き込みオフセットＷは現読み出しオフセットＲよりも少ない。そして、記憶のために利用可能スペースはｓ＝Ｒ−Ｗとして表現される。もし、ｓがＳよりも少なければ、オフセットＲの待ち行列エントリイはスキップされる。
【００２７】
待ち行列データ・ファイル２４内のフリーの記憶スペースをどのようにしてチェックするかを前述したが、もし、読み出し及び書き込み位置が近すぎると、新しいメッセージ・データを置くためのスペースはないであろう。これは待ち行列データ・ファイル２４が一杯の時に生ずる。この場合、入力メッセージを拒絶するしか選択はない。幸運なことに、この可能性は少ない。しかし、より可能性が高いのは、読み出し位置及び書き込み位置の間のスペースが読み出し位置（q_index.head）のメッセージが大変古いために小さいことである。この場合、古いメッセージはリストのヘッドからテールまでそれを移動することでスキップされる。これは例えば次のコード・セグメントにより達成される。
MMG_mutex_acquire (index_lock)
int tmp = q_index.head; 
q_index. head = q_index.indexL_entry[q_index.head].next; 
q_index.index_entry [q_index.head].prev = -1; //NONE 
q_index..index_entry[q_indey.tail].next = tmp; 
q_index.index_entry [tmp].prev =q_index.tail; 
q_index.index_entry [tmp].next = -1;    //NONE 
q_index.tail = tmp; 
MMG_mutex_release (index_lock); 
この操作は書き込みポインタ（Ｗ）及び読み出しポインタ（Ｒ）の両方を移動する効果を持つ。
【００２８】
索引エントリイ割り当て。本発明の１つの実施の形態では、索引エントリイは配列中に記憶できる。索引が最初に具体化される時、フリー索引エントリイのリンクされたリストが設定される。例えば、q_index.freeがそのリンクされたリストのヘッドを示す。フリー・リスト上の各エントリイはリスト上の次のエントリイを示すためにそのindex_entry.next値を使用する。リストはａ−１で終了する。新しい索引が必要とされる時、新しい索引が必要とされる時、プロセスは最初にindex_lockを獲得して、そしてそれを次のコード・セグメントに説明されるようにスタックq_index.freeの最初の項目をポップ・オフする。
int new_entry = q_index.free;
if (new_entry == -1) return ERROR_NO_MORE_INDEX_ENTRIES; 
q_index.free = q_index.index_entries[q_index.free]next;
【００２９】
待ち行列処理。本発明の１つの実施の形態によると、待ち行列プロセス又はスレッドは一般にルート索引のメッセージ待ち行列からメッセージを順次に取る。各メッセージは処理のためにロックされ、そしてもし処理が成功しなければロックが解除される。もし、メッセージの再試行制限が超過した場合、メッセージがその対応する索引エントリイを索引ファイルのin_use（使用中）リストからフリー・リストへ移動することにより待ち行列から削除される。索引エントリイは同様にin_use（使用中）リストからフリー・リストへメッセージが成功的又は不成功的に処理された後に移動される。
【００３０】
本発明の１つの実施の形態によると、インメモリ索引が同じホスト又はドメインに送られる全メッセージをグループ化するために使用される。これは多くのメッセージが単一ホストへ一度に送られることを可能にする。
【００３１】
待ち行列ファイル同期化。待ち行列ファイル同期化は、本発明の１つの実施の形態によると、データがディスクへ成功的に記憶されることを保証するために、例えば、msync()の同期コマンドを使用することにより達成される。しかし、msync()への同期コールは操作の全ての他のスレッドをブロックし、そしてディスク待ち行列への全てのアクセスをブロックするため、ヘルパー・プロセス、例えば、図２に示すような同期化コンポーネント２８が同期化を処理するために使用される。ＭＭＧ２０は同期化コンポーネント２８と交信するためにファーストイン・ファーストアウト（ＦＩＦＯ）待ち行列を使用する。
【００３２】
図４は、本発明の１つの実施の形態による入力データを処理する方法の例のフローチャートである。図４には、良好な平行性を生ずる同期化コンポーネント２８の２相、一括処理が説明される。この処理は４つのＦＩＦＯ待ち行列を使用する。
requestfifo 401 - ＭＭＧ２０が同期化コンポーネント２８へ要求を送る。
receiptfifo 402 -  同期化コンポーネント２８が要求の受領を確認する。
confirmfifo 403 -  同期化コンポーネント２８が全ての受信した要求の完了を確認する。
confconffifo 404 - ＭＭＧ２０が同期化コンポーネント２８と共に各受信した確認を確認する。
【００３３】
図４において、同期化コンポーネント２８ｆは、msyncデータへの命令をrequestfifo ４０上で聞く。命令は、４バイト整数、オフセット、その後に４バイト整数、長さで来る。また、命令は、４バイト整数、オフセット、その後に８バイト長整数、長さで来る。オフセットは、待ち行列データ・ファイル２４中にメモリマップされたファイル中の位置を言及する。
【００３４】
図４において、ＭＭＧスレッド、例えば、ＭＭＧスレッド１はmutexを獲得して(４１０)、requestfifo４０１を経由して同期化コンポーネント２８へ同期化（ｓｙｎｃ）要求を送る（４１２）。ＭＭＧスレッド１は、ｓｙｎｃ要求が受信されたことを示す受領を待ち（４１４）、そして同期化コンポーネント２８は受信されたｓｙｎｃ要求を待ち行列にし（４１６）、そしてreceiptfifo４０２を経由してＭＭＧスレッド１へｓｙｎｃ要求が受信されたことの確認を送信する（４１８）。要求が受信されたことの確認を受信後、ＭＭＧスレッド１はmutexを開放し（４２０）、そしてconfirmfifo４０３から要求が処理されたことの確認を待つ（４２１）。二以上のＭＭＧ２０が一時にconfirmfifo４０３を待ってもよい。
【００３５】
図４において、第二ＭＭＧスレッド、ＭＭＧスレッド２、は、mutexをＭＭＧスレッド１によりそれが開放された後（４２０）に獲得する（４２２）。ＭＭＧスレッド２は別のｓｙｎｃ要求をrequestfifo４０１を経由して同期化コンポーネント２８へ送信し（４２４）、そしてｓｙｎｃ要求が受信されたことを示す受領を待ち（４２６）、そして同期化コンポーネント２８は受信されたｓｙｎｃ要求を待ち行列にし（４２８）、そしてＭＭＧスレッド２へｓｙｎｃ要求が受信されたことの確認を送信する（４３０）。ＭＭＧスレッド２はmutexを開放し（４３２）、そしてmsyncの確認を待つ（４３３）。
【００３６】
図４において、同期化コンポーネント２８はそれらが受信された時、一括要求することができる。例えば、同期化コンポーネント２８は、それがｓｙｎｃ要求の隣接又は実質的に隣接した組を受信するまで、又は、ある所定のイベント又はタイムアウトが発生するまで、ｓｙｎｃ要求のバッチ（一括処理）を続けることができる。この時点で、同期化コンポーネント２８はrequestfifo４０１上で新しいｓｙｎｃ要求を受け取ることを停止して、受信した全ての要求を実行する（４３４）。もし、マップされたファイルの適当な部分がすでにメモリマップされている場合、単純なmsyncがコールされる（４３４）。そうでなければ、適当な部分がメモリマップされて、そしてmsyncがコールされる（４３４）。同期化コンポーネント２８は、Ｎ個のｓｙｎｃ確認を影響を受けるスレッド（例えば、ＭＭＧスレッド１及びＭＭＧスレッド２）へ送信し（４３６）、そして送信されたＮ個のｓｙｎｃ確認の確認を待つ（４３８）。Ｎは確認を待っているＭＭＧスレッドの数である。図示しないが、もし、ある構成パラメータにより、書き込み要求の現在のバッチ（一括処理）と実質的に隣接するものとして認められないｓｙｎｃ要求が受信された場合、受信されたｓｙｎｃ要求は次のバッチ（一括処理）開始まで遅延され、そして遅延されたｓｙｎｃ要求は次のバッチ（一括処理）で処理される。
【００３７】
追加のＭＭＧスレッドがconfirmfifo４０３を聞くことを開始する前に、全てのＭＭＧスレッドがconfirmfifo４０３から信号を受信していないという、競争状態が存在する。すなわち、各ＭＭＧスレッドが各確認の受領を確認することを要求されるためにconfconffifo４０４が使用できる。各確認が確認された時、同期化コンポーネント２８は他のｓｙｎｃ要求を再び受領して確認することを開始する。例えば、ＭＭＧスレッド１は同期化コンポーネント２８へ送信された（４３６）msync確認の確認を送信して応答し（４４０）、そしてＭＭＧスレッド２は同期化コンポーネント２８へ送信された（４３６）msync確認の確認を送信し返答する（４４２）。同期化コンポーネント２８は活動スレッドからのmsync要求を受信して待ち行列にする（４１６）ことを続けるためにループに戻る（４４４）。
【００３８】
ＭＭＧ２０がconfconffifo４０４を介して確認の受領を確認することができる前に死ぬという場合を処理するために、タイムアウトを同期化コンポーネント２８内に使用できる。同様に、ＭＭＧ２０は同期化コンポーネント２８が死に再開する時を検出するために中断することができる。
【００３９】
低スループットでは、別個の同期化コンポーネントを使用することは単純な同期化要求／応答システムよりも遅いが、この手法はより高い最大スループットを有するであろう。これは、各コールがより多くのデータを同期化することをmsyncに依頼するため、結果としてmsyncへのより少ないシステムコールを生ずる。同期化コンポーネントが隣接ブロックを形成するためにｓｙｎｃ要求をより長く待つことができると、より高いスループットを達成できる。しかし、これは低スループット・システムでは低い効率であり、より高い潜伏時間を経験する。すなわち、同期化コンポーネント２８に対して多くの構成オプションが同期化コンポーネント２８の性能の微調整のために指定される。例えば、次の構成オプションが同期化コンポーネント中に設定できる。バイトで指定される最大バッチ（一括処理）サイズ、書き込み要求数で指定される最大バッチ（一括処理）サイズ、最大ハッチ（一括処理）集積時間、新しい書き込み要求無しに可能な最大時間、新しい書き込み要求が実質的に隣接していないとみなされる最大オフセット（ページ又はバイトで）である。
【００４０】
メモリ・マッピング選択。複数の領域が、メッセージを待ち行列データ・ファイル２４へ書き込み及びから読み出すために待ち行列データ・ファイル２４へメモリマップされる。興味ある領域をマッピングする時にオクテットでの所定のサイズが使用でき、そして、システムが再マップを頻繁に実行する必要がないようにサイズを選択するために注意が必要である。一般に、マップされるべき領域の大きさは、ディスク・ページ・サイズの倍数とすべきである。各スレッド又はプロセスは、待ち行列データ・ファイル２４のそれ自身のマップを持つことに注意することが大切である。
【００４１】
例えば、本発明の１つの実施の形態によると、手法は読み出しのために１つのマップされた領域と書き込みのための別のマップされた領域を持つ。これは「書き込み」領域に書き込みする間に「読み出し」領域を再マップすることが可能であることを意味する。また、各マップされた領域の境界をその領域でいかなる操作を開始する前にもチェックすることが重要である。同期化要求２８はディスク同期化タスクを実行する時にそれ自身のメモリマップを使用する。
【００４２】
本発明の別の実施の形態による１つの手法は、どんな個別のスレッド又はプロセスによる排他的な使用のためにロックでき、選択的にスレッド又はプロセスにより再マップでき、そしてスレッド又はプロセスが終了した時にロックを解除することのできるメモリマップされた領域の構成可能な大きさのプールを維持することである。この実施の形態では、より多くのスレッドがマップされた領域を必要とし、そしてプール中にマップされた領域がある時、スレッドの待機待ち行列が維持される。
【００４３】
図５は本発明の１つの実施の形態による代替的な実施の形態の入力データの処理の方法の１つの例のフローチャートである。図５において、書き込み要求が実行プロセスから受信され（５０５）、そして方法が実質的に隣接したディスク書き込みのバッチ（一括処理）へ書き込み要求を追加するかどうかを決定する（５１０）。もし、実質的に隣接したディスク書き込みのバッチ（一括処理）へ書き込み要求が追加されると決定されると（５１０）、書き込み要求が実質的に隣接したディスク書き込みのバッチ（一括処理）へ追加される（５１５）。方法は実質的に隣接したディスク書き込みのバッチ（一括処理）が不揮発性メモリへの書き込みかどうかを決定する（５２０）。もし、実質的に隣接したディスク書き込みのバッチ（一括処理）が不揮発性メモリへの書き込みと決定されると（５２０）、実質的に隣接したディスク書き込みのバッチ（一括処理）がメモリマップされているかどうか決定される（５２５）。
【００４４】
図５において、実質的に隣接したディスク書き込みのバッチ（一括処理）がメモリマップされていると決定された場合（５２５）、実質的に隣接したディスク書き込みのバッチ（一括処理）が不揮発性メモリへ書き込まれる（５３０）。実質的に隣接したディスク書き込みのバッチ（一括処理）の書き込みの確認が、そこから書き込み要求がオリジナルに受信されたプロセスへ送信される（５３５）。方法は、書き込み確認を送信（５３５）した各プロセスから送信（５３５）された確認に対する確認の受信（５４０）を待つ。もし、送信（５３５）された確認に対する確認が各プロセスから受信（５４０）された場合、実質的に隣接したディスク書き込みのバッチ（一括処理）がクリアされて（５４５）、スキップされた書き込み要求及び／又は一時記憶内に記憶された書き込み要求があるかどうか決定される（５５０）。もし、一時記憶内に記憶された書き込み要求があると決定（５５０）された場合、方法は記憶された書き込み要求の１つを実質的に隣接したディスク書き込みのバッチ（一括処理）に追加するどうか決定するためにループし、そして上述したように続く。もし、一時的記憶内に記憶された書き込み要求がないと決定（５５０）された場合、方法は新しい書き込み要求を受信する（５０５）ためにループし、そして上述したように続く。
【００４５】
もし、実質的に隣接したディスク書き込みのバッチ（一括処理）に受信された書き込み要求を追加しないと決定した場合、書き込み要求をスキップするか又は一時記憶内に記憶するどうか決定（５５５）される。もし、書き込み要求をスキップすると決定（５５５）された場合、方法は新しい書き込み要求を受信する（５０５）ためにループし、そして上述したように続く。もし、書き込み要求を一時記憶に記憶すると決定（５５５）された場合、方法は書き込み要求を一時記憶に記憶し（５６０）、そして新しい書き込み要求を受信する（５０５）ためにループし、そして上述したように続く。
【００４６】
図５において、実質的に隣接したディスク書き込みのバッチ（一括処理）が不揮発性メモリにメモリマップされていないと決定された場合（５２５）、方法は書き込み要求を不揮発性メモリにメモリマップする（５６５）。方法は隣接したディスク書き込みのバッチ（一括処理）を不揮発性メモリに書き込み（５３０）、そして上述したように続く。
【００４７】
図６は、本発明の１つの実施の形態によるステートレス・ルーティングの適格性を決定するプロセスを示す。図６において、書き込み要求が実行プロセスから受信され（６１０）、そして方法は書き込み要求を実質的に隣接したディスク書き込みのバッチ（一括処理）に追加する（６２０）。方法は実質的に隣接したディスク書き込みのバッチ（一括処理）を不揮発性メモリに書き込むべきかを決定し（６３０）、もし、実質的に隣接したディスク書き込みのバッチ（一括処理）を不揮発性メモリに書き込むべきと決定（６３０）した場合、実質的に隣接したディスク書き込みのバッチ（一括処理）が不揮発性メモリに書き込まれる（６４０）。実質的に隣接したディスク書き込みのバッチ（一括処理）の書き込みの確認が、そこから書き込み要求がオリジナルに受信されたプロセス（複数）へ送信される（６５０）。方法は、書き込み確認を送信（６５０）した各プロセス（複数）から送信（６５０）された確認に対する確認を受信する（６６０）。実質的に隣接したディスク書き込みのバッチ（一括処理）がクリアされて（６７０）、方法は新しい書き込み要求を受信（６１０）するためにループし、そして上述したように続く。
【００４８】
図６において、もし、実質的に隣接したディスク書き込みのバッチ（一括処理）を書き込まないと決定（６３０）した場合、方法は新しい書き込み要求を受信（６１０）するためにループし、そして上述したように続く。
【００４９】
当業者は上述した記述から、本発明の実施の形態の広い技術はさまざまな形で実現できることが理解される。従って、本発明の実施の形態がそれらの特定の例と関連して説明されたが、本発明の実施の形態の真の範囲は、図面、明細書、及びクレームから、当業者には他の変更が明らかであるからそのように限定されるべきではない。
【図面の簡単な説明】
【００５０】
【図１】図１は、本発明の１つの実施の形態による通信システムのブロック図である。
【図２】図２は、本発明の１つの実施の形態による図１のゲートウェイ・サーバーのブロック図である。
【図３】図３は、本発明の１つの実施の形態による待ち行列索引ファイルを復旧する方法のフローチャートである。
【図４】図４は、本発明の１つの実施の形態による入力データを処理する方法の一例のフローチャートである。
【図５】図５は、本発明の代替的な実施の形態による入力データを処理する方法の一例のフローチャートである。
【図６】図６は、本発明の１つの実施の形態による書き込み要求がバッチ書き込みをトリガーするかどうかを決定するプロセスを示すプロセス・フローチャートである。
【図１】
2008501163.tif 000006
【図２】
2008501163.tif 000007
【図３】
2008501163.tif 000008
【図４】
2008501163.tif 000009
【図５】
2008501163.tif 000010
【図６】
2008501163.tif 000011
【国際調査報告】
2008501163.tif 000012