(57)【特許請求の範囲】
【請求項１】
コードをキャッシュする方法であって、
第１のコードに対するコードリクエストのインスタンスを特定するステップと、
前記第１のコードが不揮発性ランダムアクセスメモリ（ＮＶ  ＲＡＭ）キャッシュ上に保管されるか否かを特定するステップと、を含み、
前記第１のコードが前記ＮＶ  ＲＡＭキャッシュに居ない場合に、
前記第１のコードに関する第１の条件が満たされるときは、前記第１のコードを前記ＮＶ  ＲＡＭキャッシュに追加し、かつ、
前記第１の条件が満たされないときは、前記第１のコードを前記ＮＶ  ＲＡＭキャッシュに保管することを防止し、
前記方法は、さらに、
前記第１の条件が満たされない場合に、前記第１の条件および第２の条件に対応する総計閾値が満たされるか否かを判断するステップ、を含む、
ことを特徴とする方法。
【請求項２】
コードをキャッシュする方法であって、
第１のコードに対するコードリクエストのインスタンスを特定するステップと、
前記第１のコードが不揮発性ランダムアクセスメモリ（ＮＶ  ＲＡＭ）キャッシュ上に保管されるか否かを特定するステップと、を含み、
前記第１のコードが前記ＮＶ  ＲＡＭキャッシュに居ない場合に、
前記第１のコードに関する第１の条件が満たされるときは、前記第１のコードを前記ＮＶ  ＲＡＭキャッシュに追加し、かつ、
前記第１の条件が満たされないときは、前記第１のコードを前記ＮＶ  ＲＡＭキャッシュに保管することを防止し、
前記第１の条件は、アクセス頻度カウントが閾値を超えること、を含み、
前記方法は、さらに、
第２のコードのアクセス頻度カウント値に基づいて、前記アクセス頻度カウントに対する閾値を設定するステップ、または、
複数の他のコードに関するアクセス頻度カウント値に基づいて、前記アクセス頻度カウントに対する閾値を設定するステップ、を含む、
ことを特徴とする方法。
【請求項３】
コードをキャッシュする方法であって、
第１のコードに対するコードリクエストのインスタンスを特定するステップと、
前記第１のコードが不揮発性ランダムアクセスメモリ（ＮＶ  ＲＡＭ）キャッシュ上に保管されるか否かを特定するステップと、を含み、
前記第１のコードが前記ＮＶ  ＲＡＭキャッシュに居ない場合に、
前記第１のコードに関する第１の条件が満たされるときは、前記第１のコードを前記ＮＶ  ＲＡＭキャッシュに追加し、かつ、
前記第１の条件が満たされないときは、前記第１のコードを前記ＮＶ  ＲＡＭキャッシュに保管することを防止し、
前記方法は、さらに、
前記ＮＶ  ＲＡＭキャッシュに対する書き込みオペレーションの回数をトラックして、前記回数が、寿命の最大書き込み回数に関する書き込み閾値を超えるときに、警告を発生するステップ、を含む、
ことを特徴とする方法。
【請求項４】
前記方法は、さらに、
前記第１のコードを前記ＮＶ  ＲＡＭキャッシュに追加する前に、バイナリトランスレータを用いて前記第１のコードをコンパイルするステップと、
を含む、請求項１乃至３いずれか一項に記載の方法。
【請求項５】
前記方法は、さらに、
前記第１のコードに対するプロセッサリクエストの回数をトラックし、前記回数に基づいて、前記第１のコードを前記ＮＶ  ＲＡＭキャッシュに追加するステップ、
を含む、請求項１乃至３いずれか一項に記載の方法。
【請求項６】
前記方法は、さらに、
前記第１のコードが第１レベルのキャッシュに居ないときに、前記ＮＶ  ＲＡＭキャッシュに対する書き込みを行う試みを無視するステップ、を含み、
前記ＮＶ  ＲＡＭキャッシュに対する前記書き込みを行う試みは、最低使用頻度ストレージポリシに関連している、
請求項１乃至３いずれか一項に記載の方法。
【請求項７】
インストラクションを含むコンピュータプログラムであって、コンピュータによってインストラクションが実行されると、少なくとも、
第１のコードに対するコードリクエストのインスタンスを特定し、
前記第１のコードが不揮発性ランダムアクセスメモリ（ＮＶ  ＲＡＭ）キャッシュ上に保管されるか否かを特定し、かつ、
前記第１のコードが前記ＮＶ  ＲＡＭキャッシュに居ない場合に、
前記第１のコードに関する第１の条件が満たされるときは、前記第１のコードを前記ＮＶ  ＲＡＭキャッシュに追加し、かつ、
前記第１の条件が満たされないときは、前記第１のコードを前記ＮＶ  ＲＡＭキャッシュに保管することを防止し、さらに、
前記第１の条件が満たされない場合に、前記第１の条件および第２の条件に対応する総計閾値が満たされるか否かを判断する、
ことを特徴とするコンピュータプログラム。
【請求項８】
インストラクションを含むコンピュータプログラムであって、コンピュータによってインストラクションが実行されると、少なくとも、
第１のコードに対するコードリクエストのインスタンスを特定し、
前記第１のコードが不揮発性ランダムアクセスメモリ（ＮＶ  ＲＡＭ）キャッシュ上に保管されるか否かを特定し、かつ、
前記第１のコードが前記ＮＶ  ＲＡＭキャッシュに居ない場合に、
前記第１のコードに関する第１の条件が満たされるときは、前記第１のコードを前記ＮＶ  ＲＡＭキャッシュに追加し、かつ、
前記第１の条件が満たされないときは、前記第１のコードを前記ＮＶ  ＲＡＭキャッシュに保管することを防止し、さらに、
第２コードのアクセス頻度カウント値に基づいて、アクセス頻度カウントに対する閾値を設定するか、もしくは、
複数の他のコードに関するアクセス頻度カウント値に基づいて、アクセス頻度カウントに対する閾値を設定する、
ことを特徴とするコンピュータプログラム。
【請求項９】
インストラクションを含むコンピュータプログラムであって、コンピュータによってインストラクションが実行されると、少なくとも、
第１のコードに対するコードリクエストのインスタンスを特定し、
前記第１のコードが不揮発性ランダムアクセスメモリ（ＮＶ  ＲＡＭ）キャッシュ上に保管されるか否かを特定し、かつ、
前記第１のコードが前記ＮＶ  ＲＡＭキャッシュに居ない場合に、
前記第１のコードに関する第１の条件が満たされるときは、前記第１のコードを前記ＮＶ  ＲＡＭキャッシュに追加し、かつ、
前記第１の条件が満たされないときは、前記第１のコードを前記ＮＶ  ＲＡＭキャッシュに保管することを防止し、さらに、
前記ＮＶ  ＲＡＭキャッシュに対する書き込みオペレーションの回数をトラックして、前記回数が、寿命の最大書き込み回数に関する書き込み閾値を超えるときに、警告を発生する、
ことを特徴とするコンピュータプログラム。
【請求項１０】
前記インストラクションが実行されると、
前記第１の条件が、アクセス頻度カウント閾値をいつ超えたかを特定する、
請求項７乃至９いずれか一項に記載のコンピュータプログラム。
【請求項１１】
前記インストラクションが実行されると、
前記第１のコードに対するプロセッサリクエストの回数をトラックし、前記リクエストの回数に基づいて、前記第１のコードを前記ＮＶ  ＲＡＭキャッシュに追加する、  請求項７乃至９いずれか一項に記載のコンピュータプログラム。
【請求項１２】
前記インストラクションが実行されると、
前記第１のコードが第１レベルのキャッシュに居ないときに、前記ＮＶ  ＲＡＭキャッシュに対する書き込みを行う試みを無視する、
請求項７乃至９いずれか一項に記載のコンピュータプログラム。
【請求項１３】
コンパイルされたコードを動的に保管する装置であって、
前記コンパイルされたコードを保管するための第１レベルのキャッシュと、
前記コンパイルされたコードを保管するための第２レベルの不揮発性ランダムアクセスメモリ（ＮＶ  ＲＡＭ）キャッシュと、
キャッシュインターフェイスであり、前記コンパイルされたコードが閾値より多い頻度でアクセスされる場合は、前記ＮＶ  ＲＡＭに前記コンパイルされたコードを保管することを許可し、かつ、前記閾値の頻度が満たされない場合は、前記ＮＶ  ＲＡＭに前記コンパイルされたコードを保管することをブロックする、キャッシュインターフェイスと、
を含み、
前記ＮＶ  ＲＡＭキャッシュに対する書き込みオペレーションの回数をトラックして、前記回数が、寿命の最大書き込み回数に関する書き込み閾値を超えるときに、警告を発生する、
ことを特徴とする装置。
【請求項１４】
前記装置は、さらに、
前記ＮＶ  ＲＡＭキャッシュについて期待される寿命の書き込みカウント値を、前記ＮＶ  ＲＡＭキャッシュの書き込みカウントインスタンスの現在の回数と比較する、プロファイルマネージャ、を含む、
請求項１３に記載の装置。
【請求項１５】
前記装置は、さらに、
前記ＮＶ  ＲＡＭキャッシに対する書き込みカウントインスタンスの頻度を低減するために、第２の条件に関する閾値を設定する、条件閾値エンジン、を含む、
請求項１４に記載の装置。
【請求項１６】
請求項７乃至１２いずれか一項に記載のコンピュータプログラムを記憶した、
コンピュータで読取り可能な記憶媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明開示は、一般的にコンパイラに関する。より特定的には、不揮発性メモリにコードをキャッシュする方法、システムおよび装置に関する。
【背景技術】
【０００２】
ダイナミックコンパイラは、一つまたはそれ以上のプラットフォームプログラムが実行されているランタイムの最中にコードを最適化しようと試みる。コンパイラは、プロセッサのパフォーマンスを改善するためにコードを最適化しようと試みる。しかしながら、コンパイラのコード最適化タスクも、また、プロセッサのリソースを消費する。このことは、そうした最適化エフォート（ｅｆｆｏｒｔ）が最適化コード自身によって節約し得るよりも大きな量のプロセッサリソースを消費する場合に、結果として生じる最適化されたコードの一つまたはそれ以上の利点を打ち消してしまう。
【発明の概要】
【発明が解決しようとする課題】
【０００３】
コンパイラは、プロセッサのパフォーマンスを改善するためにコードを最適化しようと試みる。しかしながら、コンパイラのコード最適化タスクも、また、プロセッサのリソースを消費する。
【課題を解決するための手段】
【０００４】
ここにおいて開示される方法、装置、システム、及び/又は、製品は、不揮発性ＲＡＭベースの持続性（ｐｅｒｓｉｓｔｅｎｔ）コードキャッシュを使用する。電源オフの期間中にメモリコンテンツを維持し、従来のＬ１／Ｌ２キャッシュと同等なレイテンシ特性を示し、かつ、ＮＶ  ＲＡＭキャッシュに関するライフサイクルの観点でメモリライフを延長するやり方で書き込みオペレーションを管理するものである。
【図面の簡単な説明】
【０００５】
【図１】図１は、本発明開示の教示に従って、不揮発性メモリの中にコードをキャッシュするためのプロセッサプラットフォームに係る実施例を模式的に示している。
【図２】図２は、図１のプラットフォームにおいてキャッシュマネージャによって生成されたコード条件スコアの実施例である。
【図３】図３は、図１のプラットフォームにおいてキャッシュマネージャによって生成されたコードパフォーマンスチャートの実施例である。
【図４】図４は、図１のキャッシュマネージャの実施例を模式的に示している。
【図５Ａ】図５Ａは、不揮発性メモリの中にコードをキャッシュするために実行されるマシンで読取り可能なインストラクションの代表的な実施例に係るフローチャートである。
【図５Ｂ】図５Ｂは、不揮発性メモリの中にコードをキャッシュするために実行されるマシンで読取り可能なインストラクションの代表的な実施例に係るフローチャートである。
【図６】図６は、不揮発性メモリの中にコードをキャッシュするために実行されるマシンで読取り可能なインストラクションの代表的な実施例に係るフローチャートである。
【図７】図７は、図１−４の実施例に係るシステムおよび装置を実施するために、図５Ａ、５Ｂ、および６に係るインストラクションを実行するプロセッサの実施例を模式的に示している。
【発明を実施するための形態】
【０００６】
コード最適化技術は、ランタイムにダイナミックコンパイラを使用して、プログラムの実行を最適化、及び/又は、そうでなければ改善する。インタープリタされたコードは、例えば、ジャストインタイム（ＪＩＴ）コンパイラを介して実行の最中にマシンコードにコンパイルされ、キャッシュされる。コンパイルされたコードがキャッシュメモリからアクセスされるので、一つまたはそれ以上のファンクション（例えば、プロセス、サブルーチン、等）に対するプロセッサによる後続のリクエストが、比較的に早く生じるようにである。他の実施例においては、ダイナミックバイナリトランスレータが、ソースインストラクションをターゲットインストラクションに翻訳する。ターゲットマシン（例えば、プロセッサ）が、インストラクションを実行できるようにする方法においてである。プロセッサが最初にコードをリクエストするとき（例えば、ファンクションコール）には、ソースコードをプロセッサが取り扱えるフォーマットへと翻訳するために余分な時間（例えば、プロセッサのクロックサイクル）が費やされる。しかしながら、翻訳されたコードは、キャッシュメモリの中に保管され、後続の時間にプロセッサがターゲットコードを取り戻すことができるようにする。そこでは、キャッシュメモリへのアクセスが、ソースコードを再度コンパイルすることよりも早い。
【０００７】
いくつかのシステムにおいて、コードは、スタートアップに際してコンパイルされ、キャッシュされる。しかしながら、そうしたスタートアップ時のコンパイルは、後の使用のためのコンパイルされたコードを生成するために、著しい量のプロセッサのオーバーヘッドを消費する。オーバーヘッドは、しばしば、「ウォームアップタイム」または「ラグタイム」として参照される。そうしたエフォートは、プログラムの実行における早期のプロセッサパフォーマンスを犠牲にしている。プログラムが、比較的に長い時間期間に動作し、及び/又は、比較的頻繁に同じファンクションを繰り返しコールする場合における、ロングランでより良い結果を出すためのエフォートにおけるものである。最適にコンパイルされたコードは、オリジナルコードを再度コンパイルする将来の必要性を回避するために、ハードディスク（例えば、磁気ハードドライブ、半導体ディスク、等）上に保管される。しかしながら、ハードディスクのアクセスタイムは、ダイナミックコンパイラがオリジナルコードを再度コンパイルするのに必要な時間量よりも遅いことがあり、それにより、プログラムが開始されたとき（例えば、プラットフォームを電源オンした後）、初期的に遅いスタートアップタイム（つまり、比較的に大きいラグタイム）を結果として生じている。別の言葉で言えば、最適化されコンパイルされたコードをストレージから取り戻すための時間量は、プロセッサがコードに対するリクエストをする場合に、オリジナルコードを再度コンパイルする、及び/又は、再度最適化するための時間量よりも長い時間がかかる。
【０００８】
一方、プロセッサキャッシュ及び/又はＤＲＡＭへのアクセスをイネーブル（ｅｎａｂｌｉｎｇ）することは、ハードディスクのアクセス待ち時間と比較したときに、以前に最適化されコンパイルされたコードを取り戻す時間量を削減する。プロセッサのキャッシュは、揮発性メモリであり、電源が取り外されたときに、メモリコンテンツを喪失する。プラットフォームのシャットダウンに係るインスタンスの最中といったときである。プロセッサキャッシュは、あらゆる数量のキャッシュレイヤ（ｌａｙｅｒ）を含んでよい。レベル−１（Ｌ１）、レベル−２（Ｌ２）（例えば、マルチレベルのキャッシュ）といったものである。マルチレベルのキャッシュは、プロセッサのフェッチ待ち時間を低減する。ハードディスクストレージからのコードのための比較的により時間のかかるフェッチを試みる以前に、プロセッサが、キャッシュの中にある所望のコードをチェックできることによるものである。キャッシュは、典型的には、階層的な形式で構成されている。レベル１（例えば、Ｌ１）では、小さい待ち時間、高コスト、より小さなストレージを用い、それぞれ後続のレベル（例えば、Ｌ２、Ｌ３、等）では、より遅く、より大きく、そして、より安価なストレージを実施する。
【０００９】
Ｌ１とＬ２キャッシュ、及び/又は、あらゆる他のキャッシュレベルは、典型的に、プロセッサ及び/又はプロセッサプラットフォームと関連するランダルアクセスメモリ（ＲＡＭ）より小さい。しかし、典型的にはより早く、かつ、フェッチ待ち時間を低減するためにプロセッサに対して物理的により近い。キャッシュは、また、比較的にＲＡＭより小さい。なぜなら、部分的に、プロセッサのフットプリント（例えば、ダイキャッシュ上のもの）を一部を使用するからである。加えて、第１のレベルのキャッシュ（Ｌ１）は、典型的に、後続のキャッシュレベル及び/又はＲＡＭを超えるスピードパフォーマンス特性を伴って製造されており、それにより、比較的に高い価格ポイントを要求している。後続のキャッシュレイヤは、典型的に、比較的大きなストレージ容量を含んでいるが、物理的にさらに離れており、及び/又は、第１レイヤのキャッシュよりパフォーマンス特性が低い。プロセッサが、所望のコード（例えば、一つまたはそれ以上のインストラクション、最適化コード、等）を第１レイヤのキャッシュ（例えば、Ｌ１キャッシュ）の中に置かない場合には、外部ストレージ（例えば、ハードディスク、フラッシュメモリ、半導体ディスク、等）に対するプロセッサのフェッチ（ｆｅｔｃｈ）以前に、第２または後続レイヤのキャッシュ（例えば、Ｌ２キャッシュ、ＤＲＡＭ）がチェックされる。このように、ほとんどのキャッシュは、第１レイヤのキャッシュに書き込まれたデータを、全てのレベルのキャッシュ（例えば、Ｌ２、Ｌ３、等）において重複して保管するように構成されており、メインメモリへのアクセスを削減する。
【００１０】
コンパイルされたコードをキャッシュの中に保管することは、再度の最適化、再度のコンパイル、及び/又は、メインメモリへのアクセス試行の必要性を削減することによってレイテンシ（ｌａｔｅｎｃｙ）低減を促進する。一方で、キャッシュは揮発性である。プラットフォームがシャットダウン、及び/又は、そうでなければ電源オフされたときに、キャッシュの全てのコンテンツは失われる。いくつかの実施例において、キャッシュメモリ（例えば、Ｌ１キャッシュ、Ｌ２キャッシュ、等）はダイナミックＲＡＭ（ＤＲＡＭ）を含んでおり、バイト（ｂｙｔｅ）レベルのアクセスができるが、電源オフされるとデータを失ってしまう。バイトレベルのアクセス可能性により、プロセッサ及び/又はバイナリトランスレータは、メモリの大きなブロックより、むしろ、比較的に少量の情報に対して迅速にオペレーションすることができる。いくつかの実施例において、プロセッサは、コードの大きなブロックより、むしろ、コードのバイトレベル部分においてオペレーションすることだけが必要である。コードの大きなブロックがフェッチされた場合には、プロセッサによって必要とされないコード部分を取得するために、追加のフェッチ（転送）時間が浪費される。一方、フラッシュメモリは、電源オフされた後もメモリを維持している。フラッシュメモリは、バイトレベルの読み出し及び/又は書き込みを促進することはできないが、代わりに、ブロックでメモリにアクセスする。従って、フラッシュメモリは、バイトレベルにおけるより、むしろ、ブロックレベルにおける比較的大きなレイテンシアクセスタイムのせいで、最適なキャッシュメモリのタイプとしては、役に立たない。
【００１１】
一方、不揮発性（ＮＶ）ＲＡＭは、Ｌ１、Ｌ２キャッシュ及び/又はダイナミックＲＡＭ（ＤＲＡＭ）に匹敵するデータ転送レイテンシ特性を示し得る。さらに、プラットフォームが電源オフされたとき（シャットダウン、リブート、スリープモード、等の最中）、ＮＶ  ＲＡＭは、プラットフォームの電源が回復された後で使用するためにメモリコンテンツを維持する。さらに、なお、ＮＶ  ＲＡＭは、バイトレベルのアクセス可能性を促進する。しかしながら、ＮＶ  ＲＡＭは、従来のＬ１キャッシュメモリ、Ｌ２キャッシュメモリ、及び/又は、ＤＲＡＭと比べると、ライフサイクルが比較的に短い。ＮＶ  ＲＡＭに関連するメモリセルに対するライフサイクルは、セルが機能を停止する以前に、そのセルが行うことができるメモリ書き込みおよびオペレーションの数量を参照する。ここにおいて開示される方法、装置、システム、及び/又は、製品は、不揮発性ＲＡＭベースの持続性（ｐｅｒｓｉｓｔｅｎｔ）コードキャッシュを使用する。電源オフの期間中にメモリコンテンツを維持し、従来のＬ１／Ｌ２キャッシュと同等なレイテンシ特性を示し、かつ、ＮＶ  ＲＡＭキャッシュに関するライフサイクルの観点でメモリライフを延長するやり方で書き込みオペレーションを管理するものである。
【００１２】
図１は、プロセッサプラットフォーム１００の実施例の部分を示しており、プロセッサ１０２、ＲＡＭ１０４、ストレージ１０６（例えば、ハードディスク）、キャッシュマネージャ１０８、および、キャッシュメモリシステム１１０を含んでいる。図１に示される実施例において、キャッシュメモリシステム１１０の例は、バス１１２を介してプロセッサ１０２と通信可能にに接続されているように示されているが、一方、キャッシュシステム１１０の例は、プロセッサ１０２の一部であってもよい。プロセッサダイ（ｄｉｅ）に統合されている、といったものである。キャッシュメモリシステム１１０の実施例は、あらゆる数量のキャッシュデバイスを含んでよい。第１レベルのキャッシュ１１２（例えば、Ｌ１キャッシュ）、および、第２レベルのキャッシュ１１４（例えば、Ｌ２キャッシュ）といったものである。説明される実施例には、Ｌ１およびＬ２キャッシュが含まれており、Ｌ２キャッシュがＮＶ  ＲＡＭキャッシュである。図１のプラットフォーム１００の実施例は、また、コンパイラ１１６を含んでおり、最適化されコンパイルされたコード１２０を生成するために、ストレージ１０６からオリジナルのコード部分１１８を取得する。図１のコンパイラの実施例は、ダイナミックコンパイラ（例えば、ジャストインタイム（ＪＩＴ）コンパイラ）、または、バイナリトランスレータ、であってよい。
【００１３】
オペレーションにおいて、プロセッサ１０２の例は、レイテンシを低減しようとして、キャッシュメモリシステム１１０を第１にアクセスすることによって一つまたはそれ以上のコード部分をリクエストする。リクエストされたコードが第１レベルのキャッシュ１１２において見い出された場合において、そのコードは、さらなる処理のために、第１レベルのキャッシュ１１２からプロセッサ１０２によって取得される。リクエストされたコードが第１レベルのキャッシュ１１２において見い出されなかった場合において、プロセッサ１０２は、存在するときには、階層的なキャッシュの一つまたはそれ以上の追加的なレベルを検索する。第２レベルのキャッシュ１４の例といったものである。第２レベルのキャッシュ１４の例の中で見い出された場合、プロセッサは、さらなる処理のために第２レベルのキャッシュからコードを取得する。リクエストされたコードが、キャッシュメモリシステム１１０のあらゆるレベルのキャッシュ（例えば、キャッシュレベル１１２、１１４）においても見い出されない（例えば、「キャッシュミス（”ｃａｃｈｅ  ｍｉｓｓ”）」が生じた）場合、プロセッサは、次に、ストレージ１０６の例に対してフェッチオペレーションを開始する。ストレージ（例えば、メインメモリ）１１６に対するフェッチオペレーションは、レイテンシ時間と関連している。キャッシュメモリシステム１１０の実施例に係るレベルに関するレイテンシ時間よりも、比較的に長い時間である。ＤＲＡＭまたはキャッシュメモリお中に既に保管されていない場合に、ストレージ１０６から取得されたコンパイラの例１１６を介して、コンパイル、最適化、及び/又は、そうでなければ、コードの転換をすることによって追加のレイテンシが生じ得る。
【００１４】
キャッシュミスに応じて、キャッシュマネージャ１０８の例は、プロセッサコードリクエストを分析して、リクエストされたコードが、コンパイラ１１６の例によってコンパイル、最適化、及び/又は、そうでなければ翻訳された後で、第２レベルのキャッシュ１１４の例の中に置かれるべきか否かを判断する。いくつかの実施例においては、最低使用頻度（ＬＲＵ、ｌｅａｓｔ−ｒｅｃｅｎｔｌｙ  ｕｓｅｄ）エビクションポリシ（ｅｖｉｃｔｉｏｎ  ｐｏｌｉｃｙ）レベルが第１レベルのキャッシュ１１２の例と供に使用される。最も古く、及び/又は、そうでなければ最もアクセスが少ない、そこに保管されたデータが、プロセッサ１０２の例によってリクエストされた代替コードのためのスペースを割り当てるために、削除の候補として特定される。一方、第１レベルのキャッシュ１１２から立ち退かされたコードは、キャッシュ管理ポリシ（例えば、ＬＲＵポリシ）に準じたやり方で第２レベルのキャッシュ１１４の例に転送され、及び/又は、そうでなければ保管され得る。図１のキャッシュマネージャ１０８の例が、代わりに、コードに関する一つまたはそれ以上の条件を評価して、そのコードが第２レベルのキャッシュ１１４の例の中に保管されるべきか否か、もしくは、いずれかの現在のキャッシュポリシストレージアクションがブロックされ、及び/又は、そうでなければ上書きされるべきか否か、を判断する。いくつかの実施例において、キャッシュマネージャ１０８は、ＮＶ  ＲＡＭに関する比較的に制限された書き込みサイクルの観点で、第２レベルのＮＶ  ＲＡＭキャッシュにコードを保管することを回避する。これは、従来の揮発性ＲＡＭデバイス（例えば、ＤＲＡＭ）に対する制限ではない。
【００１５】
キャッシュマネージャ１０８の例による第２レベルのＮＶ  ＲＡＭキャッシュ１１４の例の中に保管するか又は保管を避けるかの判断に影響し得る条件は、これらに限定されるわけではないが、以下のものを含んでいる。（１）時間単位あたりに、プロセッサ１０２の例によってコードが呼び出される頻度（アクセス頻度）、（２）候補コードを翻訳し、コンパイルし、及び/又は、そうでなければ最適化するために、プラットフォームリソースによって費やされる時間量（例えば、プロセッササイクル）、（３）候補コードのサイズ、（４）候補コードがプロセッサによってアクセスされるのに用いる時間量（キャッシュアクセスレイテンシ）、及び/又は、（５）コードが電源投入アクティビティに関連するか否か（例えば、ブート関連コード）、である。いくつかの実施例において、図１のキャッシュマネージャ１０８は、一つまたはそれ以上の条件値を一つまたはそれ以上の閾値と比較して、候補コードを第２レベルのキャッシュ１１４に保管するか否かをか判断する。例えば、単位時間あたりにプロセッサ１０２がコードサンプルを呼び出す回数に関する第１の条件に応じて、キャッシュマネージャの例は、コードサンプルを第１レベルのキャッシュの中に保管するようにできる。しかし、コードサンプルが第２レベルのキャッシュの中に保管されることを防止する。一方、プロセッサ１０２がコードサンプルを呼び出す回数に関する第２の条件の例が、第１の条件の例より大きい（例えば、カウント閾値を超えている）場合には、キャッシュマネージャ１０８の例は、低減されたレイテンシを伴う将来の取得のために、コードサンプルがＮＶ  ＲＡＭキャッシュ１１４の中に保管されることを許可し得る。
【００１６】
図２の実施例は、コードのブロックの例に関する５つの条件の例に対して、キャッシュマネージャ１０８によって生成されるコード条件スコアチャート２００を示している。第１の条件の例はアクセス頻度スコア２０２を含んでおり、第２の条件の例は翻訳時間スコア２０４を含んでおり、第３の条件の例はコードサイズスコア２０６を含んでおり、第４の条件の例はアクセスタイムスコア２０８を含んでおり、そして、第５の条件の例はスタートアップスコア２１０を含んでいる。図２の実施例において示されたそれぞれのスコアは、プロセッサ１０２の例によってリクエストされ、及び/又は、コンパイラ１１６の例によってコンパイルされた、対応するコードをトラック（ｔｒａｃｋ）することにより生成される。いくつかの実施例において、それぞれの条件に対するスコアは、コンパイラ１１６の例によって決定、及び/又は、更新される。プラットフォーム１００の例に関する一つまたはそれ以上のイテレーション（ｉｔｅｒａｔｉｏｎ）のプロファイリングの最中、及び/又は、プラットフォーム１００の例の上で一つまたはそれ以上のプログラムを実行している最中である。図２は、コードサンプルの一つの例として５つの条件を示しているが、他のコードサンプルに対する他のチャートも同様に整備される。いくつかの実施例において、それぞれの条件タイプに対する閾値は、コードサンプルの選択にわたるといった、対応するコードサンプルに対する平均値に基づいている。
【００１７】
図２のアクセス頻度スコア２０２の例は、候補コードサンプルがプロセッサによって呼び出される頻度を示している（例えば、単位時間あたりの呼び出し又はコールの回数）。候補コードサンプルが、プラットフォームに関する他のコードサンプル及び/又は実行しているプログラムと比べて比較的に頻繁に呼び出されている場合は、アクセス頻度スコア２０２の例は、比較的に高い値を示す。キャッシュマネージャ１０８の例は、候補コードサンプルの相対パフォーマンスの観点で閾値を確立し得る。一方、候補コードサンプルが比較的まれに呼び出される場合（例えば、プロセッサ１０２によって呼び出される他のコードと比較したとき）、アクセス頻度スコア２０２の例は低い値を示す。一般的に、チャート２００の例におけるより高いスコア値は、候補コードサンプルを第２レベルのＮＶ  ＲＡＭキャッシュ１１４の中に保管するためのより大きな理由を反映している。一方、コードサンプルが比較的まれに呼び出される場合は、キャッシュマネージャ１０８の例は、書き込みオペレーションの回数を削減しようとして、候補コードサンプルがＮＶ  ＲＡＭキャッシュ１１４に書き込まれることを防止する。それによって、ＮＶ  ＲＡＭキャッシュ１１４の使用可能な寿命を延長している。
【００１８】
図２の翻訳時間スコア２０４の例は、対応するコードサンプルをコンパイル、及び/又は、そうでなければ翻訳するのにリソース（例えば、コンパイラ、トランスレータ、等）がどのくらい時間がかかるかの指標を反映している。候補コードサンプルをコンパイル、最適化、及び/又は、翻訳するのに比較的に長い時間量を要する場合、対応する翻訳時間スコア２０４は、より高い。一般的に、翻訳時間スコア２０４の例に対するより高い値は、候補コードサンプルがＮＶ  ＲＡＭキャッシュ１１４の中に保管されるべきことを示している。プロセッサ１０２の例による後続のコールの最中にコードサンプルを再度のコンパイル、再度の最適化、及び/又は、再度の翻訳をすることに関連する一つまたはそれ以上のレイテンシ効果を削減するためである。一方、候補コードサンプルが、他のコードサンプルと比較したとき、比較的迅速にコンパイル、最適化、及び/又は、翻訳される場合、キャッシュマネージャ１０８の例は、候補コードサンプルに対して比較的に低い翻訳時間スコア２０４を割り当てる。翻訳時間スコア２０４が対応する閾値より低い場合は、候補コードサンプルがＮＶ  ＲＡＭキャッシュ１１４に書き込まれることを防止する。再度のコンパイルのエフォートが望まないレイテンシをもたらすことがなさそうだからである。一つまたはそれ以上の閾値は、例えば、統計学的分析に基づいてもよい。いくつかの実施例においては、統計学的分析が、図２のチャート２００の例といった、複数のコードサンプルおよび複数のチャートにわたり行われ得る。
【００１９】
図２のコードサイズスコア２０６の例は、コンパイラ１１６の例によってコンパイルされた他のコードサンプル、及び/又は、プロセッサ１０２の例によって処理された他のコードサンプルと比べたときに、候補コードサンプルによって消費されるストレージスペースの相対量の指標を反映している。キャッシュマネージャ１０８の例は、ＮＶ  ＲＡＭキャッシュ１１４の例のストレージスペースを保存しようとして、比較的に小さいサイズのコードサンプルに、より高いスコア値を割り当てる。アクセスタイムスコア２０８の例は、保管されたキャッシュがどのくらい迅速にアクセスされ得るかの指標を反映している。比較的迅速にアクセスされ得るコードサンプルは、キャッシュマネージャ１０８の例によって、アクセスするのにより長い時間がかかるコードサンプルと比べたときに、比較的より高いスコアを有するように割り当てられる。いくつかの実施例において、コードサンプルにアクセスするための時間量は、候補コードサンプルの対応するサイズに比例している。
【００２０】
スタートアップスコア２１０の例は、候補コードサンプルが、ブートプロセスプログラムといった、スタートアップアクティビティと関連しているか否かの指標を反映している。いくつかの実施例において、スタートアップスコア２１０は、バイナリ値（はい／いいえ）であってよく、コードサンプルがスタートアップアクティビティに関与している状況についてより大きな重みが適用される。従って、以前に電源オフされた条件からブートするプラットフォームは、スタートアップタイムが改善され得る。対応するスタートアップコードが、ストレージ１０６から取得され、コンパイラ１１６の例によって処理、及び/又は、そうでなければコンパイルされるよりも、むしろ、ＮＶ  ＲＡＭキャッシュ１１４の例からアクセスされたときに、そうである。
【００２１】
図３の実施例は、候補コードサンプル間の相対的な差異を特定するために、キャッシュマネージャ１０８によって生成されたコードパフォーマンスチャート３００の例を示している。図３のコードパフォーマンスチャート３００の例は、サンプルＡ、Ｂ、Ｃ、および、Ｄを含んでおり、それぞれが対応する条件値を含んでいる。図３の条件値（メトリクス）の例は、これらに限定されるわけではないが、アクセス頻度条件３０２、翻訳時間条件３０４、コードサイズ条件３０６、アクセスタイム条件３０８、および、スタートアップ条件３１０、を含んでいる。それぞれの条件は、対応するコードサンプルについて対応する値を用いて設定されてよい。コンパイラ１１６及び/又はキャッシュマネージャ１０８の例に係る一つまたはそれ以上のプロファイルオペレーションによるものである。
【００２２】
図３に示される実施例において、アクセス頻度条件３０２に関する値は、対応する候補コードサンプルがプロセッサ１０２によって呼び出されたインスタンスの回数を表しており、翻訳時間３０４に関する値は、対応する候補コードサンプルを翻訳、コンパイル、及び/又は、そうでなければ最適化するためにプロセッサ１０２によって費やされた時間またはプロセッササイクルを表している。加えて、コードサイズ条件３０６に関する値は、対応する候補コードサンプルのバイト値、アクセスタイム３０８に関する値は、対応する候補コードサンプルにアクセスするためにプロセッサ１０２によって費やされた時間またはプロセッササイクルを表しており、かつ、スタートアップ条件310に関する値は、対応する候補コードサンプルがプラットフォームの一つまたはそれ以上のアクティビティに参加しているか否かのバイナリ指標を表している。
【００２３】
図４は、図１のキャッシュマネージャ１０８の実施例を模式的に示している。図４に示された実施例において、キャッシュマネージャ１０８は、プロセッサコールモニタ４０２、コード統計エンジン４０４、キャッシュインターフェイス４０６、条件閾値エンジン４０８、ＮＶ  ＲＡＭ優先度プロファイル４１０、および、警告モジュール４１２、を含んでいる。オペレーションにおいて、プロセッサコールモニタ４０２の例は、プロセッサ１０２の例がコードサンプルを呼び出そうと試みるか否かを判断する。プロセッサ１０２の例がコードサンプルに対するコールを行っていることの検出に応じて、コード統計エンジン４０４の例は、どのコードサンプルがコールされたかをログし、そうした更新統計値をストレージに保管する。図１のストレージ１０６の例、及び/又は、ＲＡＭといったものに対してである。示された実施例においては、コード統計エンジン４０４の例によって開拓、及び/又は、そうでなければトラックされた統計は以下のものを含んでいる。プロセッサ１０２の例によってコールされた所定のコードサンプル（例えば、ファンクション、サブルーチン、等）回数のカウント（例えば、コールカウント、単位時間あたりのコール、等）、所定のコードサンプルをコンパイルするために費やされたサイクル数量、所定のコードサンプルのサイズ、ＮＶ  ＲＡＭキャッシュ１１４から所定のコードサンプルを取得するためのアクセスタイム、及び/又は、所定のコードサンプルがスタートアップアクティビティに参加しているか否か、である。
【００２４】
キャッシュインターフェイス４０６の例は、プロセッサ１０２によってリクエストされたコードサンプルが第１レベルのキャッシュ１１２の中に置かれているか否かを判断し、そうである場合は、リクエストされたコードサンプルをプロセッサ１０２に対して転送する。一方、プロセッサ１０２によってリクエストされたコードサンプルが第１レベルのキャッシュ１１２の中に置かれていない場合、キャッシュインターフェイス４０６の例は、リクエストされたコードサンプルがＮＶ  ＲＡＭキャッシュ１１４の中に置かれているか否かを判断する。プロセッサ１０２によってリクエストされたコードサンプルがＮＶ  ＲＡＭキャッシュ１１４（第２レベルのキャッシュ）の中に置かれている場合、キャッシュインターフェイス４０６の例は、次に、リクエストされたコードサンプルをプロセッサ１０２に対して転送する。一方、プロセッサ１０２によってリクエストされたコードサンプルがＮＶ  ＲＡＭキャッシュ１１４の中に置かれていない場合、キャッシュマネージャ１０８の例が、将来のアクセスのためにリクエストされたコードサンプルがＮＶ  ＲＡＭキャッシュの中に置かれるべきか否かを判断するように進行する。
【００２５】
将来のアクセスのためにリクエストされたコードサンプルがＮＶ  ＲＡＭキャッシュの中に置かれるべきか否かを評価するために、コード統計エンジン４０４の例は、以前にストレージ１０６の中に保管されているリクエストされたコードサンプルに関する統計にアクセスする。いくつかの実施例において、コード統計エンジン４０４は、プラットフォームがコールドブート（ｃｏｌｄ  ｂｏｏｔ）から最後に電源投入されたとき以来取得されたコードサンプルのそれぞれに関連する統計を保持している。一方、プラットフォームの電源アプリケーションの以前に収集されたコード部分に係る統計は、消去、及び/又は、そうでなければ無視している。他の実施例において、コード統計エンジン４０４は、プラットフォームがそれぞれのコードサンプルを時間にわたり特性づけるようにオペレーションを開始して以来、コードサンプルのそれぞれに関連する統計を保持している。上述のように、それぞれのコード特性は、プロセッサ１０２の例によって処理、及び/又は、コンパイラ１１６の例によってコンパイルされたコード部分の相対的なパフォーマンスに基づいて、関連する閾値（個々の閾値）を有し得る。所与の候補コードサンプルについて、所定の条件に対する個々の閾値が超えられた場合に、キャッシュインターフェイス４０６の例は、次に、所与の候補コードサンプルをＮＶ  ＲＡＭキャッシュ１１４に追加する。
【００２６】
いくつかの実施例においては、所与の候補コードサンプルについて閾値を超える個々の特性が無く、しかし、種々の条件タイプ（例えば、書き込み頻度カウント、翻訳時間、コードサイズ、アクセスタイム、等）に対する値の総計が、スコアの総計より大きい値に集計され得る。そうである場合、図４のキャッシュインターフェイス４０６の例は、候補コードをＮＶ  ＲＡＭキャッシュ１１４に追加する。それぞれの条件タイプについて個々の閾値を超えることが無く、かつ、２つまたはそれ以上の条件タイプの例について値の総計が、総計閾値を満足しないか、超えない場合、示された実施例に係るＮＶ  ＲＡＭ優先度プロファイルマネージャ４１０は、候補コードサンプルがスタートアップタスクに関連するか否かを判断する。そうである場合、優先度プロファイルマネージャ４１０は、キャッシュインターフェイス４０６を呼び出して、ＮＶ  ＲＡＭキャッシュ１１４に候補コードサンプルを追加する。プラットフォームが、電源サイクルの際に、より早くスタートアップするようにである。ＮＶ  ＲＡＭ優先度プロファイルマネージャ４１０の例は、以下のように構成され、及び/又は、そうでなければ仕立てられている。それぞれの条件タイプに対して個々の閾値を確立及び/又は調整し、２つまたはそれ以上の条件タイプに対して総計閾値を確立及び/又は調整し、及び/又は、一つまたはそれ以上のスタートアップタスクに関連する場合に、全て又はいくつかの候補コードをＮＶ  ＲＡＭキャッシュ１１４の中に保管するべきか否かを判断する、ようにである。
【００２７】
いくつかの実施例において、キャッシュマネージャ１０８は、ＮＶ  ＲＡＭキャッシュ１１４の有効寿命（ｕｓｅｆｕｌ  ｌｉｆｅ）をモニタする。例えば、いくつかのタイプのＮＶ  ＲＡＭは、書き込み回数１００００回の寿命を有し、一方、他のタイプのＮＶ  ＲＡＭは、書き込み回数１０００００回の寿命を有する。現在及び/又は将来のタイプのＮＶ  ＲＡＭは、あらゆる他の書き込み回数の制限値を有し得るが、キャッシュマネージャ１０８の例は、有効寿命が近づいているか否かを判断するために、そうした書き込みサイクルをモニタし得る。一つまたはそれ以上の閾値は、例えば、一つまたはそれ以上のタイプのＮＶ  ＲＡＭに対する所定の有効寿命の予測に基づいて、調整され得る。いくつかの実施例において、ＮＶ  ＲＡＭは、ユーザが保守可能であり、故障、ライフサイクル終了、及び/又は、アップデートアクティビティの場合に、ＮＶ  ＲＡＭは置き換えられ得る。いくつかの実施例において、プロファイルマネージャ４１０は、ＮＶ  ＲＡＭキャッシュ１１４に対して予測される寿命書き込み値を、現在の書き込みカウント値と比較する。予測される寿命書き込み値は、一つまたはそれ以上の製造者及び/又はＮＶ  ＲＡＭキャッシュのモデル間で、異なってもよい。現在のカウントが寿命カウント値に近い、及び/又は、超える場合、一つまたはそれ以上の警告が生成される。他の実施例において、図４のＮＶ  ＲＡＭ優先度プロファイルマネージャ４１０は、書き込みサイクルの比率が、閾値を超えて増加するかを判断する。いずれの場合でも、警告モジュール４１２の例が呼び出され、一つまたはそれ以上のプラットフォーム警告が生成される。潜在的な故障がプラットフォームのオペレーションに影響する前に、ユーザ保守をなすようにである。
【００２８】
プラットフォーム１００の例を実行する実施例、及び/又は、不揮発性メモリの中にコードをキャッシュするキャッシュマネージャ１０８の例が、図１−４において説明されてきたが、図１−４に示された一つまたはそれ以上のエレメント、プロセス、及び/又は、デバイスは、結合され、分割され、再構成され、省略され、除去され、及び/又は、あらゆる他の方法で実施されてよい。さらに、図１−４に係るあらゆる又は全ての、キャッシュマネージャ１０８の例、第１のキャッシュ１１２の例、ＮＶ  ＲＡＭキャッシュ１１４の例、プロセッサコールモニタ４０２の例、コード統計エンジン４０４の例、キャッシュインターフェイス４０６の例、条件閾値エンジン４０８の例、ＮＶ  ＲＡＭ優先度プロファイル４１０の例、及び/又は、警告モジュール４１２の例は、ハードウェア、ソフトウェア、ファームウェア、及び/又は、ハードウェア、ソフトウェア及び/又はファームウェアのあらゆる組み合わせ、によって実施され得る。加えて、かつ、以下に説明されるように、図１−４に係るキャッシュマネージャ１０８の例、第１のキャッシュ１１２の例、ＮＶ  ＲＡＭキャッシュ１１４の例、プロセッサコールモニタ４０２の例、コード統計エンジン４０４の例、キャッシュインターフェイス４０６の例、条件閾値エンジン４０８の例、ＮＶ  ＲＡＭ優先度プロファイル４１０の例、及び/又は、警告モジュール４１２の例は、ハードウェア、ソフトウェア、ファームウェア、及び/又は、ハードウェア、ソフトウェア及び/又はファームウェアのあらゆる組み合わせによって実施され得る。従って、例えば、図１−４に係るキャッシュマネージャ１０８の例、第１のキャッシュ１１２の例、ＮＶ  ＲＡＭキャッシュ１１４の例、プロセッサコールモニタ４０２の例、コード統計エンジン４０４の例、キャッシュインターフェイス４０６の例、条件閾値エンジン４０８の例、ＮＶ  ＲＡＭ優先度プロファイル４１０の例、及び/又は、警告モジュール４１２の例のいずれかは、一つまたはそれ以上の回路、プログラム可能なプロセッサ、特定用途向け集積回路（ＡＳＩＣ）、プログラム可能ロジックデバイス（ＰＬＤ）、及び/又は、フィールドでプログラム可能なロジックデバイス（ＦＰＬＤ）、等によって実施され得る。この特許のあらゆる装置クレームまたはシステムクレームが、純粋にソフトウェア及び/又はハードウェアの実施をカバーするように読み込まれる場合、図１−４に係るキャッシュマネージャ１０８の例、第１のキャッシュ１１２の例、ＮＶ  ＲＡＭキャッシュ１１４の例、プロセッサコールモニタ４０２の例、コード統計エンジン４０４の例、キャッシュインターフェイス４０６の例、条件閾値エンジン４０８の例、ＮＶ  ＲＡＭ優先度プロファイル４１０の例、及び/又は、警告モジュール４１２の例のうち少なくとも一つは、ソフトウェア及び/又はファームウェアを保管している、メモリ、ＤＶＤ、ＣＤ、ブルーレイ、等といった、有形のコンピュータで読取り可能なストレージ媒体を含むものと、ここにおいて明確に定義されてよい。さらに、なお、図１のプラットフォーム１００の実施例および図４のキャッシュマネージャの例は、図１−４に示されたものに加えて、または代わりに、一つまたはそれ以上のエレメント、プロセス、及び/又は、デバイスを含んでよい。及び/又は、示されたエレメント、プロセス、および、デバイス、のうちあらゆる一つまたはそれ以上または全てを含んでよい。
【００２９】
図５Ａ、図５Ｂおよび図６には、図１にプラットフォーム１００および図１−４のキャッシュマネージャの例を実施するためのマシンで読取り可能なインストラクションの代表的な実施例に係るフローチャートが示されている。この実施例において、マシンで読取り可能なインストラクションは、以下に図７に関連して説明されるコンピュータ７００の例において示されるプロセッサ７１２といったプロセッサによる実行のためのプログラムを含んでいる。プログラムは、有形のコンピュータで読取り可能なストレージ媒体上に保管されたソフトウェアにおいて具現化されてよい。ＣＤ−ＲＯＭ、フロッピー（登録商標）ディスク、ハードドライブ、デジタル多用途ディスク（ＤＶＤ）、ブルーレイディスク、または、プロセッサ７１２に関するメモリ、といったものである。しかし、プログラム全体及び/又は部分は、代替的にプロセッサ７１２以外のデバイスによって実行され、及び/又は、ファームウェアまたは専用ハードウェアにおいて具現化され得る。さらに、プログラムの実施例は図５Ａ、図５Ｂおよび図６に示されたフローチャートに関して説明されるが、プラットフォーム１００の例および不揮発性メモリの中にコードをキャッシュするためのキャッシュマネージャ１０８の例を実施する他の多くの方法が代替的に使用されてよい。例えば、ブロックの実施順序は変更されてよく、及び/又は、説明されるブロックのいくつかは、変更、除去、または、結合されてよい。
【００３０】
上述のように、図５Ａ、図５Ｂおよび図６に係るプロセスの実施例は、有形のコンピュータで読取り可能なストレージ媒体上に保管されたコード化されたインストラクション（例えば、コンピュータで読取り可能なインストラクション）を使用して実施され得る。媒体は、ハードディスク、フラッシュメモリ、読み出し専用メモリ（ＲＯＭ）、コンパクトディスク（ＣＤ）、デジタル多用途ディスク（ＤＶＤ）、キャッシュ、ランダムアクセスメモリ（ＲＡＭ）、及び/又は、他のあらゆるストレージデバイス及び/又はストレージディスク、といったものである。ストレージデバイス及び/又はストレージディスクには、あらゆる持続時間（例えば、延長された時間期間、永久的、短いインスタンス、一時的なバッファリング、及び/又は、情報のキャッシュ）で情報が保管される。ここにおいて使用されるように、有形のコンピュータで読取り可能なストレージ媒体という用語は、あらゆるタイプのコンピュータで読取り可能なストレージデバイス及び/又はストレージディスクを含み、かつ、伝搬信号（ｐｒｏｐａｇａｔｉｎｇ  ｓｉｇｎａｌ）を除くように明確に定義されている。追加的または代替的に、図５Ａ、図５Ｂおよび図６に係るプロセスの実施例は、固定のコンピュータで読取り可能なストレージ媒体上に保管されたコード化されたインストラクション（例えば、コンピュータで読取り可能なインストラクション）を使用して実施され得る。媒体は、ハードディスク、フラッシュメモリ、読み出し専用メモリ、コンパクトディスク、デジタル多用途ディスク、キャッシュ、ランダムアクセスメモリ、及び/又は、他のあらゆるストレージ媒体、といったものである。媒体には、あらゆる持続時間（例えば、延長された時間期間、永久的、短いインスタンス、一時的なバッファリング、及び/又は、情報のキャッシュ）で情報が保管される。ここにおいて使用されるように、固定のコンピュータで読取り可能なストレージ媒体という用語は、あらゆるタイプのコンピュータで読取り可能なストレージデバイス及び/又はストレージディスクを含み、かつ、伝搬信号（ｐｒｏｐａｇａｔｉｎｇ  ｓｉｇｎａｌ）を除くように明確に定義されている。ここにおいて使用されるように、請求項のプリアンブルにおいてフレーズ「少なくとも一つの（”ａｔ  ｌｅａｓｔ”）」が転換語として使用される場合は、用語「含む（”ｃｏｍｐｒｉｓｉｎｇ”）」がオープンエンド（ｏｐｅｎ−ｅｎｄｅｄ）であるのと同様にオープンエンドである。従って、プリアンブルにおいて転換語として「少なくとも一つの」を使用している請求項は、請求項の中で明確に列挙されたものに加えてエレメントを含んでよい。
【００３１】
図５Ａのプログラム５００は、ブロック５０２で開始し、プロセッサ１０２の例がコードに対するコールを呼び出すか否かをプロセッサコールモニタ４０２の例が判断する。呼び出さない場合、プロセッサコールモニタ４０２の例はプロセッサコールを待つ。しかしながら、コールが生じた場合、コード統計エンジン４０４は、コードコールに関する統計をログする（ブロック５０４）。いくつかの実施例においては、プロセッサコールに係る一つまたはそれ以上の以前のイテレーション後まで、一つまたはそれ以上の統計が直ちに利用可能でなくてよい。上述のように、プラットフォーム１００の例及び/又はプラットフォーム１００上で実行されるコード部分の例を特性づけようとして、コードのそれぞれの候補部分に対する統計がモニタされ、保管される。コード統計は、候補コードがプロセッサ１０２によってリクエスト及び/又はそうでなければ呼び出される回数に限定されるものではないが、候補コードの翻訳、コンパイル、及び/又は、最適化によって費やされるプロセッササイクルの数または秒（例えば。ミリ秒）、コードのサイズ、及び/又は、キャッシュメモリから候補コードにアクセスするための時間（例えば、Ｌ１キャッシュ１１２のアクセスタイム、ＮＶ  ＲＡＭキャッシュ１１４のアクセスタイム、等）を含んでよい。
【００３２】
候補コードが第１レベルのキャッシュ１１２の中に置かれていると、キャッシュインターフェイス４０６の例が判断した場合（ブロック５０６）、候補コードは、次に、プロセッサ１０２の例に対して転送される（ブロック５０８）。候補コードが第１レベルのキャッシュ１１２の中に存在しない場合（ブロック５０６）、キャッシュインターフェイス４０６の例は、次に、候補コードが既にＮＶ  ＲＡＭキャッシュ１１４の中に存在するかを判断する。存在する場合、候補コードは、次に、プロセッサ１０２の例に対して転送され（ブロック５０８）、存在しない場合、キャッシュマネージャ１０８の例は、将来のアクセス可能性のために候補コードをＮＶ  ＲＡＭキャッシュ１１４の中に置くべきか否かを判断する。
【００３３】
図５Ｂのプログラム５１２は、ブロック５２０で開始し、コード統計エンジン４０４の例が、図１のストレージ１０６の例といった、ディスク上に保管された候補コードに関するデータにアクセス、及び/又は、そうでなければデータをロードする。いくつかの実施例において、統計データは、ストレージ１０６の例からロードされ、レイテンシのアクセスタイムが削減するようにＲＡＭ１０４の中に保管される。条件閾値エンジン４０８の例は、プロセッサ１０２の例によってリクエストされた候補コードに関する統計を特定し、一つまたはそれ以上の個々の閾値が超えられているか否かを判断する（ブロック５２２）。上述のように、それぞれの条件は異なる閾値を有しており、超えた場合には、キャッシュインターフェイス４０６の例を呼び出して、候補コードをＮＶ  ＲＡＭキャッシュ１１４に追加する（ブロック５２４）。例えば、候補コードが比較的に高い頻度でアクセスされる場合（例えば、プロセッサ１０２の例によってリクエストされた他のコードと比較したとき）、対応するアクセスカウント値は、図２のアクセス頻度スコア２０２の例に関する閾値より高い。そうした環境の例においては、候補コードをＮＶ  ＲＡＭキャッシュに追加することが、より速いコードの実行を促進する。より長いレイテンシのディスクアクセスタイム及び/又は再度のコンパイルのエフォートを除去することによるものである。
【００３４】
候補コードにより個々の条件閾値のどれも超えられない場合（ブロック５２２）、条件閾値エンジン４０８の例は、次に、総計スコア閾値が超えられたか否かを判断する（ブロック５２６）。超えられた場合、キャッシュインターフェイス４０６の例は、次に、候補コードをＮＶ  ＲＡＭキャッシュ１１４に追加する(ブロック５２４)。総計スコア閾値が超えられない場合（ブロック５２６）、ＮＶ  ＲＡＭ優先度プロファイルマネージャ４１０は、次に、候補コードが、ブートシーケンスコードといった、スタートアップタスクに関連しているか否かを判断する（ブロック５２８）。いくつかの実施例においては、候補コードがブートシーケンスに関連しているという指示により、キャッシュインターフェイス４０６が、候補コードをＮＶ  ＲＡＭキャッシュ１１４に追加する。再度のコンパイル、再度の最適化、及び/又は、再度の翻訳のエフォートを除去することによって、後続のスタートアップアクティビティがより速く動作するようにである。ＮＶ  ＲＡＭ優先度プロファイルマネージャ４１０の例は、興味のあるそれぞれのプラットフォームに関する一つまたはそれ以上のプロファイルを保管してよく、そうした候補コードがスタートアップタスクと関連している場合のＮＶ  ＲＡＭキャッシュに対する候補コードの自動的な追加に関するユーザコントロールのセッティングを促進する。個々の閾値がどれも超えられず（ブロック５２２）、かつ、総計スコア閾値が超えられない（ブロック５２６）場合に、キャッシュマネージャ１０８の例は、次に、一つまたはそれ以上のデフォルト（ｄｅｆａｕｌｔ）のキャッシュ最適化技術を採用する（ブロック５３０）。最低使用頻度（ＬＲＵ）技術、デフォルトの再度のコンパイル、及び/又は、ストレージ１０６のアクセス、といったものである。
【００３５】
いくつかの実施例において、キャッシュマネージャ１０８は、ＮＶ  ＲＡＭキャッシュ１１４の例が有効寿命の書き込みサイクル値に近いか、または、超えているか否かを判断する。上述のように、ＮＶ  ＲＡＭキャッシュ１１４は、ＤＲＡＭと比較して有利なレイテンシ特性を示し、かつ、ディスクストレージ１０６に関する比較的に冗長なレイテンシのアクセスタイムを避けるように不揮発性である一方で、ＮＶ  ＲＡＭキャッシュ１１４は、動作を停止する前の、制限されたキャッシュサイクル回数を有している。図６のプログラム６００は、ブロック６０２で開始し、コード統計エンジン４０４の例が、ＮＶ  ＲＡＭ書き込みカウント値を取得する。ＮＶ  ＲＡＭ優先度プロファイルマネージャ４１０の例は、ＮＶ  ＲＡＭキャッシュ１１４の書き込みカウントが寿命閾値を超えているか否かを判断する。超えている場合は、警告モジュール４１２の例を呼び出して、一つまたはそれ以上の警告を生成する（ブロック６０６）。警告モジュール４１２の例は、あらゆるタイプの警告を呼び出して、プラットフォームマネージャに、ＮＶ  ＲＡＭ  キャッシュ  １１４が有効寿命の終わりに居るか、近づいていることを知らせる。システムが生成したメッセージ、及び/又は、プラットフォームの例のパワーオンリセットの最中に表示されるプロンプトメッセージといったものである。
【００３６】
ＮＶ  ＲＡＭ優先度プロファイルマネージャ４１０が、ＮＶ  ＲＡＭキャッシュ１１４は寿命閾値にないと判断した場合（ブロック６０４）、ＮＶ  ＲＡＭ優先度プロファイルマネージャ４１０の例は、次に、書き込みサイクル率が比率閾値より上であるか否かを判断する（ブロック６０８）。いくつかの実施例において、プラットフォーム１００のオペレーションは、単位時間あたりの書き込みオペレーションの数量を加速させるやり方で変化し、比較的により短い時間期間の最中にＮＶ  ＲＡＭキャッシュ１１４の有効寿命を短くし得る。プラットフォームオペレーション及び/又は書き込みサイクル率におけるそうした変化は、警告モジュール４１２の例によって通信される（ブロック６０６）。プラットフォームマネージャが、プラットフォームコンポーネントの置き換えについて是正措置及び/又は計画が行えるようにである。図６のプログラム６００の実施例は、書き込みカウント値が周期的、非周期的、及び/又は、手動ベースで更新され得るように、遅延（ｄｅｌａｙ）を採用する（ブロック６１０）。
【００３７】
図７は、図１のプラットフォーム１００及び/又は図１−４のキャッシュマネージャ１０８を実施するために、図５Ａ、図５Ｂ、および図６に係るインストラクションを実行することができるプロセッサプラットフォーム７００の実施例に係るブロックダイヤグラムである。プロセッサプラットフォーム７００は、例えば、サーバー、パーソナルコンピュータ、インターネット装置、モバイルデバイス、または、あらゆる他のタイプのコンピューティングデバイス、であり得る。
【００３８】
インスタント（ｉｎｓｔａｎｔ）な実施例であるシステム７００は、プロセッサ７１２を含んでいる。例えば、プロセッサ７１２は、あらゆる所望のファミリまたは製造者からの一つまたはそれ以上のマイクロプロセッサまたはコントローラによって実施例され得る。
【００３９】
プロセッサ７１２は、ローカルメモリ７１３（例えば、キャッシュ、キャッシュ１１２、１１４といったもの）を含んでおり、バス７１８を介して、揮発性メモリ７１４および不揮発性メモリ７１６を含むメインメモリと通信している。揮発性メモリ７１４は、シンクロナスダイナミックランダムアクセスメモリ（ＳＤＲＡＭ）、ダイナミックランダムアクセスメモリ（ＤＲＡＭ）、ＲＡＭＢＵＳダイナミックランダムアクセスメモリ（ＲＤＲＡＭ）、及び/又は、あらゆる他のタイプのランダムアクセスメモリデバイスによって実施されてよい。不揮発性メモリ７１６は、フラッシュメモリ、及び/又は、あらゆる他の所望のタイプのメモリデバイスによって実施されてよい。メインメモリ７１４、７１６へのアクセスは、メモリコントローラによってコントロールされる。
【００４０】
プロセッサプラットフォーム７００は、また、インターフェイス回路７２０を含んでいる。インターフェイス回路７２０は、イーサネット（登録商標）（Ｅｔｈｅｎｅｔ）インターフェイス、ユニバーサルシリアルバス（ＵＳＢ）、及び/又は、ＰＣＩエクスプレスインターフェイスといった、あらゆるタイプのインターフェイス標準によって実施されてよい。
【００４１】
一つまたはそれ以上の入力デバイス７２２は、インターフェイス回路７２０に接続されている。入力デバイス７２２により、ユーザは、データとコマンドをプロセッサ７１２の中に入れることができる。入力デバイスは、例えば、キーボード、マウス、タッチスクリーン、トラックパッド、トラックボール、イソポイント（ｉｓｏｐｏｉｎｔ）、及び/又は、音声認識システム、によって実施され得る。
【００４２】
一つまたはそれ以上の出力デバイス７２４も、また、インターフェイス回路７２０に接続されている。出力デバイスは、例えば、ディスプレイデバイス（例えば、液晶ディスプレイ、カソッドレイチューブディスプレイ（ＣＲＴ）、プリンタ、及び/又は、スピーカ）によって、実施され得る。インターフェイス回路７２０は、従って、典型的には、グラフィックドライバカードを含んでいる。
【００４３】
インターフェイス回路７２０は、また、モデムまたはネットワークインターフェイスカードといった、通信デバイスも含んでおり、ネットワーク７２６（例えば、イーサネット接続、デジタル加入者線（ＤＳＬ）、電話線、同軸ケーブル、携帯電話システム、等）を介して外部のコンピュータとのデータ交換を促進している。
【００４４】
プロセッサプラットフォーム７００は、また、ソフトウェアとデータを保管するために一つまたはそれ以上の大容量ストレージデバイス７２８も含んでいる。そうした大容量ストレージデバイスの実施例は、フロッピーディスクドライブ、ハードディスクドライブ、コンパンクトディスクドライブ、および、デジタル多用途ディスク（ＤＶＤ）ドライブ、を含んでいる。
【００４５】
図５Ａ、図５Ｂ、および図６のコード化されたインストラクション７３２は、大容量ストレージデバイス７２８の中、揮発性メモリ７１４の中、不揮発性メモリ７１６の中、及び/又は、ＣＤ又はＤＶＤといった取り出し可能なストレージ媒体上に、保管されてよい。
【００４６】
ここにおいて開示された不揮発性メモリの中にコードをキャッシュするための方法、装置、システム、および、製品は、ディスクストレージに対するプロセッサのフェッチオペレーションに関するレイテンシを低減することによって、プラットフォームのオペレーションを改善する。特に、プロセッサのディスクストレージフェッチオペレーションは、プラットフォームの電源リセットの後で比較的に頻繁に起こる。従来のキャッシュデバイスに保管された、以前にコンパイル、最適化、及び/又は、そうでなければ翻訳されたコードは、電源が取り除かれた場合、保持されないからである。加えて、ここにおいて開示された不揮発性メモリの中にコードをキャッシュするための方法、装置、システム、および、製品の実施例は、書き込みサイクル寿命が制限された回数である不揮発性ランダムアクセスメモリに対して書き込みを行う試みを賢明に管理する。
【００４７】
方法、装置、システム、および、製品は、不揮発性メモリの中にコードをキャッシュするために開示されている。いくつかの開示された方法の実施例は、第１のコードに対するコードリクエストのインスタンスを特定するステップと、前記第１のコードが不揮発性ランダムアクセスメモリ（ＮＶ  ＲＡＭ）キャッシュ上に保管されるか否かを特定するステップと、を含み、前記第１のコードが前記ＮＶ  ＲＡＭキャッシュに居ない場合に、前記第１のコードに関する第１の条件が満たされるときは、前記第１のコードを前記ＮＶ  ＲＡＭキャッシュに追加し、かつ、前記第１の条件が満たされないときは、前記第１のコードを前記ＮＶ  ＲＡＭキャッシュに保管することを防止する。開示された他の方法は、前記第１の条件が満たされない場合に、プロセッサによってコードリクエストが開始される。別の言葉で言えば、前記コードリクエストは、コンパイラまたはバイナリトランスレータプロセッサのうち少なくとも一つによって開始される。さらに開示された他の方法において、ＮＶ  ＲＡＭ  キャッシュは、バイトレベルのアクセスを許可し、開示されたいくつかの方法において、第１の条件は、アクセス頻度カウントが閾値を超えること、を含む。そこでは、第２のコードのアクセス頻度カウント値に基づいて、前記アクセス頻度カウントに対する閾値を設定し、及び/又は、複数の他のコードに関するアクセス頻度カウント値に基づいて、前記アクセス頻度カウントに対する閾値を設定する。いくつかの実施例の方法では、第１の条件は、アクセス頻度カウント、翻訳時間、コードサイズ、または、キャッシュアクセスレイテンシ、のうち少なくとも一つを含む。他の実施例の方法では、第１のコードを前記ＮＶ  ＲＡＭキャッシュに追加する前に、バイナリトランスレータを用いて前記第１のコードをコンパイルし、さらに他の実施例の方法では、第１のコードに対するプロセッサリクエストの回数をトラックし、そこでは、第１のコードに対する前記リクエストの回数に基づいて、前記第１のコードが前記ＮＶ  ＲＡＭキャッシュに追加される。さらに他の方法の実施例では、ＮＶ  ＲＡＭキャッシュに対する書き込みオペレーションの回数をトラックし、そこでは、ＮＶ  ＲＡＭキャッシュに対する書き込みオペレーションの前記回数が、寿命の最大書き込み回数に関する書き込み閾値を超えるときに、警告を発生する。開示された実施例は、また、第１のコードが第１レベルのキャッシュに居ないときに、前記ＮＶ  ＲＡＭキャッシュに対するストレージ試みを無視し、そこでは、ＮＶ  ＲＡＭキャッシュに対する前記ストレージ試みは、最低使用頻度ストレージポリシに関連している。
【００４８】
不揮発性メモリの中にコードをキャッシするための装置の実施例は、コンパイルされたコードを保管するための第１レベルのキャッシュと、コンパイルされたコードを保管するための第２レベルの不揮発性ランダムアクセスメモリ（ＮＶ  ＲＡＭ）キャッシュと、キャッシュインターフェイスであり、前記コンパイルされたコードが閾値より多い頻度でアクセスされる場合は、前記ＮＶ  ＲＡＭに前記コンパイルされたコードを保管することを許可し、かつ、前記閾値の頻度が満たされない場合は、前記ＮＶ  ＲＡＭに前記コンパイルされたコードを保管することをブロックする、キャッシュインターフェイスと、を含む。いくつかの開示された装置は、ダイナミックランダムアクセスメモリを有する第１レベルのキャッシュを含む。開示された装置の他の実施例は、ＮＶ  ＲＡＭキャッシュについて期待される寿命の書き込みカウント値を、前記ＮＶ  ＲＡＭキャッシュの書き込みカウントインスタンスの現在の回数と比較する、プロファイルマネージャと、を含む。さらに他の開示された装置は、ＮＶ  ＲＡＭキャッシに対する書き込みカウントインスタンスの頻度を低減するために、第２の条件に関する閾値を設定する、条件閾値エンジンと、を含む。
【００４９】
開示されたいくつかのマシンで読み取り可能なストレージ媒体の実施例は、インストラクションが実行されると、マシンは、少なくとも、第１のコードに対するコードリクエストのインスタンスを特定し、前記第１のコードが不揮発性ランダムアクセスメモリ（ＮＶ  ＲＡＭ）キャッシュ上に保管されるか否かを特定し、かつ、前記第１のコードが前記ＮＶ  ＲＡＭキャッシュに居ない場合に、前記第１のコードに関する第１の条件が満たされるときは、前記第１のコードを前記ＮＶ  ＲＡＭキャッシュに追加し、かつ、前記第１の条件が満たされないときは、前記第１のコードを前記ＮＶ  ＲＡＭキャッシュに保管することを防止する。いくつかのマシンで読み取り可能なストレージ媒体の実施例は、第１の条件が満たされない場合に、前記第１の条件および第２の条件に対応する総計閾値が満たされるか否かを判断し、一方、他のものは、ＮＶ  ＲＡＭキャッシュを介したバイトレベルのアクセスを許可する。他の開示されたマシンで読み取り可能なストレージ媒体は、インストラクションが実行されると、マシンが、第１の条件が、アクセス頻度カウント閾値をいつ超えたかを特定し、そこで、第２コードのアクセス頻度カウント値に基づいて、アクセス頻度カウントに対する閾値を設定する。さらに他の開示されたマシンで読み取り可能なストレージ媒体は、インストラクションが実行されると、マシンが、複数の他のコードに関するアクセス頻度カウント値に基づいて、アクセス頻度カウントに対する閾値を設定し、一方、他のものは、第１のコードに対するプロセッサリクエストの回数をトラックする。開示された他のマシンで読み取り可能なストレージ媒体は、インストラクションが実行されると、マシンが、第１のコードに対する前記リクエストの回数に基づいて、前記第１のコードを前記ＮＶ  ＲＡＭキャッシュに追加する、そして、他のものは、ＮＶ  ＲＡＭキャッシュに対する書き込みオペレーションの回数をトラックし、そこで、マシンは、ＮＶ  ＲＡＭキャッシュに対する書き込みオペレーションの前記回数が、寿命の最大書き込み回数に関する書き込み閾値を超えるときに、警告を発生する。開示されたいくつかの他のマシンで読み取り可能なストレージ媒体は、インストラクションが実行されると、マシンが、第１のコードが第１レベルのキャッシュに居ないときに、前記ＮＶ  ＲＡＭキャッシュに対するストレージ試みを無視する。
【００５０】
ここにおいて所定の方法、装置、および、製品の実施例が説明されてきたが、本発明の範囲のカバレージは、これらに限定されるものではない。反対に、本発明に係る特許は、本特許出願の特許請求の範囲内に適正に留まる全ての方法、装置、および、製品をカバーするものである。
【図１】
0005989908.tif 000002
【図２】
0005989908.tif 000003
【図３】
0005989908.tif 000004
【図４】
0005989908.tif 000005
【図５Ａ】
0005989908.tif 000006
【図５Ｂ】
0005989908.tif 000007
【図６】
0005989908.tif 000008
【図７】
0005989908.tif 000009