共有スタックと、前記共有スタックの第1の部分を第1のスレッドに選択的に割り当て、前記共有スタックの第2の部分を第2のスレッドに選択的に割り当てるように動作可能な、コントローラとを含む、装置。前記第1の部分が、前記第2の部分と非連続である、請求項1に記載の装置。前記第1の部分が、前記第2の部分と連続である、請求項1に記載の装置。前記共有スタックが、ハードウェアスタックおよびランダムアクセスメモリからなる群から選択される、請求項1に記載の装置。前記共有スタックと関連付けられるスタック操作要求を生成するように構成される、マルチスレッド化されたプロセッサコアを含む、プロセッサをさらに含む、請求項1に記載の装置。前記コントローラが、スタック操作要求に応答するように動作可能である、請求項1に記載の装置。前記スタック操作要求が、プッシュとポップの少なくとも1つを含む、請求項6に記載の装置。前記スタック操作要求が、機能リターンアドレスを含む、請求項6に記載の装置。前記第1のスレッドが、前記第2の部分内でデータ要素を上書きする、請求項1に記載の装置。前記第1の部分および前記第2の部分が動的に割り当てられる、請求項1に記載の装置。前記コントローラが、前記第1のスレッドの書き込み先になるように構成される前記共有スタックの最下位のエントリを、指すように構成される、最下位エントリポインタと、前記第1のスレッドの書き込み先になるように構成される前記共有スタックの最上位のエントリを、指すように構成される、最上位エントリポインタと、前記第1のスレッドと関連付けられる前記共有スタックの最も新しく書き込まれたエントリを指すように構成される、スタックの最上位ポインタと、前記第1のスレッドと関連付けられる前記共有スタックの最も古い有効なエントリを指すように構成される、スタックの最下位ポインタとを含む、請求項1に記載の装置。前記コントローラが、前記第1のスレッドがプロセスを実行しているかどうかを示すように構成されるスレッドアクティブステータスビットを含む、請求項1に記載の装置。前記コントローラが、前記第1のスレッドと関連付けられる前記共有スタックのエントリが使われるかどうかを示すように構成されるエンプティビットを含む、請求項1に記載の装置。前記コントローラが、前記第1のスレッドが前記共有スタック内でラップしたかどうかを示すように構成されるラップトスタックビットを含む、請求項1に記載の装置。前記コントローラが、機能リターンアドレスを予測するように構成され、第1の命令が前記リターンアドレスを決定し、共有スタックの喪失が、前記機能リターンアドレスを決定するための第2の命令を引き起こす、請求項1に記載の装置。セットトップボックス、音楽プレーヤ、ビデオプレーヤ、エンターテインメントユニット、ナビゲーションデバイス、通信デバイス、携帯情報端末、固定位置のデータユニット、およびコンピュータからなる群から選択されるデバイスをさらに含み、前記コントローラと前記メモリの少なくとも1つが組み込まれる、請求項1に記載の装置。プロセッサの複数のスレッドによって共有されるスタックを管理する方法であって、共有スタックの第1の部分を第1のスレッドに割り当てるステップと、前記共有スタックの第2の部分を第2のスレッドに割り当てるステップとを含む、方法。前記第1のスレッドを用いて、前記第2の部分内でデータ要素を上書きするステップをさらに含む、請求項17に記載の方法。前記共有スタックの前記第1の部分の要素に関して、リターンアドレスのプッシュとポップの少なくとも1つを前記第1のスレッドが行うのを可能にするステップをさらに含む、請求項17に記載の方法。前記共有スタックの前記第2の部分の要素に関して、リターンアドレスのプッシュとポップの少なくとも1つを前記第2のスレッドが行うのを可能にするステップをさらに含む、請求項19に記載の方法。メモリの一部の中に前記共有スタックを形成するステップをさらに含む、請求項17に記載の方法。前記共有スタックを用いてリターンアドレスを予測するステップをさらに含む、請求項17に記載の方法。前記第1の部分および前記第2の部分を動的に割り当てるステップをさらに含む、請求項17に記載の方法。前記第1の部分と前記第2の部分のうちの少なくとも1つのサイズを調整するステップをさらに含む、請求項17に記載の方法。前記第1の部分と前記第2の部分のうちの少なくとも1つのサイズを固定するステップをさらに含む、請求項17に記載の方法。公平性の方針に従って、前記第1のスレッドに割り当てられた前記第1の部分のサイズを制限するステップをさらに含む、請求項17に記載の方法。前記公平性の方針に従って前記第1の部分の前記サイズを制限するステップが、前記第1のスレッドと関連付けられるエントリの最大の数と、前記共有スタックの使用率との少なくとも1つに基づいて、前記第1の部分の前記サイズを制限するステップを含む、請求項26に記載の方法。コンピュータによって実行可能な命令を記憶するコンピュータ可読有形媒体であって、前記命令が、共有スタックの第1の部分を第1のスレッドに割り当てるように、前記コンピュータによって実行可能な命令と、前記共有スタックの第2の部分を第2のスレッドに割り当てるように、前記コンピュータによって実行可能な命令とを含む、コンピュータ可読有形媒体。前記命令が、セットトップボックス、音楽プレーヤ、ビデオプレーヤ、エンターテインメントユニット、ナビゲーションデバイス、通信デバイス、携帯情報端末、固定位置のデータユニット、およびコンピュータからなるグループから選択されたデバイスに組み込まれるプロセッサによって実行可能である、請求項28に記載のコンピュータ可読有形媒体。マルチスレッド化されたプロセッサの各スレッドは、固有の専用RASを使うことができ、各RASのサイズは一定であり得る。各スレッドは、各スレッドが実行している命令ストリームに応じて、異なる数の一定のサイズのRASのエントリを使うことができる。しかし、複数のリターンアドレススタックを使うと、システムに対する負担が増大する。ある特定の実施形態は、共有スタックへのマルチスレッド化されたアクセスを可能にし得る。共有スタックへのアクセスは、各スレッドの現在の需要に従って、複数のスレッドに動的に割り当てられ得る。共有スタックのエントリは、スレッドポインタの操作を通じて、スレッドによって割り当てられ上書きされ得る。スタックアドレスのエントリを移動する代わりにスレッドポインタが移動されるので、処理能力および電力に対する要求が低くなり得る。共有スタックのエントリは、複数のスレッドにわたってより効率的に分布し得るので、共有スタックは、従来の静的なマルチスレッド化されたリターンアドレススタックよりも、少ないエントリを含み得る。スタックのエントリが少ないことで、ダイに必要な空間が小さくなるとともに、性能が向上し得る。別の特定の実施形態では、共有スタックを含む装置が開示される。装置はさらに、共有スタックの第1の部分を第1のスレッドに選択的に割り当て、共有スタックの第2の部分を第2のスレッドに選択的に割り当てるように動作可能な、コントローラを含む。別の特定の実施形態では、プロセッサの複数のスレッドによって共有されるスタックを管理する方法は、共有スタックの第1の部分を第1のスレッドに割り当てるステップと、共有スタックの第2の部分を第2のスレッドに割り当てるステップとを含む。別の特定の実施形態では、コンピュータ可読有形媒体が、コンピュータによって実行可能な命令を記憶する。この命令は、共有スタックの第1の部分を第1のスレッドに割り当て、共有スタックの第2の部分を第2のスレッドに割り当てるように、コンピュータによって実行可能な命令を含む。開示される実施形態の少なくとも1つによって提供される具体的な利点は、共有スタックが、共有されたアクセスのために複数のスレッドによって構成されることに起因し得る。共有スタックは、スレッドが各々別個のスタックにアクセスするシステムによって従来必要とされる全体のエントリよりも、より少ない全体のエントリを含み得る。エントリの全体の数が少ないことで、ダイに必要な空間が小さくなるとともに、複雑さが低減し必要な電力が小さくなり得る。開示される実施形態の1つまたは複数によって容易になる、スタックサイズの低減および他の利点によって、さらに、メモリの配分およびスタックアクセスの効率性が改善され得る。本開示の他の態様、利点、および特徴は、以下のセクション、すなわち、図面の簡単な説明、発明を実施するための形態、および特許請求の範囲を含む、本出願全体の検討後に明らかになろう。マルチスレッド化されたプロセッサの複数のスレッドによって共有されるメモリスタックを含む、システムが開示される。共有スタックのエントリは、スタックコントローラによって、所与のスレッドに動的に割り当てられ得る。そのような割り当てによって、各スレッドに対して割り当てられる共有スタックの部分は、スタックが効率的に使用されるような、かつ公平性の方針を考慮した、大きさである。共有スタックは、別々のスレッドに対して各々専用である別個のスタックによって用いられるスタックエントリよりも、少ないスタックエントリを含み得る。図1を参照すると、複数のスレッドでスタックを共有するためのシステムの特定の実施形態が図示され、全般に100と称される。システム100は、メモリ104に結合されるコントローラ102を含む。コントローラ102は、マルチスレッド化されたプロセッサ160に応答する。メモリ104は、共有スタック105を含む。コントローラ102は、マルチスレッド化されたプロセッサ160からのスタック操作要求に応答して、マルチスレッド化されたプロセッサ160の個々のスレッドに、共有スタック105の部分を割り当てかつ割り当てを解除し、スレッドを要求するために共有スタック105のスタック操作を実行する。マルチスレッド化されたプロセッサ160は、1つまたは複数のスレッドを実行できる、1つまたは複数のマルチスレッド化されたプロセッサコア106を含み得る。たとえば、マルチスレッド化されたプロセッサ160は、第1のスレッド108、第2のスレッド110、第3のスレッド112、および第nのスレッド114を実行することができる。マルチスレッド化されたプロセッサ160は、スタック操作要求を、スレッド108~114の1つまたは複数のためにコントローラ102に送ることができる。たとえば、マルチスレッド化されたプロセッサ160は、プッシュ要求138をコントローラ102に送ることができ、コントローラ102は、プッシュ要求138を生成するスレッドを特定し、さらに、共有スタック105のうちの要求するスレッドの部分にプッシュされるべきデータを特定する。別の例として、マルチスレッド化されたプロセッサ160は、ポップ要求136をコントローラ102に送ることができる。ポップ要求136は、複数のスレッド108~114のうちの要求するスレッドを特定し、共有スタック105のうちの要求するスレッドの部分に最も新しく追加されたデータのリターンを要求することができる。コントローラ102は、共有スタック105の部分を個々のスレッドに選択的に割り当てるように動作可能である。たとえば、コントローラ102は、共有スタック105の第1の部分116を第1のスレッド108に、共有スタック105の第2の部分118を第2のスレッド110に、共有スタック105の第3の部分120を第3のスレッド112に、および共有スタック105の第nの部分122を第nのスレッド114に、選択的に割り当てることができる。ある特定の実施形態では、共有スタック105はハードウェアスタックを含み得る。あるいは、共有スタック105は、ランダムアクセスメモリのような他のメモリの中で実装されてもよい。コントローラ102は、公平性の方針140に従うスレッド要求に応答して、共有スタック105の部分116~122を動的に割り当て、スタックポインタ142を介して、割り当てを示すデータおよび割り当てられた部分116~122の使用量を保持する。たとえば、公平性の方針140は、共有スタック105が、スレッドにわたって等しく、各スレッドに対する部分の大きさを一定にして、各々の実行するスレッドに対する部分の大きさを一定にして、各スレッドに対する部分の大きさを可変にして、各々の実行するスレッドに対する部分の大きさを可変にして、スタックの喪失の数に関して部分の大きさを加重平均にして、または何らかの他の方式で割り当てられることを、示し得る。スタックポインタ142は、第1のスレッド108に対応するポインタ162、第2のスレッド110に対応するポインタ164、第3のスレッド112に対応するポインタ166、および第nのスレッド114に対応するポインタ168を含む。たとえば、スレッドポインタ162~168の各々は、図2~図6に関して説明されるように、最上位エントリポインタ、スタックの最上位ポインタ、スタックの最下位ポインタ、最下位エントリポインタ、および1つまたは複数の追加のステータスビットを含み得る。コントローラ102は、循環バッファを用いて各スレッドに割り当てられる別個のスタックを管理するために、ポインタ162~168を用いる。第1の部分116は、第1のスレッド108に対応するスタック操作のために割り当てられ得る。第1の部分116は、第1のスレッド108の1つまたは複数のデータ要素124を記憶し得る、1つまたは複数のスタックエントリを含み得る。第2の部分118は、第2のスレッド110のスタック操作のために割り当てられてよく、第2のスレッド110の1つまたは複数のデータ要素126を記憶し得る1つまたは複数のスタックエントリを含み得る。第3の部分120は、第3のスレッド112に対応するスタック操作のために割り当てられてよく、第3のスレッド112の1つまたは複数のデータ要素128を記憶し得る1つまたは複数のスタックエントリを含み得る。第nの部分122は、第nのスレッド114に対応するスタック操作のために割り当てられてよく、第nのスレッド114の1つまたは複数のデータ要素130を記憶し得る1つまたは複数のスタックエントリを含み得る。動作中、マルチスレッド化されたプロセッサ160の1つまたは複数のスレッドは、プッシュ要求138のようなスタック操作要求を生成することができる。コントローラ102は、プッシュ要求138を受け取り、要求するスレッドが、データの追加に対応するのに十分な空間を、割り当てられた部分に有するかどうかを、判定することができる。第1の部分116が十分な空間を含まない場合、コントローラ102は、公平性の方針140に従って、追加の空間を第1のスレッド108に動的に割り当てるかどうかを決定することができる。たとえば、他のスレッド110~114が共有スタック105の残りを使っていない場合、コントローラ102は、第1のスレッド108に対応する追加のプッシュ要求に対応するために、第1の部分116に追加のメモリを動的に割り当てることができる。あるいは、複数のスレッド110~114が共有スタック105をアクティブに使っている場合、コントローラ102は、公平性の方針140によって決定されるように、第1のスレッド108に、共有スタック105の公平な持ち分よりも多くを割り当てるのを防ぐことができる。共有スタックの各部分は、循環バッファを用いて実装され得る。プッシュ要求138を満たすことができるとコントローラ102が判定すると、コントローラ102は、第1の部分116内の第1のスレッド108のデータ要素124の1つに対するプッシュ要求138のために受け取られたデータを書き込むことを含み得る、メモリ操作150を開始する。コントローラ102はまた、第1の部分がリサイズされた時に、第1のスレッドポインタ162を更新し、スタックの最上位のエントリの変更を示すことができる。コントローラ102はまた、スレッドのいずれかから、たとえば、第1のスレッド108から、ポップ要求136を受け取るように構成され得る。ポップ要求136に応答して、コントローラ102は、第1のスレッド108のデータ要素124から最も新しく追加されたデータ要素を読み取り、ポップ要求136に応答して、マルチスレッド化されたプロセッサ160にデータ134を返すための、メモリ操作150を開始するように構成される。たとえば、共有スタック105が機能リターンアドレススタックとして実装される場合、リターンデータ134は、第1のスレッド108のような要求されるスレッドに対応する、機能リターンアドレスを含む。加えて、コントローラ102は、第1のスレッドポインタ162を更新して、スタックの最上位がポップされたことを示し、ポップ要求136が満たされたことに応答して、第1の部分116内でのスタック空間の使用量の割り当てを減らすことができる。コントローラ102が第1の命令を介して機能リターンアドレスを予測する特定の実施形態では、予測を誤った機能リターンアドレスが共有スタック105から来ると、訂正された機能リターンアドレスがその後返される。たとえば、マルチスレッド化されたプロセッサ160は、実行されるべき命令の形態で、ポップ要求136を受け取ることができる。このリターンの実行は、完了に複数のサイクルを要し得る。リターン命令の実行の開始の時点で、リターンアドレスは共有スタック105からポップされ得る。このポップされたリターンアドレスは、命令フェッチをリダイレクトするために用いられる、推測のアドレスであってよい。リターン命令の実行が続くと、マルチスレッド化されたプロセッサ160は、実際のリターンアドレスを計算することができる。リターン命令が実行を完了した時、推測のリターンアドレスと推測ではないリターンアドレスが比較され得る。リターンアドレスが一致しない場合、実際のリターンアドレスが命令をフェッチするために使われ得る。不正確にフェッチされた命令は、フラッシュされ得る。コントローラ102が、プッシュ動作要求138に応答して共有スタック105の部分を動的に割り当てるために、公平性の方針140を実施した結果として、各スレッド108~114が、共有スタック105内での全体のスタックのエントリの効率的な利用のために個別のスタックとして動作する共有スタック105の別々の部分を与えられるように、共有スタック105は、複数のスレッド108~114によって使われ、動的に割り当てられ得る。個々のスレッド108~114への、共有スタック105の部分116~122の割り当ておよび割り当て解除は、データ要素124~130を共有スタック105内で移動しなくてもよいように、コントローラ102の動作を通じて、かつスタックポインタ142の制御によって実行され得る。代わりに、共有スタック105の割り当てられた部分116~122は、データ要素124~130の周りで移動されてもよい。その結果、共有スタック105を効率的に使うことができ、共有スタック105は、複数のスレッド108~114からのスタック操作に対応することができ、各スレッド108~114に別個の専用スタックを含むシステムよりも、使用する全体のスタックエントリを少なくすることができる。4つのスレッドおよび4つの部分が図1に示されるが、共有スタック105は、2つ以上のスレッドによって用いられる、2つ以上の部分を含み得る。また、メモリ104、コントローラ102、およびプロセッサ160は別個の構成要素として示されるが、そのような構成要素の2つ以上が単一のデバイスに統合されてもよいことを、理解されたい。図2を参照すると、共有スタックにアクセスするように構成される複数のスレッドの1つの実行を示す、システムの特定の例示的な実施形態のブロック図が図示され、全般に200と称される。より具体的には、スレッド112は、リセット状態からアクティブになることができ、共有スタック105のエントリ222を割り当てられ得る。図2のスレッド108、110、および112は、図1のスレッド108、110、および112と同じであってよく、図2の共有スタック105は、図1の共有スタック105と同じであってよい。スレッド112は、ポインタ252、254、256、および258の使用を通じて、共有スタック105のエントリ222の所有権を得ることができる。スレッド112は、スレッド112の書き込み先であり得る、最上位エントリポインタ252を含み得る。最上位エントリポインタ252は、共有スタック105内で再上位のエントリを指すことができる。スレッド112は、スタックの最上位ポインタ254も含み得る。スタックの最上位ポインタ254は、スレッド112と関連付けられる共有スタック105内の、最上位の、または最も新しく書き込まれたエントリを指すことができる。最も新しく書き込まれたエントリは、スタックポップ操作があると返されるデータを含み得る。スレッド112内に含まれるスタックの最下位ポインタ256は、スレッド112と関連付けられる共有スタック105内の最も古い有効なエントリを指すことができる。スレッド112はさらに、最下位エントリポインタ258を含み得る。最下位エントリポインタ258は、スレッド112の書き込み先であり得る、共有スタック105の最下位エントリを指すことができる。スレッド112はさらに、スレッドアクティブステータスビット260を含み得る。スレッドアクティブステータスビット260は、スレッド112がプロセスを実行しているかどうかを示すことができる。スレッド112がプロセスを実行していない場合、スレッド112は、共有スタック105のエントリを割り当てられなくてよい。スレッド112はさらに、ラップトスタックビット264を含む。ラップトスタックビット264は、スタックの最上位ポインタ254およびまたはスタックの最下位ポインタ256が共通のエントリを指すように進んだことに応答して、共有スタック105がラップしたかどうかを示すことができる。たとえば、ラップトスタックビット264は、スタックポインタ254がラップアラウンドしてスタックの最下位ポインタ256に到達したことを示すために、論理値1に設定され得る。ラップトスタックビット264が論理値1に設定される場合、その後のプッシュによって、スタックの最下位ポインタ256とスタックの最上位ポインタ254の両方がインクリメントされ得る。プッシュ操作によってさらに、共有スタックの中の最も古いエントリが上書きされ得る。共有スタック105からのポップ操作が、スレッドのラップトスタックビット264が論理値1を有する時に起きる場合、ラップトスタックビット264は、値0に遷移し得る。スレッド112はまた、エンプティフルビット262を含む。エンプティフルビット262は、スレッド112と関連付けられる共有スタック105のエントリが使われるかどうかを示すように構成され得る。たとえば、エンプティフルビット262は、スレッド112のデータが共有スタック105の中に存在する時、論理値1を含み得る。逆に、エンプティフルビット262は、スレッド112のデータが共有スタック105内に記憶されていない時、論理値0を含み得る。エンプティフルビット262が論理値0であり、プッシュ操作が行われる場合、エンプティフルビット262は論理値1に遷移し得る。スタックの最上位ポインタ254とスタックの最下位ポインタ256の両方が同じエントリを指し、ラップトスタックビット264が論理値0に等しい時に、ポップ操作が起きた場合、エンプティフルビット262は論理値0に遷移し得る。一般に、スレッドは、最上位エントリポインタと最下位エントリポインタとによって境界が示される共有スタック105のエントリを割り当てられてよく、またはそれを所有してよい。スレッドは、そのような所有されるエントリにデータを書き込むことができる。加えて、スレッドは、スタックの最上位ポインタとスタックの最下位ポインタとの間のエントリを利用すると考えられ得る。したがって、共有スタック105のエントリは、特定のスレッドによって所有されてよく、特定のスレッドによって所有され利用されてよく、または、特定のスレッドによって所有も利用もされなくてもよい。スレッド112と同様に、スレッド110は、最上位エントリポインタ238と、スタックの最上位ポインタ240とを含み得る。スレッド110はさらに、スタックの最下位ポインタ242と、最下位エントリポインタ244とを含み得る。スレッドアクティブステータスビット246、エンプティフルビット248、およびラップトスタックビット250も、スレッド110内に含まれ得る。スレッド108は、最上位エントリポインタ224と、スタックの最上位ポインタ226とを含み得る。スレッド108はさらに、スタックの最下位ポインタ228と、最下位エントリポインタ230とを含み得る。スレッドアクティブステータスビット232、エンプティフルビット234、およびラップトスタックビット236も、スレッド108内に含まれ得る。共有スタック105は、命令のメモリアドレスを記憶する、エントリ210、212、214、216、218、220、および222を含み得る。エントリ210、212、214、216、218、220、および222は、スレッド108、110、および112によって共有されるように構成され得る。シングルスレッド動作の間に、スレッド112はアクティブになり得る。最上位エントリポインタ252、スタックの最上位ポインタ254、スタックの最下位ポインタ256、および最下位エントリポインタ258が、点線266によって示されるように、エントリ222を指すように設定され得る。スレッド112は、エントリ222を所有していると言われ得る。エンプティフルビット262およびラップトスタックビット264は、空の状態を示すように設定されてよく、スレッドアクティブステータスビット260は、アクティブな状態を示すように設定されてよい。スレッド112上で実行するプロセスによってコールが行われると、スタックの最上位ポインタ254によって示されるエントリ222に、アドレスが共有スタック105上でプッシュされ得る。アドレスは、リターンアドレスを示し得る。スレッド112上で実行するプロセスによってその後のコールが行われる場合、スタックの最上位ポインタ254によって示されるエントリ222の上のエントリ220に、別のアドレスが共有スタック105上でプッシュされ得る。このプッシュによって、最上位エントリポインタ252およびスタックの最上位ポインタ254は、新たに書き込まれたエントリ220を指すように動的にインクリメントし得る。したがってこのインクリメントは、共有スタック105の1つまたは複数の追加のエントリを、スレッド112に割り当て得る。スレッド112上で実行するプロセスがリターンを示す場合、共有スタック105からのポップ操作が、予測されるリターンアドレスを取り出すために起こり得る。ポップ操作によって、スレッド112のスタックの最上位ポインタ254はデクリメントし得るが、最上位エントリポインタ252はデクリメントしなくてよい。誤った分岐予測が、共有スタック105からポップされた不正確なリターンアドレスによって引き起こされ得る。それに応答して、スタック105に記憶され、誤った予測を行うスレッドと関連付けられる、すべてのデータが廃棄されてよく、スレッドのスタックの構築が再び開始され得る。たとえば、スレッド112が誤った予測を行った場合、スタックの最下位ポインタ256と等しくスタックの最上位ポインタ254を設定し、空の状態を示すようにエンプティフルビット262の状態を設定し、ラップがないことを示すようにラップトスタックビット264を設定することによって、スレッド112の再構築が開始され得る。エンプティフルビット262が値0に等しい間、ポップ要求を避けることができ、これによって処理能力を節減することができる。図2は、シングルスレッドに関する動作を示す。たとえば、スレッド112は、リセット状態からアクティブになり得る。スレッド112のスレッドポインタは最初、共有スタック105の単一のエントリを指していてよい。したがって、スレッド112は、リセット状態からアクティブになった時に、共有スタック105のエントリ222に自身を固定したと考えられてよい。スレッド112によって実行されるプロセスによってコールが行われると、スレッドポインタは更新され得るが、共有スタック105内に記憶されるアドレスはシフトしなくてよい。共有スタック内でアドレスをシフトするのではなくスレッドポインタを更新することで、消費電力、ハードウェアに対する要求、および全体的な複雑さを下げることができる。図3は、プロセスを実行し、共有スタック105の複数のエントリ216、218、220、および222に動的にアクセスする、アクティブスレッド112を含む、図2に示されるプロセシング状態とは異なるプロセシング状態の、システム200のブロック図を示す。スレッド108および110は、非アクティブである。スレッド112は、エントリ222に加えて、共有スタック105のエントリ216、218、および220も割り当てられている。エントリ272は使われていなくてよい。最上位エントリポインタ252は、点線270によって示されるように、エントリ216を指すことができる。点線268によって示されるように、スタックの最上位ポインタ254は、エントリ220を指していてよい。点線266によって示されるように、スタックの最下位ポインタ256と最下位エントリポインタ258の両方が、エントリ222を指すことができる。したがって、スレッド112は、線270および線266によって境界が示される、エントリ216、218、220、および222を割り当てられてよく、またはそれらを所有してもよい。図3は、共有スタック105からスレッド112への、エントリの動的な割り当てを示す。この割り当ては、共有スタック105の中でエントリをシフトする代わりに、スレッドポインタを再割り当てすることによって起こってよく、このことは、メモリの配分の改善、電力効率の改善、およびハードウェアに対する要求の軽減を支援し得る。図4は、スレッド110がアクティブになり、共有スタック105の使用されていないエントリ272内に割り当てられ、そこに自身を固定した場合の、システム200の特定の例示的な実施形態のブロック図である。エントリ272は、エントリ210、212、214、および274という第1のグループと、スレッド112が所有を主張するエントリ216、218、220、および222という第2のグループとの間に位置し得る。アクティブになると、スレッド110は、共有スタック105のエントリ272内に自身を固定することができる。スレッド110は、エントリ272内で共有スタック105にデータ要素をプッシュすることができる。ある特定の実施形態では、エントリ272は、別のスレッドへの割り当てを事前に解除されていてもよく、または別のスレッドによる所有の主張が事前に取り消されていてもよい。別の特定の実施形態では、スレッドを固定するのに用いられるエントリは、別のスレッドに事前に割り当てられていてもよい。図4の点線276によって示されるように、最上位エントリポインタ238、スタックの最上位ポインタ240、スタックの最下位ポインタ242、および最下位エントリポインタ244が、エントリ272を指す。スレッド110は、別のエントリの所有を主張し、共有スタック105の所有を主張されたエントリへの追加のデータ要素を、エントリ274にプッシュすることができる。図4は、共有スタック105に動的にアクセスする複数のアクティブスレッドを示す。共有スタック105のエントリは、アクティブスレッドのスレッドポインタを修正することによって、複数のアクティブスレッドに動的に割り当てられ得る。アクティブスレッドは、現在の需要に従って、共有スタック105のエントリを割り当てられてよく、これによって、効率的なスタックの利用が促進され得る。図5を参照すると、共有スタック105と、図4に示されるものとは異なるプロセシング状態にある3つのスレッド108、110、および112を含む、システム200のある特定の例示的な実施形態が図示される。スレッド110およびスレッド112は、アクティブであり、共有スタック105にアクセスしている。たとえば、スレッド110は、追加のエントリの所有を主張しており、スレッド112のエントリの上書きを準備している。スレッド112は、点線270によって示される214から、点線266によって示されるエントリ220まで、共有スタック105のエントリを所有することができる。同様に、スレッド110は、エントリ222と、エントリ210および212を含むようにスタック105をラップアラウンドすることとによって、境界が示される、共有スタック105のエントリを所有することができる。スタックの最下位ポインタ242が、スタックの最上位ポインタ240の上にあるので、スレッド110は、共有スタック105内でラップアラウンドされたと言うことができる。したがってスレッド110は、エントリ210、212、および222を所有する。スレッド110が所有する共有スタック105の部分はこうして、スレッド112と連続的になり、プッシュに応じて所有を主張すべき、スレッド110向けのフリーのエントリは存在しない。スレッド110が共有スタック105へのプッシュを実行し、スタックの最上位ポインタ240が最上位エントリポインタ238と同じエントリを指している場合、データは2つの位置のうちの1つにプッシュされ得る。たとえば、図6で描かれるように、スレッド110は、スタックの最上位ポインタ240と最上位エントリポインタ238との両方をインクリメントすることができ、それによって、新たにプッシュされたデータを記憶するための、新たなエントリおよびより多くのスタック空間の所有を主張する。あるいは、スレッド110は、スタックの最上位ポインタ240をラップアラウンドし、最下位エントリポインタ244が指すエントリにデータを書き込むことができる。どのプロセスを選択するかは、最上位エントリポインタ238の後続のエントリがすでに所有を主張されたかどうか、および、スレッド110が共有スタック105の公平な持ち分をすでに使っているかどうかに、依存し得る。最上位エントリポインタ238の指すエントリ222の上のエントリ220が所有を主張されていない場合、スレッド110は、最上位エントリポインタ238を更新することによって、エントリ220の所有を主張することができる。スレッド110はさらに、スタックの最上位ポインタ240を、同じエントリ220を指すように設定することができる。最上位エントリポインタ238の指すエントリ222の上のエントリ220が、別のスレッドによって所有を主張され、スレッド110がすでに、スタック105の少なくとも公平な持ち分を所有している場合、その後のプッシュによって、スレッド110が追加のスタックエントリ220の所有を主張することはできない。代わりに、スタックの最上位ポインタ240は、最上位エントリポインタ238から最下位エントリポインタ244にラップアラウンドすることができる。最上位エントリポインタ238の指すエントリ222の上のエントリ220が、別のスレッドによって所有を主張され、スレッド110が共有スタック105の公平な持ち分をまだ所有していない場合、プッシュは、別のスレッド112からのエントリ220の所有を主張することを許可され得る。エントリ220は、スレッド112の最下位エントリポインタ258を更新し、スレッド110の最上位エントリポインタ238を更新することによって、所有を主張され得る。図6を参照して説明されるように、スレッド112のポインタはまた、エントリ220の喪失を反映するようにも更新され得る。スレッド110は、共有スタック105の公平な持ち分に達するまで、この方式でエントリの所有の主張を続けることができる。図5は、複数のスレッドの間の共有スタックアクセスを示す。図5に示されるように、スレッド112は共有スタック105のうちの所有する部分の中でラップアラウンドされるので、スレッド110は、スレッド112が利用するスタックエントリの最下位からではなく、スレッド112が利用するスタックエントリの中央部からの、エントリの所有を主張することができる。これによって、スレッド112は、スタックの最下位からのスタックエントリではなく、スタックの中央部に位置するスタックエントリ220を失い得る。その結果、スレッド112のスタックは、エントリ218よりも下では損なわれ得る。したがって、スタックの最下位ポインタ256は、図6に示されるように、エントリ218に移動され得る。したがって、スレッドは、十分なエントリがある限りは、スレッドの需要に従って、共有スタック105に動的にアクセスすることができる。エントリが乏しくなると、スレッドは、公平なスタックの利用を実現するために、エントリを喪失し得る。図5に示されるように、スレッド112は、エントリ214~220を所有し、エントリ216~220、およびエントリ214~274を利用することができる。したがってエントリ220は、エントリ220がスレッド110によって所有を主張されている時には、スレッド112によって所有されかつ利用されている。図6を参照すると、共有スタック105と、図5に示されるものとは異なるプロセシング状態にある3つのスレッド108、110、および112を含む、システム200の別の特定の例示的な実施形態が図示される。たとえば、スレッド110がすでに、スレッド112のエントリの所有を主張しており、スレッド112のエントリを上書きしている。スレッド112は、点線270によって境界が示される214から、点線280によって境界が示されるエントリ218まで、共有スタック105のエントリを所有することができる。スレッド112は、スレッド110に対してエントリ220を喪失している可能性がある。したがって、図6に示される特定の実施形態では、スレッド112は、共有スタック105の利用されている部分の中央部からの、エントリ220を喪失し得る。スレッド112のスタックの最下位ポインタ256は、274を指す状態から、新たな最下位エントリ218を指すように、更新され得る。同様に、スレッド110は、エントリ220と、エントリ210および212を含むようにスタック105をラップアラウンドすることとによって、境界が示される、共有スタック105のエントリを所有することができる。したがってスレッド110は、エントリ210、212、220、および222を所有する。スレッド112は、スレッド110に対してエントリ220を喪失している。ある特定の実施形態によれば、有効なエントリ220を喪失したスレッド112は、喪失したエントリ220よりも古いすべてのエントリを、無効にすることができる。この目的のために、スレッド112は、スタックの最下位ポインタ256を、新たにインクリメントされた最下位エントリポインタ258と同じエントリを指すように、設定することができる。図6は、1つのスレッドが別のスレッドの所有するエントリの所有を主張でき、かつそのエントリを上書きできる、複数のスレッドによる共有スタック105のアクセスを示す。エントリは、スレッドポインタを修正することによって、かつ共有スタック105内でエントリを移動することなく、所有を主張され得る。共有スタック105は、現在の需要に従って、複数のスレッドに動的に割り当てられてよく、これによって効率的なスタックの利用が促進され得る。図7は、プロセッサの複数のスレッドによって共有されるスタックを管理する方法700の、ある特定の例示的な実施形態の流れ図を示す。本明細書で説明されるように、例示的な方法700は、図1のシステム100または図2のシステム200によって実行され得る。702において、共有スタックの第1の部分が、第1のスレッドに割り当てられ得る。たとえば、図1の共有スタック105の第1の部分116が、第1のスレッド108に割り当てられ得る。さらに例示すると、第1のスレッド108は、共有スタック105の追加の空間を要求する、プロセスを実行することができる。第1のスレッド108のポインタ162は、共有スタック105の第1の部分116を指し、第1の部分116の制御権を取得することができる。704において、共有スタックの第2の部分が、第2のスレッドに割り当てられ得る。たとえば、図1の共有スタック105の第2の部分118が、第2のスレッド110に割り当てられ得る。さらに例示すると、第2のスレッド110は、共有スタック105の追加の空間を要求する、プロセスを実行することができる。第2のスレッド110のポインタ164は、共有スタック105の第2の部分118を指し、第2の部分118の制御権を取得することができる。706において、共有スタックの第3の部分が、第3のスレッドに割り当てられ得る。たとえば、図1の共有スタック105の第3の部分120が、第3のスレッド112に割り当てられ得る。さらに例示すると、第3のスレッド112は、共有スタック105の追加の空間を要求する、プロセスを実行することができる。第3のスレッド112のポインタ166は、共有スタック105の第3の部分120を指し、第3の部分120の制御権を取得することができる。708において、共有スタックが、リターンアドレスを予測するために使われ得る。たとえば、図1の共有スタック105が、リターンデータ134に含まれる機能リターンアドレスを予測するために、使われ得る。図7の方法700は、共有スタックのあらゆる使用の前に、共有スタックの一部を複数のスレッドに割り当てるステップを示すが、そのような順序は例示を目的とするものに過ぎず、限定するものと見なされるべきではないことに留意されたい。共有スタックの一部を割り当てられる任意のスレッドは、他のスレッドが共有スタックの他の部分をいつ割り当てられるかに関係なく、割り当てられた部分の使用を開始することができる。したがって、図7は、プロセッサの複数のスレッドによって共有されるスタックを管理する方法700を示す。ある特定の実施形態によれば、共有スタックのエントリは、スレッド要求に従って動的に割り当てられ得る。動的な割り当ては、スタック効率の向上、ダイに必要な空間の縮小、さらには性能の向上につながるような方式での、分岐予測を容易にし得る。図8は、共有スタックへのマルチスレッド化されたアクセスを可能にする方法800の、特定の例示的な実施形態の流れ図を示す。本明細書で説明されるように、例示的な方法800は、図1のシステム100または図2のシステム200によって実行され得る。802において、共有スタックが、メモリの一部の中に形成され得る。たとえば、図1の共有スタック105が、メモリ104の中に形成され得る。804において、共有スタックの第1の部分および第2の部分が、動的に割り当てられ得る。たとえば、図1の共有スタック105の第1の部分116が、第1のスレッド108に動的に割り当てられ得る。さらに例示すると、第1のスレッド108は、共有スタック105の追加の空間を要求する、プロセスを実行することができる。第1のスレッド108のポインタ162は、共有スタック105の第1の部分116を指し、第1の部分116の制御権を取得することができる。同様に、図1の共有スタック105の第2の部分118が、第2のスレッド110に割り当てられ得る。さらに例示すると、第2のスレッド110は、共有スタック105の追加の空間を要求する、プロセスを実行することができる。第2のスレッド110のポインタ164は、共有スタック105の第2の部分118を指し、第2の部分118の制御権を取得することができる。806において、第1の部分、第2の部分、またはこれら両方のサイズが、調整され得る。たとえば、第1の部分116のサイズが、第1のスレッド108の要求に従って、動的に調整され得る。第1のスレッド108のポインタ162は、第1の部分116のエントリを指して、要求を満たすように第1の部分116を小さくしまたは大きくすることができる。同様に、第2の部分118のサイズが、第2のスレッド110の要求に従って、動的に調整され得る。第2のスレッド110のポインタ164は、第2の部分118のエントリを指して、要求を満たすように第2の部分118を小さくしまたは大きくすることができる。あるいは、808において、第1の部分、第2の部分、またはこれら両方のサイズが、固定され得る。たとえば、図1の第1の部分116、第2の部分118、またはこれら両方のサイズが、固定され得る。さらに例示すると、スレッド108、110、112、および114の1つまたは複数のポインタ162~168が、特定の一定の値に設定され得る。一定の値は、共有スタック105が、スレッド108、110、112、および114の間で等しく区分されるように、選択され得る。810において、第1のスレッドに割り当てられる第1の部分のサイズが、公平性の方針に従って制限され得る。たとえば、第1のスレッド108に割り当てられる第1の部分116のサイズが、図1の公平性の方針140に従って制限され得る。さらに例示すると、第1の部分116のサイズは、第1の部分116と関連付けられるエントリの最大の数と、共有スタック105の使用率との少なくとも1つに基づいて、制限され得る。たとえば、公平性の方針140は、第1のスレッド108が公平な持ち分の閾値を満たした時、またはそれを超えた時、第1の部分116のサイズと、第1のスレッド106にアクセス可能な関連するエントリの数とを、制限することができる。公平な持ち分の閾値は、共有スタック105のエントリの全体の数を、現在のアクティブスレッド108、110、112、および114の数で割ることによって、求めることができる。812において、第1のスレッドおよび第2のスレッドが、プロセッサによって実行され得る。たとえば、マルチスレッド化されたプロセッサコア106の1つが、第1のスレッド108および第2のスレッド110を実行することができる。814において、第1のスレッドは、共有スタックの第1の部分の要素に関して、リターンアドレスをプッシュまたはポップすることが許可され得る。たとえば、第1のスレッド108は、第1の部分116のデータ要素124の1つにおいて、リターンアドレスのポップまたはプッシュの実行を許可され得る。816において、第2のスレッドは、共有スタックの第2の部分の要素に関して、リターンアドレスのプッシュまたはポップの実行が許可され得る。たとえば、第2のスレッド110は、第2の部分118の第2のデータ要素126において、リターンアドレスのポップ136またはプッシュ138の実行を許可され得る。818において、第2の部分の中のデータ要素が、第1のスレッドを用いて上書きされ得る。たとえば、第2の部分118の第2のデータ要素126が、第1のスレッド108を用いて上書きされ得る。例示すると、第1のスレッド108は、第2の部分118の中の最も古いエントリを上書きさせる、プッシュ138を実行することができる。したがって、図8は、複数のスレッドにわたりスタックアクセスを共有する方法800を示す。この方法は、各スレッドの現在の要求に従って、共有スタックへのアクセスを動的に割り当てるステップを含む。共有スタックのエントリは、スレッドに属するポインタを操作することによって、スレッドによって取得され上書きされ得る。共有スタック内に記憶されるアドレスエントリを移動する代わりに、スレッドポインタが更新されるので、処理能力および電力の消費が低減し得る。また、同等の性能を実現するのに必要なスタックエントリの数が少ないことで、さらに、ダイに必要な空間を小さくすることが容易になり得る。メモリの配分の改善によってさらに、スタックの性能が向上し得る。図9を参照すると、共有スタック964のマルチスレッド化されたアクセスを実施する論理回路を含む、電子デバイスのある特定の例示的な実施形態のブロック図が示され、全般に900と称される。デバイス900は、メモリ932に結合された、マルチスレッド化されたプロセッサ910などのプロセッサを含む。マルチスレッド化されたプロセッサ910は、リターンスタックのような、複数のスレッドによってアクセス可能な共有スタック964を含む。説明のための例では、マルチスレッド化されたプロセッサ910は、図1~図6の1つまたは複数に示されるシステムを含み、図7および図8の方法の1つまたは複数またはこれらの任意の組合せを実行することができる。図9に示される実施形態は持ち運び可能な電子デバイスを示すが、本明細書で開示されるような共有スタックの部分の割り当ては、プロセッサを含む任意のデバイスにおいて実施され得ることに留意されたい。たとえば、デバイス900、またはその何らかの一部は、代わりに、セットトップボックス、音楽プレーヤ、ビデオプレーヤ、エンターテインメントユニット、ナビゲーションデバイス、通信デバイス、携帯情報端末、固定位置のデータユニット、コンピュータ、サーバ、または、リターンアドレススタックを有する少なくとも1つのプロセッサを有する任意の他のデバイスに、組み込まれてもよい。メモリ932は、命令950を記憶するコンピュータ可読有形媒体であってよく、命令950のコンピュータによる実行は、共有スタックの第1の部分の第1のスレッドへの割り当てを引き起こす。たとえば、命令950が、マルチスレッド化されたプロセッサ910によって実行されてよく、共有スタック964の第1の部分の第1のスレッドへの割り当てを引き起こす。命令950はさらに、共有スタック964の第2の部分の第2のスレッドへの割り当てを引き起こすように、実行されてよい。図9はまた、マルチスレッド化されたプロセッサ910およびディスプレイ928に結合されたディスプレイコントローラ926も示す。コーダデコーダ934も、マルチスレッド化されたプロセッサ910に結合され得る。スピーカ936およびマイクロフォン938がコーデック934に結合され得る。図9は、ワイヤレスコントローラ940が、マルチスレッド化されたプロセッサ910およびワイヤレスアンテナ942に結合され得ることも示す。ある特定の実施形態では、マルチスレッド化されたプロセッサ910、ディスプレイコントローラ926、メモリ932、コーデック934、およびワイヤレスコントローラ940は、システムインパッケージデバイスまたはシステムオンチップデバイス922に含まれる。特定の一実施形態では、入力デバイス930および電源944が、システムオンチップデバイス922に結合される。その上、ある特定の実施形態では、図9に示されるように、ディスプレイ928、入力デバイス930、スピーカ936、マイクロフォン938、ワイヤレスアンテナ942、および電源944は、システムオンチップデバイス922の外部にある。ただし、ディスプレイ928、入力デバイス930、スピーカ936、マイクロフォン938、ワイヤレスアンテナ942、および電源944の各々は、インターフェースまたはコントローラなど、システムオンチップデバイス922の構成要素に結合され得る。さらに、本明細書で開示した実施形態に関して説明した様々な例示的な論理ブロック、構成、モジュール、回路、およびアルゴリズムは、電子ハードウェア、コンピュータソフトウェア、または両方の組合せとして実装され得ることが、当業者には諒解されよう。上で、様々な例示的な構成要素、ブロック、構成、モジュール、回路、およびアルゴリズムが、全般にそれらの機能に関して説明されてきた。そのような機能をハードウェアとして実装するか、ソフトウェアとして実装するかは、具体的な適用例および全体的なシステムに課される設計制約に依存する。当業者は、説明した機能を具体的な適用例ごとに様々な方法で実装し得るが、そのような実装の決定は、本開示の範囲からの逸脱を生じるものと解釈すべきではない。本明細書で開示する実施形態に関して説明する方法またはアルゴリズムのポインタは、直接ハードウェアで具現化されるか、プロセッサによって実行されるソフトウェアモジュールで具現化されるか、またはその2つの組合せで具現化され得る。ソフトウェアモジュールは、ランダムアクセスメモリ、フラッシュメモリ、読取り専用メモリ、プログラマブル読取り専用メモリ、消去可能プログラマブル読取り専用メモリ、電気消去可能プログラマブル読取り専用メモリ、レジスタ、ハードディスク、リムーバブルディスク、コンパクトディスク読取り専用メモリ、または当技術分野で知られている他の形態の記憶媒体中に存在し得る。例示的な記憶媒体は、プロセッサが記憶媒体から情報を読み取り、記憶媒体に情報を書き込むことができるように、プロセッサに結合される。代替として、記憶媒体はプロセッサと一体であり得る。プロセッサおよび記憶媒体は、特定用途向け集積回路に存在し得る。ASICは、コンピューティングデバイスまたはユーザ端末に存在し得る。代替として、プロセッサおよび記憶媒体は、コンピューティングデバイスまたはユーザ端末の中に、個別の構成要素として存在し得る。開示される実施形態の上記の説明は、当業者が、開示された実施形態を実現または利用するのを可能にするために提供される。これらの実施形態への様々な修正が、当業者には容易に明らかであり、本明細書で定義される原理は、本開示の範囲から逸脱することなく、他の実施形態に適用され得る。したがって、本開示は、本明細書で示される実施形態に限定されることは意図されず、以下の特許請求の範囲で定義されるような原理および新規の特徴と矛盾しない、可能な最大の範囲を認められるべきである。