(57)【特許請求の範囲】
【請求項１】
マルチスレッド・コンピューティング・システム内の複数のスレッドが共有しているメモリをアロケートする方法であって、
前記共有メモリを複数のブロックへ分割する工程と、
特定のスレッドが引き起こした、前記複数のブロックに含まれる選択されたブロックのオーバーフローの回数を決定することにより前記特定のスレッドが高速アロケーティング・スレッドであるか否かを決定する工程と、
前記複数のスレッドを少なくとも第１グループのスレッド及び第２グループのスレッドへグループ分けする工程と、前記第１グループは複数の高速アロケーティング・スレッドを含むように構成され、
前記複数のブロックから選択した第１ブロックを、前記複数のスレッドから選択したスレッドへアロケートする工程と
を含み、前記選択したスレッドは、オブジェクトを前記選択した第１ブロック内でアロケートすることを試みるために設けられ、前記選択したスレッドへの前記選択した第１ブロックのアロケーションは、前記選択したスレッドが前記第１グループ及び第２グループのうちのいずれの一部であるかということに少なくとも部分的に基づいて実施される方法。
【請求項２】
請求項１に記載の複数のスレッドが共有しているメモリをアロケートする方法において、前記特定のスレッドが高速アロケーティング・スレッドであることが確定した際、前記特定のスレッドはオブジェクトを比較的頻繁にアロケートすることを試み、前記特定のスレッドが高速アロケーティング・スレッドでないことが確定した際、前記特定のスレッドはオブジェクトを比較的頻繁にアロケートすることを試みることはなく、かつ前記第２グループへグループ分けされる方法。
【請求項３】
請求項１に記載の複数のスレッドが共有しているメモリをアロケートする方法において、前記特定のスレッドが高速アロケーティング・スレッドであることが確定した際、前記特定のスレッドは所定数を越す数のバイトを所定時間内でアロケートし、前記特定のスレッドが高速アロケーティング・スレッドでないことが確定した際、前記特定のスレッドは所定数未満の数のバイトを所定時間内でアロケートし、かつ前記第２グループへグループ分けされる方法。
【請求項４】
請求項１ないし請求項３のいずれか一項に記載の複数のスレッドが共有しているメモリをアロケートする方法において、前記共有メモリを複数のブロックへ分割する工程は、前記共有メモリを少なくとも２つのサイズの複数のブロックへ分割する工程を含む方法。
【請求項５】
マルチスレッド・コンピューティング・システム内の共有メモリをアロケートする方法であって、前記マルチスレッド・コンピューティング・システムが第１スレッド及び第２スレッドを少なくとも有する方法において、
前記共有メモリを複数のブロックへ分割する工程と、
前記複数のブロックから選択した第１ブロックを前記第１スレッド及び第２スレッドの両方がアクセスできるブロックとして割り当てる工程と、第１オブジェクトを前記第１ブロック内でアロケートすることを試みるべく前記第１スレッドは設けられ、第２オブジェクトを前記第１ブロック内でアロケートすることを試みるべく前記第２スレッドは設けられていることと、
前記第１ブロックがオーバーフローした時を決定する工程と、
前記第１ブロックがオーバーフローしたことが確定した際、前記第１オブジェクトを第１ブロック内でアロケートする前記第１スレッドの試みが、前記第１ブロックのオーバーフローを引き起こしたか否かを決定する工程と、
前記第１オブジェクトを第１ブロック内でアロケートする前記第１スレッドの試みが、前記第１ブロックのオーバーフローを引き起こしたことが確定した際、前記複数のブロックから選択した第２ブロックを、前記第１スレッドへ割り当てる工程と、前記第２ブロックを第１スレッドへ割り当てる工程は、前記第１スレッドがオブジェクトを前記第１ブロック内でアロケートすることをそれ以降試みないようにすべく設けられていること
を含む方法。
【請求項６】
請求項５に記載の方法において、オブジェクトを前記第２ブロック内でアロケートすることを試みるべく前記第２スレッドは設けられていない方法。
【請求項７】
請求項５または請求項６に記載の方法において、前記第１ブロック及び第２ブロックの一方がオーバーフローした時を決定する工程と、
前記第２ブロックがオーバーフローしたことが確定した際、前記複数のブロックから選択した第３ブロックを前記第１スレッドへ割り当てる工程と、
前記第１ブロックがオーバーフローしたことが確定した際、前記第３ブロックを第２スレッドへ割り当てる工程とをさらに含む方法。
【請求項８】
請求項７に記載の方法において、前記第１ブロックがオーバーフローしたことが確定した際、前記第１ブロックと置換するために、前記複数のブロックから選択した第４ブロックを割り当てる工程をさらに含む方法。
【請求項９】
請求項８に記載の方法において、前記複数のブロックが第４ブロックを含むか否かを決定する工程を含む方法。
【請求項１０】
請求項５ないし請求項９のいずれか一項に記載の方法において、前記複数のブロックが第２ブロックを含むか否かを決定する工程を含む方法。
【請求項１１】
請求項１０に記載の方法において、前記複数のブロックが前記第２ブロックを含まないことが確定した際、
前記第１ブロックに関連するメモリ・スペースを解放するために、ガーベッジ・コレクションを前記共有メモリ領域で実施する工程と、
前記複数のブロックから選択した新たな第１ブロックを、前記第１スレッド及び第２スレッドの両方からアクセスできるように割り当てる工程と
を含む方法。
【請求項１２】
請求項１０に記載の方法において、前記複数のブロックが前記第２ブロックを含まないことが確定した際、
前記複数のブロックに関連するメモリ・スペースを解放するために、ガーベッジ・コレクションを前記共有メモリ領域で実施する工程と、
前記第１スレッドが高速アロケーティング・スレッドであるか否かを決定する工程と、
前記第１スレッドが高速アロケーティング・スレッドであることが確定した際、前記複数のブロックから選択した第３ブロックを前記第１スレッドへ割り当てる工程と
を含む方法。
【請求項１３】
請求項１２に記載の方法において、前記複数のブロックから選択した新たな第１ブロックを前記第２スレッドがアクセスできるように割り当てる工程をさらに含む方法。
【請求項１４】
請求項１３に記載の方法において、前記第１スレッドが高速アロケーティング・スレッドであるか否かを決定する工程は、
オブジェクトを前記第１ブロック内でアロケートすることを試みるべく前記第１スレッドが設けられているか否かを決定する工程と、
オブジェクトを前記第１ブロック内でアロケートすることを試みるべく前記第１スレッドが設けられていることが確定した際、前記第１スレッドのアロケーション・ルーチンをロッキングへ設定する工程と、
オブジェクトを前記第１ブロック内でアロケートすることを試みるべく前記第１スレッドが設けられていないことが確定した際、前記第１スレッドがアロケートしたメモリが閾値を越えたか否かを決定する工程と、
前記第１スレッドがアロケートしたメモリが前記閾値を越えたと判定した際、前記第１スレッドのアロケーション・ルーチンをノンロッキングへ設定する工程と
を含む方法。
【請求項１５】
請求項５または請求項６に記載の方法において、前記第１ブロックがオーバーフローしたことが確定した際、前記第１ブロックを置換するために、前記複数のブロックから選択した第３ブロックを割り当てる工程をさらに含む方法。
【請求項１６】
請求項５ないし請求項１５のいずれか一項に記載の方法において、前記第１スレッドが前記第１ブロックのオーバーフローを引き起こしたことが確定した際、前記第１スレッドに関連するカウンタをインクリメントする工程をさらに含み、前記カウンタは前記第２ブロックを前記第１スレッドへ割り当てる時を示すために設けられている方法。
【請求項１７】
請求項１６に記載の方法において、前記カウンタが閾値を越えた時を決定する工程をさらに含み、前記カウンタが閾値を越えていることが確定するまで、前記第２ブロックを第１スレッドへ割り当てない方法。
【請求項１８】
請求項５ないし請求項１７のいずれか一項に記載の方法において、前記複数のブロックに含まれる各ブロックは実質的に全て同じサイズである方法。
【請求項１９】
請求項１８に記載の方法において、前記複数のブロックに含まれる各ブロックのサイズは約２キロバイトから約３２キロバイトの範囲内である方法。
【請求項２０】
マルチスレッド・コンピューティング・システム内の共有メモリをアロケートする方法であって、前記マルチスレッド・コンピューティング・システムが第１スレッド及び第２スレッドを少なくとも有する方法において、
前記共有メモリを、第１サイズの複数のブロックと、第２サイズの少なくとも１つのブロックとを含む複数のブロックへ分割する工程と、
前記第１サイズの複数のブロックから選択した第１ブロックを、第１オブジェクトを前記第１ブロック内でアロケートすることを試みるべく設けられた第１スレッドへ割り当てる工程と、
前記第１サイズの複数のブロックから選択した第２ブロックを、第２オブジェクトを前記第２ブロック内でアロケートすることを試みるべく設けられた第２スレッドへ割り当てる工程と、
前記第１ブロック及び第２ブロックの一方がオーバーフローした時を決定する工程と、
前記第２サイズの第３ブロックが利用可能であるか否かを決定する工程と、
前記第３ブロックが利用可能であることが確定し、かつ前記第１ブロックがオーバーフローしたことが確定した際、前記第３ブロックを第１スレッドへ割り当てる工程と、
前記第３ブロックが利用可能であることが確定し、かつ前記第２ブロックがオーバーフローしたことが確定した際、前記第３ブロックを第２スレッドへ割り当てる工程と
を含む方法。
【請求項２１】
請求項２０に記載の方法において、オブジェクトを前記第２ブロック内でアロケートすることを試みるべく前記第１スレッドは設けられておらず、オブジェクトを前記第１ブロック内でアロケートすることを試みるべく前記第２スレッドは設けられておらず、前記第３ブロックが前記第１スレッドへ割り当てられた際、オブジェクトを前記第３ブロック内でアロケートすることを試みるべく前記第２スレッドは設けられておらず、前記第３ブロックが前記第２スレッドへ割り当てられた際、オブジェクトを前記第３ブロック内でアロケートすることを試みるべく前記第１スレッドは設けられていない方法。
【請求項２２】
請求項２０または請求項２１に記載の方法において、前記第１サイズの複数のブロックは、前記第２サイズの少なくとも１つのブロックより大きいサイズを有する方法。
【請求項２３】
請求項２０ないし請求項２２のいずれか一項に記載の方法において、前記第３ブロックが利用可能でないことが確定した際、前記複数のブロックをクリアすべくガーベッジ・コレクションを実施する工程をさらに含む方法。
【請求項２４】
メモリ、第１スレッド及び第２スレッドを有し、かつメモリをアロケートすべく設けられているマルチスレッド・コンピュータ・システムであって、前記メモリは前記第１スレッド及び第２スレッドの両方からのアクセスが可能なマルチスレッド・コンピュータ・システムにおいて、
前記第１スレッドに関連する第１プロセッサと、
前記第２スレッドに関連する第２プロセッサと、
前記メモリを複数のブロックへ分割すべく設けられたメモリ・パーティショナと、
前記複数のブロックから選択した第１ブロックを、前記第１スレッド及び第２スレッドの両方からアクセスできるブロックとして割り当てるべく設けられたブロック・アサイナと、第１オブジェクトを前記第１ブロック内でアロケートすることを試みるべく前記第１スレッドは設けられ、第２オブジェクトを前記第１ブロック内でアロケートすることを試みるべく前記第２スレッドは設けられていることと、
前記第１ブロックがオーバーフローした時を決定するために設けられた第１決定機構と、
前記第１ブロックがオーバーフローしたことが確定した際、前記第１オブジェクトを第１ブロック内でアロケートする前記第１スレッドの試みが、前記第１ブロックのオーバーフローを引き起こしたか否かを決定するために設けられた第２決定機構と、
前記第１オブジェクトを前記第１ブロック内でアロケートする前記第１スレッドの試みが、前記第１ブロックのオーバーフローを引き起こしたことが確定した際、前記複数のブロックから選択した第２ブロックを前記第１スレッドへ割り当てるべく設けられた第２ブロック・アサイナと、前記第２ブロックを前記第１スレッドへ割り当てることは、前記第１スレッドがオブジェクトを前記第１ブロック内でアロケートすることをそれ以降試みないようにすべく行われること
を含むマルチスレッド・コンピュータ・システム。
【請求項２５】
請求項２４に記載のマルチスレッド・コンピュータ・システムにおいて、
前記第１ブロック及び第２ブロックの一方がオーバーフローした時を決定すべく設けられた第３決定機構と、
前記第２ブロックがオーバーフローしたことが確定した際、前記複数のブロックから選択した第３ブロックを前記第１スレッドへ割り当てるために設けられ、かつ前記第１ブロックがオーバーフローしたことが確定した際、前記第３ブロックを前記第２スレッドへ割り当てるためにも設けられている第３ブロック・アサイナと
をさらに含むマルチスレッド・コンピュータ・システム。
【請求項２６】
自身に関連する共有メモリをアロケートすべく設けられたマルチスレッド・コンピュータ・システムであって、第１スレッド及び第２スレッドを少なくとも有するマルチスレッド・コンピュータ・システムにおいて、
前記第１スレッドに関連する第１プロセッサと、
前記第２スレッドに関連する第２プロセッサと、
前記共有メモリを、第１サイズの複数のブロックと、第２サイズの少なくとも１つのブロックとを含む複数のブロックへ分割すべく設けられたメモリ・アロケータと、
前記第１サイズの複数のブロックから選択した第１ブロックを、第１オブジェクトを前記第１ブロック内でアロケートすることを試みるべく設けられた第１スレッドへ割り当てるために設けられた第１割り当て機構と、
前記第１サイズの複数のブロックから選択した第２ブロックを、第２オブジェクトを前記第２ブロック内でアロケートすることを試みるべく設けられた第２スレッドへ割り当てるために設けられた第２割り当て機構と、
前記第１ブロック及び第２ブロックの一方がオーバーフローした時を決定するために設けられた第１決定機構と、
前記第２サイズの第３ブロックが利用可能であるか否かを決定するために設けられた第２決定機構と、
前記第３ブロックが利用可能であることが確定し、かつ前記第１ブロックがオーバーフローしたことが確定した際、前記第３ブロックを第１スレッドへ割り当てるために設けられるとともに、前記第３ブロックが利用可能であることが確定し、かつ前記第２ブロックがオーバーフローしたことが確定した際、前記第３ブロックを第２スレッドへ割り当てるためにも設けられている第３割り当て機構と
を有するマルチスレッド・コンピュータ・システム。
【請求項２７】
請求項２６に記載のマルチスレッド・コンピュータ・システムにおいて、前記第１サイズの複数のブロックは前記第２サイズの少なくとも１つのブロックより大きいサイズを有するマルチスレッド・コンピュータ・システム。
【請求項２８】
マルチスレッド・コンピューティング・システム内の共有メモリをアロケートするためのコンピュータ・プログラムであって、前記マルチスレッド・コンピューティング・システムが第１スレッド及び第２スレッドを少なくとも有するコンピュータ・プログラムを格納するコンピュータ読み取り可能媒体であって、前記コンピュータ・プログラムは、
前記共有メモリを複数のブロックへ分割する機能と、
前記複数のブロックから選択した第１ブロックを前記第１スレッド及び第２スレッドの両方がアクセスできるブロックとして割り当てる機能と、第１オブジェクトを前記第１ブロック内でアロケートすることを試みるべく前記第１スレッドは設けられ、第２オブジェクトを前記第１ブロック内でアロケートすることを試みるべく前記第２スレッドは設けられていることと、
前記第１ブロックがオーバーフローした時を決定する機能と、
前記第１ブロックがオーバーフローしたことが確定した際、前記第１オブジェクトを第１ブロック内でアロケートする前記第１スレッドの試みが、第１ブロックのオーバーフローを引き起こしたか否かを決定する機能と、
前記第１オブジェクトを第１ブロック内でアロケートする前記第１スレッドの試みが、前記第１ブロックのオーバーフローを引き起こしたことが確定した際、前記複数のブロックから選択した第２ブロックを前記第１スレッドへ割り当てる機能と、前記第２ブロックを前記第１スレッドへ割り当てることは、前記第１スレッドがオブジェクトを前記第１ブロック内でアロケートすることをそれ以降試みないようにすべく行われることと、
をコンピュータによって実現させる、コンピュータ読み取り可能媒体。
【請求項２９】
請求項２８に記載のコンピュータ読み取り可能媒体において、前記コンピュータ読み取り可能媒体は、ＣＤ−ＲＯＭ、コンピュータ・ディスク、コンピュータ・テープ及びコンピュータ・ディスク・ドライブのうちのいずれか１つであるコンピュータ読み取り可能媒体。
【請求項３０】
マルチスレッド・コンピューティング・システム内の共有メモリをアロケートするためのコンピュータ・プログラムであって、前記マルチスレッド・コンピューティング・システムが第１スレッド及び第２スレッドを少なくとも有するコンピュータ・プログラムを格納するコンピュータ読み取り可能媒体であって、前記コンピュータ・プログラムは、
前記共有メモリを、第１サイズの複数のブロックと、第２サイズの少なくとも１つのブロックとを含む複数のブロックへ分割する機能と、
前記第１サイズの複数のブロックから選択した第１ブロックを、第１オブジェクトを前記第１ブロック内でアロケートすることを試みるべく設けられた第１スレッドへ割り当てる機能と、
前記第１サイズの複数のブロックから選択した第２ブロックを、第２オブジェクトを前記第２ブロック内でアロケートすることを試みるべく設けられた第２スレッドへ割り当てる機能と、
前記第１ブロック及び第２ブロックの一方がオーバーフローした時を決定する機能と、
前記第２サイズの第３ブロックが利用可能であるか否かを決定する機能と、
前記第３ブロックが利用可能であることが確定し、かつ前記第１ブロックがオーバーフローしたことが確定した際、前記第３ブロックを第１スレッドへ割り当てる機能と、
前記第３ブロックが利用可能であることが確定し、かつ前記第２ブロックがオーバーフローしたことが確定した際、前記第３ブロックを第２スレッドへ割り当てる機能と
をコンピュータによって実現させる、コンピュータ読み取り可能媒体。
【請求項３１】
請求項３０に記載のコンピュータ読み取り可能媒体において、前記コンピュータ読み取り可能媒体は、ＣＤ−ＲＯＭ、コンピュータ・ディスク、コンピュータ・テープ及びコンピュータ・ディスク・ドライブからなるグループから選択した１つであるコンピュータ読み取り可能媒体。
【請求項３２】
マルチスレッド・コンピューティング・システム内の共有メモリをアロケートすべくコンピュータに実装する方法であって、前記マルチスレッド・コンピューティング・システムが第１スレッド及び第２スレッドを少なくとも有する方法において、
前記メモリを複数のブロックへ分割する工程と、前記複数のブロックは第１ブロック及び第２ブロックを含み、前記第１ブロックは前記第２ブロックよりサイズが実質的に小さく、前記第１ブロックが１ＫＢから４ＫＢの範囲のサイズを有し、前記第２ブロックが１６ＫＢから３２ＫＢの範囲のサイズを有することと、
前記第１ブロックを前記第１スレッドがアクセスできるように割り当てる工程と、前記第１スレッドは低速アロケーティングスレッドであり、第１オブジェクトを前記第１ブロック内でアロケートすることを試みるべく設けられており、複数のスレッドを含むように構成されている第１グループと関連付けられていることと、
前記第２ブロックを前記第２スレッドがアクセスできるように割り当てる工程と、前記第２スレッドは高速アロケーティングスレッドであり、第２オブジェクトを前記第２ブロック内でアロケートすることを試みるべく設けられ、前記第１オブジェクトを前記第２ブロック内でアロケートすることを試みるべく前記第１スレッドは設けられておらず、前記第２オブジェクトを前記第１ブロック内でアロケートすることを試みるべく前記第２スレッドは設けられていないこと
を含む方法。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
一般的に、本発明はコンピュータ・システム内におけるメモリ・アロケーションに関する。より詳細には、本発明はオブジェクトベースのマルチスレッド・コンピュータ・システム内における効率的な低オーバーヘッド・メモリ・アロケーションに関する。
【０００２】
【従来の技術】
コンピュータ技術分野での仮想マシンの利用が増大することにより、仮想マシンの全体効率の改善が更に重要になってきた。一般的に、仮想マシンを有するコンピュータ・システムに関連するメモリの量は限られている。この場合、メモリを節約し、かつリサイクルする必要が一般的にある。多くのコンピュータ・プログラミング言語は、ソフトウェア開発者がコンピュータ・システム内のメモリを動的にアロケートすることを可能にするが、他のプログラミング言語は、以前にアロケートしたメモリの明示的マニュアル・デアロケーションを必要とする。そして、このデアロケーションは複雑であって、エラーを起こし易い。明示的マニュアル・メモリ管理を必要とする言語はＣ及びＣ＋＋プログラミング言語を含む。メモリをリクラメーション・システムからアロケートするコンピュータ・プログラムの適切なオペレーションを保証すべく、必要のないメモリをリクレームするために、他のプログラミング言語はオートマチック・ストレージ・リクラメーションを使用している。このようなオートマチック・ストレージ・リクラメーション・システムは、メモリを以前使用していたコンピュータ・プログラムからの明示的命令、即ち、呼び出しを受けることなく、そのメモリをリクレームする。
【０００３】
オブジェクト指向システム、即ち、オブジェクト・ベースのシステムでは、当業者が理解するように、メモリ・アロケーションの一般的なユニットはオブジェクトまたはメモリ・オブジェクトと一般的に称される。使用中のオブジェクトは“ライブ”オブジェクトと一般的に称され、コンピュータ・プログラムを正しく実行するために必要なくなったオブジェクトは“ガーベッジ”オブジェクトと一般的に称される。ガーベッジ・オブジェクトをリクレームする行為はガーベッジ・コレクションと一般的に称される。そして、オートマチック・ストレージ・リクラメーション・システムはガーベッジ・コレクタと称されることが多い。ジャバ（Java、商標）プログラミング言語（サンマイクロシステムズ・インコーポレイテッドが開発）及びスモールトーク・プログラミング言語などの言語で書かれたコンピュータ・プログラムは、メモリを自動的に管理するためにガーベッジ・コレクションを使用する。
【０００４】
一般的に、コンパクティング・ガーベッジ・コレクタの使用は、オブジェクトを比較的迅速にアロケートすることを可能にする。即ち、コンパクティング・ガーベッジ・コレクタを使用する１つの効果としては、オブジェクトの高速アロケーションが挙げられる。オブジェクトは連続メモリ領域（例：アロケーション領域）内でアロケートできる。この結果、アロケーション・ポインタを所望の記憶量だけインクリメントすることによって、オブジェクトのアロケーションを実行可能である。アロケーション領域の末端へ到達した際、ガーベッジ・コレクションを実施し得る。
【０００５】
ガーベッジ・コレクションの１つの方法としては、世代別ガーベッジ・コレクションが挙げられる。世代別ガーベッジ・コレクションでは、オブジェクトを形成した時点からのオブジェクトの寿命に基づいて、オブジェクトを分離する。“若い方”のオブジェクトは“古い方”のオブジェクトよりガーベッジになりやすいことが確認されている。この場合、世代別ガーベッジ・コレクションはメモリ・リクラメーションの全体効率を高めるために使用される。
【０００６】
世代別ガーベッジ・コレクションを使用するシステムでは、新たなオブジェクトのアロケーションを行うための特別なメモリ領域が指定されている。新たなオブジェクトをこのメモリ領域内でアロケートするため、一般的に、このメモリ領域は“育成場所（nursery）”と見なされている。当業者が理解するように、多くの場合、このメモリ領域は“エデン（Eden）”と称される。
【０００７】
図１は単一のスレッドと、このスレッド専用のメモリ・アロケーション領域とを示す図である。このメモリ・アロケーション領域は、世代別ガーベッジ・コレクションを使用するシングル・スレッド・システム内でのインプリメンテーションに適する。図示するように、エデンとして知られるメモリ・アロケーション領域１０２は、アロケーション・ポインタ１０４によって索引付けされる。一般的に、エデン１０２は新たなオブジェクトをその中で形成できるメモリのブロックである。エデン１０２に関連付けられたスレッド１０６が新たなオブジェクトをアロケートすることを試みた際、一般的に、アロケーション・ポインタ１０４を新たなオブジェクトのサイズだけインクリメントする。次いで、アロケーション・ポインタ１０４がエデン１０２の末端へ到達したか否かを決定するためのチェックを行う。エデン１０２の末端に到達したことが確定した際、エデン１０２を事実上空にするために、世代別ガーベッジ・コレクションを実施し、これによって、スレッド１０６によるエデン１０２内での新たなオブジェクトの形成を可能にする。
【０００８】
図１に基づいて詳述したメモリ及び新たなオブジェクトのアロケーションはシングル・スレッド・システム内では効果的である。しかし、一般的に、このメモリ及びオブジェクトのアロケーションは複数の中央処理装置（ＣＰＵ）を有するマルチスレッド・システム内では使用できない。例えば、２つのスレッドが単一のエデン内のスペースをリクエストすることを並行して試みた際、並行性の問題が生じ得る。この場合、マルチスレッド・システムでは、エデンが共有リソースである際、任意の時点における複数のスレッドによるエデン内でのアロケーティングを防止するために、エデンへのアクセスは同期を一般的に必要とする。エデンへのアクセスの同期化は、エデンへのアロケーション・ロックの関連付けを含む。スレッドが新たなオブジェクトの形成を望む際、このスレッドはアロケーション・ロックを獲得する。そして、新たなオブジェクトを形成した後、このスレッドはアロケーション・ロックを解除する。
【０００９】
図２は２つのスレッドと、これら２つのスレッドがマルチスレッド・システム内で共有するメモリ・アロケーション領域とを示す図である。エデン１１２の未使用部分１１５の開始位置を表示するために設けられた関連するアロケーション・ポインタ１１４をエデン１１２は有する。エデン１１２を共有する２つのスレッド１１６，１１８が新たなオブジェクトをエデン１１２内でアロケートすることを望む際、これらのスレッド１１６，１１８はエデン１１２に関連付けられたアロケーション・ロック（図示略）を獲得する必要がある。具体的には、スレッド１１６が未使用部分１１５へのアクセスを望む際、このスレッド１１６はアロケーション・ロックをエデン１１２上で獲得する必要がある。スレッド１１６がアロケーション・ロックを獲得し、かつアロケーション・ポインタ１１４がエデン１１２の末端へ到達していないことが確定した後、スレッド１１６はアロケーション・ポインタ１１４をインクリメントし、かつ新たなオブジェクトをアロケートし得る。アロケーション・ポインタ１１４がエデン１１２の末端まで達した場合、即ち、未使用部分１１５がヌルの際、エデン１１２を事実上空にし、これによってスレッド１１６，１１８による新たなオブジェクトの形成を可能にするために、ガーベッジ・コレクションを実施する。
【００１０】
エデンへのアクセスを同期化した際、エデンに関連付けられたアロケーション・ロックの獲得及び解除に関連するオーバーヘッドに起因して、エデン内における新たなオブジェクトのアロケーションは一般的に大幅に遅くなる。スレッドが新たなオブジェクトをエデン内で形成することを望む毎に、このスレッドはエデンに対する独占権を獲得する必要がある（例えば、アロケーション・ロックの獲得によって）。一般的に、ハードウェアが直接インプリメントする“高速”ロッキング・プリミティブ（例：コンペア・アンド・スワップ・プリミティブ）と称されるプリミティブであっても、アロケーションに関連するベース・コストと比べた際、アロケーションの速度は相対的に遅い。例えば、マルチプロセッサ・システムでは、当業者が理解するように、ロッキング・プリミティブはリモート・キャッシュ・ミスを招来し得る。このシステムでは、多くの場合、同期機能の追加はアロケーションのコストを大幅（例：２倍または３倍）に増大する。したがって、アロケーション中における同期の追加は総合システムのパフォーマンスに大きく影響する。
【００１１】
マルチスレッド・システム内におけるエデンへのアクセスに関連するパフォーマンスを同期を使用せずに改善するために、独自のエデンをマルチスレッド・システム内の各スレッドへ割り当てる。即ち、各スレッドが独自のエデンを有する際、複数のスレッドが共有エデンへのアクセスを試みた際に生じる並行性の問題を防止できる。図３は２つのスレッドと、これら２つのスレッドの独自のエデン、即ち、メモリ・アロケーション領域とを示す図である。マルチスレッド・システム２００内において、アロケーション・ポインタ２０４が参照する第１エデン２０２は第１スレッド２０６に関連付けられている。マルチスレッド・システム２００は第２エデン２１２を有する。第２エデン２１２はアロケーション・ポインタ２０４によって参照され、かつ第２スレッド２１６に関連付けられている。
【００１２】
第１スレッド２０６が新たなオブジェクトのアロケーションを望む際、この第１スレッド２０６は第１エデン２０２へアクセスする。同様に、第２スレッド２１６が新たなオブジェクトのアロケーションを望む際、この第２スレッド２１６は第２エデン２１２へアクセスする。各スレッド２０６，２１６が独自の専用エデン、即ち、エデン２０２，２１２を有することにより、新たなオブジェクトを形成するために、２つのスレッドが単一エデンへのアクセスを任意の時点でそれぞれ試みることを防止するアロケーション・ロックは必要なくなる。
【００１３】
独立したエデンをマルチスレッド・システム内の各スレッドへアロケートすることによって、アロケーション・ロックの必要性を排除できる。しかし、多くの場合、独立したエデンのアロケーティングは多くのメモリを必要とする。例えば、幾つかのアプリケーションは数百または数千のスレッドを含む。更に、幾つかのスレッドは他のスレッドより更に速くオブジェクトをアロケートし、これによって、更に多くのメモリを必要とし得る。更に多くのメモリの必要性は、ある種の同期を必要とするメモリ全体に対する頻繁なガーベッジ・コレクション（例：全てのエデン上で実施するグローバル・ガーベッジ・コレクション）を引き起こし得る。この場合、幾つかのエデンが依然かなり空いているのに対し、他のエデンはその能力一杯まで満たされているため、複数のエデン上でのガーベッジ・コレクションの実施に関連する全体的なオーバーヘッドは増大し、かつ総合システムのパフォーマンスに悪影響を及ぼし得る。
【００１４】
マルチスレッド・システム内において、独立したエデンを複数のスレッドへそれぞれアロケートすることに関連する多くのメモリの使用と、ガーベッジ・コレクションに関連する全体的なオーバーヘッドの増大とは非効率的であり、かつ大きな費用を必要とする。使用するメモリの量と、ガーベッジ・コレクションの頻度とを低減することは、効率を高め、かつマルチスレッド・システムに関連するコストを一般的に低減する。一般的に、１つのエデンを複数のチャンク、即ち、ブロックへ分割することにより、アロケーション・ロックを要することなくエデンを共有できる。図４は２つのスレッドと、これら２つのスレッドが共有するメモリ・アロケーション領域とを示す図であり、このメモリ・アロケーション領域は複数のチャンクへ分割されている。マルチスレッド・システム２３０はエデン２３２を有し、エデン２３２は一定のサイズを有する複数のチャンク２３３へ分割されている。換言するならば、全てのチャンク２３３はほぼ同じサイズである。先頭チャンクをエデン２３２を共有する各スレッド２３６，２３８へアロケートする。例えば、チャンク２３３ａをスレッド２３６へ最初にアロケートし、チャンク２３３ｂをスレッド２３８へ最初にアロケートする。
【００１５】
スレッド（例：スレッド２３６）がチャンク２３３ａを満たした際、別のチャンク２３３ｃをスレッド２３６へアロケートする。利用可能な全てのチャンク２３３が枯渇するまでチャンク２３３をスレッドへアロケートする。そして、利用可能な全てのチャンク２３３が無くなった際、ガーベッジ・コレクションを実施する。チャンク２３３に関するリクエストは同期しているが、この同期は前記のアロケーション同期ほど頻繁に行われないことを理解する必要がある。
【００１６】
各チャンク２３３は大型オブジェクトを保持できるサイズに形成する必要がある。このため、スレッド２３６，２３８へのチャンク２３３のアロケーションは実質的な断片化を招来することが多い。したがって、チャンクが部分的に満たされ、スレッドが形成した大型オブジェクトが、この部分的に満たされたチャンクに収まらなくなった際、大型オブジェクトを収容するために、新たなチャンクをスレッドへアロケートする。部分的に満たされたチャンク内に残されたスペースは事実上無駄になる。更に、低速アロケーティング・スレッドが実質的に空のチャンクを占有し、これによって、不必要なメモリ・スペースをリザーブした際、チャンク内のスペースのアロケーションは非効率的になる。
【００１７】
したがって、マルチスレッド・仮想マシンなどのマルチスレッド・システム内のメモリを効率的にアロケートするための方法及び装置が望まれる。具体的には、メモリ・スペースを最小限に抑制し、アロケーション・コストを最小限に抑制し、さらにはガーベッジ・コレクションの効率を改善する一方で、スレッドが新たなオブジェクトをメモリ・アロケーション領域（例：エデン）内で形成することを可能にする方法及び装置が必要である。
【００１８】
【発明の概要】
本発明はマルチスレッド・コンピュータ・システムにおける共有メモリの効率的なアロケーションに関する。本発明の１つの実施形態に基づき、マルチスレッド・コンピューティング・システム内の複数のスレッドが共有しているメモリをアロケートすべく、コンピュータに実装する方法は、共有メモリを複数のブロックへ分割する工程と、複数のスレッドを少なくとも第１グループ及び第２グループへグループ分けする工程とを含む。選択したブロックを選択したスレッドへアロケートする。この選択したスレッドは、オブジェクトを選択したブロック内でアロケートすることを試み得る。選択したスレッドへの選択したブロックのアロケーションは、選択したスレッドが第１グループ及び第２グループのうちのいずれの一部であるかということに少なくとも部分的に基づいて実施される。１つの実施形態では、複数のスレッドを第１グループ及び第２グループへグループ分けする工程は、特定のスレッドを識別する工程と、この特定のスレッドが高速アロケーティング・スレッドであるか否かを決定する工程とを含む。
【００１９】
本発明の別の態様に基づき、第１スレッド及び第２スレッドを少なくとも有するマルチスレッド・コンピューティング・システム内の共有メモリをアロケートすべく、コンピュータに実装する方法は、共有メモリを複数のブロックへ分割する工程と、新たなオブジェクトを形成するために、第１スレッド及び第２スレッドの両方がアクセスできる第１ブロックを割り当てる工程とを含む。システムの実行を許可した後、第１ブロックがオーバーフローしたか否かを事実上決定する。第１ブロックがオーバーフローしたことが確定した場合、第１オブジェクトを第１ブロック内でアロケートする第１スレッドの試みが、第１ブロックのオーバーフローを引き起こしたか否かを決定する工程を、この方法は含む。前記の第１スレッドの試みが第１ブロックのオーバーフローを引き起こしたことが確定した場合、第２ブロックを第１スレッドへ割り当てる。第１スレッドへの第２ブロックの割り当てにより、オブジェクトを第１ブロック内でアロケートする能力を第１スレッドは事実上放棄する。
【００２０】
本発明の更に別の態様では、マルチスレッド・コンピューティング・システム内のメモリをアロケートすべくコンピュータに実装する方法は、メモリを複数のブロックへ分割する工程を含み、前記の複数のブロックは第１ブロックと、第１ブロックより実質的に大きい第２ブロックとを含む。第１ブロックは第１スレッドがアクセスできるように割り当てられており、第１スレッドは第１オブジェクトを第１ブロック内でアロケートすることを試みるべく設けられている。更に、第２スレッドが第２オブジェクトを第１ブロック内でアロケートすることを試みるために、第２ブロックは第２スレッドがアクセスできるように割り当てられている。
【００２１】
以下の詳細な説明を読み、かつ複数の図面を研究することにより、本発明を更に容易に理解できる。
【００２２】
【発明の実施の形態】
多くの場合、マルチスレッド・システム内の共有メモリ（例：“エデン”）のアロケーティングに関連するオーバーヘッドは大きい。独立したエデンをマルチスレッド・システム内の各スレッドへアロケートすることにより、同期に関連するアロケーション・ロックの必要は無くなる。しかし、多くの場合、独立したエデンのアロケーティングは多くのメモリを必要とし、かつ更に頻繁なガーベッジ・コレクションを引き起こし、これによって、総合システムのパフォーマンスに潜在的に悪影響を及ぼす。
【００２３】
複数のスレッドが共有するエデンを均等な複数のチャンク、即ち、ブロックへ分割し、これによって、各スレッドは独自のブロックを持つことができる。各スレッドによる独自のブロックの保有を可能にすることにより、アロケーション・ロックを要することなく、エデンを共有できる。しかし、エデンを均等な複数のチャンクへ分割し、各スレッドによる独自のブロックの保有を可能にすることにより、大きな断片化を生じることが多い。例えば、チャンクが部分的に満たされていて、スレッドが形成した大型オブジェクトが、この部分的に満たされたチャンクに収まらない際、大型オブジェクトを収容するために、新たなチャンクをスレッドへアロケートする。そして、部分的に満たされたチャンク内に残されたスペースは事実上無駄になる。更に、オブジェクトを希にアロケートするスレッドが実質的に空のチャンクを占有し、これによって、不必要なメモリ・スペースをリザーブした際、チャンク内のスペースのアロケーションは非効率的になる。スレッドが不必要なメモリ・スペースをリザーブした際、このメモリ・スペースはメモリ・スペースを必要とするスレッドから事実上奪い去られる。更に、追加メモリ・スペースを必要とするスレッドによるメモリの使用を可能にすべくメモリを解放するために、大きなオーバーヘッドをともなう更に頻繁なガーベッジ・コレクションが生じる。
【００２４】
オブジェクトを希にアロケートする複数のスレッドが、共有メモリ・アロケーション領域のチャンク、即ち、ブロックを共有することを可能にする。その一方で、“プライベート”メモリ・ブロック、即ち、非共有メモリ・ブロックを、オブジェクトを頻繁にアロケートするスレッドへ提供する。これにより、更に多くのメモリ・スペースを、より多くのメモリを必要とするスレッドにだけ効果的に提供する。この結果、ガーベッジ・コレクションの実施前に、更に多くのメモリ・スペースが満たされる。更に、ガーベッジ・コレクションの頻度も減少する。低速アロケーティング・スレッド（例：オブジェクトを希にアロケートするスレッド）が共有ブロックへアクセスする際、同期を使用する。しかし、多くの場合、低速アロケーティング・スレッドは共有メモリへ頻繁にアクセスする必要がない、即ち、共有メモリ内で頻繁にアロケートする必要がないため、同期コストは比較的低い。この場合、同期に関連するオーバーヘッドは比較的小さいと考えられる。
【００２５】
共有メモリ領域内における新たなオブジェクトのアロケーションでの同期を省くために、複数の異なるサイズのブロックを共有メモリ領域内で形成し、これによって、プライベート・ブロックを全てのスレッドへそれぞれ割り当てる。具体的には、小さい方のプライベート・ブロックを潜在的な低速アロケーティング・スレッドへ割り当て、大きい方の非共有ブロックを潜在的な高速アロケーティング・スレッドへ割り当てる。小さい方のブロックを低速アロケーティング・スレッドへ割り当て、大きい方のブロックを高速アロケーティング・スレッドへ割り当てることにより、僅かなメモリを必要とするスレッドへ提供するメモリ・スペースより更に多くのメモリ・スペースを、多くのメモリを必要とするスレッドへ提供する。これは共有メモリ内の新たなオブジェクトのアロケーションに関連する同期オーバーヘッドをともなうことなく行われる。
【００２６】
実質的に同じサイズの複数のブロックへの共有メモリ領域の分割と、これら同じサイズのブロックのアロケーションに使用する方法とを、図５〜図１０に基づいて以下に詳述する。前記のように、本発明の１つの実施形態では、複数のスレッドがメモリのブロックを共有し、プライベート・メモリ・ブロックをこれら以外のスレッドへ割り当てる。図５は本発明の第１実施形態に基づく複数のスレッドと、これら複数のスレッドが共有するメモリ・アロケーション領域とを示す図である。総合システム３００は共有メモリ・アロケーション領域３０２を有する。１つの実施形態では、メモリ・アロケーション領域３０２はエデンである。しかし、一般的に、メモリ・アロケーション領域３０２は、新たなオブジェクトをその中でアロケートできる任意の共有メモリであり得ることを理解する必要がある。
【００２７】
メモリ・アロケーション領域３０２はほぼ同じサイズの複数のブロック３０４、即ち、チャンクへ分割されている。一般的に、ブロック３０４のサイズはシステム３００の要件に基づいて広範に変化し得る。例えば、システム３００が、関連するジャバ（商標）仮想マシン（サンマイクロシステムズ・インコーポレイテッドが開発）を有する場合、複数のブロック３０４はそれぞれ約２キロバイト（ｋＢ）から約３２ｋＢの間のサイズである。メモリ・アロケーション領域３０２の全体サイズは広範に変化し得ることを理解することが必要である一方、このシステムでは、メモリ・アロケーション領域３０２は約１２８ｋＢから約５１２ｋＢの範囲のサイズである。
【００２８】
システム３００内では、全ての高速アロケーティング・スレッド、即ち、大量のオブジェクトをメモリ・アロケーション領域３０２内でアロケートする全てのスレッド３０６は、独自の指定ブロック３０４を最終的に割り当てられる。本実施形態では、スレッド３０６ａ，３０６ｄは高速アロケーティング・スレッドの候補であり、したがって、各スレッド３０６ａ，３０６ｄはプライベート・ブロックへ関連付けられている。図６、図７、図９及び図１０に関連して以下に詳述するように、高速アロケーティング・スレッドと考えられるスレッド３０６は、共有ブロックをオーバーフローさせる（例：メモリ・スペースを使い尽くす）スレッド３０６である。一般的に、スレッド３０６ａ，３０６ｄが自身の指定ブロック（例：プライベート・ブロック）３０４をオーバーフローさせた際、追加ブロック３０４の利用が可能な限り、この追加ブロック３０４をスレッド３０６ａ，３０６ｄへ割り当てる。図示するように、スレッド３０６ａは３つのブロック３０４ｂ，３０４ｄ，３０４ｆを割り当てられており、このうちのブロック３０４ｂ，３０４ｄは満杯である。スレッド３０６ｄは２つのブロック３０４ｅ，３０４ｆを割り当てられており、このうちのブロック３０４ｅは満杯であり、ブロック３０４ｆは部分的に満たされている。スレッド３０６ａは独自のプライベート・ブロック３０４ｂ，３４０ｄ，３０４ｆを有するため、スレッド３０６ａが新たなオブジェクトを自分の複数のブロックのうちの１つへアロケートすることを試みる際、同期は必要ない。同様に、スレッド３０６ｄが新たなオブジェクトを自身の複数のブロックのうちの１つへアロケートすることを試みる際、スレッド３０６ｄはアロケーション・ロックまたはこれに類するデバイスを獲得する必要がない。
【００２９】
高速アロケーティング・スレッドと考えられないスレッド３０６（例：スレッド３０６ｂ，３０６ｃ）は共有ブロック（例：ブロック３０４ｃ）を割り当てられる。スレッド３０６ｂ，３０６ｃは共有ブロック３０４ｃを割り当てられ、これによって、これら２つのスレッド３０６ｂ，３０６ｃは新たなオブジェクトをブロック３０４ｃ内でアロケートする。スレッド３０６ｂ，３０６ｃがブロック３０４ｃへほぼ同時にアクセスする際、並行性の問題を防止するために、同期が一般的に使用される。しかし、スレッド３０６ｂ，３０６ｃは低速アロケーティング・スレッドと考えられるため、同期に関連するオーバーヘッドは一般的に小さい。即ち、スレッド３０６ｂ，３０６ｃは新たなオブジェクトをブロック３０４ｃ内でアロケートすることを稀に試みることが予期される。
【００３０】
共有可能な複数のブロックへ分割された共有メモリをアロケートする方法は様々であるが、このうちの幾つかの適切な方法を図６、図７、図８、図９及び図１０に基づいて以下に詳述する。図６では、本発明の第１実施形態に基づいて、複数のスレッドによって共有されるメモリをアロケートする第１の方法に関連する複数のステップを示す。即ち、図６は図５に基づいて詳述したように共有メモリ・システム内のメモリをアロケートする１つの方法に関連している。この方法では、共有メモリ・ブロックのオーバーフローを引き起こすスレッドは、高速アロケーティング・スレッドである可能性が統計学的に高いため、共有メモリ・ブロックがオーバーフローした全ての時点で、独自のメモリ・ブロックを、共有メモリ・ブロックのオーバーフローを引き起こしたスレッドへアロケートする。
【００３１】
メモリをアロケートする第１の方法はステップ４０２から始まる。ステップ４０２では、複数のメモリ・ブロックを共有メモリ・アロケーション領域（例：エデン）内でアロケートすることによって、共有メモリ・アロケーション領域を構築する。本実施形態では、アロケート、分割、または形成される複数のメモリ・ブロックは実質的に同じサイズである。このサイズは個々のシステムの要件に基づいて広範に変化し得る。しかし、一般的には、このサイズは約２ｋＢから約３２ｋＢの範囲である。
【００３２】
アロケーション領域内のメモリをアロケートした後、ステップ４０４では、新たなオブジェクトをアロケーション領域内でアロケートすることを試みる全てのスレッドのための共有ブロックとして、アロケーション領域内の第１ブロックを割り当てる。全てのスレッドのための共有ブロックを割り当てることにより、これらのスレッドのうちの１つが新たなオブジェクトをアロケートする毎に、この新たなオブジェクトを共有ブロック内でアロケートすることが試みられる。多くの場合、複数のスレッドがブロックを共有する際、アロケーション・ロックまたはこれに類するデバイスが、オブジェクト・アロケーション中における同期目的で使用されることを理解する必要がある。
【００３３】
共有ブロックを割り当てた後、総合システムをステップ４０６で実行する。換言するならば、スレッドに関連するコンピューティング・システムの実行を許可する。一般的に、前記の複数のスレッドのうちの１つがアロケーション領域内のブロック（例：共有ブロック）のオーバーフローを発見するまで、総合システムの実行を許可する。この場合、ブロックがオーバーフローしたか否かはステップ４０８で決定される。
【００３４】
共有ブロックなどのブロックがオーバーフローしたことがステップ４０８で確定するまで、ステップ４０６におけるシステムの実行の継続を許可する。ブロックがオーバーフローしたことが確定した際、プロセスの流れはステップ４１０へ移行する。ステップ４１０では、利用可能な次のブロックをアロケーション領域から獲得することが試みられる。ステップ４１２では、新たなブロックが利用可能であるか否かを決定する。即ち、利用可能な“フリー”メモリ・ブロックがアロケーション領域内にあるか否かを決定する。新たなブロックが利用可能である際、この新たなブロックを、システムの実行中にブロックのオーバーフローを引き起こしたスレッドへステップ４１４で割り当てる。当初は、即ち、プライベート・ブロックがスレッドへ割り当てられるまでは、前記の新たなブロックは共有ブロックのオーバーフローを引き起こしたスレッドへ割り当てられることを理解する必要がある。但し、プライベート・ブロックをスレッドへ割り当てた後では、このプライベート・ブロックまたは前記の共有ブロックがオーバーフローしていることになるため、新たなブロックはプライベート・ブロックを有するスレッドと、共有ブロックを共有している複数のスレッドとのいずれかへ割り当てられる。
【００３５】
一般的に、スレッドがプライベート・アロケーション・ブロック及び共有アロケーション・ブロックのうちのいずれを有するかに基づいて、このスレッドは２つのアロケーション・ルーチンのうちの１つを使用する。当業者が理解するように、プライベート・ブロックを有するスレッドはロッキング・オーバーヘッドを減らすためにノンロッキング高速アロケーション・ルーチンを使用し、共有ブロックを有するスレッドはロッキング低速アロケーション・ルーチンを使用する。したがって、スレッドがプライベート・ブロックを割り当てられた際、そのアロケーション・ルーチンはノンロッキング・ルーチンに一般的に設定される。逆に、スレッドがプライベート・ブロックを割り当てられた際、そのアロケーション・ルーチンはロッキング・ルーチンに一般的に設定される。
【００３６】
一般的に、共有ブロックのオーバーフローを引き起こすスレッドは、オブジェクトを比較的頻繁にアロケートする傾向にあるスレッドであることが予期される。この場合、プライベート・ブロックをこのスレッドへ割り当てることにより、共有ブロック上におけるアロケーション・ロックの獲得及び解除に関連するオーバーヘッドが減少する。新たなオブジェクトを頻繁にアロケートするスレッドは、アロケーション・ロックを使用しないプライベート・ブロックを一般的に割り当てられるため、このオーバーヘッドは一般的に減少する。多くの場合、共有ブロックを共有し続けるスレッドは新たなオブジェクトを希にアロケートするスレッドであるため、共有ブロックに関連するアロケーション・ロックの獲得及び解除に関連するオーバーヘッドは一般的に比較的小さい。
【００３７】
新たなブロックを、ブロックのオーバーフローを引き起こしたスレッドへステップ４１４で割り当てた後、オーバーフローしたブロックが共有ブロックであるか否かをステップ４１７で決定する。一般的に、スレッドがプライベート・ブロックを獲得した後では、ステップ４０８でオーバーフローの確定したブロックは、プライベート・ブロックまたは共有ブロックである。しかし、あらゆるプライベート・ブロックの割り当て前の段階では、オーバーフローしたブロックは共有ブロックである。
【００３８】
オーバーフローしたブロックが共有ブロックでないことが確定した際、これはオーバーフローしたブロックがプライベート・ブロックであることを意味する。オーバーフローしたブロックがプライベート・ブロックである場合、プロセスの流れはステップ４１７からステップ４０６へ移行し、スレッドがブロックのオーバーフローを発見するまで、総合システムの実行を許可する。これに代えて、オーバーフローしたブロックが共有ブロックであることがステップ４１７で確定した場合、利用可能な別の新たなブロックがアロケーション領域内に存在するか否かをステップ４１８で決定する。
【００３９】
利用可能な別のブロックがアロケーション領域内に存在することがステップ４１８で確定した場合、ステップ４２０において、満杯の共有ブロックを新たなブロックと置換する。満杯の共有ブロックを置換した後、ステップ４０６における総合システムの実行を許可する。しかし、利用可能なブロックがアロケーション領域内に事実上存在しないことが確定した場合、プロセスの流れはステップ４０６へ移行し、システムの実行を許可する。ブロック（例：共有ブロックまたはプライベート・ブロック）がオーバーフローするまで、満杯またはほぼ満杯の共有ブロックを有するシステムの実行を継続させることを理解する必要がある。
【００４０】
再びステップ４１２へ戻り、利用可能な新たなブロックが存在しないことが確定した際、ガーベッジ・コレクションをステップ４１６で実施する。実質的に任意のガーベッジ・コレクション・アルゴリズムを使用し得る。しかし、１つの実施形態では、世代別ガーベッジ・コレクション・アルゴリズムを使用する。一般的に、アロケーション領域のブロックに格納されたライブ・オブジェクトをコピーし、これによって、少なくとも幾つかのブロックを新たなアロケーションのために空にするために、世代別ガーベッジ・コレクション・アルゴリズム、即ち、世代別ガーベッジ・コレクタは設けられている。ガーベッジ・コレクションをステップ４１６で実施した後、プロセスの流れはステップ４０４へ戻り、アロケーション領域内の第１ブロックを全てのスレッドのための共有ブロックとして割り当てる。
【００４１】
図７は本発明の第１実施形態に基づくメモリをアロケートする第２のプロセスに関連する複数のステップを示すフローチャートであり、この第２のプロセスは特定のスレッドが高速アロケーティング・スレッドであるか否かの決定を可能にする。このメモリをアロケートする第２の方法はステップ４３２から始まる。ステップ４３２では、複数のメモリ・ブロックを共有メモリ・アロケーション領域（例：エデン）内でアロケートすることによって、共有メモリ・アロケーション領域を構築する。アロケーション領域内のメモリを複数のブロックへ実質的に分割した後、ステップ４３４では、新たなオブジェクトをアロケーション領域内でアロケートすることを試みる全てのスレッドのための共有ブロックとして、アロケーション領域内の第１ブロックを割り当てる。全てのスレッドのための共有ブロックを割り当てることにより、これらのスレッドのうちの１つが新たなオブジェクトをアロケートする毎に、この新たなオブジェクトを共有ブロック内でアロケートすることが試みられる。
【００４２】
共有ブロックを割り当てた後、総合システムをステップ４３６で実行する。一般的に、前記の複数のスレッドのうちの１つがアロケーション領域内のブロックのオーバーフローを発見するまで、総合システムの実行を許可する。事実上、この発見はブロックがオーバーフローしたことの確定である。したがって、ブロックがオーバーフローしたか否かをステップ４３８で決定する。
【００４３】
共有ブロックなどのブロックがオーバーフローしていないことがステップ４３８で確定した場合、ステップ４３６におけるシステムの実行の継続を許可する。これに代えて、ブロックがオーバーフローしていることが確定した場合、プロセスの流れはステップ４４０へ移行する。ステップ４４０では、利用可能な次のブロックをアロケーション領域から獲得することが試みられる。利用可能な次のブロックの獲得を試みた後、ステップ４４２において、新たなブロックが利用可能であるか否かを決定する。即ち、事実上未使用の利用可能なメモリ・ブロックがアロケーション領域内に存在するか否かを決定する。
【００４４】
利用可能な新たなブロックが存在しないことが確定した際、ステップ４５６において、ガーベッジ・コレクションを実施する。１つの実施形態では、ガーベッジ・コレクションは世代別ガーベッジ・コレクション・アルゴリズムを含む。図６に関連して詳述したように、アロケーション領域のブロックに格納されたライブ・オブジェクトをメモリの他の領域へコピーし、これによって、アロケーション領域の少なくとも幾つかのブロックを新たなアロケーションのために空にするために、世代別ガーベッジ・コレクション・アルゴリズムは設けられていることが多い。
【００４５】
ガーベッジ・コレクションをステップ４５６で実施した後、ステップ４５８において、高速アロケーティング・スレッドと考えられるスレッドを決定する。一般的に、高速アロケーティング・スレッドと考えられるスレッドの決定は、多くの新たなオブジェクトをアロケートするスレッドの決定である。高速アロケーティング・スレッドと考えられるスレッドを決定する１つの方法を図８に基づいて以下に詳述する。
【００４６】
高速アロケーティング・スレッドを識別した後、ステップ４６０において、新たなブロックを、高速アロケーティング・スレッドと考えられる各スレッドへ割り当てる。即ち、各高速アロケーティング・スレッドはプライベート・ブロックを割り当てられる。新たなブロック、即ち、新たなプライベート・ブロックを実質的に高速アロケーティング・スレッドに対してだけ割り当てることにより、プライベート・ブロックを以前保持していたスレッドであって、現在は高速アロケーティング・スレッドと考えられないスレッドは、不必要なメモリ・スペースのリザーブを阻止される。更に、高速アロケーティング・スレッドは高速非同期アロケーションの使用を継続する。
【００４７】
新たなブロックを高速アロケーティング・スレッドへ割り当てた後、ステップ４６２において、共有ブロックを他の全てのスレッドへ割り当てる。即ち、共有ブロックを高速アロケーティング・スレッドと考えられない全てのスレッドへ割り当てる。高速アロケーティング・スレッドと考えられないスレッド、即ち、低速アロケーティング・スレッドと考えられるスレッドは、共有ブロックを割り当てられる。そして、プロセスの流れはステップ４３６へ戻り、総合システムの実行を許可する。
【００４８】
再びステップ４４２へ戻り、新たなブロックが利用可能である際、ステップ４４４において、この新たなブロックを、システムの実行中にブロックのオーバーフローを引き起こしたスレッドへ割り当てる。プライベート・ブロックがスレッドへ割り当てられるまでは、新たなブロックは共有ブロックのオーバーフローを引き起こしたスレッドへ割り当てられることを理解する必要がある。このプライベート・ブロックまたは前記の共有ブロックがオーバーフローしていることにより、新たなブロックはプライベート・ブロックを有するスレッド（いずれかのスレッドがプライベート・ブロックを既に割り当てられている場合）と、共有ブロックを共有している複数のスレッドとのいずれかへ割り当てられる。
【００４９】
新たなブロックを、ブロックのオーバーフローを引き起こしたスレッドへ割り当てた後、ステップ４４７において、オーバーフローしたブロックが共有ブロックであるか否かを決定する。一般的に、少なくとも１つのスレッドがプライベート・ブロックを獲得した後では、ステップ４３８でオーバーフローの確定したブロックは、プライベート・ブロックまたは共有ブロックである。しかし、共有ブロックは全てのスレッドに割り当てられた唯一のブロックであるため、あらゆるプライベート・ブロックの割り当て前の段階では、オーバーフローしたブロックは共有ブロックである。
【００５０】
オーバーフローしたブロックが共有ブロックでないことが確定した際、これはオーバーフローしたブロックがプライベート・ブロックであることを意味する。オーバーフローしたブロックがプライベート・ブロックである場合、プロセスの流れはステップ４４７からステップ４３６へ戻り、別のブロックがオーバーフローするまで、総合システムの実行を許可する。これに代えて、オーバーフローしたブロックが共有ブロックであることがステップ４４７で確定した場合、共有するために利用可能な別の新たなブロックがアロケーション領域内に存在するか否かをステップ４４８で決定する。
【００５１】
利用可能な別のブロックがアロケーション領域内に存在することがステップ４４８で確定した場合、ステップ４５０において、満杯の共有ブロックを新たなブロックと置換する。満杯の共有ブロックを置換した後、ステップ４３６における総合システムの実行を許可する。しかし、利用可能なブロックがアロケーション領域内に事実上存在しないことが確定した場合、プロセスの流れはステップ４３６へ直接移行し、システムの実行を許可する。スレッドが新たなオブジェクトの形成を試み、この新たなオブジェクトの形成を試みたことによって、関連するブロック（例：共有ブロックまたはプライベート・ブロック）がオーバーフローしたことまたはオーバーフローしそうなことを、このスレッドが発見するまで、満杯またはほぼ満杯の共有ブロックを有するシステムが実行を継続することを理解する必要がある。最終的には、プロセスの流れは新たなブロックが利用可能であるか否かの決定（即ち、ステップ４４２における決定）へ逆戻りする。新たなブロックが利用可能でない場合、前記のように、ガーベッジ・コレクションが一般的に実施される。
【００５２】
図８では、本発明の第１実施形態に基づいて、高速アロケーティング・スレッドと考えられるスレッドを決定する１つの方法（即ち、図７のステップ４５８）を示す。高速アロケーティング・スレッドを決定する方法はステップ５０４から始まる。ステップ５０４では、高速アロケーティング・スレッドであるか否かを識別するための“テスト”を受けるスレッドが存在するか否かを事実上決定する。テストを受けるスレッドが存在しない際、スレッドが高速アロケーティング・スレッド及び低速アロケーティング・スレッドのうちのいずれであるかを決定するプロセスは完了する。これに代えて、テストを受けるスレッドが存在する際、ステップ５０６において、スレッドが共有プール、即ち、共有ブロックを使用しているか否かを決定する。換言するならば、ステップ５０６では、そのスレッドが共有ブロックに関連付けられたスレッドであるか否かを決定する。
【００５３】
スレッドが共有プールを使用していることが確定した場合、これはそのスレッドが低速アロケーティング・スレッドであることを示す。したがって、プロセスの流れはステップ５０６からステップ５１２へ移行し、スレッドのアロケーション・ルーチンはロッキングに設定される。即ち、スレッドが新たなオブジェクトをアロケートすることを試みた際、そのスレッドが共有ブロックに関連付けられたロックを獲得するように、そのスレッドのアロケーション・ルーチンは設定される。前記のように、１つのスレッドが共有ブロック内でアロケートしている最中に、別のスレッドがこの共有ブロック内でアロケートすることを、ロックの使用によって防止する。スレッドのアロケーション・ルーチンをステップ５１２でロッキングに設定した後、プロセスの流れはステップ５０４へ戻り、処理する別のスレッドが存在するか否かを決定する。
【００５４】
これに代えて、ステップ５０６において、スレッドが共有ブロックを使用していないことが確定した場合、これはそのスレッドが少なくとも１つのプライベート・ブロックを有することを意味する。したがって、そのスレッドは高速アロケーティング・スレッドと考えられる。スレッドが高速アロケーティング・スレッドと考えられる際、プロセスの流れはステップ５０６からステップ５０８へ移行する。ステップ５０８では、スレッドが最後のガーベッジ・コレクション・インターバルでアロケートしたメモリが閾値を越えているか否かを決定する。換言するならば、スレッドが直近のガーベッジ・コレクション以降にアロケートしたメモリの総量が閾値を越えているか否かを決定する。一般的に、閾値の量は総合システムの要件に基づいて広範に変化し得る。例えば、閾値の量は約２メモリ・ブロックから約５メモリ・ブロックの範囲である。
【００５５】
スレッドが最後のガーベッジ・コレクション・インターバル内でアロケートしたメモリの総量が閾値を越えていることがステップ５０８で確定した場合、そのスレッドは高速アロケーティング・スレッドと考えられる。したがって、ステップ５１０では、ロックを獲得することなく、スレッドが自身に関連するブロック、即ち、プライベート・ブロック内で任意の時点でアロケートできる（これは、他のスレッドがこのブロックへアクセスすることがないことに起因する）ことを示すために、そのスレッドのアロケーション・ルーチンをノンロッキングに設定する。スレッドのアロケーション・ルーチンをノンロッキングに設定した後、プロセスの流れはステップ５０４へ戻り、他のスレッドを処理するか否かを決定する。
【００５６】
スレッドが最後のガーベッジ・コレクション・インターバルでアロケートしたメモリの総量が閾値を越えていないことがステップ５０８で確定した場合、これはそのスレッドが高速アロケーティング・スレッドでないことを意味する。この場合、スレッドはプライベート・ブロックを保持する必要はなく、ステップ５１２において、このスレッドのアロケーション・ルーチンをロッキングに設定する。スレッドのアロケーション・ルーチンをロッキングに設定した後、プロセスの流れはステップ５０４へ戻り、処理する別のスレッドが存在するか否かを決定する。
【００５７】
プライベート・ブロックを、共有ブロックのオーバーフローを引き起こしたスレッドへ割り当てることは、低速アロケーティング・スレッドのための共有ブロックを維持し、かつ高速アロケーティング・スレッドがプライベート・ブロックを所有することを可能にする点で一般的に効果的である。しかし、その一方で、プライベート・ブロックを低速アロケーティング・スレッドへアロケートする可能性は依然存在する。例えば、オブジェクトを希にアロケートするスレッドが、共有ブロックのオーバーフローを引き起こすオブジェクトを偶然アロケートした場合、プライベート・ブロックがこのスレッドへアロケートされる。そして、このスレッドはこのプライベート・ブロックを満杯に近づけることは決してない。したがって、メモリのブロックをアロケートする幾つかの方法は、スレッドが高速アロケーティング・スレッド及び低速アロケーティング・スレッドのいずれであるかの“明示的”決定を含み得る。
【００５８】
幾つかの実施形態では、アロケーション領域から得たプライベート・ブロックを、共有ブロックのオーバーフローを引き起こしたスレッドへアロケートすることは、実質的に自動的に起こらない。例えば、スレッドが共有ブロックのオーバーフローを引き起こした回数と、プライベート・ブロックをスレッドへアロケートする時とを示すために、“統計学的インジケータ”を使用し得る。図９は本発明の第１実施形態に基づくメモリをアロケートするプロセスに関連する複数のステップを示すフローチャートであり、このプロセスにおけるプライベート・ブロックの割り当ては統計学的データに基づいて行われる。このメモリをアロケートする方法はステップ６０２から始まる。ステップ６０２では、複数のメモリ・ブロックを共有メモリ・アロケーション領域内でアロケートすることによって、共有メモリ・アロケーション領域を構築する。アロケーション領域内のメモリを複数のブロックへ分割した後、ステップ６０４では、新たなオブジェクトのアロケーションをアロケーション領域内で試みる全てのスレッドのための共有ブロックとして、アロケーション領域内の第１ブロックを割り当てる。全てのスレッドのための共有ブロックを割り当てることにより、各スレッドは新たなオブジェクトを共有ブロック内でアロケートできる。
【００５９】
共有ブロックを割り当てた後、総合システムをステップ６０６で実行する。一般的に、総合システムの実行中のある時点において、新たなオブジェクトの形成を試みるスレッドはアロケーション領域をオーバーフローし得る。前記のように、ブロックがオーバーフローしたことの発見、即ち、スレッドによる発見は、ブロックがオーバーフローしたことの事実上の確定といえる。したがって、ブロックがオーバーフローしたか否かをステップ６０８で決定する。
【００６０】
共有ブロックなどのブロックがオーバーフローしていないことがステップ６０８で確定した際、ステップ６０６におけるシステムの実行の継続を許可する。これに代えて、ブロックがオーバーフローしたことが確定した際、プロセスの流れはステップ６１０へ移行する。ステップ６１０では、利用可能な次のブロックをアロケーション領域から獲得することが試みられる。利用可能な次のブロックを獲得することを試みた後、ステップ６１２において、新たなブロックが利用可能であるか否かを決定する。換言するならば、利用可能な未使用のメモリ・ブロックがアロケーション領域内に存在するか否かを決定する。
【００６１】
新たなブロックが利用可能であることが確定した際、ステップ６１８では、ブロックのオーバーフローを引き起こしたスレッド、即ち、“オーバーフローイング・スレッド”に関連付けられたオーバーフロー・カウンタをインクリメントする。自身に関連付けられたスレッドがブロックのオーバーフローを引き起こした回数の表示（例：統計学的表示）を提供するために、オーバーフロー・カウンタは設けられている。プライベート・ブロックがスレッドへアロケートされるまで、このスレッドのオーバーフロー・カウンタは、このスレッドがブロックのオーバーフローを引き起こした回数を事実上表示する。しかし、プライベート・ブロックをスレッドへアロケートした後、このスレッドのオーバーフロー・カウンタは、このスレッドが共有ブロックまたはプライベート・ブロックのオーバーフローを引き起こした回数の表示を提供する。
【００６２】
オーバーフローイング・スレッドのオーバーフロー・カウンタをステップ６１８でインクリメントした後、オーバーフロー・カウンタが閾値を越えたか否かをステップ６２０で決定する。換言するならば、このスレッドが引き起こしたブロックのオーバーフローの回数が特定の限度を超えたか否かを決定する。この限度、即ち、閾値は総合システムの要件に基づいて広範に変化し得ることを理解する必要がある。オーバーフロー・カウンタが閾値を越えていないことがステップ６２０で確定した場合、プロセスの流れはステップ６２２へ移行する。ステップ６２２では、満杯のブロックを新たな共有ブロックと置換する。新たなブロックを適切に割り当てた後、プロセスの流れはステップ６０６へ戻り、総合システムの実行を許可する。
【００６３】
オーバーフロー・カウンタが閾値を越えていることがステップ６２０で確定した際、ステップ６２４において、新たなブロックを、ブロックのオーバーフローをステップ６０８で引き起こしたスレッドへ割り当てる。次いで、ステップ６２６において、オーバーフローしたブロックが共有ブロックであるか否かを決定する。オーバーフローしたブロックが共有ブロックでないことが確定した場合、ステップ６０６における総合システムの実行を許可する。しかし、オーバーフローしたブロックが共有ブロックであることが確定した場合、これは新たな共有ブロックが必要なことを意味する。したがって、ステップ６２７において、共有ブロックとして割り当てる別の新たなブロックが利用可能であるか否かを決定する。
【００６４】
新たなブロックが利用可能でない際、プロセスの流れはステップ６０６へ戻り、システムの実行を許可する。新たな共有ブロックがない場合、新たなオブジェクトをそれまでの共有ブロック内でアロケートするスレッドのその後の全ての試みは、以下に詳述するように、使用済みのブロックを事実上解放するガーベッジ・コレクションを引き起こす。これに代えて、別の新たなブロックをステップ６２７で利用可能な際、ステップ６２２において、満杯の共有ブロックを新たな共有ブロックと置換する。
【００６５】
再びステップ６１２へ戻り、新たなブロックが利用可能でないことが確定した際、ガーベッジ・コレクションをステップ６１６で実施する。１つの実施形態では、ガーベッジ・コレクションは、世代別ガーベッジ・コレクション・アルゴリズムを含む。前記のように、アロケーション領域のブロックに格納されたライブ・オブジェクトをメモリの他の領域へコピーし、これによって、アロケーション領域の少なくとも幾つかのブロックを新たなアロケーションのために空にするために、世代別ガーベッジ・コレクション・アルゴリズムは設けられている。ブロックの解放後、これらのブロックは特定の１つのスレッドまたはスレッド群へ割り当てるために利用可能である。
【００６６】
ガーベッジ・コレクションをステップ６１６で実施した後、ステップ６１７において、総合システムに関連する実質的に全てのスレッドのオーバーフロー・カウンタをそれぞれリセットする。一般的に、オーバーフロー・カウンタは初期値へリセットされ、この初期値はスレッドがあらゆるブロックをオーバーフローさせていないことを示す。プロセスの流れはステップ６１７からステップ６０４へ戻り、共有ブロックを総合システム内の全てのスレッドへ割り当てる。
【００６７】
一般的に、図９に基づいて詳述したように、プライベート・ブロックをスレッドへ割り当てる時を決定するために、統計学的インジケータを使用し得る。しかし、一般的に、統計学的インジケータを使用する方法は様々である。メモリのアロケーションにおけるオーバーフロー・カウンタなどの統計学的インジケータの使用の別の例を図１０に基づいて詳述する。図１０はガーベッジ・コレクション・プロセス後に、幾つかのスレッドがプライベート・ブロックを維持することを可能にするための、オーバーフロー・カウンタの使用を示す。
【００６８】
図１０は本発明の第１実施形態に基づく統計学的インジケータを使用してメモリをアロケートする別のプロセスに関連する複数のステップを示すフローチャートである。このメモリをアロケートする方法はステップ７０２から始まる。ステップ７０２では、複数のメモリ・ブロックを共有メモリ・アロケーション領域内でアロケートすることによって、共有メモリ・アロケーション領域を構築する。アロケーション領域内のメモリを複数のブロックへ分割した後、ステップ７０４では、新たなオブジェクトのアロケーションをアロケーション領域内で試みる全てのスレッドのための共有ブロックとして、アロケーション領域内の第１ブロックを割り当てる。
【００６９】
共有ブロックを割り当てた後、ステップ７０６において、総合システムを実行する。即ち、スレッドが新たなオブジェクトのアロケーションを試みることを許可する。総合システムの実行中のある時点において、新たなオブジェクトの形成を試みるスレッドはアロケーション領域をオーバーフローさせる。ブロックがオーバーフローしたことの発見、即ち、スレッドによる発見は、ブロックがオーバーフローしたことの事実上の確定であるため、ブロックがオーバーフローしたか否かをステップ７０８で決定する。
【００７０】
事実上、ブロック（例：共有ブロック）がオーバーフローしたことがステップ７０８で確定するまで、ステップ７０６におけるシステムの実行の継続を許可する。ブロックがオーバーフローしたことが確定した際、プロセスの流れはステップ７０８からステップ７１０へ移行する。ステップ７１０では、利用可能な次のブロックをアロケーション領域から獲得することが試みられる。利用可能な次のブロックを獲得することを試みた後、ステップ７１２において、ブロックが利用可能であるか否かを決定する。
【００７１】
新たなブロックが利用可能であることが確定した際、ステップ７１３では、ブロックのオーバーフローを引き起こしたスレッド、即ち、オーバーフローイング・スレッドに関連付けられたオーバーフロー・カウンタをインクリメントする。図９に基づいて詳述したように、自身に関連付けられたスレッドがブロックのオーバーフローを引き起こした回数を確認するために、オーバーフロー・カウンタは一般的に設けられている。
【００７２】
オーバーフローイング・スレッドのオーバーフロー・カウンタをステップ７１３でインクリメントした後、オーバーフロー・カウンタの値が所定の閾値より大きいか否かをステップ７１４で決定する。プライベート・ブロックをスレッドへ割り当てるか否かを決定するために、所定の閾値は一般的に使用される。オーバーフロー・カウンタの値が閾値未満であることが確定した際、プロセスの流れはステップ７２０へ移行する。ステップ７２０では、満杯の共有ブロックを新たなブロック、即ち、新たな共有ブロックと置換する。満杯の共有ブロックを置換した後、ステップ７０６における総合システムの実行の継続を許可する。
【００７３】
オーバーフロー・カウンタの値が閾値を越えていることがステップ７１４で確定した場合、ステップ７１５において、新たなブロックを、ステップ７０８でブロックをオーバーフローさせたことが確定したスレッドへ割り当てる。新たなブロックをスレッド、より詳細には、オーバーフローイング・スレッドへ割り当て、これによって、この新たなブロックがプライベート・ブロックとなった後、オーバーフローしたブロックが共有ブロックであるか否かをステップ７１７で決定する。オーバーフローしたブロックが共有ブロックでないことが確定した場合、プロセスの流れはステップ７０６へ戻り、総合システムの実行を許可する。プライベート・ブロックをオーバーフローしたシステムへ割り当てた後、総合システムの実行を許可するまでは、このオーバーフローしたブロックが共有ブロックであることを理解する必要がある。プライベート・ブロックをオーバーフローしたシステムへ割り当てた後、このオーバーフローしたブロックは、共有ブロックまたはプライベート・ブロックである。
【００７４】
これに代えて、オーバーフローしたブロックが共有ブロックであることがステップ７１７で確定した場合、これはオーバーフロした共有ブロックを置換することが好ましいことを意味している。したがって、別の新たなブロックが利用可能であるか否かをステップ７１８で決定する。別の新たなブロックが利用可能であることが確定した場合、ステップ７２０では、オーバーフローした共有ブロックを別の新たなブロックと置換する。次いで、プロセスの流れはステップ７０６へ移行し、総合システムの実行を許可する。その一方、別の新たなブロックが利用可能でないことがステップ７１８で確定した際、プロセスの流れはステップ７０６へ直接戻り、総合システムの実行を許可する。
【００７５】
再びステップ７１２へ戻り、ブロックがオーバーフローした後、新たなブロックが利用可能でないことが確定した際、ガーベッジ・コレクションをステップ７２６で実施する。ガーベッジ・コレクションをステップ７２６で実施した後、高速アロケーティング・スレッドと考えられるスレッドをステップ７２８で決定する。１つの実施形態では、高速アロケーティング・スレッドと考えられるスレッドの決定は、特定の限度を越えたオーバーフロー・カウンタを有するスレッドを識別するために、スレッドのオーバーフロー・カウンタを比較することを含む。これに代えて、別の実施形態では、高速アロケーティング・スレッドと考えられるスレッドは、全てのスレッドの中で最も高い数値を示すオーバーフロー・カウンタを有する所定の数のスレッドであり得る。
【００７６】
高速アロケーティング・スレッドと考えられるスレッドをステップ７２８で識別した後、ステップ７２９では、低速アロケーティング・スレッド、即ち、高速アロケーティング・スレッドと考えられないスレッドのオーバーフロー・カウンタをリセットする。低速アロケーティング・スレッドのオーバーフロー・カウンタのリセットは、プライベート・ブロックを必要としないスレッドに対するプライベート・ブロックのアロケーションを防止する。一般的に、オーバーフロー・カウンタは、スレッドがあらゆるブロックをオーバーフローさせていないことを示す初期値へリセットされる。ステップ７３０では、新たなブロックを各高速アロケーティング・スレッドへ割り当てる。即ち、プライベート・ブロックを各高速アロケーティング・スレッドへ割り当てる。新たなブロックを各高速アロケーティング・スレッドへ割り当てた後、ステップ７３２では、共有ブロックを他の全てのスレッド、即ち、低速アロケーティング・スレッドへ割り当てる。プライベート・ブロックまたは共有ブロックを全てのスレッドへ割り当てた後、プロセスの流れはステップ７０６へ戻り、総合システムの実行を許可する。
【００７７】
高速アロケーティング・スレッドがプライベート・メモリ・ブロックへアクセスすることを許可する一方で、複数の低速アロケーティング・スレッドによるメモリ・ブロックの共有を可能にすることによって、ガーベッジコレクションの時に無駄になるメモリの量、即ち、リザーブされていながらも満たされていないメモリの量が減少する。メモリ・ブロックの共有によって更に多くのメモリがガーベッジ・コレクションの実施前に満たされるため、メモリ・ブロックの共有は実施されるガーベッジ・コレクションの頻度を減少させる。無駄になるメモリを減少し、かつガーベッジ・コレクションの頻度を低減するメモリ・ブロックをアロケートする別の方法は、異なる複数のサイズのメモリ・ブロックを形成し、これらのメモリ・ブロックをスレッドの要件に基づいてスレッドへアロケートすることを含む。この方法を使用することにより、オブジェクトを共有ブロック内でアロケートする試みに関連する同期コストを事実上無くし得る。
【００７８】
異なる複数のサイズのメモリ・ブロックに分割された共有メモリ領域と、ブロックを異なる複数のスレッドへアロケートする幾つかの方法とを図１１、図１２、図１３、図１４及び図１５に基づいて以下に詳述する。図１１は本発明の第２実施形態に基づく複数のスレッドと、これらのスレッドによって共有され、かつ複数の異なるサイズのブロックへ分割されたメモリ・アロケーション領域とを示す図である。マルチスレッド・コンピューティング環境７５０は共有メモリ・アロケーション領域７５２及び複数のスレッド７５６を含む。メモリ・アロケーション領域７５２は複数の異なるサイズのブロック７５４，７５５へ分割されている。本実施形態では、複数のブロック７５４は実質的に同じ１つのサイズであり、別の複数のブロック７５５はブロック７５４より大きい実質的に同じ別のサイズである。しかし、メモリ・アロケーション領域７５２は異なるサイズの２つを越す数のブロック群を一般的に含むことを理解する必要がある。
【００７９】
メモリ・アロケーション領域７５２のサイズは環境７５０の要件（但し、これに限定されない）を含むファクタに基づいて変化し得る。例えば、環境７５０が関連するジャバ（商標）仮想マシンを有する場合、メモリ・アロケーション領域７５２は約１２８ｋＢから約５１２ｋＢの範囲のサイズを有し得る。同様に、ブロック７５４，７５５のサイズは広範に変化し得る。１つの実施形態では、ブロック７５４はブロック７５５よりかなり小さくできる。例えば、ブロック７５４を約１ｋＢから４ｋＢの範囲のサイズとし、ブロック７５５を約１６ｋＢから約３２ｋＢの範囲のサイズとし得る。前記のように、環境７５０では、全てのブロック７５４をほぼ同じサイズとし、全てのブロック７５５をほぼ同じサイズとする。これによって、メモリ・アロケーション領域７５２は２つの異なるサイズのブロックを事実上有する。
【００８０】
環境７５０内では、ブロック７５５はブロック７５４より大きいため、プライベート・ブロック７５５が各高速アロケーティング・スレッド７５６（例：スレッド７５６ａ，７５６ｄ）へ最終的にアロケートされる。その一方、プライベート・ブロック７５４が各低速アロケーティング・スレッド７５６ｂ，７５６ｃへアロケートされる。一般的に、小さい方のブロック７５４はガーベッジ・コレクションの時に満たされている可能性が更に高いため、この小さい方のブロック７５４を低速アロケーティング・スレッド７５６ｂ，７５６ｃへ割り当てることによって、無駄になるメモリ・スペースが減少する。更に、大きい方のブロック７５５を高速アロケーティング・スレッド７５６ａ，７５６ｄ、即ち、比較的多くのバイトをアロケートするスレッドへ割り当てることにより、高速アロケーティング・スレッド７５６ａ，７５６ｄはメモリ・スペースへの更に多くのアクセスが可能になる。これによって、ガーベッジ・コレクションの頻度が潜在的に減少する。
【００８１】
小さい方のブロック７５４を低速アロケーティング・スレッド、即ち、少量アロケーティング・スレッド７５６ｂ，７５６ｃへ割り当てることにより、環境７５０、即ち、マルチスレッド方式のマルチプロセッサ環境などの環境において起こり得る偽の共有に関連する問題を減少し得る。当業者が理解するように、２つのオブジェクトを１つのキャッシュ・ライン内でアロケートし、これら２つのオブジェクトがそれぞれ単一スレッドによる頻繁な書き込みを受ける際、即ち、１つのスレッドが一方のオブジェクトを書き込み、別のスレッドが他方のオブジェクトを書き込む際、偽の共有が一般的に起こる。この状況は比較的高い費用を要するリモート・キャッシュ・ミスを引き起こし得る。各スレッド７５６が独自のブロック７５４，７５５を有する場合、オブジェクトをアロケートするこのスレッドが、特定のオブジェクトを最も頻繁に書き込むスレッドである限り、偽の共有は減少する。
【００８２】
１つの実施形態では、プライベート大型ブロックを潜在的な高速アロケーティング・スレッドへ割り当てる前、潜在的な高速アロケーティング・スレッドを識別する。図１２は本発明の第２実施形態に基づくメモリをアロケートする第１のプロセスに関連する複数のステップを示すフローチャートである。このプロセスはステップ８０２から始まる。ステップ８０２では、小型メモリ・ブロック及び大型メモリ・ブロックをアロケートすることによって、アロケーション領域を事実上構築する。小型ブロックの数量及び大型ブロックの数量は広範に変化可能であり、かつ総合システムの予想される要件（但し、これに限定されない）を含むファクタに基づき得る。一般的に、総合システムに関連する全てのスレッドのための少なくとも１つの小型ブロックを設けるように、小型ブロックの数量は決められている。
【００８３】
図１１に関連して詳述したように、メモリ・ブロックのサイズは広範に変化し得る一方、１つの実施形態では、大型メモリ・ブロックは小型メモリ・ブロックのサイズの少なくとも１０倍のサイズである。例えば、小型メモリ・ブロックを約２ｋＢのサイズにし、大型メモリ・ブロックを約３２ｋＢのサイズにし得る。一般的に、大型メモリ・ブロックを小型メモリ・ブロックへ必要に応じて簡単に分割できるようにするために、小型メモリ・ブロックは大型メモリ・ブロックより２の累乗だけ小さいサイズとし得る。
【００８４】
小型メモリ・ブロック及び大型メモリ・ブロックをステップ８０２でアロケートした後、ステップ８０４において、小型メモリ・ブロックを全てのスレッドへ割り当てる、即ち、アロケートする。即ち、小型メモリ・ブロックを全てのスレッドへプライベート・ブロックとして割り当てる。小型メモリ・ブロックを各スレッドへ割り当てた後、ステップ８０６における総合システムの実行を許可する。総合システムの実行中、スレッドは新たなオブジェクトを自身に関連するプライベート・ブロック内でアロケートすることを試みる。一般的に、システムの実行中、新たなオブジェクトをアロケートすることを試みるスレッドは自身のプライベート・ブロックをオーバーフローさせる。
【００８５】
一般的に、スレッドが自身のプライベート・ブロックのオーバーフローを発見することは、ブロックがオーバーフローしたことの確定を事実上意味する。したがって、ブロックがオーバーフローしたことがステップ８０８で確定するまで、総合システムはステップ８０６における実行を継続する。ブロックがオーバーフローしたことがステップ８０８で確定した際、これはブロックのオーバーフローを引き起こしたスレッドが潜在的に高速アロケーティング・スレッドであることを意味する。したがって、ステップ８１０では、利用可能な次の大型ブロックをアロケーション領域から獲得することを試みる。
【００８６】
ステップ８１２では、新たな大型ブロックをステップ８１０で獲得できたか否か、即ち、利用可能であるか否かを決定する。新たな大型ブロックが利用可能であることが確定した場合、ステップ８１４において、新たな大型ブロックを、自身のブロックのオーバーフローを引き起こしたスレッドへ割り当てる。新たな大型ブロックを割り当てた後、プロセスの流れはステップ８０６へ戻り、総合システムの実行を許可する。
【００８７】
これに代えて、新たな大型ブロックが利用可能でないことがステップ８１２で確定した際、本実施形態では、ガーベッジ・コレクションをステップ８１６で実施する。前記のように、ガーベッジ・コレクション（例：世代別ガーベッジ・コレクション）はメモリ・ブロックを解放するために実施する。一般的に、ガーベッジ・コレクションはスレッド及びプライベート・ブロックの間の関連付けを削除する。換言するならば、ガーベッジ・コレクションを完了した際、総合システム内の各スレッドは自身に割り当てられたブロックを持たないことになる。したがって、ガーベッジ・コレクションを実施した後、プロセスの流れはステップ８０４へ移行し、小型メモリ・ブロックを各スレッドへ割り当てる。
【００８８】
ガーベッジ・コレクション・プロセス後、小型ブロックを各スレッドへ割り当てることは効果的であるが、ガーベッジ・コレクション・プロセス後に各スレッドへ割り当てるブロックのサイズを決定するために、他のプロセスを使用し得る。例えば、小型ブロックをガーベッジ・コレクション・プロセス後に各スレッドへ割り当てる代わりに、ブロックを各スレッドの考えられる要件に基づいて割り当て得る。スレッドが大型ブロックであるプライベート・ブロックをガーベッジ・コレクション・プロセスの実施前に持っていたか否かを憶えておくことにより、スレッドが高速アロケーティング・スレッドであり、かつ大型ブロックを必要としていることが確定した場合、新たな大型ブロックをそのスレッドへ割り当て得る。比較的大量の新たなオブジェクトをアロケートすることが期待されるスレッドに対して、プライベート大型ブロックを割り当てることにより、総合システム内のブロックがオーバーフローする回数が減少し、これによって、システムの効率が高くなる。
【００８９】
図１３は本発明の第２実施形態に基づくメモリをアロケートするプロセスに関連する複数のステップを示すフローチャートであり、このプロセスはブロックをスレッドのアロケーション速度に基づいてスレッドへ割り当てることを含む。プロセスはステップ９０２から始まる。ステップ９０２では、小型メモリ・ブロック及び大型メモリ・ブロックをアロケートすることによって、アロケーション領域を構築する。小型ブロックの数量及び大型ブロックの数量は広範に変化し、かつ総合システムの予想される要件（但し、これに限定されない）を含むファクタに基づき得る。一般的に、総合システムに関連する全てのスレッドのための少なくとも１つの小型ブロックを設けるように、小型ブロックの数量は決められている。
【００９０】
小型メモリ・ブロック及び大型メモリ・ブロックをアロケーション領域内でアロケートした後、ステップ９０４では、小型メモリ・ブロックを全てのスレッドへ割り当てる、即ち、アロケートする。プライベート小型メモリ・ブロックを各スレッドへ割り当てた後、ステップ９０６において、総合システムの実行を許可する。総合システムの実行中、スレッドは新たなオブジェクトを自身に関連するプライベート・ブロック内でアロケートすることを試みる。システム実行中のある時点において、新たなオブジェクトをアロケートすることを試みるスレッドは自身のプライベート・ブロックをオーバーフローさせる。
【００９１】
スレッドが自身のプライベート・ブロックのオーバーフローを発見することは、ブロックがオーバーフローしたことの確定を事実上意味する。したがって、ブロックがオーバーフローしたことがステップ９０８で確定するまで、総合システムはステップ９０６における実行を継続する。ブロックがオーバーフローしていることがステップ９０８で確定した際、ステップ９１０において、利用可能な次の大型ブロックをアロケーション領域から獲得することを試みる。
【００９２】
利用可能な次の大型ブロックをアロケーション領域から獲得することを試みた後、新たな大型ブロックが利用可能であるか否かをステップ９１２で決定する。新たな大型ブロックが利用可能であることが確定した場合、ステップ９１４において、新たな大型ブロックを自身のブロックのオーバーフローを引き起こしたスレッドへ割り当てる。そして、プロセスの流れはステップ９０６へ移行し、総合システムの実行を許可する。
【００９３】
これに代えて、新たな大型ブロックが利用可能でないことがステップ９１２で確定した場合、本実施形態では、ステップ９１６において、ガーベッジ・コレクションを実施する。ガーベッジ・コレクション（世代別ガーベッジ・コレクションであり得る）はメモリ・ブロックを解放するために実施し、かつスレッド及びプライベート・ブロックの間の関連付けを削除する。本実施形態では、ガーベッジ・コレクション中、そのスレッドが大型ブロック及び小型ブロックのいずれに関連付けられていたかを示す情報を維持する。
【００９４】
ガーベッジ・コレクションを実施した後、ステップ９１８において、高速アロケーティング・スレッドと考えられるスレッドを識別する。高速アロケーティング・スレッドの識別に関連するステップは一般的に様々であり、かつ個々のシステムの要件（但し、これに限定されない）を含むファクタに基づき得る。高速アロケーティング・スレッドと考えられるスレッドを決定する１つの方法を、図１４に基づいて以下に詳述する。
【００９５】
ステップ９２０では、新たな大型ブロックを、識別された各高速アロケーティング・スレッドへ割り当てる。換言するならば、プライベート大型ブロックを各高速アロケーティング・スレッドへアロケートする。次いで、ステップ９２２において、小型ブロックを残りの各スレッド（例：低速アロケーティング・スレッド）へ割り当てる。プライベート・ブロックを全てのスレッドへ割り当てた後、プロセスの流れはステップ９０６へ戻り、総合システムの実行を許可する。
【００９６】
次いで、高速アロケーティング・スレッドと考えられるスレッドを識別する１つの方法を図１４に基づいて詳述する。図１４は本発明の第２実施形態に基づく高速アロケーティング・スレッドと考えられるスレッドを決定することに関連する複数のステップ、即ち、図１３のステップ９１８に関連する複数のステップを示すフローチャートである。高速アロケーティング・スレッドと考えられるスレッドを決定するプロセスはステップ９３４から始まる。ステップ９３４では、高速アロケーティング・スレッドと考えられるか否かを識別するための“テスト”を受けるスレッドが存在するか否かを事実上決定する。テストを受けるスレッドが存在しない場合、スレッドが高速アロケーティング・スレッド及び低速アロケーティング・スレッドのいずれであるか否かを決定するプロセスは完了する。これに代えて、テストを受けるスレッドが存在する場合、ステップ９３６において、プライベート小型ブロックがそのスレッドへ割り当てられているか否かを決定する。
【００９７】
プライベート小型ブロックがスレッドへ割り当てられていることが確定した場合、このスレッドはプライベート大型ブロックを以前に必要としていなかったことになる。このため、これはそのスレッドが低速アロケーティング・スレッドであることを意味する。スレッドが低速アロケーティング・スレッドであると考えられる際、ステップ９４２において、このスレッドを低速アロケーティング・スレッドとしてマークする。スレッドを低速アロケーティング・スレッドとして識別した後、プロセスの流れはステップ９３４へ戻り、処理する別のスレッドが存在するか否かを決定する。
【００９８】
これに代えて、プライベート小型ブロックがスレッドへ割り当てられていないことがステップ９３６で確定した場合、これはプライベート大型ブロックがそのスレッドへ割り当てられたことを意味する。したがって、そのスレッドは高速アロケーティング・スレッドと考えられる。スレッドが高速アロケーティング・スレッドと考えられる場合、ステップ９３８において、このスレッドが最後のガーベッジ・コレクション・インターバルでアロケートしたメモリの総量が閾値を越えているか否かを決定する。１つの実施形態では、ガーベッジ・コレクション・インターバルは、直近のガーベッジ・コレクションと、この直近のガーベッジ・コレクションの直前に行われたガーベッジ・コレクションとの間の経過時間である。一般的に、ガーベッジ・コレクション・インターバルに関連する情報は必要に応じて総合システム・メモリ内に蓄積され、かつ格納される。この場合、スレッドが直近のガーベッジ・コレクション以降にアロケートしたメモリの総量が、閾値を超えていないか否かを決定することをステップ９３８は基本的に含む。そして、閾値は総合システムの要件に基づいて広範に変化し得る。
【００９９】
スレッドが最後のガーベッジ・コレクション・インターバル内でアロケートしたメモリの総量が閾値を超えていることがステップ９３８で確定した場合、スレッドは高速アロケーティング・スレッドと考えられる。スレッドが高速アロケーティング・スレッドと考えられる際、ステップ９４０において、そのスレッドを高速アロケーティング・スレッドとしてマークする。スレッドを高速アロケーティング・スレッドとしてマークした後、即ち、識別した後、プロセスの流れはステップ９０４へ戻り、処理する別のスレッドが存在するか否かを決定する。
【０１００】
その一方、スレッドが最後のガーベッジ・コレクション・インターバル内でアロケートしたメモリの総量が閾値未満であることがステップ９３８で確定した場合、これはそのスレッドが高速アロケーティング・スレッドでないことを意味する。この結果、ステップ９４２において、そのスレッドを低速アロケーティング・スレッドとしてマークする。スレッドを低速アロケーティング・スレッドとしてマークした後、プロセスの流れはステップ９３４へ戻り、処理する別のスレッドが存在するか否かを決定する。
【０１０１】
大型メモリ・ブロック及び小型メモリ・ブロックのいずれを、自身のブロックをオーバーフローさせたスレッドへアロケートするかを決定するために、このスレッドが任意の時間内でアロケートしたメモリの総量などの診断を使用することに代えて、スレッドへアロケートするブロックのサイズの決定は、他のファクタに基づいて行い得る。例えば、この決定は、スレッドがプライベート・ブロックをオーバーフローさせた回数に基づき得る。次いで、本発明の第２実施形態に基づき、メモリをオーバーフロー・カウンタを使用してアロケートする第３のプロセスに関連する複数のステップを図１５に基づいて詳述する。このプロセスはステップ９５２から始まる。ステップ９５２では、異なる複数のサイズ（例：小型及び大型）のメモリ・ブロックをアロケートすることによって、メモリ・アロケーション領域を事実上構築する。小型メモリ・ブロック及び大型メモリ・ブロックをアロケートした後、ステップ９５４において、小型ブロックを総合システム内の各スレッドへ割り当てる。即ち、プライベート小型ブロックをシステム内の各スレッドへ割り当てる。
【０１０２】
プライベート小型ブロックを各スレッドへ割り当てた後、ステップ９５６における総合システムの実行を許可する。総合システムの実行中、スレッドは新たなオブジェクトを自身のプライベート・ブロック内でアロケートすることを試みる。システムの実行中、新たなオブジェクトを自身のプライベート・ブロック内でアロケートすることを試みるスレッドは、自身のプライベート・ブロックをオーバーフローさせる。一般的に、スレッドが自身のプライベート・ブロックのオーバーフローを発見することは、総合システム内のブロックがオーバーフローしたことの確定に事実上等しい。したがって、ブロックがオーバーフローしたことがステップ９５８で確定するまで、総合システムはステップ９５６における実行を継続する。ブロックがオーバーフローしたことがステップ９５８で確定した際、ステップ９５９において、ブロックのオーバーフローを引き起こしたスレッドのオーバーフロー・カウンタをインクリメントする。
【０１０３】
本実施形態では、スレッドが関連するプライベート・ブロックのオーバーフローを引き起こした回数を表示するために、スレッドのオーバーフロー・カウンタは設けられている。オーバーフローイング・スレッドのオーバーフロー・カウンタをインクリメントした後、ステップ９６０において、オーバーフローイング・スレッドのオーバーフロー・カウンタが閾値、即ち、特定の限度を超えたか否かを決定するための比較を実施する。閾値は総合システムの要件に基づいて広範に変化し得ることを理解する必要がある。しかし、一般的に、閾値を越すオーバーフローカウンタを有するスレッドが、多くのオブジェクトをアロケートする傾向を示すように、閾値を設定する。
【０１０４】
オーバーフローイング・スレッドのオーバーフロー・カウンタが閾値を超えていないことがステップ９６０で確定した際、これはオーバーフローイング・スレッドがおそらく高速アロケーティング・スレッドではなく、したがって、大型ブロックをおそらく必要としないことを意味している。この結果、ステップ９６２において、新たな小型ブロックをアロケーション領域から獲得することを試みる。ステップ９６４では、新たな小型ブロックをアロケーション領域から獲得する試みが成功したか否かを決定する。新たな小型ブロックの獲得に成功した場合、ステップ９６６において、この新たな小型ブロックを、自身のブロックをオーバーフローさせたスレッドへ割り当てる。次いで、プロセスの流れはステップ９５６へ戻り、総合システムの実行の継続を許可する。
【０１０５】
これに代えて、新たな小型ブロックが利用可能でないことがステップ９６４で確定した場合、世代別ガーベッジ・コレクションなどのガーベッジ・コレクションをステップ９６８で実施する。小型ブロック及び大型ブロックに関連するメモリを解放するために、ガーベッジ・コレクションを実施した後、ステップ９７０において、全てのスレッドのオーバーフロー・カウンタを初期値へリセットする。一般的に、スレッドがブロックのオーバーフローを引き起こしていないことを表示するために、初期値は設けられている。オーバーフロー・カウンタをリセットした後、プロセスの流れはステップ９５４へ戻り、プライベート小型ブロックを各スレッドへアロケートする。
【０１０６】
再びステップ９６０へ戻り、オーバーフローイング・スレッドのオーバーフロー・カウンタが閾値を超えていることが確定した際、これはオーバーフローイング・スレッドがおそらく高速アロケーティング・スレッドと考えられることを意味する。したがって、ステップ９７２では、利用可能な次の大型ブロックをメモリ・アロケーション領域から獲得することを試みる。新たな大型ブロックの獲得を試みた後、ステップ９７４において、新たな大型ブロックが利用可能であるか否かを決定する。新たな大型ブロックが利用可能であることが確定した場合、ステップ９７６において、この新たな大型ブロックをオーバーフローイング・スレッドへ割り当て、ステップ９５６における総合システムの実行を許可する。これに代えて、大型ブロックが利用可能でないことがステップ９７４で確定した場合、プロセスの流れはステップ９６８へ移行し、メモリを解放するためのガーベッジ・コレクションを実施する。
【０１０７】
本発明は任意の適切なコンピュータ・システム上で実現できる。図１６は本発明の実現に適した一般的な汎用コンピュータ・システムを示す。コンピュータ・システム１０３０は任意の数のプロセッサ１０３２（中央処理装置、即ち、ＣＰＵとも称される）を有する。プロセッサ１０３２は一次記憶装置１０３４（一般的には、リード・オンリ・メモリ、即ち、ＲＯＭ）及び別の一次記憶装置１０３６（一般的には、ランダム・アクセス・メモリ、即ち、ＲＡＭ）を含むメモリ装置へ接続されている。
【０１０８】
当業者が理解するように、コンピュータ・システム１０３０、より詳細には、ＣＰＵ１０３２は仮想マシンをサポートすべく設け得る。コンピュータ・システム１０３０上でサポートされている仮想マシンの１つの例を図１７に基づいて詳述する。当該技術分野で知られているように、ＲＯＭはデータ及び命令をＣＰＵ１０３２へ単方向に転送すべく機能する。その一方、ＲＡＭはデータ及び命令を双方向に転送すべく一般的に使用される。一般的に、ＣＰＵ１０３２は任意の数のプロセッサを含み得る。前記の２つの一次記憶装置１０３４，１０３６は任意の適切なコンピュータ読み取り可能媒体をそれぞれ含み得る。一般的には大容量メモリ装置である二次記憶媒体１０３８はＣＰＵ１０３２に双方向接続され、かつ別のデータ記憶能力を提供する。大容量メモリ装置１０３８はコンピュータ・コード及びデータ等を含むプログラムを格納するために使用可能なコンピュータ読み取り可能媒体である。一般的に、大容量メモリ装置１０３８は一次記憶装置１０３４，１０３６より一般的に遅いハード・ディスクまたはテープ等の記憶媒体である。大容量メモリ装置１０３８は磁気テープ・リーダー、ペーパー・テープ・リーダーまたは他の周知の装置の形態をなし得る。適切なケースでは、大容量メモリ装置１０３８内に保持されている情報は、ＲＡＭ１０３６の一部に標準的な形式で仮想メモリとして組み込み得る。ＣＤ−ＲＯＭ等の特定の一次記憶装置１０３４はデータをＣＰＵ１０３２へ単方向に送信可能である。
【０１０９】
ＣＰＵ１０３２は１つ以上の入出力装置（Ｉ／Ｏ）１０４０へ接続されている。入出力装置１０４０は、ビデオ・モニタ、トラック・ボール、マウス、キーボード、マイクロホン、タッチ・ディスプレイ、トランスデューサ・カード・リーダー、磁気テープ・リーダー、ペーパー・テープ・リーダー、タブレット、スタイラス、音声認識装置、手書き文字認識装置または他の周知の入力装置（例：他のコンピュータ）などの装置を含み得る（但し、これらに限定されない）。符号１０１２で示すネットワーク接続を使用することにより、ＣＰＵ１０３２をコンピュータまたはテレコミュニケーション・ネットワーク（例：インターネット・ネットワークまたはイントラネット・ネットワーク）へ任意で接続し得る。このネットワーク接続により、前記の方法のステップを実施する過程で、ＣＰＵ１０３２は情報をネットワークから受信し、かつ情報をネットワークへ出力し得る。多くの場合、この情報はＣＰＵ１０３２を用いて実行する命令の順番列を表す。更に、この情報は例えば搬送波に組み込まれたコンピュータ・データ信号の形態でネットワークに対して送受信可能である。前記の複数のデバイス及び資材は、コンピュータ・ハードウェア及びソフトウェアの技術分野の当業者には公知である。
【０１１０】
前記のように、仮想マシンはコンピュータ・システム１０３０上で実行可能である。図１７は図１６のコンピュータ・システム１０３０によってサポートされ、かつ本発明の実現に適する仮想マシンを示す図である。ジャバ（商標）プログラミング言語（サンマイクロシスムズ・インコーポレイテッドが開発）によって書かれたコンピュータ・プログラムなどのコンピュータ・プログラムを実行する際、ソース・コード１１１０をコンパイラ１１２０へコンパイルタイム環境１１０５内で提供する。コンパイラ１１２０はソース・コード１１１０をバイトコード１１３０へ翻訳する。一般的に、ソフトウェア開発者がソース・コード１１１０を形成した時点で、このソース・コード１１１０はバイトコード１１３０へ翻訳される。
【０１１１】
バイトコード１１３０は図１６のネットワーク１０１２などのネットワークを通じて複製、ダウンロード若しくは配布するか、または図１６の一次記憶装置１０３４などの記憶装置へ格納し得る。本実施形態では、バイトコード１１３０はプラットフォームから独立している。即ち、バイトコード１１３０は適切な仮想マシン１１４０上で動作する実質的に任意のコンピュータ・システム上で実行可能である。
【０１１２】
バイトコード１１３０は仮想マシン１１４０を含むランタイム環境１１３５へ提供される。一般的に、ランタイム環境１１３５は図１６のＣＰＵ１０３２などのプロセッサを使用して実行できる。仮想マシン１１４０はコンパイラ１１４２、インタプリタ１１４４及びランタイム・システム１１４６を含む。バイトコード１１３０はコンパイラ１１４２またはインタプリタ１１４４へ提供可能である。
【０１１３】
バイトコード１１３０をコンパイラ１１４２へ提供する際、バイトコード１１３０に含まれるメソッドはマシン命令にコンパイルされる。１つの実施形態では、コンパイラ１１４２はジャスト・イン・タイム・コンパイラであり、このジャスト・イン・タイム・コンパイラはバイトコード１１３０に含まれるメソッドのコンパイレーションをそのメソッドをまさに実行する直前まで遅延させる。バイトコード１１３０をインタプリタ１１４４へ提供した際、バイトコード１１３０はインタプリタ１１４４内へ１バイトづつ読み込まれる。次いで、各バイトコードがインタプリタ１１４４内へ読み込まれるのにしたがって、インタプリタ１１４４は各バイトコードが定義するオペレーションを実行する。即ち、当業者が理解するように、インタプリタ１１４４はバイトコード１１３０を“通訳”する。一般的に、インタプリタ１１４４はバイトコード１１３０を処理し、かつバイトコード１１３０に関連するオペレーションをほぼ連続的に実行する。
【０１１４】
１つのメソッドが別のメソッドによって呼び出された際、即ち、ランタイム環境１１３５から呼び出された際、この呼び出されたメソッドを通訳する場合、ランタイム・システム１１４６はこのメソッドをランタイム環境１１３５からバイトコード１１３０の列の形態で獲得し、このバイトコード１１３０の列はインタプリタ１１４４によって直接実行される。その一方、呼び出されたメソッドがまだコンパイルされていないコンパイル・メソッド（compiled method）である場合、ランタイム・システム１１４６は、このメソッドをランタイム環境１１３５からバイトコード１１３０の列の形態で獲得し、次いで、コンパイラ１１４２を起動する。次いで、コンパイラ１１４２はマシン命令をバイトコード１１３０から形成し、形成されたマシン言語命令をＣＰＵ１０３２で直接実行する。一般的に、仮想マシン１１４０を終了した際、マシン言語命令は捨てられる。
【０１１５】
以上、本発明の僅かな数の実施形態のみを詳述したが、本発明の趣旨または範囲から逸脱することなく、本発明を他の多くの形態で実施し得ることを理解する必要がある。例えば、メモリ・スペースを実質的に同じ複数のブロックへ分割したシステムと、メモリ・スペースを異なる複数のサイズのブロックへ分割したシステムとの両方において、メモリ・スペースをアロケートすることに関連する複数のステップの順序を変更し得る。更に、必要に応じて、ステップの変更、削除または追加が可能である。
【０１１６】
プライベート小型ブロック及びプライベート大型ブロックの両方を含むシステム内において、プライベート・ブロック、即ち、プライベート大型ブロックをスレッドへ割り当てるか否かの決定は、そのスレッドがアロケートしたバイト数に事実上基づくが、この決定を様々なファクタに基づいて実施し得ることを理解する必要がある。例えば、スレッドが単一の大型オブジェクトを比較的低い頻度でアロケートすべく設けられている際、共有ブロック内における大型オブジェクトの低い頻度でのアロケーションに関連する同期オーバーヘッドは大きくないと考えられるため、プライベート・ブロックをこのスレッドへアロケートすることはない。これに代えて、スレッドが実施するオブジェクト・アロケーションの総数は、プライベート・ブロックを割り当てるスレッドを決定するために使用できる。
【０１１７】
ガーベッジ・コレクション後に実施される高速アロケーティング・スレッドと考えられるスレッドへのプライベート・メモリ・ブロックの割り当てを、各高速アロケーティング・スレッドへの新たなブロックの割り当てに関して説明した。しかし、高速アロケーティング・スレッドへのプライベート・ブロックの割り当てが“グローバル”である必要がないことを理解する必要がある。換言するならば、プライベート・ブロックを、高速アロケーティング・スレッドと考えられる全てのスレッドへ割り当てなくても良い。例えば、独自のブロックを各高速アロケーティング・スレッドへ関連付けることを可能にする十分な数のメモリ・ブロックが存在しない場合、本発明の趣旨または範囲から逸脱することなく、プライベート・ブロックを“最速”の高速アロケーティング・スレッドにのみ割り当て得る。
【０１１８】
共有ブロックの使用を、マルチスレッド・システムに関連する全てのスレッドへ最初に割り当てられる共有ブロックに関して一般的に説明した。しかし、１つの実施形態では、単一の共有ブロックを全てのスレッドへ最初に割り当てるより、寧ろ、複数のスレッド群を特定の共有ブロックへ割り当てる。即ち、１つを越す数の共有ブロックが特定のシステム内に存在し得る。使用する共有ブロックの数の決定は、ガーベッジ・コレクションの相対的コストと比較した同期の相対コスト（但し、これに限定されない）を含むファクタに基づき得る。
【０１１９】
共有ブロック、即ち、多数のスレッドが共有するブロックの使用を、その全てのブロックが実質的に同じサイズであるメモリ・アロケーション領域に関して説明したが、本発明の趣旨または範囲から逸脱することなく、共有ブロックを、異なるサイズの複数のブロックを含むシステム内でも使用できることを理解する必要がある。例えば、メモリ・アロケーション領域を複数の小型ブロック及び大型ブロックへ分割した際、共有ブロックは小型ブロックまたは大型ブロックであり得る。共有ブロックを小型ブロック及び大型ブロックのいずれにするかの決定は、個々のコンピュータ・システムの予想される要件（但し、これに限定されない）を含むファクタに基づき得る。共有ブロックがオーバーフローした際、幾つかの実施形態では、プライベート小型ブロックをオーバーフローイング・スレッドへ最初に割り当て得る。次いで、オーバーフローイング・スレッドが高速アロケーティング・スレッドであることが最終的に確定した場合、プライベート大型ブロックをオーバーフローイング・スレッドへ割り当て得る。
【０１２０】
図１２、図１３及び図１５に基づいて詳述したように、メモリ・アロケーション領域を複数の小型ブロック及び大型ブロックへ分割した際、大型ブロックを獲得する試みの失敗はガーベッジ・コレクションを引き起こす。しかし、１つの実施形態では、大型ブロックが利用可能でない際、小型ブロックの獲得を試み得る。小型ブロックが利用可能である場合、小型ブロックをオーバーフローイング・スレッドへ割り当て得る。しかし、小型ブロックが利用可能でない場合、ガーベッジ・コレクションを実施し得る。小型ブロックの獲得をガーベッジ・コレクションの実施前に最初に試みることにより、ガーベッジ・コレクションの頻度を減少し、これによって、システムの効率を潜在的に増大させる。
【０１２１】
同様に、複数の小型メモリ・ブロック及び大型メモリ・ブロックを有するシステム内における小型ブロック獲得の試みが失敗した際、大型ブロックの獲得をガーベッジ・コレクションに頼る前に試み得る。大型ブロックが利用可能である際、大型ブロックをオーバーフローイング・スレッドへ割り当て得る。小型ブロックが利用可能でない際に、大型ブロックをオーバーフローイング・スレッドへ割り当てることにより、利用可能なブロックが枯渇するまで、ガーベッジ・コレクションを遅延できる。これに代えて、小型ブロックが利用可能でない際、新たな小型ブロックを形成するために、大型ブロックを分割し、次いで、形成された小型ブロックを割り当て得る。一般的に、ガーベッジ・コレクションは比較的大きなオーバーヘッドを有するため、ガーベッジ・コレクションの遅延により、必要とされるガーベッジ・コレクションの数を少なくできる。したがって、総合システムの効率を改善することができる。
【０１２２】
小型ブロック及び大型ブロックの両方を含むシステム内において、スレッドへ割り当てるブロックのサイズを決定するためのオーバーフロー・カウンタの使用を、単一のスレッドへ関連付けられた単一のオーバーフロー・カウンタの比較に関して説明したが、一般的に、スレッドは任意の数のオーバーフロー・カウンタを有し得る。例えば、スレッドが小型ブロックをオーバーフローさせた回数を確認するためのオーバーフロー・カウンタと、スレッドが大型ブロックをオーバーフローさせた回数を確認するためのオーバーフロー・カウンタとを、スレッドは有し得る。２つのオーバーフロー・カウンタを有するスレッドの場合、スレッドへ割り当てる任意の新たなブロックのサイズを決定する際に、異なる複数の閾値を設けることができる。
【０１２３】
アロケーション領域内における異なるサイズのブロックのアロケーションを、小型ブロック及び大型ブロックのアロケーションに関して一般的に説明した。具体的には、異なるサイズのブロックのアロケーションを２つのサイズのブロックを有するアロケーション領域に関して説明した。しかし、幾つかの実施形態では、本発明の趣旨または範囲から逸脱することなく、２つを越すサイズのブロックをアロケーション領域内でアロケートし得ることを理解する必要がある。例えば、各スレッドの要件に基づいて異なるスレッドへそれぞれ割り当て得る小型メモリ・ブロック、大型メモリ・ブロック及び中型メモリ・ブロックを、アロケーション領域は含むことができる。
【０１２４】
本発明をジャバ（商標）仮想マシンなどのマルチスレッド・仮想マシンの一部としての利用に関して説明した。しかし、一般的に、本発明は実質的に任意の適切な仮想マシンに対して実現可能である。したがって、本明細書に開示した複数の実施形態は例示目的であって、限定目的ではない。更に、本発明は本明細書に開示する詳細部分に限定されることなく、請求の範囲内で変更し得る。
【図面の簡単な説明】
【図１】スレッド及びメモリ・アロケーション領域を示す図である。
【図２】２つのスレッドと、これら２つのスレッドが共有するメモリ・アロケーション領域とを示す図である。
【図３】２つのスレッドと、これらのスレッドに関連するメモリ・アロケーション領域とを示す図である。
【図４】２つのスレッドと、これら２つのスレッドが共有する複数のチャンクに分割されたメモリ・アロケーション領域とを示す図である。
【図５】本発明の第１実施形態に基づく複数のスレッドと、これらのスレッドが共有するメモリ・アロケーション領域とを示す図である。
【図６】本発明の第１実施形態に基づくメモリをアロケートする第１のプロセスに関連する複数のステップを示すフローチャートである。
【図７】本発明の第１実施形態に基づくメモリをアロケートする第２のプロセスに関連する複数のステップを示すフローチャートである。
【図８】本発明の第１実施形態に基づく高速アロケーティング・スレッドと考えられるスレッドの決定、即ち、図７のステップ４５８に関連する複数のステップを示すフローチャートである。
【図９】本発明の第１実施形態に基づくメモリをアロケートする第３のプロセスに関連する複数のステップを示すフローチャートである。
【図１０】本発明の第１実施形態に基づくメモリをアロケートする第４のプロセスに関連する複数のステップを示すフローチャートである。
【図１１】本発明の第２実施形態に基づく複数のスレッドと、これらのスレッドが共有するメモリ・アロケーション領域とを示す図である。
【図１２】本発明の第２実施形態に基づくメモリをアロケートする第１のプロセスに関連する複数のステップを示すフローチャートである。
【図１３】本発明の第２実施形態に基づくメモリをアロケートする第２のプロセスに関連する複数のステップを示すフローチャートである。
【図１４】本発明の第２実施形態に基づく高速アロケーティング・スレッドと考えられるスレッドの決定、即ち、図１３のステップ９１８に関連する複数のステップを示すフローチャートである。
【図１５】本発明の第２実施形態に基づくメモリをアロケートする第３のプロセスに関連する複数のステップを示すフローチャートである。
【図１６】本発明の実現に適する一般的な汎用コンピュータ・システムを示す図である。
【図１７】図１６のコンピュータ・システム１０３０によってサポートされ、かつ本発明の実現に適する仮想マシンを示す図である。
【図１】
0004511653.tif 000002
【図２】
0004511653.tif 000003
【図３】
0004511653.tif 000004
【図４】
0004511653.tif 000005
【図５】
0004511653.tif 000006
【図６】
0004511653.tif 000007
【図７】
0004511653.tif 000008
【図８】
0004511653.tif 000009
【図９】
0004511653.tif 000010
【図１０】
0004511653.tif 000011
【図１１】
0004511653.tif 000012
【図１２】
0004511653.tif 000013
【図１３】
0004511653.tif 000014
【図１４】
0004511653.tif 000015
【図１５】
0004511653.tif 000016
【図１６】
0004511653.tif 000017
【図１７】
0004511653.tif 000018