(57)【特許請求の範囲】
【請求項１】
複数の部分領域を含むメモリ領域の各前記部分領域へのアクセス回数を記憶部に記憶する記憶ステップと、
各前記部分領域へのアクセス回数に基づき、前記各部分領域へのアクセス頻度をアクセス負荷として算出し、前記アクセス負荷を前記各部分領域に対応する閾値とそれぞれ比較することにより、第１の電力状態と、前記第１の電力状態よりも消費電力が低い第２の電力状態とを含む複数の電力状態のうちの１つを前記部分領域のそれぞれについて決定する電力状態決定ステップと、
各前記部分領域を、前記電力状態決定ステップにより決定された電力状態にそれぞれ設定する電力状態制御ステップと、
をコンピュータに実行させ
前記各部分領域に対応する閾値は、前記各部分領域を前記第１の電力状態に維持するために必要な電力、前記各部分領域を前記第２の電力状態に維持するために必要な電力、前記各部分領域を前記第１の電力状態から前記第２の電力状態に遷移させるために必要な電力、前記各部分領域を前記第２の電力状態から前記第１の電力状態に遷移させるために必要な電力に基づき定められる
プログラム。
【請求項２】
前記閾値は、前記各部分領域を前記第１の電力状態に維持するために必要な電力から前記各部分領域を前記第２の電力状態に維持するために必要な電力を減算した値を、前記各部分領域を前記第１の電力状態から前記第２の電力状態に遷移させるために必要な電力と前記各部分領域を前記第２の電力状態から前記第１の電力状態に遷移させるために必要な電力とを加算した値で除算することで計算される
請求項１に記載のプログラム。
【請求項３】
前記第１の電力状態は、メモリアクセスが可能な状態であり、
前記第２の電力状態は、メモリアクセスが不可能な状態であり、
前記電力状態制御ステップは、前前記第２の電力状態の前記部分領域へのメモリアクセスが要求されたときは、前記部分領域を前記第１の電力状態に設定し、前記メモリアクセスが完了した後、前記部分領域を前記第２の電力状態に戻す
請求項１ないし２のいずれか一項に記載のプログラム。
【請求項４】
前記第２の電力状態の前記部分領域のうち、前記メモリアクセスが要求された領域に含まれる第１データを読み出し、前記第１の電力状態の部分領域内の領域に前記第１データを格納する実行ステップと、
前記メモリアクセスが要求された領域のアドレスと、前記第１データが格納された領域のアドレスの対応関係を管理する管理ステップと、
をさらに前記コンピュータに実行させる請求項３に記載のプログラム。
【請求項５】
前記実行ステップは、前記第１の電力状態の部分領域内の前記領域に前記第１データが格納される前に、前記領域に格納されている第２データを読み出し、前記メモリアクセスが要求された領域に前記第２データを格納し、
前記管理ステップは、前記第２データが読み出された領域のアドレスと、前記第２データが格納された領域のアドレスの対応関係を管理する、
請求項４に記載のプログラム。
【請求項６】
前記実行ステップは、前記第２の電力状態の部分領域内のデータを、外部の記憶装置に書き出す場合、前記部分領域を前記第１の電力状態に変更し、前記データを書き出した後、前記領域を前記第２の電力状態に戻す
請求項４または５に記載のプログラム。
【請求項７】
前記実行ステップは、外部の記憶装置に記憶されたデータにアクセスする場合、前記外部の記憶装置から読み出したデータを前記第１の電力状態の部分領域に書き込む
請求項４ないし６のいずれか一項に記載のプログラム。
【請求項８】
ダイレクトメモリアクセス用のバッファ領域を前記部分領域に確保するステップをさらに前記コンピュータに実行させ、
前記電力状態決定ステップは、前記バッファ領域が確保された前記部分領域を前記第１の電力状態に維持することを決定する
請求項１ないし７のいずれか一項に記載のプログラム。
【請求項９】
前記第２の電力状態の前記部分領域へのダイレクトメモリアクセスが失敗したことを検知するステップをさらに前記コンピュータに実行させ、
前記電力状態決定ステップは、前記ステップにより失敗が検出されたとき、前記第２の電力状態の前記部分領域を前記第１の電力状態に変更することを決定し、
前記電力状態制御ステップは、前記部分領域を前記第１の電力状態に設定する
請求項１ないし７のいずれか一項に記載のプログラム。
【請求項１０】
ダイレクトメモリアクセスによりアクセスされようとする部分領域が前記１の電力状態および前記第２の電力状態のいずれにあるのかを検出するステップを前記コンピュータに実行させ、
前記電力状態決定ステップは、前記第２の電力状態が検出されたときは、前記部分領域を前記第１の電力状態にすることを決定し、
前記電力状態制御ステップは、前記部分領域を前記第１の電力状態に設定する
請求項１ないし７のいずれか一項に記載のプログラム。
【請求項１１】
前記電力状態決定ステップは、前記部分領域が前記第１の電力状態に設定され、前記部分領域へのダイレクトメモリアクセスが完了した後、前記部分領域を前記第２の電力状態に戻すことを決定する
請求項９または１０に記載のプログラム。
【請求項１２】
複数の部分領域を含むメモリ領域の各前記部分領域へのアクセス回数をアクセス負荷として算出し、前記アクセス負荷を前記各部分領域に対応する閾値とそれぞれ比較することにより、第１の電力状態と、前記第１の電力状態よりも消費電力が低い第２の電力状態とを含む複数の電力状態のうちの１つを前記部分領域のそれぞれについて決定する電力状態決定部と、
各前記部分領域を、前記電力状態決定部により決定された電力状態にそれぞれ設定する電力状態制御部と、
を備え、
前記各部分領域に対応する閾値は、前記各部分領域を前記第１の電力状態に維持するために必要な電力、前記各部分領域を前記第２の電力状態に維持するために必要な電力、前記各部分領域を前記第１の電力状態から前記第２の電力状態に遷移させるために必要な電力、前記各部分領域を前記第２の電力状態から前記第１の電力状態に遷移させるために必要な電力に基づき定められる計算処理装置。
【請求項１３】
前記閾値は、前記各部分領域を前記第１の電力状態に維持するために必要な電力から前記各部分領域を前記第２の電力状態に維持するために必要な電力を減算した値を、前記各部分領域を前記第１の電力状態から前記第２の電力状態に遷移させるために必要な電力と前記各部分領域を前記第２の電力状態から前記第１の電力状態に遷移させるために必要な電力とを加算した値で除算することで計算される
請求項１２に記載の計算処理装置。
【請求項１４】
前記第１の電力状態は、メモリアクセスが可能な状態であり、
前記第２の電力状態は、メモリアクセスが不可能な状態であり、
前記電力状態制御部は、前記第２の電力状態の前記部分領域へのメモリアクセスが要求されたときは、前記部分領域を前記第１の電力状態に設定し、前記メモリアクセスが完了した後、前記部分領域を前記第２の電力状態に戻す
請求項１２ないし１３のいずれか一項に記載の計算処理装置。
【請求項１５】
前記第２の電力状態の前記部分領域のうち、前記メモリアクセスが要求された領域に含まれる第１データを読み出し、前記第１の電力状態の部分領域内の領域に前記第１データを格納する実行部と、
前記メモリアクセスが要求された領域のアドレスと、前記第１データが格納された領域のアドレスの対応関係を管理する管理部と、
をさらに備えた請求項１４に記載の計算処理装置。
【請求項１６】
前記実行部は、前記第１の電力状態の部分領域内の前記領域に前記第１データが格納される前に、前記領域に格納されている第２データを読み出し、前記メモリアクセスが要求された領域に前記第２データを格納し、
前記管理部は、前記第２データが読み出された領域のアドレスと、前記第２データが格納された領域のアドレスの対応関係を管理する、
請求項１５に記載の計算処理装置。
【請求項１７】
前記実行部は、前記第２の電力状態の部分領域内のデータを、外部の記憶装置に書き出す場合、前記部分領域を前記第１の電力状態に変更し、前記データを書き出した後、前記部分領域を前記第２の電力状態に戻す
請求項１５または１６に記載の計算処理装置。
【請求項１８】
前記実行部は、外部の記憶装置に記憶されたデータにアクセスする場合、前記外部の記憶装置から読み出したデータを前記第１の電力状態の部分領域に書き込む
請求項１５ないし１７のいずれか一項に記載の計算処理装置。
【請求項１９】
ダイレクトメモリアクセス用のバッファ領域を前記部分領域に確保する手段を備え、
前記電力状態決定部は、前記バッファ領域が確保された前記部分領域を前記第１の電力状態に維持することを決定する
請求項１２ないし１８のいずれか一項に記載の計算処理装置。
【請求項２０】
前記第２の電力状態の前記部分領域へのダイレクトメモリアクセスが失敗したことを検知する手段を備え、
前記電力状態決定部は、前記手段により失敗が検出されたとき、前記第２の電力状態の前記部分領域を前記第１の電力状態に変更することを決定し、
前記電力状態制御部は、前記部分領域を前記第１の電力状態に設定する
請求項１２ないし１８のいずれか一項に記載の計算処理装置。
【請求項２１】
ダイレクトメモリアクセスによりアクセスされようとする部分領域が前記１の電力状態および前記第２の電力状態のいずれにあるのかを検出する手段を備え、
前記電力状態決定部は、前記第２の電力状態が検出されたときは、前記部分領域を前記第１の電力状態にすることを決定し、
前記電力状態制御部は、前記部分領域を前記第１の電力状態に設定する
請求項１２ないし１８のいずれか一項に記載の計算処理装置。
【請求項２２】
前記電力状態決定部は、前記部分領域が前記第１の電力状態に設定され、前記部分領域へのダイレクトメモリアクセスが完了した後、前記部分領域を前記第２の電力状態に戻すことを決定する
請求項２０または２１に記載の計算処理装置。
【請求項２３】
複数の部分領域を含むメモリ領域の各前記部分領域へのアクセス回数を記憶部に記憶する記憶ステップと、
各前記部分領域へのアクセス回数に基づき、前記各部分領域へのアクセス頻度をアクセス負荷として算出し、前記アクセス負荷を前記各部分領域に対応する閾値とそれぞれ比較することにより、第１の電力状態と、前記第１の電力状態よりも消費電力が低い第２の電力状態とを含む複数の電力状態のうちの１つを前記部分領域のそれぞれについて決定する電力状態決定ステップと、
各前記部分領域を、前記電力状態決定ステップにより決定された電力状態にそれぞれ設定する電力状態制御ステップと、を備え、
前記各部分領域に対応する閾値は、前記各部分領域を前記第１の電力状態に維持するために必要な電力、前記各部分領域を前記第２の電力状態に維持するために必要な電力、前記各部分領域を前記第１の電力状態から前記第２の電力状態に遷移させるために必要な電力、前記各部分領域を前記第２の電力状態から前記第１の電力状態に遷移させるために必要な電力に基づき定められる
メモリ管理方法。
【請求項２４】
ユーザにより操作入力を行うための入力手段と、
画像表示を行う表示手段と、
ネットワークと通信する通信手段と、
ＣＰＵと、
複数の部分領域を含むメモリ領域を有するメモリへアクセス可能なメモリアクセス手段と、
計算処理手段と
を備え、
前記計算処理手段は、
前記メモリ領域の各前記部分領域へのアクセス回数に基づき、前記各部分領域へのアクセス頻度をアクセス負荷として算出し、前記アクセス負荷を前記各部分領域に対応する閾値とそれぞれ比較することにより、第１の電力状態と、前記第１の電力状態よりも消費電力が低い第２の電力状態とを含む複数の電力状態のうちの１つを前記部分領域のそれぞれについて決定し、各前記部分領域を、前記決定された電力状態にそれぞれ設定し、
前記各部分領域に対応する閾値は、前記各部分領域を前記第１の電力状態に維持するために必要な電力、前記各部分領域を前記第２の電力状態に維持するために必要な電力、前記各部分領域を前記第１の電力状態から前記第２の電力状態に遷移させるために必要な電力、前記各部分領域を前記第２の電力状態から前記第１の電力状態に遷移させるために必要な電力に基づき定められる、計算機。
【請求項２５】
前記計算処理手段は前記ＣＰＵに含まれる
請求項２４に記載の計算機。
【請求項２６】
前記計算処理手段は前記メモリに含まれる
請求項２４に記載の計算機。
【請求項２７】
前記メモリアクセス手段は、前記ＣＰＵに含まれる
請求項２４ないし２６のいずれか一項に記載の計算機。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明の実施形態は、プログラムおよび計算処理装置に関し、たとえばデジタルデータを記憶するメモリ装置の消費電力を削減するための制御技術に関する。  
【背景技術】
【０００２】
近年、パーソナルコンピュータを代表とする計算機の普及は目覚ましく、携帯電話やコピー装置、ホームルータ、など様々な情報処理を行うために、計算機技術が用いられている。計算機技術の特徴として、DRAMなどのメモリ装置を有し、そのメモリ上に格納されたデータを処理し、処理された結果のデータをメモリに格納することで、情報処理を行うことがある。すなわち、データの読み・書きの片方あるいは両方を行うメモリ領域を有することが、これらの機器の特徴である。
【０００３】
近年、計算機の消費電力を削減することに対する要求が高まっている。この要求の基になっている動機は、電力コストの削減や、発熱に伴う計算機の誤動作の防止がある。また、バッテリ駆動されている機器では、稼働時間の延長などがある。このほかにも様々ある。この計算機の消費電力削減要求は、計算機に含まれるメモリ装置に対する消費電力削減要求へと分解されている。
【０００４】
この要求に応えるため、例えばメモリ領域をバンクと呼ばれる複数のセグメントに分割し、有効なデータを含まないセグメントへの給電を停止する。これにより、メモリ装置の消費電力削減の効果を狙うものが開示されている。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開2005-196343号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
ここで、例えば、複数のWebページを開いたWebタグブラウザを考える。この場合、ユーザがバックグラウンドに配したWeb画面については、そのWeb画面に対する処理は行われない。それにも関わらず、そのWeb画面を描画するためのメモリ領域は保持されたままである。
【０００７】
あるいは、ワープロソフトや表計算ソフトなど複数のソフトウエアを立ち上げている場合においても、ユーザは一つのソフトウエアしか操作しないため、それ以外のソフトウエアの処理は行われない。それにも関わらず、これらのソフトウエアのメモリ領域は保持されたままであり、保持されたメモリ領域が多い場合には、消費電力の削減効果が小さいという課題がある。
【０００８】
本発明は、メモリ装置の消費電力を削減することを目的とする。
【課題を解決するための手段】
【０００９】
本発明の一態様としてのプログラムは、電力状態決定ステップと、電力状態制御ステップと、をコンピュータに実行させる。
【００１０】
前記電力状態決定ステップは、複数の部分領域を含むメモリ領域のアクセス負荷を算出し、前記アクセス負荷に応じて、第1の電力状態と、前記第1の電力状態よりも消費電力が低い第２の電力状態とを含む複数の電力状態のうちの１つを前記部分領域のそれぞれについて決定する。
【００１１】
前記電力状態制御ステップは、各前記部分領域を、前記電力状態決定部により決定された電力状態にそれぞれ設定する。
【００１２】
本発明の一態様としての計算処理装置は、電力状態決定部と、電力状態制御部とを備える。
【００１３】
前記電力状態決定部は、複数の部分領域を含むメモリ領域のアクセス負荷を算出し、前記アクセス負荷に応じて、第1の電力状態と、前記第1の電力状態よりも消費電力が低い第２の電力状態とを含む複数の電力状態のうちの１つを前記部分領域のそれぞれについて決定する。
【００１４】
前記電力状態制御部は、各前記部分領域を、前記電力状態決定部により決定された電力状態にそれぞれ設定する。
【図面の簡単な説明】
【００１５】
【図１】本発明の実施例に係る計算機のハードウエア構成の例を示す図。
【図２】メモリモジュールの構成例を示す図。
【図３】メモリモジュールのアドレスとセグメントの関係を示す図。
【図４】論理アドレスから物理アドレスへのアドレス変換の動作を説明するための図。
【図５】セグメント情報管理テーブルの一例を示す図。
【図６】物理メモリの使用状態の一例を示す図。
【図７】セグメントに電力状態に関する順序制約を付けた例を示す図。
【図８】実施例２に係る処理の流れの一例を示すフローチャート。
【図９】実施例２に係る処理の流れの他の例を示すフローチャート。
【図１０】ページ置換に伴うアドレス変換表の書き換えを説明するための図。
【図１１】メモリモジュールの他の構成例を示す図。
【図１２】スワップ情報テーブルの例を示す図。
【図１３】メモリモジュールのさらに別の構成例を示す図。
【図１４】本発明の実施例１に係る計算処理装置の構成例を示す図。
【図１５】本発明の実施例２に係る計算処理装置の構成例を示す図。
【図１６】バッファ領域の確保の様子を模擬的に示す図。
【発明を実施するための形態】
【００１６】
（実施例１）  図1でWireless NICやMain Memory等、英語名称を伊瀬が使用したため、明細書中および図面で日本語表記と英語表記が混在しています。このままで問題なければ、このままでOKです。問題があるのであれば表記の統一をお願いします。
【００１７】
図1に、本発明の実施例に係る計算機のハードウエア構成の例を示す。
【００１８】
計算機は、CPU１１とこれにつながる表示ディスプレイ（例えば、LCD（液晶ディスプレイ））２１とメインメモリ３１とHDD（ハードディスクドライブ）４１と無線NIC５１と外部入力手段（キーボードやマウス等）６１を備える。CPU１１は、一つ以上のCPUコア１２と、キャッシュ領域（以下、キャッシュ）１３と、グラフィックプロセッサ１４と、MMU（Memory Management Unit：メモリ管理ユニット）１５とUSBホストコントローラ１６とDMA（ダイレクトメモリアクセス）コントローラ１７とBUSコントローラ１８とSATA（Serial Advanced Technology Attachment）ホストコントローラ１９とを備える。
【００１９】
CPUコア１２は、実行命令に基づいて演算を行う。
【００２０】
グラフィックプロセッサ１４は、CPUコア１２からの描画命令に従い、RGB信号を生成し、これを表示ディスプレイ２１に出力する。
【００２１】
キャッシュ１３は、CPUコア１２がメインメモリ３１にアクセスする際の遅延を改善するために設けられている記憶装置である。CPUコア１２は、メモリの内容を読み込む際には、まずキャッシュ１３の内容を確認する。キャッシュ１３にその内容が保持されていなければ、メモリ３１から値を読み込み、キャッシュ１３にその内容を記憶する。キャッシュ１３にその内容が存在すれば、キャッシュ１３の値を読み込む。CPUコア１２がメモリ３１にデータを書き込むためには、まずキャッシュ１３の保持する内容を書き換える。この書き換えられた内容が、例えばライトバックあるいはライトスルーと呼ばれる方法に従って、メインメモリ３１に書き込まれる。キャッシュ１３に用いられる記憶方式には、SRAMやDRAMなど様々なものを用いることができる。キャッシュ１３は、メインメモリよりアクセス遅延の小さいことが望ましい。
【００２２】
MMU１５は、メインメモリ３１をアクセスする際に使う物理アドレスと、CPUコア１２上で動作するOS（Operating System）が使用する仮想アドレス（あるいは論理アドレス。本明細書では仮想アドレスと論理アドレスを区別せず使用する。）との変換を行う装置である。仮想アドレスを入力として、これに対応する物理アドレスを出力する。この仮想アドレスと物理アドレスの変換情報の全てをMMU１５内部のメモリに保持してもよい。または、変換表の一部をMMU１５に保持し、その他の部分をメインメモリ３１等の外部に保持してもよい。一部のみを保持する方式としては、例えば、TLB(Translation Lookaside Buffer)と呼ばれる高速メモリをMMU１５が有し、TLBに保持していない変換データのみメインメモリ３１を参照して取得するとともに、得られた変換データをTLBに書き込む方法がある。
【００２３】
USBホストコントローラ１６は、USB（Universal Serial Bus）規格に基づいて、USBデバイスとの情報送受信を行う。
【００２４】
DMAコントローラ１７は、メインメモリ３１、バス上のデバイス（無線NICなど）およびSATAデバイス（HDDなど）とのデータの送受信処理を行う。DMAコントローラ１７は、CPUコア１２と交渉し、バスの制御権を得る。バスの制御権を得たDMAコントローラ１７は、バス上のデバイスからデータを受信し、受信データをメインメモリ３１に書き込む。あるいは、メインメモリ３１のデータを読み、そのデータをバス上のデバイスに送信する。DMAコントローラ１７およびCPUコア１２は、メインメモリ３１にアクセスするメモリアクセス装置に対応する。
【００２５】
バスコントローラ１８は、例えば、PCI-Expressなどのバス規格に従って、バス上のデバイスとのデータの送受信を行う。
【００２６】
SATAホストコントローラ１９は、SATA（Serial Advanced Technology Attachment）規格に従って、SATAケーブルを介してデバイス（HDD）とのデータの送受信を行う。
【００２７】
表示ディスプレイ２１は、RGB信号を通じて入力した信号を、人間の読める形式にして表示する。
【００２８】
メインメモリ３１は、例えばDRAM(Dynamic Random Access Memory)であり、例えばDDR3と呼ばれるインタフェース（メモリバス）にてCPU１１と接続される（図示しないメモリコントローラをCPU１１は有する）。このメインメモリ３１は、MRAM(Magneto-resistive Random Access Memory)やFeRAM(Ferroelectric Random Access Memory)やPRAM(Phase change Random Access Memory)やReRAM（Resistive Random Access Memory）などの不揮発性メモリ技術にて構成されていれば一層望ましい。
【００２９】
メインメモリ３１は、CPU１１からのread命令を受信した際には、read命令とともに与えられるアドレス情報に対応した領域に保持されている値を読み出して、CPU１１に出力する。さらに、CPU１１からwrite命令を受信した際には、write命令とともにアドレス情報と値を受信し、アドレス情報に対応する領域に受信した値を書き込む。メインメモリ３１とCPU１１との間の接続インタフェースには、DDR3以外にLPDDR3やWideIOなど様々なインタフェースが使用され得る。
【００３０】
HDD４１は、例えば、TOSHIBA社のMK1059GSMのように、磁気媒体のデジタル情報を記憶する装置であり、SATAインタフェースにてCPU１１と接続される。HDDの代わりに、SSDと呼ばれる半導体記憶装置（NAND フラッシュ）を用いてもよい。デジタル情報を記憶するための方式は様々であるが、メモリ３１よりも大容量であることが望ましい。HDD４１とCPU１１との間の接続は、SATA以外にもSCSIやFiber ChannelやPCI-Expressなどの様々なインタフェースを使用し得る。
【００３１】
無線NIC(Network Interface Card)５１は、例えばIEEE 802.11の規格に従って、ネットワークに対して通信パケットを送受信するものである。使用する規格は、IEEE802.11に限るものではなく、LTE(Long Term Evolution)と呼ばれるセルラー通信向きのインタフェースであってもよいし、100Mイーサネットと呼ばれるような有線インタフェースであってもよい。
【００３２】
外部入力手段６１は、人間による操作を入力するための手段であり、例えばキーボードやマウス、表示ディスプレイ上のタッチパネルであってもよい。また、温度センサーなどでもよく、入力される情報は人間からのものに限定されるものではない。本実施例ではUSB規格に従って外部入力をCPU１１に送信しているが、外部入力手段６１は、USB以外の他の規格（例えば、IEEE1394, RS-232C,HDMI）で接続されていてもよい。
【００３３】
本実施例では、ハードウエア構成として、図1の構成を用いたが、グラフィックプロセッサ、MMU、USBホストコントローラ、DMAコントローラ、バスコントローラ、SATAホストコントローラのいずれか一つ以上がCPU１１の外側に存在する構成もあり得る。また、無線NICの一部の機能を、CPU１１内に有するなど様々な変形が考え得る。
【００３４】
［メモリモジュールのHW構成］
図2にメインメモリ３１に用いるメモリモジュールの構成例を示す。
【００３５】
メモリモジュール１０１は、8個のメモリチップ（LSI）１０２を、基板上に有している。メモリモジュール１０１は、アドレスとコマンドと制御信号とを送受信するための信号線を有し、当該信号線を介して、アドレスとコマンドと制御信号を、各メモリチップ１０２へ伝える。コマンドには、以下のようにReadコマンドおよびWriteコマンドに加え、メモリのセグメント（部分領域）の電力状態を変更するPowerStateChangeコマンドがある。制御信号は、クロック信号やread/writeタイミング信号などである。また、メモリモジュール１０１は、データの送受信を行う信号線を有し、当該信号線を介して、各メモリチップとデータを送受信する。
【表１】
0005624583.tif 000002
【００３６】
ここで電力状態には、アクティブとスリープの2状態が存在する。アクティブなセグメントは、データのread/writeが可能である。スリープであるセグメントは、記憶しているデータを保持し続けるが、read/writeはできない。セグメントの消費する電力は、アクティブ状態の方が、スリープ状態よりも大きい。
【００３７】
DRAMにおいて、スリープ状態とは、例えば、セグメントを選択してセルフリフレッシュモードにすることで実現できる。セルフリフレッシュモードとは、メモリモジュールあるいはメモリチップのセグメント内部で、リフレッシュ動作（DRAMではメモリセルに保持した情報が時間とともに消失するため、メモリセルの内容を読み出して再度そのセルに書き込む動作）を行う状態である。リフレッシュ間隔を長くすることで、消費電力を削減することができる。さらに、一般にDRAMのメモリセルの情報保持時間は低温であるほど長くなる。このため、このセルフリフレッシュ動作は、低温であるほどリフレッシュ間隔を長くすることが望ましい。さらに、メモリセル内で情報保持時間にばらつきがあるため、そのばらつきを考慮して、リフレッシュ間隔をなるべく長くすることが望ましい。
【００３８】
一方MRAMのような不揮発性メモリでは、情報を保持するための電力は不要である。このため、セグメントを選択し、そのメモリセルの読出し・書き込み用の信号への給電を停止あるいは電圧を下げることで、スリープ状態を実現できる。さらにPLL(Phase-locked loop)、カラムデコーダ、ロウデコーダ、センスアンプ回路などの他の回路への給電停止あるいは電圧の低電圧化、そしてクロック停止を行うことが望ましい。
【００３９】
メモリモジュール１０１は、上記した2種類の信号線を介して、CPU１１とつながる。CPU１１は複数のメモリモジュールと接続することができる。例えば、CPU１１は、1チャンネル当たり２つのメモリモジュールを接続することができる。この場合、CPU１１が3チャンネル有する場合には、合計6個のメモリモジュールを接続することが可能である。
【００４０】
各メモリチップ１０２のメモリ領域は、８セグメントに分かれている。各メモリチップ１０２は、セグメント単位で、電力状態を変更できる。メモリモジュール１０１の外部から、例えば、セグメント１に対して電力状態を指定すると、全てのメモリチップ１０２のセグメント１の電力状態が指定された状態となる。なお、この構成は一例であり、全てのメモリチップ１０２のセグメント１をそれぞれ別個のセグメントとして扱って、個別に電力状態制御を行う構成も可能である。
【００４１】
図3に、メモリモジュールのアドレスとセグメントの関係を示す。
【００４２】
メモリモジュール１０１が8つのセグメントを有する、すなわち各メモリチップ１０２がそれぞれ8つのセグメントに分かれているとする。アドレス0000000から1fffffffまでの領域がセグメント０に属し、アドレス20000000から3fffffffまでの領域がセグメント１に属する様子が示されている。
【００４３】
この例では各セグメントのサイズは等しい構成になっているが、各セグメントの大きさは任意の値に構成しても構わない。たとえば、セグメント０がメモリ容量の1/128であり、セグメント1が1/128、セグメント２が1/64、セグメント3が1/32、セグメント４が1/16、セグメント５が1/8、セグメント6が1/4、セグメント７が1/2のようになっていてもよい。
【００４４】
また、図3では8つのセグメントを有する場合を例に説明しているが、セグメントの数は8つに限定されない。一般にセグメント数は多いほど、高い消費電力削減効果を期待できるが、同時にセグメントを実現するための回路規模が大きくなる。セグメント数の増加は、その回路の実装コストの増加や消費電力増加につながる可能性がある。
【００４５】
［動作原理概略］
計算機の電源を投入すると、BIOSと呼ばれるプログラムがメインメモリ３１に読み込まれ、CPUコア１２にて実行される。BIOSは、計算機のハードウエア構成を確認し、各デバイス（HDDや無線NIC）を初期化し、HDD４１に格納されたOSを、メモリ３１に読み込む。OSがメモリ３１に読み込まれた後は、BIOSはOSに制御を移す（OSの所定の命令にジャンプする）。OSは起動処理を行ない、予め定められたプログラムを実行する。あるいは外部入力手段の入力に従って、プログラムを起動する。
【００４６】
OSはアプリケーションからのメモリ確保要求、メモリ解放要求、確保したメモリへのread/write要求に従い、メインメモリ３１にアクセスを行う。また、OSは、メインメモリ３１のアクセス負荷を算出する。これは、メインメモリ３１へのアクセス頻度、アクセス時間、メモリの領域使用量など、どの程度メモリに負荷がかかっているかを表す。たとえば、セグメント毎のアクセス頻度（定義および計算方法は後述する）がある。またCPUクロック数もアクセス負荷を表しているといえる。クロック数が高ければ、計算性能の上昇を図れるが、消費電力が大きくなり、負荷が増す。また、メモリへのアクセス時間が長ければ、また、領域の使用量が大きければ、大きな消費電力がかかり、負荷が高い。これらは一例であり、他の種類の指標を、アクセス負荷として採用することができる。以下では、主に説明のため、セグメントのアクセス頻度を例に説明を行う。
【００４７】
セグメントのアクセス頻度が、予め定められた閾値よりも高い場合には、そのセグメントの電力状態をアクティブに設定し、そうでない場合にはスリープに設定する。スリープに設定されたセグメントの領域に対するread/writeが発生した場合には、OSはそのセグメントをアクティブに設定し、read/writeが終了した後に、スリープに設定を戻す。このように、アクセス頻度の少ないセグメントをスリープ状態とすることで、メインメモリの消費電力を削減することができる。アクセス負荷として、クロック数を採用した場合には、たとえばクロック数に応じてスリープにするセグメント数を決定し、当該セグメント数のセグメントをスリープにしてもよい。この際、後述するページ交換を行っても良い（実施例２参照）。スリープにするセグメントは、たとえばアドレス線が長いセグメントほど駆動の消費電力が大きいとすると（後述の実施例２の説明等を参照）、アドレス線が長いセグメントから、すなわち消費電量が大きいものから、優先的に決定してもよい。
【００４８】
ここでは、スリープ状態のセグメントに対してread/writeする際に、その電力状態をアクティブにし、read/write後にスリープに戻すのをOSが行う例を示した。しかしながら、この電力状態の変更は、OSの代わりにメモリコントローラが行ってもよいし、メモリモジュール１０１上のメモリチップが行ってもよい。あるいは、メモリモジュール１０１上の制御回路（図示しない）が行ってもよい。
【００４９】
さらに、メモリコントローラは、未処理のメモリアクセス要求を多数保持している場合には、あるスリープセグメントに対するアクセスをなるべくまとめて処理することが望ましい。つまり、そのスリープセグメントをアクティブ状態にし、保持しているそのセグメントへの複数のアクセス要求をまとめて処理し、その後に、そのセグメントをスリープ状態に戻す。これにより、セグメントの電力状態の変更回数を減らすことができ、処理性能を向上できる。
【００５０】
ここで、セグメントの電力状態をアクティブにするか、スリープにするかの判定の閾値λ’は、メモリモジュールの特性により決めることができる。例えば、
Pa:アクティブ状態を維持するために必要な電力
Ps:スリープ状態を維持するために必要な電力
Psa:スリープ状態からアクティブ状態に遷移する際に必要な電力
Pas:アクティブ状態からスリープ状態に遷移する際に必要な電力
とすると、以下の式で、求めることができる。
【数１】
0005624583.tif 000003
【００５１】
これは、スリープさせることによる電力利得（アクティブに滞在する電力とスリープに滞在する電力の差）が、スリープ状態のセグメントにアクセスする電力（電力状態をアクティブとスリープに遷移させる電力）の何回分に相当するかを求めている。
【００５２】
各セグメントに対してアクセス頻度と閾値λ’を比べ、アクセス頻度の方が大きければアクティブ状態とし、そうでなければスリープ状態とする。消費電力よりもメモリアクセスの遅延を少なくしたい場合には、アクセス頻度と比較する閾値を、λ’よりも小さくすることが望ましい。
【００５３】
また、セグメント毎に異なる閾値を用いることも可能である。例えば、セグメントのサイズが異なる場合には、大きいセグメントほど閾値を大きくすることで、大きいセグメントほどスリープ状態にしやすくする。これにより、消費電力削減効果を大きくすることが可能である。
【００５４】
CPU負荷によりCPUクロック数が動的に変化する場合には、CPUクロック数が大きくなるほど、この閾値を小さくすることが望ましい。これは、メモリアクセス頻度はCPUクロック数に比例して大きくなることが、経験則より知られているためである。
【００５５】
また、処理遅延が大きくても問題ない場合は、この閾値λ’を大きくすることが望ましい。たとえばユーザからのマウス入力やキーボード入力がある一定時間発生しない場合や、これによりディスプレイの表示を停止した場合がある。これにより、多くのセグメントがスリープ状態となり、消費電力を削減することが可能となる。
【００５６】
また、消費電力削減への要求度に応じて、この閾値を変化することも可能である。例えば、バッテリ残量が少ないほど、この閾値を大きくすることで、消費電力を削減することができる。もちろん、GUIにて、“ハイパワー”、”ノーマル“、”ロングパワー“などのメニューをユーザに選択させることで、ユーザがこの閾値を調節できるようにしてもよい。
【００５７】
ここで、アクセス頻度の計測は、例えば以下のように行う。
【００５８】
時刻Tから２Tの間のセグメントiのアクセス回数をSi(T,2T)とする。時刻Tから2Tの間のアクセス頻度をFi(T,2T)とすると、以下の式でアクセス頻度を計算できる。ただし、aは0以上1以下の定数である。
【数２】
0005624583.tif 000004
【００５９】
時間間隔T毎にFi(nT,(n+1)T)を求め、これを閾値と比較することで、次の時間区間(n+2)Tにおけるセグメントiの電力状態（アクティブまたはスリープ）を決定する。
【００６０】
［アクセス頻度の他の例］
上述の例では、アクセス頻度Fi( )を用いて、セグメントの電力状態を決めた。これは、将来のアクセス頻度を、過去のアクセス頻度Fi( )を用いて予測し、これにより将来の消費電力が最も小さくなるようにセグメントの電力状態（アクティブまたはスリープ）を決めていると言える。
【００６１】
また、OSのタスクスケジューリング情報を参考に、セグメントの電力状態を決めることもできる。タスクスケジューリングとは、マルチタスクOSにおいて、複数のタスクに対してCPUにアサインする順番を決めるアルゴリズムである。CPUにアサインされたタスクは、予め定められたCPU時間だけCPUによる処理を実行される。その後、次にスケジューリングされたタスクが、CPUにアサインされる。タスクスケジューリング情報（例えばスケジュールキュー）を参照すれば、タスク実行順序を推測することができる。
【００６２】
そのため、予め定められた時間ウィンドウ内でCPUにアサインされないタスクを列挙し、それらのタスクが使用しているメモリ領域を調べる。各セグメントにおいて、CPUにアサインされないタスクが使用するメモリの使用量が予め定められた量よりも大きいセグメントの電力状態をスリープとして決定することができる。CPUにアサインされたタスクによる使用量がゼロのセグメントについては、無条件にスリープとしてもよい。
【００６３】
また別の例としては、OSのコンテキストスイッチングの際にMMUにアドレス変換表（ページテーブル）の情報が読み込みなおされる場合には、MMUに読み込まれているアドレス変換表に対応する物理ページを保持する量に応じてセグメントの電力状態を決定することも可能である。具体的には、ある種のOSは、コンテキストスイッチを行う際には、そのコンテキストに応じたアドレス変換表をMMUに設定する。MMUに設定されているアドレス変換表に記されている物理ページを列挙し、セグメント毎にその物理ページ数を数える。その物理ページ数が予め定められている閾値以上のセグメントをアクティブ状態とする。後述するように、プログラムあるいはOSがメモリにアクセスする際には論理アドレスを物理アドレスに変換する必要がある。そのため、MMUにアドレス変換表が設定されていない物理ページへのアクセス遅延は大きくてもよいと期待できる。
【００６４】
［OSの動作詳細］
図4に論理アドレスから物理アドレスへのアドレス変換の動作を模擬的に示す。
【００６５】
MMU１５はアドレス変換表を有している。アドレス変換表を用いることで、論理ページ番号から対応するエントリを検索できる。ここで、例として、アドレス幅を32bit、ページサイズを4KBとして説明を行う。CPUは32bitの論理アドレスのうち上位22bitを論理ページ番号として用い、下位10bitをページ内アドレスとして用いる。論理アドレスから決定される論理ページ番号からアドレス変換表を検索し、該当するエントリを得る。そのエントリの物理ページアドレスに、ページ内アドレスを結合したものが物理アドレスである。ここで結合とは、物理ページ番号22bitの下位ビットとしてページ内アドレスを結合することを意味する。
【００６６】
検索されたエントリは、その物理ページに関する様々な属性を保持している。属性の例としては、キャッシュの可否や、アクセス情報（特権レベルごとの読み書き可否）、参照情報（参照されたか否か）、修正情報（修正されたか否か）、存在情報（物理メモリ上に存在するか否か）を挙げることができる。
【００６７】
ここで、MMU１５は一つのアドレス変換表を有する場合を示した。そうではなく、マルチレベルページテーブルと呼ばれる階層構成をなす複数のアドレス変換表を有していてもよい。マルチページテーブルを用いることにより、MMU１５の管理するテーブルサイズを小さくすることができる。大切なことは、論理アドレスから対応する物理アドレスの情報を得られることである。
【００６８】
また、MMU１５の有するアドレス変換表は、メインメモリ３１上にOSが保持しており、コンテキストスイッチ等のタイミングでCPUコア１２上にて動作しているプロセス（あるいはOS）に対応するアドレス変換表を、MMU１５にロードすることも可能である。
【００６９】
物理アドレスが得られると、図5に示したセグメント情報管理テーブルを参照し、物理アドレスに対応するエントリを検索する。例えば、物理アドレスefffffffがMMU１５から得られた場合には、図5のテーブルを参照し、これがセグメント７に属し、セグメント７がスリープ状態であることが分かる。スリープ状態の場合には、該セグメントをアクティブ状態に変更する命令をメモリモジュール１０１に送信し、その後メモリモジュール１０１にアクセス（書き込みまたは読み出し）を行う命令を送り、この後、該セグメントをスリープ状態に変更する命令をメモリモジュール１０１に送信する。
【００７０】
図5のテーブルのアクセス回数は、上述したSi( )の値を格納しており、アクセス毎に1増加する。たとえばあるデータをメモリにH回に分けて書き込みが行われた場合は、このときアクセス回数に値Hが加算される。アクセス回数のインクリメントは、MMU１５が行ってもよいし、CPUコア１２が行ってもよいし、別の手段で行ってもよい。
【００７１】
また、アクセス頻度は、上述のFi( )を格納している。OSは時間間隔T毎のタイマ割り込みにより、数式２を用いてアクセス頻度を計算し、さらに、図５のテーブルのアクセス回数をゼロクリアする。さらに、アクセス頻度が予め定められた電力状態判定閾値よりも小さいセグメントについては、そのセグメントがアクティブ状態であれば、そのセグメントをスリープ状態とする命令をメモリモジュール１０１に発行する。アクセス頻度が予め定められた電力状態判定閾値以上のセグメントについては、そのセグメントがスリープ状態であれば、アクティブ状態とする命令をメモリモジュールに発行する。電力状態（スリープまたはアクティブ）が変化しないセグメントについては、命令を発行する必要は無い。
【００７２】
このようにアクセス頻度の少ないセグメントをスリープ状態とすることで、メモリの消費電力を削減することが可能である。また、スリープセグメントへのアクセスには、該セグメントをアクティブ状態に変更した上で、アクセスする必要があるため、アクセス遅延が増す。しかしながら、アクセス頻度の少ないセグメントをスリープ状態としているため、そのアクセス遅延の増加による計算機の処理速度への影響を小さくすることができる。
【００７３】
次に、計算機がACPIのS5状態から起動した場合を考える。
【００７４】
ACPIのS5状態とは、Windowsでいうシャットダウン操作により遷移する状態であり、それまでの実行状態は保持されない。S5から起動した場合、図5のセグメント情報管理テーブルの初期値は、アクセス回数とアクセス頻度は０である。そこで、S5からの起動時は、電力状態はすべてのセグメントをアクティブとし、起動完了後の予め定められたタイミング（たとえば起動完了後一定時間経過したタイミング）で、アクセス頻度に基づく電力状態設定を行うようにすることが望ましい。これにより、比較的メモリアクセスの多い起動時の処理性能の低下を防ぐことができる。
【００７５】
［セグメントの電力状態の変更のバリエーション］
上では、CPUコアがメモリモジュールにセグメントの電力状態を変更する命令を発行する場合を例に挙げて、説明を行ったが、この命令をMMU１５が発行しても構わない。また、図5のセグメント情報管理テーブルをメモリモジュール１０１が保持し、アクセス回数とアクセス頻度の計算を行い、メモリモジュール１０１内でセグメントの電力状態を変更することも可能である。
【００７６】
［メモリの確保・解放］
プロセスあるいはOSがメモリを必要とする場合、OSは物理ページを確保し、対応する論理アドレスを決め、アドレス変換表に書き込む。図6は、物理メモリの使用状態を模擬的に記した図である。
【００７７】
セグメントあたり物理ページが４つあり、ページ０はアドレス00000000から00000fffの領域であり、ページ１はアドレス000001000から00002fffの領域である（ページサイズ４KB）。ページ１，２，３，４は既にメモリ確保され使用中であり、残りは空き（未使用）である。
【００７８】
OSは、新たにメモリを確保する必要がある場合、空きページの中で最もアドレスの若いものを確保する。このようにすることで、空ページをアドレスの大きい領域にまとめることができ、アドレスの大きいセグメントをスリープにできるチャンスが増える。そして、論理アドレスと物理アドレスの対応をアドレス変換表に記す。
【００７９】
メモリを開放する場合には、アドレス変換テーブルの該当する領域を削除する（あるいは該当領域のエントリの属性値を未使用に変更する）。
【００８０】
［メモリモジュールの構成］
図11は、メモリモジュール１０１の構成図である。図11に示す構成例は、4セグメントの構成である。メモリモジュールは、制御部２０１と、リフレッシュカウンタ２０２と、アドレスバッファ２０３と、I/Oバッファ２０４と、4つのメモリセルアレイ部２１１、２１２、２１３、２１４とを備える。各メモリセルアレイ部は、メモリセルアレイ、ロウデコーダ、カラムデコーダ、センスアンプを備える。
【００８１】
制御部２０１は、外部からコマンドあるいは制御指示を受信し、それに従いメモリモジュール内を制御する。制御の例として、セグメントを指定した電力状態の変更がある。
【００８２】
リフレッシュカウンタ２０２は、DRAMの場合に必要になるもので、メモリ保持内容が消失しないようにリフレッシュ動作を行う際の、リフレッシュ対象セルとタイミングを指示する。
【００８３】
アドレスバッファ２０３は、外部から物理アドレスを受信し、それをカラムアドレスとロウアドレスに分け、カラムデコーダとロウデコーダに送信する。このとき、アドレスバッファ２０３は、受信したアドレスから対応するセグメントを導出し、導出されたセグメントにのみカラムアドレスとロウアドレスを送信することが望ましい。カラムアドレスおよびロウアドレスの夫々を受信したカラムデコーダとロウデコーダは、そのアドレスで指定されたメモリセルの値を読み込み（読み出しコマンドの場合）、I/Oバッファ２０４に送信する。
【００８４】
センスアンプは、メモリセルに保持されている情報を読み出す際の信号増幅を行う。
【００８５】
メモリセルアレイは、複数のメモリセルから構成され、情報保持を行う。
【００８６】
I/Oバッファ２０４は、メモリセルアレイと送受信するデータをいったん蓄積する。
【００８７】
図13にメモリモジュールの別の構成例を示す。
【００８８】
図13では、4バンク構成で各バンク（メモリセルアレイ）３１１、３１２、３１３、３１４がセグメントに分割されている。CPUは物理アドレスを、以下のようにメモリアドレスと対応付けることが望ましい。ここで、カラムアドレス側がロウアドレス側よりもMSB（Most Significant Bit）である。転送単位とは、一度のアクセスで読み書きするデータのビット数を示している。チャネルとは、メモリチャネルの番号を示す。バンクとは、バンクの番号を示す。同一チャネルのDIMM番号とは、同じチャネルに接続されている各DIMMを識別する番号を示す。
【表２】
0005624583.tif 000005
【００８９】
こうすることで、メモリセルアレイの同一行に対してバンクを切り替えながらメモリにアクセスすることで、特に転送単位が大きい場合に、メモリアクセスの高速化が可能である。また、図３に示したようにセグメント内で物理アドレスが連続領域となるため、転送単位が大きい場合にも、複数のセグメントを跨いだアクセスが発生しづらい効果がある。この効果は、図11のメモリモジュールの構成でも、カラムアドレスをロウアドレスよりもMSB側とすることで、有効となる。
【００９０】
［構成例］
図14は、本実施形態に係る計算処理装置の構成例である。
【００９１】
図14に示す計算処理装置は、電力状態決定部４０１と、電力状態制御部４０２と、入出力処理部４０３と、電力状態記憶部４０４とを備える。各ブロックの機能は、これらの機能の実行を記述したプログラム命令を含むプログラムを実行することにより、またはハードウエアにより、または、これらの組み合わせにより実現される。これらの機能の一部をCPUコア12とは別のハードウエアに備えさせてもよい。当該別のハードウエアは、メモリモジュールあるいはメモリチップに実装されていてもよい。上記プログラムは、コンピュータ読取可能記録媒体に格納され、当該記録媒体から読み出して実行してもよい。
【００９２】
図14に示すように、入出力処理部（普通はCPU）は、外部（普通はOSから）メモリアクセス要求を受信すると（（１））、これに含まれるアドレスを電力状態決定部４０１に送信するとともに、このアドレスを含むセグメントの電力状態を電力状態記憶部４０４から得る。もし、その電力状態がスリープ状態の場合は、電力状態制御部４０２にそのセグメントをアクティブ状態にするよう要求し、その後、メモリアクセス要求に従い、データのreadあるいはwriteを実行する（（２））。電力状態がスリープであった場合には、電力状態制御部４０２に、そのセグメントをスリープ状態に戻すことを要求する。
【００９３】
ここでメモリアクセス要求がread要求の場合は、当該read要求にはアドレス情報が含まれる。メモリからの応答には、メモリ内の指定されたアドレスに保持されていたデータ情報が含まれる。また、メモリアクセス要求がwrite要求の場合は、当該write要求に、アドレス情報と書き込むべきデータ情報が含まれる。メモリからの応答には、書き込み完了を伝えるイベントが含まれる。
【００９４】
電力状態決定部４０１は、メモリのアクセス負荷を算出し、当該アクセス負荷に応じて各セグメントの電力状態を決定する。本例の場合、入出力処理部４０３からアドレスを受信するとこれの属するセグメントのアクセス回数をインクリメントする。また、時間間隔T毎にアクセス頻度をアクセス回数に基づき計算し、導出したアクセス頻度を基に、各セグメントの電力状態（スリープまたはアクティブ）を決定する。電力状態決定部４０１は、決定した各セグメントの電力状態を、電力状態制御部４０２に送信する。
【００９５】
電力状態制御部４０２は、電力状態決定部４０１からセグメントの電力状態を受信すると、電力状態記憶部４０４に保持されている現在の電力状態と比較する。変更が必要であれば、電力状態を変更する（（３））とともに、電力状態記憶部４０４に新しい電力状態を設定する。
【００９６】
電力状態記憶部４０４は、各セグメントの電力状態を記憶している。
【００９７】
図１４に示した構成では、図5のセグメント情報記憶テーブルは、電力状態記憶部４０４と電力状態決定部４０１で共有保持することが考えられる
【００９８】
［備考］
このように本実施例では、セグメント毎のメモリアクセス頻度といったアクセス負荷を計算し、そのアクセス負荷を元にセグメントの電力状態を制御する。本実施例は様々な変形が可能であり、例えば、MMUを有さない計算機アーキテクチャにおいても実行可能である。
【００９９】
また、本実施例では、ページ方式のメモリ管理方式を例に説明を行ったが、セグメンテーション方式を用いたメモリ管理方式に対しても本発明を適用することも可能である。
【０１００】
さらに、本実施例では、OSがメモリアクセス頻度等のアクセス負荷を算出し、これを基に電力状態の変更要求をメモリモジュールに送信した。別の構成として、メモリモジュールがアクセス負荷の算出（たとえばアクセス回数の計測およびアクセス頻度の算出）を行い、メモリモジュール自身がセグメントの電力状態を変更することも可能である。この場合、メモリモジュールはスリープセグメントへのメモリアクセスを検出したら、そのセグメントをアクティブ状態に変更し、アクセスを処理した後に、スリープ状態に該セグメントを移行する。
【０１０１】
さらに、本実施例では、OSがメモリアクセス頻度等のアクセス負荷を算出し、これを基に電力状態の変更要求をメモリモジュールに送信した。別の構成として、デーモンプロセスのようなユーザ空間で実行されるプログラムがこれを行ってもよい。または、ソフトウエアのCPU処理ではなく、別のハードウエアによる処理で実現することも可能である。
【０１０２】
本実施例では、メモリはアクティブ状態とスリープ状態の2つの電力状態を有するとして説明を行ったが、3つ以上の電力状態を有することも可能である。例えば、読み書き可能な状態を第１アクティブ状態と第2アクティブ状態に分ける。第1アクティブ状態は第2アクティブ状態よりも、消費電力は大きいが、アクセス遅延は小さい。これは、例えば、メモリ内部のクロックあるいはリフレッシュレートのどちから一方あるいは両方を、第1アクティブ状態の方が第2アクティブ状態よりも大きくすることで実現できる。第1アクティブ状態のセグメントのアクセス頻度Fi( )がある閾値よりも小さい場合に、第2アクティブ状態にする。もちろん、アクセス頻度がさらに小さい場合（アクセス頻度が、当該ある閾値より小さい別の閾値よりも小さい場合）にはスリープ状態にすることが望ましい。
【０１０３】
また、メモリへの読み書きのアクセスができない状態を複数に分けることができる。例えば、当該状態を、第1スリープ状態と第2スリープ状態に分ける。第1スリープ状態は第2スリープ状態よりも、消費電力は大きいが、アクティブ状態にするための遅延は小さいと定義することもできる。これは、アクセス回路のうち、給電を停止している回路部分の大きさで実現することができる。例えば、アクセス回路においてPLL以外の回路の給電を停止しているのが第1スリープ状態であり、アクセス回路においてPLLを含むほとんどの回路の給電を停止しているのが第2スリープ状態として実現することができる。第2スリープ状態のセグメントのアクセス頻度Fi( がある閾値よりも大きい場合に、第１スリープ状態にする。もちろん、アクセス頻度がさらに大きい場合（アクセス頻度が、当該ある閾値より大きい別の閾値以上の場合）には、アクティブ状態にすることが望ましい。
【０１０４】
本実施例では、readとwriteを区別せずアクセス頻度を計算したが、readアクセス頻度とwriteアクセス頻度を計算し、これに基づき、電力状態を設定することも可能である。たとえば、readアクセス頻度が閾値より小さいとき、セグメントの電力状態として、readに対してアクセス遅延を大きくすることで、メモリの消費電力が小さくなるように回路を構成する。さらに、writeアクセス頻度が閾値より小さいとき、セグメントの電力状態として、writeに対してアクセス遅延を大きくすることで、メモリの消費電力が小さくなるようにする。これらの場合、readとwriteの電力状態を、独立にかつ同時に扱うことが望ましい。
【０１０５】
本発明は、DRAMのような不揮発メモリ以外にも、MRAMのような不揮発メモリに対して適用可能である。この場合、スリープ状態での消費電力を一層削減することができるため、一層好適である。また、DRAMとMRAMのように複数の種別のメモリを使用した計算機に、本発明を適用することもできる。
【０１０６】
（実施例2：実施例１にページスワップを追加）
実施例１では、セグメント毎に電力状態を制御する方法を示した。本実施例では、さらにページのアクセス頻度に応じて、ページの所属するセグメントを変更することで、セグメントをスリープさせる機会を増やす手法を示す。
【０１０７】
なお、本実施例における計算機アーキテクチャとメモリモジュールの構成は、実施例１と同様であるため、重複する説明は省略する。また、実施例１で記載した様々なバリエーションは実施例2にも適用可能である。
【０１０８】
［動作原理概略］
メモリアクセスには、時間局所性（一度アクセスされたメモリ番地は短期間のうちに再度アクセスされる）と、空間局所性（一度アクセスされたメモリ番地の近隣のメモリがよくアクセスされる（ここでメモリ番地とは論理アドレスである））を有すると信じられている。もし、何らかの手段により、よくアクセスされるメモリ領域を特定のセグメントに集めることができれば、より多くのセグメントをスリープ状態にし得ると期待できる。
【０１０９】
仮にアクティブセグメントへのアクセス頻度をλH、スリープセグメントへのアクセス頻度をλLとし、アクティブセグメントおよびスリープセグメントのセグメント数を夫々NH、NLとする。Nλ＝λHNH＋λLNLをメモリ全体へのアクセス頻度とする。N=NH+NLはセグメントの総数とする。このとき、メモリの消費電力は、以下のように求めることができる。
【数３】
0005624583.tif 000006
【０１１０】
数式３より、Nおよびλを一定とすると、NLが大きいほど消費電力は小さく、NLλLが小さいほど消費電力が小さいことが分かる。すなわち、スリープセグメント数が多く、スリープセグメント全体へのアクセス頻度が小さいほど、消費電力は小さくなる。
【０１１１】
メモリアクセスの局所性という経験則を利用して、特定セグメントにアクセスを集中させることで消費電力を削減できる。
【０１１２】
［OSの動作詳細］
メモリアクセスの局所性を利用するために、ページ置き換えを行う。ページ置き換えとは、あるページにアクセスが発生した際に、以後そのページ内のアクセスが多く発生することを見越して、アクセス頻度の高いセグメントにそのページを移動する操作である。
【０１１３】
［ページ置き換えアルゴリズム］
CPUコア１２が論理アドレスへのアクセスを実行する際に、MMU１５のアドレス変換表を用いて、物理アドレスをみつける（実施例１と同様）。さらに、セグメント情報管理テーブル（図５参照）を参照し、その物理アドレスがスリープセグメントにあるかアクティブセグメントにあるかを調べる。もし、スリープセグメント上にあるならば、そのセグメントをアクティブ状態に移行し、その物理アドレスを含むページを別のアクティブセグメント上のページと置き換える。そして、当該別のアクティブセグメントにおける当該置換後のページにアクセスするとともに、アクティブ状態に移行された上記セグメントをスリープ状態に戻す。
【０１１４】
図8に、この処理のフローチャートを示す。本フローは、論理アドレスから物理アドレスに変換後、その物理アドレスがセグメントnに存在する場合の処理を示す。
【０１１５】
セグメントnをアクティブ状態に変更し（S101）、当該セグメントnとは別のアクティブセグメントにおいて、上記物理アドレスを含むページ（アクセスページ）と置き換えるページ（置き換え対象ページ）を決定する（S102）。アクセスページと置き換え対象ページを置き換える（S103）。セグメントnをスリープ状態に戻し（S104）、セグメントnのアクセス回数をインクリメントする（S105）。
【０１１６】
ここで、アクセスページと置き換え対象ページを置き換えるとは、メモリ上の記憶箇所を置き換えるとともに、アドレス変換表のデータも書き直すことである。
【０１１７】
図10を用いて、その処理の具体例を説明する。
【０１１８】
図10(a)では、論理ページ０は物理ページ１と対応し、論理ページ１は物理ページ２に、論理ページ２は物理ページ４に、論理ページNは物理ページ１７に対応している。論理ページ２（すなわち物理ページ４）に属するアドレスにアクセスがあり、その置き換え対象が物理ページ２である場合、メモリ上において物理ページ２と物理ページ４上に保持されている情報を置き換える（物理ページ2上のデータを物理ページ４に移動するととともに物理ページ4上のデータを物理ページ2に移動する）。
【０１１９】
さらに、図10(b)のようにアドレス変換表の論理ページ１に対応するエントリと、論理ページ２に対応するエントリを交換する。これにより、かつて論理ページ１上のデータは、物理ページ２から４に移動しているが、アドレス変換表の書き換えにより依然論理ページ１上に存在する。このため、論理アドレスを通じてメモリアクセスするプログラムからは、このページ交換を意識する必要は無い。
【０１２０】
ここで、置き換えるページをみつける方法には、様々なものが考えられる。例えば、LRU（Lease Recently Used）ページ置き換えアルゴリズムと呼ばれる方法を用いることができる。この方法では、アクティブセグメント上のページにおいて、最新のアクセスが最も過去に起こったページを選び、これをアクセスページと交換する。もちろん、アクティブセグメント上に空ページがあれば、それを置き換え対象とすることが望ましい。
【０１２１】
また、NFU（Not Frequently Used Algorithm）と呼ばれるアルゴリズムを用いて置き換え対象のページを決めることもできる。NFUアルゴリズムでは、ページ毎にアクセス頻度を保持しており、もっともアクセス頻度の少ないページを置き換え対象ページとして選択する。そして、当該置き換え対象ページを、スリープセグメント上に移動する。
【０１２２】
NFUアルゴリズムには、様々な派生アルゴリズムが存在する。例えば、エージング法では、ティックと呼ばれるある時間間隔（例えば、10 msec）毎に、アクセスの有無を記録し、その記録領域は10ティック分だけ用意する。これにより、各ページに対して1ティック毎のアクセス有無を過去10ティック分だけ知ることができる。スリープセグメント上のページにアクセスがあった場合には、アクティブセグメント上のもっとも最新アクセスが古いページをみつけて、置き換える。
【０１２３】
置き換え対象ページを選ぶアルゴリズムとしては、この他にもFIFOアルゴリズム、セカンドチャンスアルゴリズム、クロックアルゴリズム、ワーキングセットアルゴリズム、WSClockアルゴリズムなどがある（詳細は、「モダンオペレーティングシステム  原著第2版」アンドリュー・S・タンネンバウム著、発行所：（株）ピアソン・エデュケーション）。
【０１２４】
このように、ページ置き換えアルゴリズムを用いることで、メモリアクセスの局所性を利用して、アクセス頻度の高いセグメントと、低いセグメントを分けることができ、セグメントをスリープする機会を増やすことができる。
【０１２５】
［スリープセグメント数の決定］
CPUが論理アドレスを用いてアクセスする際に、アドレス変換表から物理アドレスを調べ、セグメント情報変換テーブル（図５参照）からセグメント情報を得て、物理メモリにアクセスする。この際、該当セグメントのアクセス回数をインクリメントする。
【０１２６】
OSは時間間隔T毎のタイマ割り込みにより、数式２を用いてアクセス頻度を計算し、アクセス回数をゼロクリアする。
【０１２７】
スリープセグメントにおいて、アクセス頻度が、電力状態判定閾値λsleepよりも大きければ、そのスリープセグメントをアクティブにする。この際、ある一定時間にアクティブに変化させるスリープセグメント数に、上限を設けることが望ましい。具体的には、時間間隔T毎に、最大１個のセグメントのみ、電源状態を変えることができるようにする。
【０１２８】
さらに、アクティブセグメントにおいて、アクセス頻度が、電力状態判定閾値λactiveよりも小さければ、そのアクティブセグメントをスリープにする。この際、ある一定時間にスリープに変化させるアクティブセグメント数に、上限を設けることが望ましい。具体的には、時間間隔T毎に最大１個のセグメントのみ、電源状態を変えることができるようにする。λactive＜λsleepであることが望ましい。
【０１２９】
ここで、λactiveとλsleepは、セグメント毎に異なる値を使用することも可能である。具体例としては、セグメントの電力特性およびアクセス特性（アクセスに要する消費電力、スリープ状態に要する消費電力、アクティブ状態に要する消費電力、電力状態を変更するのに要する時間など）に応じて変更することが挙げられる。
【０１３０】
また、最も最近に電力状態を変更したときからの経過時間に応じて、λactive、λsleepを変更することも可能である。具体的には、経過時間が短いほど電力状態の変更が行わないように設定することで、電力状態の過度な変更を防ぐことができる。
【０１３１】
図9に、時間間隔T毎に最大１つのスリープセグメントがアクティブに変更され、最大１つのアクティブセグメントがスリープに変更される場合の処理を示す。
【０１３２】
まずパラメータ変数i=0として（S201）、セグメントiのアクセス頻度を計算し（S202）、セグメントiのアクセス回数をゼロにクリアする（S203）。すべてのセグメントについてS202、S203の処理を行う（S204、S205）。
【０１３３】
アクティブセグメントの中で最小のアクセス頻度を有するものを特定する（S206）。特定したセグメントのアクセス頻度がλactive以下かを判定する（S207）。λactive以下の場合は、セグメントをスリープ状態に変更し（S208）、ステップS209に進む。λactiveより大きい場合は、ステップS209に進む。
【０１３４】
次に、スリープセグメントの中で最大のアクセス頻度を有するものを特定する（S209）。特定したセグメントのアクセス頻度がλsleep以上かを判定する（S210）。λsleep以上の場合は、特定したセグメントをアクティブ状態に変更し（S211）、本処理を終了する。λsleepより小さい場合は、処理を終了する。
【０１３５】
本アルゴリズムの変形として、セグメントに電力状態に対する順序を予めつけておき、その順序とアクセス頻度に応じて、電力状態を決定することもできる。順序をつけるとは、セグメントiは、セグメントi-1,i-2,,,0がアクティブ状態である場合にアクティブ状態にすることができ、またセグメントiはセグメントi+1,i+2,,,,がスリープ状態の場合にのみスリープ状態とすることができる、という制限を付けることである。
【０１３６】
この順序は、アクティブ状態での消費電力の小さいセグメントほど小さいことが望ましい。あるいは、スリープ状態での消費電力が小さいセグメントほど大きいことが望ましい。あるいは、アクティブ状態でのアクセス遅延が小さいほど順序が小さい方が望ましい。あるいは、スリープ状態からアクティブ状態への遷移に要するコスト（遷移時間あるいは消費電力）が大きいセグメントほど順序が小さいことが望ましい。これらの順序は、メモリがDRAMで実現されているかMRAMで実現されているかによって、あるいはCPUとメモリの電気的な接続距離によって、決めることが望ましい。以下、具体的に述べる。
【０１３７】
カラムアドレスを送信する信号線が、アドレスバッファ２０３とセグメント０との間が一番短く、アドレスバッファ２０３とセグメント３との間が一番長いとする。アドレス線が長いほどアドレス線を駆動する電力消費が大きいとすると、その電力消費の大きいセグメントほど、なるべくスリープ状態とすることが望ましい。例えば、上述のセグメントの順序という点では消費電力の大きいセルアレイほど、セグメントの順序を大きくすることが望ましい。
【０１３８】
また、図2で示したように、複数のメモリチップ１０２にて一つのメモリモジュールが構成されている場合、例えば、図2で右端のメモリチップのセルアレイほど大きなセグメント順序をアサインすることで、アクセスの遅延の大きいセルアレイへのアクセスを減らすことができる。
【０１３９】
さらに、メモリモジュール内でスリープセグメント数が同じ場合でも、チップ間でスリープセグメントが散在するよりも、一つのチップにスリープセグメントが集中する方が消費電力削減効果が高い場合がある。例えば、一つのメモリチップ内の全てのセグメントがスリープになると、消費電力削減効果が高い。この場合、メモリチップ内およびメモリチップ間で、連続したセグメント順序をつけることが望ましい。例えば、４個のメモリチップを搭載したメモリモジュールを考えると、メモリチップ０内にセグメント０とセグメント１を配置し、メモリチップ１内にセグメント２とセグメント３を配置し、メモリチップ２内にセグメント４とセグメント５を配置し、メモリチップ３内にセグメント６とセグメント７を配置することが望ましい。
【０１４０】
さらに、計算機が複数のメモリモジュールを備える場合には、計算機内でスリープセグメント数が同じでも、メモリモジュール間でスリープセグメントが散在するよりも、一つのメモリモジュールにスリープセグメントが集中すると、消費電力削減効果が高い場合がある。例えば、一つのメモリモジュール内の全てのセグメントがスリープになると、消費電力削減効果が高い。この場合は、メモリモジュール内およびメモリモジュール間で、連続したセグメント順序をつけることが望ましい。例えば、二つのメモリモジュールを竿なえる場合には、メモリモジュール０にセグメント０とセグメント１を配置し、メモリモジュール１にセグメント２とセグメント３を配置することが望ましい。
【０１４１】
また、複数のメモリモジュールを計算機が有し、あるメモリモジュール（あるいはメモリ機能を有する半導体）はCPUと同じLSIパッケージに存在し、別のメモリモジュールは別パッケージにて実現されているとする。このとき、同一パッケージ内のメモリモジュールのアクセスは低消費電力・低アクセス遅延で実現できることが期待できる。このため、同一パッケージ内のメモリモジュールほどアクティブ状態になることが望ましい。すなわちセグメント順序を小さく割り当てることが望ましい。
【０１４２】
図7(a)は、物理メモリを模擬的に示した図である。白抜きのセグメント（セグメント０，１）はアクティブ状態であり、ハッチングのセグメント（セグメント2~7）はスリープ状態である。時間間隔T毎に各セグメントのアクセス頻度を計算し、以下に従い、スリープセグメント数を決める。
【０１４３】
１．アクセス頻度がλactive以下のアクティブセグメントが存在し、アクセス頻度がλsleep以上のスリープセグメントが存在しない場合、スリープセグメント数を一つ増やす。(図7において(a)から(c)に変更)
２．アクセス頻度がλactive以下のアクティブセグメントが存在せず、アクセス頻度がλsleep以上のスリープセグメントが存在する場合、スリープセグメント数を一つ減らす。(図7において(a)から(b)に変更)
３．アクセス頻度がλactive以下のアクティブセグメントが存在せず、アクセス頻度がλsleep以上のスリープセグメントが存在しない場合、スリープセグメント数を変更しない。
４．アクセス頻度がλactive下のアクティブセグメントが存在し、アクセス頻度がλsleep上のスリープセグメントが存在する場合、スリープセグメント数を変更しない。
【０１４４】
上記項目４では、スリープセグメント数を変更していないが、消費電力を優先してスリープセグメント数を増やすこともできる。あるいは、処理性能を優先してスリープセグメント数を減らすことも可能である。
【０１４５】
［セグメントの電力状態の変更のバリエーション］
上では、CPUがメモリモジュールにセグメントの電力状態を変更する命令を発行する場合を例に挙げて、説明を行ったが、この命令をMMU１５が発行しても構わない。
【０１４６】
また、図5のセグメント情報管理テーブルをメモリモジュールが保持し、メモリモジュール内でアクセス回数とアクセス頻度の計算を行い、メモリモジュール内でページ置き換えとセグメントの電力状態を変更することも可能である。この場合、図10のアドレス変換表と同様の変換表をメモリモジュールがMMU１５とは別途保持して、CPUがメモリをアクセスする物理アドレスと、メモリモジュール内部の内部アドレスとの対応関係を維持する。これにより、ページ置き換えをメモリモジュールの中で隠ぺいして、ページ置き換えをCPUが意識しなくても済むようにする。
【０１４７】
［メモリの確保・解放］
プロセスあるいはOSがメモリを必要とする場合、OSは物理ページを確保し、対応する論理アドレスを決め、アドレス変換表に書き込む。図6は、物理メモリの使用状態を模擬的に記した図である。
【０１４８】
セグメントあたり物理ページが４つあり、ページ０はアドレス00000000から00000fffの領域であり、ページ１はアドレス000001000から00002fffの領域である（ページサイズ４KB）。ページ１，２，３，４は既にメモリ確保され使用中であり、残りは空き（未使用）である。
【０１４９】
OSは、新たにメモリを確保する必要がある場合、空きページの中で最もアドレスの若いものを確保する。このようにすることで、空ページをアドレスの大きい領域にまとめることができ、アドレスの大きいセグメントをスリープにできるチャンスが増える。そして、論理アドレスと物理アドレスの対応をアドレス変換表に記す。
【０１５０】
メモリを開放する場合には、アドレス変換テーブルの該当する領域を削除する（あるいは該当領域のエントリの属性値を未使用に変更する）。
【０１５１】
［構成例］
図15は、本実施例に係る計算処理装置の構成例を示す。
【０１５２】
図15に示す計算処理装置は、電力状態決定部５０１と電力状態制御部５０２と入出力処理部５０３と電力状態記憶部５０４とアドレス変換表管理部５０５とページ置き換え実行部５０６とを備える。実施例１と比べ、アドレス変換表管理部５０５と、ページ置き換え実行部５０６が追加されている。
【０１５３】
入出力処理部５０３（普通はCPU）は、外部（普通はOSから）メモリアクセス要求を受信する（（１））と、これに含まれる論理アドレスに対応する物理アドレスを、アドレス変換管理部５０５から導出する。そして、この物理アドレスを電力状態決定部５０１に送信するとともに、この物理アドレスを含むセグメントの電力状態を電力状態記憶部５０４から得る。
【０１５４】
もし、そのセグメントの電力状態がスリープ状態の場合は、入出力処理部５０３は、電力状態制御部５０２にそのセグメントをアクティブ状態にするよう要求する。その後、メモリアクセス要求（read要求またはwrite要求）に従い、データのreadあるいはwriteを実行する（（２））。電力状態がスリープであった場合には、ページ置き換え部５０６にページ置き換えを要求し、その後、電力状態制御部５０２にそのセグメントをスリープ状態に戻すことを要求する。
【０１５５】
ここでメモリアクセス要求がread要求の場合は、要求に論理アドレス情報が含まれる。またメモリからの応答には、メモリ内の指定された論理アドレスに保持されていたデータが含まれる。また、メモリアクセス要求がwrite要求の場合は、要求に論理アドレス情報と書き込むべきデータとが含まれる。メモリからの応答は、書き込み完了を伝えるイベントが含まれる。
【０１５６】
電力状態決定部５０１および電力状態制御部５０２の動作は実施例１と同じであるため、説明を省略する。
【０１５７】
電力状態記憶部５０４は、実施例１と同様、各セグメントの電力状態を記憶している。
【０１５８】
アドレス変換表管理部５０５は、図4に示したように論理アドレスと物理アドレスの対応（アドレス変換表）を管理している。図示しないが、メモリ確保やメモリ解放操作により、アドレス変換表の内容は変化する。
【０１５９】
ページ置き換え実行部５０６は、入出力処理部５０３からアクセスする物理アドレスを受信すると、そのアクセスを記録する。さらに、入出力処理部５０３からページ置き換えを要求されると、上記アクセス記録を基に、例えばNFUアルゴリズムを用いて置き換え対象のページを決める。そして、ページ置き換え要求に含まれる物理アドレスから算出されるページと、置き換え対象ページを置き換える（（４））。この置き換え操作は例えば、両ページ上のデータをメモリモジュールから読み、元とは異なるページに書き込むことで実現する。
【０１６０】
［備考］
本実施例では、OSがメモリアクセス頻度を算出し、これを基に電力状態の変更要求をメモリモジュールに送信した。別の構成としてデーモンプロセスのようなユーザ空間で実行されるプログラムがこれを行ってもよいし、ソフトウエアのCPU処理ではなく別のハードウエアによる処理で実現することも可能である。
【０１６１】
本発明は、DRAMのような不揮発メモリに対して適用可能であるが、MRAMのような不揮発メモリに対して適用すると、スリープ状態での消費電力を一層削減することができるため、一層好適である。
【０１６２】
また、DRAMとMRAMのように複数の種別のメモリを使用した計算機に本発明を適用することもできる。この場合、MRAMのようにスリープ状態の消費電力の小さいメモリ上のセグメントをDRAM上のセグメントよりも優先的にスリープするよう制御することが望ましい。これは、例えば、MRAM上のセグメントにDRAM上のセグメントよりも大きな順序を与えることで実現できる。
【０１６３】
（実施例３：仮想メモリを使用する場合）
実施例２の構成に加え、仮想メモリを利用する場合について、説明を行う。本実施例のブロック構成は、実施例２と同様である。また、実施例１、２で記載した様々なバリエーションは、実施例３にも適用可能である。
【０１６４】
［仮想メモリの一般的な動作］
仮想メモリとは、論理ページ上のデータが物理メモリ上ではなく、HDDなどの他の記憶媒体上に存在できるようにする方法である。これは、アドレス変換表を拡張することで実現する。
【０１６５】
CPUが論理アドレスのデータにアクセスする際に、図4で示したアドレス変換表から対応するエントリをMMU１５が導出する。このエントリの属性として、在・不在情報と、アサイン済・未アサイン情報が記されている。
【０１６６】
アサイン済とはメモリ確保済であることを示し、未アサインとはメモリ確保されていないことを示す。
【０１６７】
在・不在情報とは、アサイン済である場合に有効な情報で、在の場合は物理メモリ上にデータが存在することを示す。不在の場合は、物理メモリ上にデータが存在しないことを示す。
【０１６８】
対応するエントリの属性情報をMMU１５は検査し、アサイン済で不在の場合、CPUコア１２に割り込みを入れる。
【０１６９】
割込みを受信したCPUコア１２は割り込みハンドラを起動し、スワップ変換表からHDD４１上のどの部分にデータが保持されているのかを導出する。割り込みハンドラは、その情報を基にHDD４１にアクセスし、対応するデータを物理メモリ３１に格納する。格納は、アクティブページに行うのが望ましい。格納した物理アドレスを基にアドレス変換表を書き換える。さらに、スワップ変換表を書き換える。その後、割り込みハンドラは処理を終え、当初のメモリアクセスの処理を継続する。論理アドレスに対応する物理アドレスをアドレス変換表にて導出し、これに記されている物理アドレスにアクセスすることで、論理アドレスに対応するデータにアクセスすることができる。
【０１７０】
図12にこのスワップ変換表を模擬的に示す。
【０１７１】
この例では、HDD４１上のスワップファイルに、論理ページに対応するデータが保持されており、そのスワップファイルのどの部分にデータがあるのかをスワップ情報テーブルは記している。例えば、論理ページ０はスワップファイルの先頭４KB（ページサイズ４KBの場合）に保持されており、論理ページ１は先頭から４KBから８KB部分に保持されていることを示す。
【０１７２】
ここで、スワップ領域はHDD４１に保持する場合を例に示したが、HHDではなくSSDに保持することも可能である。また、SSDとHHDの両方に保持し、アクセス頻度の高いデータを優先してSSDに保持することで、計算機の処理性能を向上することもできる。これは、HDDよりもSSDの方が低遅延にアクセス可能であるためである。
【０１７３】
［HDDへの書き出し動作］
次に、物理メモリ３１上のデータをHDD４１に書き出す処理について述べる。
【０１７４】
（１）時間間隔τ毎に、物理メモリ上の空き領域を検査し、空き領域のサイズを計算する。空き領域のサイズは、メモリ領域全体の中での空いている領域の合計サイズを意味する。
【０１７５】
（２）空き領域のサイズが予め定められた第1の閾値を下回っている場合には、リードバッファに使用している領域を解放することで、空き領域を広げる。リードバッファとは、HDD上のファイルのリードアクセスをした際に使用したバッファ（データを保持しているメモリ領域）を解放せずに保持していたものである。これにより、同じファイルに再びアクセスが発生した際に、HDDへアクセスすることなしに、データを読むことが可能となる。このようにリードバッファを用いることでファイルアクセスの遅延が短くなることが期待できる。リードバッファを解放する際には、アドレス変換表の解放した領域に対応するエントリの属性情報を、未アサインとする。リードバッファに使用している領域は、スリープセグメントから選択するのが望ましい。
【０１７６】
（２）空き領域のサイズが第2の閾値を下回っていた場合には、ライトバッファの保持するデータをHDDに書き込み、ライトバッファを解放することで、空き領域を広げる。ライトバッファとはHDD上のファイルにライトアクセス要求が、ユーザプロセスあるいはOSから発生した際に、HDDにはアクセスせず一時的に物理メモリ上に書き込みデータを保持しているものである。これにより、再度書き込み要求が発生した場合に、ライトバッファ内のデータを書き換えることで、HDDにアクセスすることなしにデータを書き換える。これにより複数回のHDDへのアクセスをそれよりも少ない回数（理想的には1回）に減らすことで、ファイルアクセスに要する時間を短くすることができる。ライトバッファを解放する際には、ライトバッファ内のデータをHDDの対応する領域に書き出し、さらにアドレス変換表の解放した領域に対応するエントリの属性情報を未アサインとする。解放するライトバッファは、スリープセグメントに属するものを選択するのが望ましい。この場合、スリープセグメントをいったんアクティブにし、データをHDDに書き出した後、スリープに戻す。
【０１７７】
（３）空き領域のサイズが第3の閾値を下回っていた場合には、物理メモリ上のアクセス頻度が、最も少ないまたは閾値以下のページをHDD上に書き出す（スワップアウト）ことで、空き領域を広げる。当該ページが、スリープセグメントに属する場合は、スリープセグメントをいったんアクティブにし、データをHDDに書き出した後、スリープに戻す。
【０１７８】
スワップアウトする際には、アクセス頻度の少ないページをHDDに書き出し、書き出した場所をスワップ情報テーブルに記し、アドレス変換表の対応するエントリの属性情報を不在とする。
【０１７９】
ここで、スワップアウトするページを選ぶアルゴリズムには様々なバリエーションが存在し、LRUアルゴリズムやNRUアルゴリズムやFIFOアルゴリズム、セカンドチャンスアルゴリズム、クロックアルゴリズム、ワーキングセットアルゴリズム、WSClockアルゴリズムなどがある。
【０１８０】
ここで、第３の閾値は、第1閾値と第2の閾値よりも大きいことが望ましい。
【０１８１】
また、第1の閾値を複数用意し（例えば、第1-1の閾値、第1-2の閾値、第1-3の閾値）、閾値毎に解放せずにメモリ上に残すリードバッファの量を変えてもよい。ここで閾値が大きいほど、メモリ上に残すリードバッファ量も大きいことが望ましい。
【０１８２】
また、第２の閾値を複数用意し（例えば、第2-1の閾値、第2-2の閾値、第2-3の閾値）、閾値毎に解放せずにメモリ上に残すライトバッファの量を変えてもよい。ここで閾値が大きいほどメモリ上に残すライトバッファ量も大きいことが望ましい。
【０１８３】
リードバッファの解放あるいは、ライトバッファの解放あるいは、スワップアウトを行う際には、あるスリープセグメントをアクティブ状態に変更し、そのセグメント上のリードバッファの解放、ライトバッファの解放、データのスワップアウトを全て行った後に、そのセグメントをスリープ状態に戻すことが望ましい。これによりセグメントの電力状態の変更回数が減り、処理性能の向上が期待できる。また、複数のスリープセグメントを同時にアクティブ状態にした後、そのセグメント上のリードバッファの解放あるいは、ライトバッファの解放あるいは、スワップアウトの処理を行うことも可能である。
【０１８４】
［備考］
本発明は、DRAMのような不揮発メモリに対して適用可能であるが、MRAMのような不揮発メモリに対して適用すると、スリープ状態での消費電力を一層削減することができるため、一層好適である。
【０１８５】
（実施例４：DMA転送）
実施例１〜３では、メモリ領域の一部がスリープ状態となるため、DMA転送を用いる場合に、そのアクセス先のメモリ領域がスリープしていると、DMA転送に失敗する可能性がある。そこで、本実施例では、これまで述べた実施例でDMA転送を実現する方法について述べる。本実施例のブロック構成は、実施例２と同様である。
【０１８６】
［DMA転送の基本シーケンス］
DMA転送とは、バスデバイス上のデータをメインメモリに転送させる際（あるいはメインメモリ上のデータをバスデバイスに転送させる際）に、CPUのかわりにDMAコントローラ（図１参照）を用いて、データ転送を行う方法である。CPUがデータ転送処理を行なう必要がないため、データ転送以外の他の処理をCPUが行うことができ、計算機の処理性能の向上が期待できる。
【０１８７】
ここで、バスデバイスとは、図1の無線NIC５１のようにバス上に存在するデバイスのことである。バスデバイスの例としてはビデオデータの圧縮・伸張を行うビデオカードや、サウンドデータを処理するサウンドカードや、USBインタフェースを外部に提供する拡張ボードなど様々なものが存在する。
【０１８８】
さらに、図1のバス上のデバイスだけでなく、SATAインタフェースで接続されたHDDなどもDMA転送を行うデバイスとして扱うことが可能である。すなわち、DMA転送とは、CPUを用いずに、デバイスにその接続インタフェースを通じてアクセスするとともにメモリコントローラを通じてメインメモリにアクセスする転送方法である。本実施例では、例としてバス上のデバイスを用いて説明を行っていく。
【０１８９】
図1ではDMAコントローラ１７はCPU１１内に存在するが、バスデバイス上に配することも可能であり、一つの計算機内に複数のDMAコントローラを配することも可能である。
【０１９０】
DMA転送処理の処理シーケンスについて説明する。
【０１９１】
まず、readの場合の処理シーケンスを説明する。
1.      プロセスがreadシステムコールを呼ぶなどして、バスデバイス上のデータを要求する。
2.      そのプロセスはスリープし、以下、OSによるreadシステムコールの処理となる。
3.      readシステムコールの読み込み元アドレスの値から、それがデバイス上のデータであることを判断し、そのデバイスに対応するデバイスドライバに処理を任せる。
4.      デバイスドライバは、DMA転送先のバッファ領域をメインメモリ３１上に確保し、DMAコントローラ１７に、readシステムコールで指定されたデータを、確保したバッファ領域に転送するよう設定する。
5.      DMAコントローラ１７は、CPUコア１２と交渉しバスマスタとなり、バス転送を開始できる権限を得る。その後、バスを用いてデバイス上のデータをバッファ領域に転送する。
6.      DMA転送が終了すると、DMAコントローラ１７はCPU割り込みをいれる。
7.      この割込みによりCPUコア１２は割り込みハンドラを起動し、バッファ領域上のデータを、プロセスがreadシステムコールで指定してきたメモリ領域にコピーする。
8.      プロセスはスリープを終え、コピーされたデータを処理する。
【０１９２】
次に、writeの場合の処理シーケンスは、以下となる。
1.      プロセスがwriteシステムコールを呼ぶなどして、バスデバイス上へのデータ書き込みを要求する。
2.      そのプロセスはスリープし、以下、OSによるwriteシステムコールの処理となる。
3.      writeシステムコールの書き込み先アドレスの値から、それがデバイス上であることを判断し、そのデバイスに対応するデバイスドライバに処理を任せる。
4.      デバイスドライバは、DMA転送先のバッファ領域をメインメモリ３１上に確保し、writeシステムコールで指定されたデータを、このバッファ領域にコピーする。そして、DMAコントローラ１７に、writeシステムコールで指定された転送先に、バッファ領域のデータを転送するよう設定する。
5.      DMAコントローラ１７は、CPUと交渉しバスマスタとなり、バス転送を開始できる権限を得る。その後、バスを用いてバッファ領域のデータをデバイスに転送する。
6.      DMA転送が終了すると、DMAコントローラ１７はCPUコア１２に割り込み信号を送る。
7.      プロセスはスリープを終え、writeシステムコールの次の処理を行う。
【０１９３】
以上に述べたreadとwriteの両方の場合で、DMA転送を行う際のバッファ領域は物理アドレス上で連続領域である必要がある。例えばページサイズが4KBで、バッファ領域として9KBが必要な場合、連続する3ページが必要である。
【０１９４】
もうひとつのDMA転送の例として、無線NIC５１を例に、バスデバイスが、当該バスデバイスからメインメモリへのデータの転送を要求する場合の処理シーケンスを示す。
1.      無線NIC５１が無線リンクを介してパケットを受信し、その物理層の処理とMAC層の処理を行い、抽出したパケット（イーサフレーム）をNIC内のFIFOに蓄え、割り込み信号をCPUに送る。
2.      CPUコア１２は割り込みハンドラを起動し、NIC５１のデバイスドライバが処理を開始する。
3.      デバイスドライバは、DMA転送先のバッファ領域をメインメモリ３１上に確保し、DMAコントローラ１７にパケットをバッファ領域に転送するよう設定する。
4.      DMAコントローラ１７は、CPUコア１２と交渉しバスマスタとなり、バス転送を開始できる権限を得る。その後、バスを用いてNIC５１のFIFO内のパケットをバッファ領域に転送する
5.      DMA転送が終了すると、DMAコントローラ１７はCPU割り込み信号を送る
6.      この割込みによりCPUコア１２は割り込みハンドラを起動し、バッファ領域上のパケットの処理を行う。
【０１９５】
［DMA用のバッファ領域は、スリープさせない場合］
［動作概略］
上述のDMA転送シーケンスとは別に、デバイスドライバはその初期化時（例えば、OS起動時、あるいは動的にロード可能なデバイスドライバの場合は、そのロード時）に、DMA転送に使用するバッファ領域をOSに対して予め確保する。確保された領域を保持するセグメントはスリープ状態としないようにする。ブロック図での動作を説明すると、計算処理装置における入出力処理部５０３は、ダイレクトメモリアクセス用のバッファ領域をセグメントに確保する手段を備え、電力状態決定部５０１は、バッファ領域が確保されたセグメントをアクティブに維持することを決定する。上述のDMA転送シーケンスにおいてバッファ領域の確保を行う際に、この予め確保した領域を用いることで、DMA転送先（あるいは転送元）を必ずアクティブ状態のセグメントとすることができる。
【０１９６】
また、このバッファ領域を確保するための領域は、将来デバイスドライバがロードしたときにバッファ領域を確保する領域として予約しておき、OSが他の処理に使用しないことが望ましい。例えばLinuxではOSは物理アドレスの低位側からメモリを使用するため、この予約領域は物理アドレスの高位側から確保していくことが望ましい。これにより、デバイスドライバが動的にロードされる際にもバッファ領域を確保できる。
【０１９７】
［動作シーケンス］
予約領域の確保について詳細に記す。
【０１９８】
デバイスドライバはその初期化処理の際に、OSのメモリ管理機能に対してDMA転送用のバッファ領域を確保する。具体的には、デバイスドライバは、必要な領域のサイズをOSのメモリ管理機能に伝え、OSのメモリ管理機能は物理アドレスの高位側よりバッファ領域を確保し、その先頭アドレスをデバイスドライバに通知する。
【０１９９】
図16にこのバッファ領域の確保の様子を模擬的に示す。
【０２００】
物理アドレスが図３で示した構造である場合に、セグメント６とセグメント７を描いたものである。図16（a）はビデオカードとのDMA転送用のバッファ領域が、既に予約されている（物理アドレス f0000000~ffffffffの領域）様子を示す。さらに、無線NICのデバイスドライバが48KBのバッファ領域の予約をOSに要求した様子を図16(b)に示す。
【０２０１】
OSは新たに物理アドレス efff447f~dfffffffの領域を確保し、その先頭アドレスefff447fをデバイスドライバに通知する。ここで、セグメント７は常にアクティブ状態とし、実施例２で示したページ交換の対象にしない。OSは予約領域を連続領域として確保するが、セグメントを跨いでも構わない。また、例えばセグメント６上に新たにバッファ領域を確保した場合には、セグメント6は常にアクティブ状態とする。すなわち、バッファ確保のための予約領域が複数セグメントあるとき、バッファが確保されていないセグメントはスリープ状態し、バッファが確保されているセグメントはアクティブ状態とすることが望ましい。
【０２０２】
［常にバッファ領域がアクティブであるからこそのバッファの使用方法］
無線NIC５１のデバイスドライバは、その初期化時に確保したバッファ領域を用いて、DMA転送を行う。この際、上述したように無線NIC５１がパケットを受信する度に、NIC５１が割り込み信号送信を行い、これをきっかけにDMA転送にバッファ領域を通知することもできるが、ここではさらに別の処理シーケンス例についても述べる。
【０２０３】
1.      無線NIC５１のデバイスドライバの初期化時に、図16のようにDMA転送用のバッファ領域を確保する。
2.      デバイスドライバは、そのバッファ領域をDMAコントローラ１７に通知し、DMA転送を許可する
3.      無線NIC５１は、パケットを受信しFIFOにこれを蓄積すると、DMAコントローラ１７が上記２で通知されていたバッファ領域に向けてパケットデータを転送し、割り込み信号をCPUに送信する
4.      CPUは割り込み信号を受信すると、割り込みハンドラを通じてパケット処理関数を実行する。
5.      パケット処理関数は、バッファ領域に転送されているパケットを処理する
【０２０４】
ここで、パケット処理関数がパケットを処理中に無線NIC５１がパケットを受信すると、DMAコントローラ１７はバッファ領域の空き領域にパケットデータをDMA転送し、CPUに割り込み信号を送信する。パケット処理関数は現在のパケット処理終了後に、その2番目にDMA転送されたパケットの処理を開始する。
【０２０５】
ここで、DMAコントローラ１７は、バッファ領域をリングバッファとして使用することが望ましい。すなわち、バッファ領域の先頭からパケットデータを転送していき、バッファ領域の最後まで使用した際には、再度バッファ領域の先頭から使用する。このとき、バッファ領域のどこにパケットデータが存在し、どこのパケットデータの処理を終えたかを示す情報をパケット処理関数とDMAコントローラ１７が共有することが望ましい。また、パケット処理関数の処理が間に合わず、バッファ領域が未処理パケットデータでいっぱいになった際には、DMAコントローラ１７は、新たなDMA転送を停止することが望ましい。
【０２０６】
また、この例では、DMAコントローラ１７は無線NIC５１上に存在することが望ましい。このようにデバイスが、専用のDMAコントローラを有することで、複数のデバイスが存在する際のDMAコントローラを設定する負荷を軽減することが可能となる。
【０２０７】
また、この例では一つのパケットデータのDMA転送が完了する毎に、DMAコントローラ１７はCPUに割り込み信号を送信していた。別の構成として、予め定められた数（例えば５個）のパケットデータのDMA転送を完了する毎に、割り込み信号を送信するよう変形してもよい。これにより、CPUの割り込み信号の処理を減らすことができる。この場合には、予め定められた数のパケットデータをDMA転送する前に、FIFOが空となり転送すべきパケットが無い場合には、DMAコントローラはCPUに割り込み信号を送信することが望ましい。
【０２０８】
［DMA転送のバッファ領域はスリープしており、DMA転送に失敗してからアクティブにする］
先ほどの例では、バッファ領域を格納するセグメントは、常にアクティブ状態であるとしたが、ある一定時間セグメントへのアクセスがない場合には、そのセグメントをアクティブ状態からスリープ状態にする構成も可能である。これにより、消費電力の一層の削減を実現できる。このときの一定時間が0の場合には、DMA転送が終了次第、そのセグメントをスリープ状態に移行させることを意味する。ブロック図での動作は、電力状態決定部５０１は、セグメントがアクティブ状態に設定されている状態で、当該セグメントへのダイレクトメモリアクセスが完了した後、当該セグメントをスリープ状態に設定することを決定する。電力状態制御部５０２は、当該決定に従って、当該セグメントをスリープ状態に設定する。
【０２０９】
このとき、DMAコントローラ１７は、スリープセグメント上のバッファ領域にデータ転送を行うため、データ転送に失敗する。そこで、DMAコントローラ１７は、データ転送の失敗を検出すると割り込み信号をCPUに送信し、これを受信したCPU上で動作するプログラムにより、そのセグメントをアクティブ状態にし、その後再度DMA転送を行う。このようにして、スリープセグメント上のバッファ領域へのDMA転送を実現する。この動作の処理手順を以下に示す。
【０２１０】
1.      DMAコントローラ１７がデータ転送の失敗を検出する。失敗検出は、例えば、データ転送成功信号を一定時間内に受信したか否かで行う。ブロック図における計算処理装置の入出力処理部５０３は、スリープ状態のセグメントへのダイレクトメモリアクセスが失敗したことを検知する手段を備える。
2.      DMAコントローラ１７は、割り込み信号をCPUに送信する。
3.      CPUは割り込み信号に含まれるデバイス情報から、そのデバイスに対応したデバイスドライバを実行する。
4.      デバイスドライバは、保持しているバッファ領域の物理アドレスから、セグメント情報管理テーブルを検索して、セグメント番号を得る。そして、その番号のセグメントに対し、アクティブ状態への変更命令を送信する。ブロック図での動作を説明すると、計算処理装置の電力状態決定部５０１は、上記失敗が検出されたとき、スリープ状態のセグメントをアクティブに変更することを決定し、電力状態制御部５０２は当該セグメントをアクティブに設定する。
5.      デバイスドライバは、DMA転送の再度の実施をDMAコントローラ１７に設定する。
【０２１１】
ここで、DMA転送の失敗をDMAコントローラ１７が検出しているが、この失敗検出は様々な箇所で可能である。例えば、この失敗検出をメモリコントローラが代わりに行うことも可能である。
【０２１２】
上のシーケンスは、［DMA転送の基本シーケンス］の欄で述べたDMA転送パターンでも有効である。
【０２１３】
［DMA転送前にセグメントをアクティブにする］
先ほどの例では、スリープセグメント上へのDMA転送時には、DMA転送失敗を検出してから再転送を行っているが、ここでは別の例を示す。
【０２１４】
DMAコントローラ１７は、バッファ領域を通知される際に、同時にそのバッファ領域を格納しているセグメント番号も通知されている。そこで、DMAコントローラ１７がDMA転送を行う際には、最初にそのセグメントをアクティブ状態にする命令をメモリコントローラに送信し、その後DMA転送を行うことで、失敗なくDMA転送を行うことが可能となる。ブロック図での動作を説明すると、計算処理装置の入出力処理部５０３は、ダイレクトメモリアクセスによりアクセスされようとするセグメントがアクティブ状態およびスリープ状態のいずれにあるのかを検出する手段を備える。電力状態決定部５０１は、スリープ状態が検出されたときは、セグメントをアクティブ状態にすることを決定し、電力状態制御部５０２は当該セグメントをアクティブに設定する。
【０２１５】
このセグメントをアクティブにする命令の送信をDMAコントローラ１７が行うのではなく、メモリコントローラが行うことも可能である。この場合、メモリコントローラはセグメント情報管理テーブルあるいはその一部を有し、DMAコントローラ１７からのメモリアクセス命令の物理アドレス情報からセグメント番号とその電力状態を導出する。メモリコントローラは、それがスリープ状態であればアクティブ状態にそのセグメントを変更し、DMAコントローラ１７から受信したデータをメモリに転送する。もちろん、メモリからデバイスへのデータ転送の場合も同様に、メモリコントローラでセグメントの電力状態をアクティブにする。
【０２１６】
あるいは、DMA転送に先立ってCPUがDMAコントローラ１７にバッファ領域を設定する場合（［DMA転送の基本シーケンス］の欄で述べた処理シーケンス）には、CPUがそのバッファ領域のセグメント番号と電力状態をセグメント情報管理テーブルから導出する。CPUは、その番号のセグメントがスリープ状態である場合には、アクティブ状態に変更し、その後DMAコントローラ１７にDMA転送を指示する。これにより、スリープセグメント上へのDMA転送を防止することができる。この場合、DMA転送完了の割り込み信号をCPUが受信すると、そのセグメントをスリープ状態に戻してもよい。
【０２１７】
［備考］
本実施例において、バッファ領域を確保しているセグメントに空きがある場合には、ページを置くことも可能である。この場合には、そのセグメントのセグメント順序は最も小さいことが望ましい。
【０２１８】
デバイスハンドラの初期化時にバッファ領域を確保するのではなく、DMA転送毎にバッファ領域を確保する場合には、アクティブセグメント上でバッファ領域を確保することでDMA転送を行うことも可能である。この場合、所望のサイズの連続領域が確保できない場合には、アクティブセグメント上のページをスリープセグメント上あるいはHDD上に書き出すことで、バッファ領域を用意することが望ましい。
【図１】
0005624583.tif 000007
【図２】
0005624583.tif 000008
【図３】
0005624583.tif 000009
【図４】
0005624583.tif 000010
【図５】
0005624583.tif 000011
【図６】
0005624583.tif 000012
【図７】
0005624583.tif 000013
【図８】
0005624583.tif 000014
【図９】
0005624583.tif 000015
【図１０】
0005624583.tif 000016
【図１１】
0005624583.tif 000017
【図１２】
0005624583.tif 000018
【図１３】
0005624583.tif 000019
【図１４】
0005624583.tif 000020
【図１５】
0005624583.tif 000021
【図１６】
0005624583.tif 000022