JP5398375B2 - ユニプロセッサ・システム上のプリエンプタブルな読み取り・コピー・更新のための猶予期間検出の最適化 - Google Patents

ユニプロセッサ・システム上のプリエンプタブルな読み取り・コピー・更新のための猶予期間検出の最適化 Download PDF

Info

Publication number
JP5398375B2
JP5398375B2 JP2009148307A JP2009148307A JP5398375B2 JP 5398375 B2 JP5398375 B2 JP 5398375B2 JP 2009148307 A JP2009148307 A JP 2009148307A JP 2009148307 A JP2009148307 A JP 2009148307A JP 5398375 B2 JP5398375 B2 JP 5398375B2
Authority
JP
Japan
Prior art keywords
grace period
period detection
rcu
data
multiprocessor
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Expired - Fee Related
Application number
JP2009148307A
Other languages
English (en)
Other versions
JP2010033554A (ja
Inventor
ジョシュ・トリプレット
ポール・エドワード・マッキニー
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
International Business Machines Corp
Original Assignee
International Business Machines Corp
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by International Business Machines Corp filed Critical International Business Machines Corp
Publication of JP2010033554A publication Critical patent/JP2010033554A/ja
Application granted granted Critical
Publication of JP5398375B2 publication Critical patent/JP5398375B2/ja
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F13/00Interconnection of, or transfer of information or other signals between, memories, input/output devices or central processing units
    • G06F13/38Information transfer, e.g. on bus
    • G06F13/42Bus transfer protocol, e.g. handshake; Synchronisation
    • G06F13/4282Bus transfer protocol, e.g. handshake; Synchronisation on a serial bus, e.g. I2C bus, SPI bus
    • G06F13/4291Bus transfer protocol, e.g. handshake; Synchronisation on a serial bus, e.g. I2C bus, SPI bus using a clocked protocol
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F13/00Interconnection of, or transfer of information or other signals between, memories, input/output devices or central processing units
    • G06F13/38Information transfer, e.g. on bus
    • G06F13/42Bus transfer protocol, e.g. handshake; Synchronisation
    • G06F13/4282Bus transfer protocol, e.g. handshake; Synchronisation on a serial bus, e.g. I2C bus, SPI bus
    • G06F13/4295Bus transfer protocol, e.g. handshake; Synchronisation on a serial bus, e.g. I2C bus, SPI bus using an embedded synchronisation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F15/00Digital computers in general; Data processing equipment in general
    • G06F15/16Combinations of two or more digital computers each having at least an arithmetic unit, a program unit and a register, e.g. for a simultaneous processing of several programs
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F15/00Digital computers in general; Data processing equipment in general
    • G06F15/16Combinations of two or more digital computers each having at least an arithmetic unit, a program unit and a register, e.g. for a simultaneous processing of several programs
    • G06F15/161Computing infrastructure, e.g. computer clusters, blade chassis or hardware partitioning
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30003Arrangements for executing specific machine instructions
    • G06F9/30076Arrangements for executing specific machine instructions to perform miscellaneous control operations, e.g. NOP
    • G06F9/30087Synchronisation or serialisation instructions
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/448Execution paradigms, e.g. implementations of programming paradigms
    • G06F9/4494Execution paradigms, e.g. implementations of programming paradigms data driven
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/451Execution arrangements for user interfaces
    • G06F9/453Help systems
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/52Program synchronisation; Mutual exclusion, e.g. by means of semaphores

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Computer Hardware Design (AREA)
  • Human Computer Interaction (AREA)
  • Mathematical Physics (AREA)
  • Memory System Of A Hierarchy Structure (AREA)
  • Memory System (AREA)

Description

本発明は、データ資源が複数の消費者間で同時に共用される際に、各消費者に関するデータの完全性及び一貫性を維持するようにしたコンピュータ・システム及び方法に係り、さらに詳細に説明すれば、ユニプロセッサ・コンピュータ環境において、「読み取り・コピー・更新」(read-copy-update:以下「RCU」と略記)として知られている相互排他機構を実装することに係る。
RCU技術とは、ロック、共用メモリへの書き込み、メモリ・バリア、アトミック命令又は計算コストが高い他の同期機構を使用することなく、読み取りのために共用データにアクセスすることを可能にするとともに、当該データを同時に更新(修正、削除、挿入)することを可能にする相互排他技術である。RCU技術を使用するのに特に適したマルチプロセッサ・コンピュータ環境とは、共用データセットにアクセスする読み取り動作(参照者)の数が更新動作(更新者)の数より大きく、しかも各読み取り動作のために他の相互排他技術(例えば、ロック)を使用するオーバーヘッド・コストが高い、というものである。例えば、読み取り側のロック獲得が著しい負担となるケースは、数分おきに1回だけ更新されるが、毎秒数千回も検索されるようなネットワーク経路指定テーブルである。
RCU技術は、データ更新を2つの段階で実装する。第1(初期更新)段階では、実際のデータ更新は、更新中データの2つのビューを一時的に保存するという態様で実行される。1つのビューは、当該データを参照中の読み取り動作のために維持される、古い(更新前の)データ状態である。他のビューは、当該更新の後に当該データにアクセスする動作のために使用可能な、新しい(更新後の)データ状態である。第2(遅延型更新)段階では、古いデータ状態は、「猶予期間」の後に除去される。この「猶予期間」は、実行中の全ての動作がもはや更新前のデータへの参照を維持しないであろうということを保証するように十分に長くなっている。第2段階の更新動作は、典型的には、古いデータ要素を解放することを含む。特定のRCU実装では、第2段階の更新動作は、第1段階の更新に従った動作状態を変更するような他の操作を含むことがある。
図1〜図4は、1グループのデータ要素A〜Cのうちデータ要素Bを修正する場合の、RCU機構の使用例を示す。データ要素A〜Cは、循環的に探索される単方向連結リスト内に配列され、その各要素は、データの或るアイテムを格納することに加えて、当該リスト内の次の要素へのポインタ(最後の要素の場合はヌル・ポインタ)を保持する。グローバル・ポインタ(図示せず)が、当該リストの第1のメンバである、データ要素Aを指すものと仮定する。当業者には明らかなように、データ要素A〜Cは、C言語の「struct」変数によって定義されるデータ構造を含む、種々の伝統的プログラミング構文のうち任意のものを使用して実装される。
ここで、図1〜図4の単方向連結リストが、複数の参照者によって(ロックなしで)同時に探索され、そして当該リスト内のデータ要素を削除、挿入又は修正する更新者によって時々更新されるものと仮定する。図1では、データ要素Bの下部にある矢印によって示すように、参照者r1がデータ要素Bを参照中である。図2では、更新者u1は、データ要素Bを修正することにより、連結リストを更新することを望んでいる。参照者r1がデータ要素Bを参照中であるという事実を考慮することなくデータ要素Bを単に更新する代わりに(そのようにすると、参照者r1を破壊することがある)、更新者u1は、データ要素Bを保存し、他方、その更新バージョン(図3のデータ要素B’)を生成し且つ当該更新バージョンを連結リスト内に挿入する。具体的には、更新者u1は、適切なロックを獲得し、データ要素B’用の新しいメモリを割り振り、データ要素Bの内容をデータ要素B’にコピーし、必要に応じてデータ要素B’を修正し、データ要素B’を指すようにAからBへのポインタを更新し、ロックを解除する。連結リストを探索する後続(更新後)の全ての参照者(例えば、参照者r2)は、データ要素B’に遭遇することにより、更新動作の結果を見出すであろう。他方、古い参照者r1は、データ要素Bの原バージョン及びデータ要素Cへのそのポインタが保存されるという理由で、影響を受けないであろう。参照者r1は、古いデータを現に読み取り中であるが、これを許容することができる多くのケースが存在する。1例を挙げると、データ要素がコンピュータ・システムの外部にあるコンポーネントの状態(例えば、ネットワーク接続性)を追跡するときは、通信遅延のために古いデータを許容しなければならない。
前記更新後の或る時間に、参照者r1は、連結リストの探索を継続し、そしてデータ要素Bのその参照から移動しているであろう。さらに、他の如何なる参照者プロセスも、データ要素Bにアクセスする資格を有さない時点が存在するであろう。前述の猶予期間の満了を表すこの時点では、更新者u1は、図4に示すように、データ要素Bを解放することができる。
図5〜図7は、単方向連結リスト内のデータ要素A〜Cのうちデータ要素Bを削除する場合の、RCU機構の使用例を示す。図5に示すように、参照者r1がデータ要素Bを現に参照中であり、そして更新者u1がデータ要素Bを削除することを望んでいるものと仮定する。図6に示すように、更新者u1は、データ要素Aがデータ要素Cを指すようにAからBへのポインタを更新する。このように、参照者r1は、妨害されないが、後続の参照者r2は、削除の結果を見出す。図7に示すように、参照者r1は、その後にデータ要素Bのその参照から移動し、その結果、猶予期間の満了後にデータ要素Bを解放することを許容するであろう。
RCU機構の文脈では、猶予期間は、RCU機構によって保護されたデータ要素にアクセスする全ての実行中プロセスが、「静止状態」を通過した時点を表す。この場合、これらの実行中プロセスは、もはや当該データ要素への参照を維持したり、当該データ要素上のロックを表明したり、或いはデータ要素の状態に関する如何なる仮定も行うことができない。規約により、オペレーティング・システムのカーネル・コード・パス、コンテキスト(プロセス)スイッチ、アイドル・ループ及びユーザ・モードの実行については、その全ては、所与のCPUのための静止状態を表す(他の同様の動作は省略)。
図8では、4つの別個のCPU上で実行中のプロセス0〜3は、(2重の垂直バーによって表された)静止状態を定期的に通過するように示されている。猶予期間は、プロセス0〜3の全てがそれぞれ1つの静止状態を通過する、時間フレームを包含する。もし、プロセス0〜3が、図1〜図4又は図5〜図7の単方向連結リストを探索する参照者プロセスであれば、猶予期間の前に古いデータ要素Bを参照していたどのプロセスも、猶予期間の後は、当該古いデータ要素Bへの参照を維持することができないであろう。これらのプロセスによって行われる猶予期間後の全ての探索は、更新者によって挿入されたリンクを辿って、データ要素Bをバイパスするであろう。
猶予期間後に遅延型データ更新を実装するために使用される種々の方法が存在する。その1つは、遅延型更新要求を(例えば、コールバック・リスト上の)コールバックとして累積し、猶予期間の終わりに、バッチ・コールバック処理を実行するというものである。これは、非同期的な猶予期間処理を表す。更新者は、第1段階の更新を実行し、コールバック要求を発行した後、それらのコールバックが猶予期間の終わりに最終的に処理されるであろうということを知った上で動作を再開することができる。一般的に使用される他の技術は、更新者に第1段階の更新を実行させ、猶予期間が完了するまで阻止(待機)させた後、遅延型更新を実行することを再開させるというものである。これは、同期的な猶予期間処理を表す。
RCU機構は、リナックス(登録商標)カーネルを含む、種々のオペレーティング・システム・カーネル環境内で長年にわたって稼働してきた。非プリエンプタブル・カーネルでは、猶予期間検出処理は、自然な静止状態(例えば、コンテキスト・スイッチ、ユーザ・モード又はアイドル・ループ)を監視するか、又はかかる状態を(例えば、コンテキスト・スイッチの強制を通して)生じさせることにより、これを実行することができる。プリエンプタブル・カーネルでは、実行中のRCU参照者は、優位順位の高いタスクによってプリエンプトされ得る。かかるプリエンプションは、当該参照者がRCU機構によって保護されたデータ要素を参照中のカーネル・モードのクリティカル・セクション内にある間さえ、行われることがある。参照者のプリエンプションは、コンテキスト・スイッチを表すが、それは、猶予期間検出のために有効に使用できないことがある。そのため、プリエンプタブルな環境用に設計されたRCUバージョン(以下「非プリエンプタブルなRCU」と称する)は、自然な静止状態に依存しない。その代わりに、各参照者は、当該参照者がRCUクリティカル・セクションに入るか又はそこから出るときに、RCUクリティカル・セクション処理のための登録又は登録抹消を行うことにより、それ自体の静止状態を定義する。
猶予期間が満了すると決定されるのは、当該猶予期間の開始後に登録した全ての参照者がその後に登録抹消を行った場合である。幾つかのプリエンプタブルなRCU実装については、この猶予期間検出作業は、RCU参照者を実行中の種々のプロセッサ間の調整(coordination)を必要とする。参照者は、更新者が新しい猶予期間を開始する時点を知る必要があり、更新者は、古い猶予期間の終わりを宣言する前に、参照者がそれぞれのRCUクリティカル・セクションから出たことを確信する必要がある。メモリ・アクセスを順序外で実行することを可能にするCPU及び/又はコンパイラによる最適化に起因して、或るタイプのプリエンプタブルなRCU猶予期間検出のために必要とされる調整作業が、重要となることがある。
一般に、プリエンプタブルなRCUは、マルチプロセッサ環境内で使用されるが、ユニプロセッサ環境内でもこれを使用することができる。例えば、多数の小さな組み込み式リアルタイム・システムは、依然としてユニプロセッサ・システムである。かかるシステムは、しばしばRCUから恩恵を受けることがあり、従って他の相互排他機構の代替手段としてプリエンプタブルなRCUを使用することができる。
しかし、プリエンプタブルなRCUの幾つかの実装によって使用される既存の猶予期間検出方法は、ユニプロセッサ環境については最適でないことがある。
プリエンプタブルなデータ参照者に影響する共用データの更新動作の後の猶予期間検出を最適化するための方法、システム及びコンピュータ・プログラムが提供される。データ処理システムが、ユニプロセッサ・システム又はマルチプロセッサ・システムの何れであるかという決定がなされる。もし、前記データ処理システムがユニプロセッサ・システムであれば、第1の猶予期間検出技術を使用して、猶予期間検出処理が実行される。もし、前記データ処理システムがマルチプロセッサ・システムであれば、第2の猶予期間検出技術を使用して、猶予期間検出処理が実行される。前記猶予期間検出処理は、猶予期間の終わりを決定する。その場合、プリエンプションの対象である参照者は、静止状態を通過しており、共用データの更新前のビューへの参照を維持することができない。
本発明は、プリエンプタブルなRCUの幾つかの実装によって使用される既存の猶予期間検出方法を、ユニプロセッサ環境について最適化することができるという効果を奏する。
従来のRCU機構に従った、単方向連結リスト内の1グループのデータ要素のうち一のデータ要素を修正するための一連の動作を例示する図である。 従来のRCU機構に従った、単方向連結リスト内の1グループのデータ要素のうち一のデータ要素を修正するための一連の動作を例示する図である。 従来のRCU機構に従った、単方向連結リスト内の1グループのデータ要素のうち一のデータ要素を修正するための一連の動作を例示する図である。 従来のRCU機構に従った、単方向連結リスト内の1グループのデータ要素のうち一のデータ要素を修正するための一連の動作を例示する図である。 従来のRCU機構に従った、単方向連結リスト内の1グループのデータ要素のうち一のデータ要素を削除するための一連の動作を例示する図である。 従来のRCU機構に従った、単方向連結リスト内の1グループのデータ要素のうち一のデータ要素を削除するための一連の動作を例示する図である。 従来のRCU機構に従った、単方向連結リスト内の1グループのデータ要素のうち一のデータ要素を削除するための一連の動作を例示する図である。 従来技術に従った、猶予期間の間に4つのプロセスが静止状態を通過する態様を例示する図である。 ユニプロセッサ動作用のプリエンプタブルなRCU猶予期間検出を最適化するために使用することができる環境を表す、コンピュータ・システムを示すブロック図である。 図9のコンピュータ・システム内で実装される、RCUサブシステムを示すブロック図である。 マルチプロセッサ動作用のプリエンプタブルなRCU猶予期間検出を最適化するために使用することができる代替環境を表す、他のコンピュータ・システムを示すブロック図である。 ユニプロセッサ動作用のプリエンプタブルなRCU猶予期間検出を最適化するために使用することができる、システム構成変数を示すブロック図である。 本発明に従った、プリエンプタブルなRCUの猶予期間検出処理を最適化する、第1の例を示すフローチャートである。 本発明に従った、プリエンプタブルなRCUの猶予期間検出処理を最適化する、第2の例を示すフローチャートである。 スリープ可能なRCU実装内で実行される、従来技術の猶予期間検出処理を示すフローチャートである。 スリープ可能なRCU実装内で実行される、ユニプロセッサ動作用の最適化された猶予期間検出を示すフローチャートである。 スリープ可能なRCU実装内で実行される、ユニプロセッサ動作用の最適化された猶予期間検出をサポートする、修正された synchronize_shed() 関数を示すフローチャートである。 リアルタイムRCU実装内で使用される、従来技術の状態マシンを示すフローチャートである。 図18の状態マシンの第1の状態で実装される、従来技術の関数を示すフローチャートである。 図18の状態マシンの第2の状態で実装される、従来技術の関数を示すフローチャートである。 図18の状態マシンの第3の状態で実装される、従来技術の関数を示すフローチャートである。 図18の状態マシンの第4の状態で実装される、従来技術の関数を示すフローチャートである。 図18の状態マシンの他のビューを示すフローチャートである。 リアルタイムRCU実装内で実行可能なユニプロセッサ動作用の最適化された猶予期間検出を有する、図18の状態マシンの修正を示すフローチャートである。 リアルタイムRCU実装内で実行可能なユニプロセッサ動作用の最適化された猶予期間検出を有する、図18の状態マシンの修正を示すフローチャートである。 ユニプロセッサ動作用に最適化されたRCU猶予期間検出を実装するためのコンピュータ・プログラムを提供するために使用することができる、コンピュータ可読媒体を示す図である。
図9は、その内部で本発明が実装される、コンピュータ環境を例示する。具体的には、ユニプロセッサ・コンピュータ・システム2が図示され、そこではプロセッサ4がシステム・バス6を介してメモリ8に接続される。通常のキャッシュ・メモリ10及びキャッシュ・コントローラ12が、プロセッサ4に関連する。通常のメモリ・コントローラ14が、メモリ8に関連する。
図9では、カーネル・レベル又はユーザ・レベルのプロセス若しくはスレッド(又は他の実行コンテキスト)内で実行される更新動作が、メモリ8内に格納された1セットの共用データ16上で定期的に更新を実行することを仮定している。参照番号18〜18は、プロセッサ4上で定期的に実行される、個別的なデータ更新動作(更新者)を示す。前述の背景技術の項で説明したように、データ更新者18〜18によって実行される更新は、連結リストの要素を修正し、当該リストに新しい要素を挿入し、当該リストから要素を削除することに加えて、(リスト又は他のデータ構造が関係する)他の多くのタイプの動作を含むことができる。かかる更新を促進するために、プロセッサ4は、そのカーネル・レベル又はユーザ・レベル機能の一部としてRCUサブシステム20を実装するようにプログラムされる。また、プロセッサ4は、共用データ16上で、カーネル・レベル又はユーザ・レベルの読み取り動作(参照者)21〜21を定期的に実行する。かかる読み取り動作は、典型的には、更新よりも遙かに多く実行されるであろう。これがRCUの使用の基礎となる前提のうちの1つである。もし、システム2がリアルタイム動作をサポートすれば、更新者18〜18及び参照者21〜21は、プリエンプタブルであると仮定される。そのため、幾つかの参照者21〜21が共用データ要素16への同時的な参照を維持している間に、更新者18〜18が(例えば、プリエンプションを行っているリアルタイム・プロセス又はスレッドのコンテキストにおいて、又は割り込みコンテキストから)同じデータ項目を更新することが可能であろう。
RCUサブシステム20は、図9の環境内で、種々のプリエンプタブルなRCU実装のうち任意のものを使用して実装される。これらのプリエンプタブルなRCU実装は、リナックス(登録商標)カーネルの最近のバージョン又はリナックス(登録商標)カーネルの最近のバージョンに対するパッチ・セットで見出される、リアルタイムRCU、スリープ可能なRCU(SRCU)及びクイックSRCU(QRCU)実装を含む。これらのプリエンプタブルなRCU実装の各変形は、猶予期間検出処理を実装するために、前述の背景技術の項で説明したように、参照者の登録及び登録抹消を使用する。参照者登録、参照者登録抹消及び猶予期間検出機能は、RCUサブシステム20内のRCUプリミティブによってサポートされる。これらのプリミティブは、図10の参照番号22、24及び26によってそれぞれ例示される。
また、前述の背景技術の項で説明したように、幾つかのプリエンプタブルなRCU実装、特に直前の段落で言及したものは、マルチプロセッサ・システムにおいて調整された猶予期間検出処理を必要とする。この調整作業は、他のプロセッサが特定の猶予期間検出アクションを取るまで、各プロセッサが相当な時間にわたって待機することを必要とすることがある。本発明者は、ユニプロセッサ・システム内では猶予期間検出の調整が常に必要とされるものではないことを認識し、ユニプロセッサ環境内でかかる処理を回避するための解決策を開発した。具体的には、本発明に従った当該解決策は、システム内にあるプロセッサの数を、猶予期間検出処理の条件とする。もし、2つ以上のプロセッサがアクティブであれば、前述の猶予期間検出の調整が実行される。一方、1つのプロセッサだけがアクティブであれば、プロセッサ間の猶予期間検出の調整を実行する必要はない。図9のシステム2は、この条件が適用される1つの環境を表す。他の例は、1つのプロセッサだけがアクティブなマルチプロセッサ環境(例えば、ホット・プラグ可能なCPUを有するシステム)になるであろう。この例は、図11のホット・プラグ可能なマルチプロセッサ・システム2Aによって例示される。このシステムには、関連するキャッシュ・メモリ10〜10及びキャッシュ・コントローラ12〜12を有する、複数のプロセッサ4〜4が存在する。RCUサブシステム20は、RCUサブシステムのインスタンス20〜20として、プロセッサ4〜4上に分散される。システム2Aは、プロセッサ4〜4のうち1つを除く全てが非アクティブである(実質的にユニプロセッサ・システムになる)状態に置くことができるので、本発明に従った、条件付きの猶予期間検出の解決策を使用することができる。
ユニプロセッサ環境用の猶予期間検出処理は、これを種々の方法で条件付けることができる。1つの技術は、マルチプロセッサ対ユニプロセッサ・コンパイラ・プリプロセッサ指令に基づき、RCUサブシステムを条件付きでコンパイルすることにより、猶予期間検出条件をコンパイル時に静的にセットするものであろう。リナックス(登録商標)では、この条件は、CONFIG_SMPカーネル構成(Kconfig)オプションに基づくことがある。プリプロセッサ指令の擬似コードは、次のように実装される。
#ifdef CONFIG_SMP
#definegp_detection()smp_gp_detection()
#else gp_detection() up_gp_detection()
#endif
この場合、smp_gp_detection() 関数は、マルチプロセッサ環境内のプロセッサ調整を有する猶予期間検出を実行し、一方、up_gp_detection() 関数は、ユニプロセッサ環境内のプロセッサ調整のない猶予期間検出を実行する。gp_detection() 関数は、コンパイル時における適切な環境のためにセットされるであろう。
猶予期間検出処理を条件付けるための他の技術は、実行時に、猶予期間条件を動的にセットするものであろう。こうするためには、コンパイル時に提供されるシステム構成情報を、ブート時又は実行時に調べるようにすればよい。例えば、ユニプロセッサ又はマルチプロセッサ構成の何れかを指示するように、コンパイル時に、図12のシステム構成変数30を定義することができる。プリプロセッサ指令を使用する擬似コードは、次のように実装される。
Static const int config_smp =
#ifdef CONFIG_SMP
1;
#else
0;
#endif
これから明らかなように、config_smp 構成変数30は、マルチプロセッサ・コードコンパイルについては1として定義され、ユニプロセッサ・コンパイルについてはゼロとして定義されるであろう。実行時には、config_smp 変数をテストすることにより、適切なシステム構成に従って猶予期間検出を条件付けることができる。
猶予期間検出処理を動的に条件付けるための他の技術は、ブート時に渡されるカーネルのブート・パラメータに従って、猶予期間検出を選択するものであろう。カーネルの初期化コードは、ユニプロセッサ及びマルチプロセッサの猶予期間検出処理のうちどちらをRCUサブシステム20が使用すべきかを指示するブート・パラメータに従って、構成変数30(例えば、前述のconfig_smp )をセットすることができる。直前の段落で挙げた例のように、RCUサブシステム20は、構成変数30を検査して、ユニプロセッサ・モード及びマルチプロセッサ・モードの猶予期間検出のうちどちらを使用すべきかを動的に決定するように、プログラムされるであろう。
猶予期間検出処理を動的に条件付けるための他の技術は、アクティブなプロセッサの現在の数に従って、構成変数30をセットするものであろう。図11のシステム2Aのようなホット・プラグ可能な環境では、オンライン・プロセッサの数は、カーネルから容易に決定することができる。例えば、RCUサブシステム20がリナックス(登録商標)カーネル内で実装されるならば、RCUサブシステム20は、既存の「num_online_cpus()」関数を呼び出すことにより、当該システムがユニプロセッサ又はマルチプロセッサ・システムの何れとして現に動作しているかを動的に決定することができる。RCUサブシステム20がユーザ空間内で実装される場合は、他の技術を使用することができる。一旦プロセッサの数が決定されると、環境(ユニプロセッサ又はマルチプロセッサ)を指定するように、構成変数30(例えば、前述のconfig_smp )をセットすることができる。代替的に、この場合は構成変数30が実際に必要とされていないから、RCUサブシステム20は、プロセッサの数の直接的な評価によって(例えば、num_online_cpus() 関数によって戻された結果を使用して)その猶予期間検出をセットすることができる。
図13は、コンパイル時に猶予期間検出を静的に条件付けた後、実行時に適切なタイプの猶予期間検出を自動的に実装するための、RCUサブシステム20によって実行される処理を例示する。コンパイル時には、ブロック40、42A及び42Bの初期処理が実行される。実行時には、ブロック44〜50の後続処理が実行される。ブロック40では、コンパイラは、プリプロセッサ指令を介して、ユニプロセッサ又はマルチプロセッサ環境の何れかについてコンパイルするように命令される。もし、ユニプロセッサ・コンパイルが指令されるならば、ブロック42Aが実装され、猶予期間検出は、マルチプロセッサ調整機能性を含まないようにコンパイルされる。一方、マルチプロセッサ・コンパイルが指令されるならば、ブロック42Bが実装され、猶予期間検出は、必要とされるマルチプロセッサ調整機能性を含むようにコンパイルされる。実行時中のブロック44では、更新者18〜18は、図9及び図11の共用データセット16への更新を実行する。RCUの原理に従って、この更新は、当該更新動作中に共用データを現に参照中の参照者のために、共用データの更新前のビューを一時的に保存する、という態様で実行される(第1段階の更新)。ブロック46では、更新者は、RCUサブシステム20の猶予期間検出コンポーネント26を呼び出す。ブロック48では、猶予期間検出コンポーネント26は、ブロック42A又は42Bでコンパイルされた方法に基づいて(すなわち、当該システムがユニプロセッサ・システム又はマルチプロセッサ・システムの何れであるかに従って)、マルチプロセッサ調整を含むか又はこれを含まない猶予期間検出を実装する。ブロック50では、第2段階の更新動作が実行される(例えば、古いデータ要素が解放される)。もし、この猶予期間検出が同期的であれば、第1段階の更新を実行した更新者18〜18が、ブロック50の第2段階の更新動作を実行する。一方、この猶予期間検出が非同期的であれば、RCUサブシステム20が、ブロック50を実装するであろう。
図14は、実行時に猶予期間検出処理を動的に条件付けるための、RCUサブシステム20によって実行される処理を例示する。ブロック60では、更新者18〜18は、図9及び図11の共用データセット16への更新を実行する。RCUの原理に従って、この更新は、当該更新動作中に共用データを現に参照中の参照者のために、共用データの更新前のビューを一時的に保存する、という態様で実行される(第1段階の更新)。ブロック62では、更新者は、RCUサブシステム20の猶予期間検出コンポーネント26を呼び出す。ブロック64では、猶予期間検出コンポーネント26は、ホスト・データ処理システムがユニプロセッサ・システム又はマルチプロセッサ・システムの何れであるかを動的に決定する。前述のように、使用される3つの可能な技術は、コンパイル時、ブート時又は実行時に提供されるシステム構成情報(例えば、図12の構成変数30)を検査するものを含む。もし、当該データ処理システムがユニプロセッサ・システムであれば、RCUサブシステム20は、マルチプロセッサ調整を含まない第1の猶予期間検出技術を使用して、ブロック66Aの猶予期間検出処理を実行する。一方、当該データ処理システムがマルチプロセッサ・システムであれば、RCUサブシステム20は、マルチプロセッサ調整を含む第2の猶予期間検出技術を使用して、ブロック66Bの猶予期間検出処理を実行する。何れの場合も、猶予期間検出処理は、参照者が共用データの更新前のビューへの参照を維持することができない、猶予期間の終わりを決定する。ブロック68では、第2段階の更新動作が実行される(例えば、古いデータ要素が解放される)。もし、この猶予期間検出が同期的であれば、第1段階の更新を実行した更新者18〜18が、ブロック68の第2段階の更新動作を実行する。一方、この猶予期間検出が非同期的であれば、RCUサブシステム20が、ブロック68を実装するであろう。
以下、既存のプリエンプタブルなRCU実装を修正することにより、図13及び図14の処理を実装する方法を例示するために、特定の実装例を説明する。これらの例は、それぞれリナックス(登録商標)カーネルの現行バージョン内で実装されるような、SRCU及びリアルタイムRCUに基づく。しかし、他のカーネル・レベルのプリエンプタブルなRCUバージョン及びユーザ・レベルのプリエンプタブルなRCUも、本明細書に開示した猶予期間検出の最適化技術を実装するための開始点として役立つであろう。
<例1−SRCU>
スリープ可能なRCUは、RCU参照者がRCUクリティカル・セクション内でスリープするか又は遅れることを可能にする、プリエンプタブルなRCU実装である。参照者が長い期間にわたって阻止されることがあるという理由で、非同期的な猶予期間検出は、許容されない。更新者は、同期的な猶予期間検出を実行することが必要とされる。誤った参照者がシステム全体の猶予期間検出を遅らせる可能性を最小化するために、参照者は、サブシステムによってグループ化される。各サブシステムは、RCUクリティカル・セクションの登録及び登録抹消のために当該サブシステム内の参照者によって使用され且つ猶予期間検出のために更新者によって使用される、「srcu_struct」タイプのデータ構造を割り当てられる。各SRCUデータ構造は、(1)経過した猶予期間のカウント、(2)プロセッサ対応のカウンタ・ペアへのポインタ及び(3)mutex ロックを保持する。プロセッサ対応の各カウンタ・ペアは、現在の猶予期間中に開始した読み取り動作をカウントするためのアクティブ・カウンタと、最後の猶予期間中に開始した読み取り動作をカウントするための非アクティブ・カウンタとを含む。経過した猶予期間カウンタの下位ビットは、現在の猶予期間にアクティブに関連する、プロセッサ対応のカウンタをインデックスするために使用される。
SRCU実装では、図10の参照者登録コンポーネント22は、srcu_read_lock() プリミティブを使用して実装することができる。このプリミティブは、適用可能なSRCUデータ構造にアクセスし且つ現在の猶予期間及び参照者のプロセッサに関連するプロセッサ対応のカウンタをインクリメントすることにより、RCUクリティカル・セクション処理のための参照者を登録する。SRCU実装内の参照者登録抹消コンポーネント24は、srcu_read_unlock() プリミティブを使用して実装することができる。このプリミティブは、srcu_read_lock() によって以前にインクリメントされたプロセッサ対応のカウンタをデクリメントすることにより、RCUクリティカル・セクションの処理の後に、参照者を登録抹消する。
SRCU実装内の猶予期間検出コンポーネント26は、synchronize_scru() プリミティブを使用して実装することができる。このプリミティブは、所与のSRCUデータ構造内の経過した猶予期間カウントをインクリメントすることにより、プロセッサ対応のカウンタの役割を交換し(カウンタの「フリッピング」と呼ばれる)、その後、参照者がRCUクリティカル・セクションの処理を完了するのに応じて、以前の猶予期間に関連するカウンタがゼロに達するまで待機する。その後、第2段階のRCU更新動作を、安全に実行することができる。マルチプロセッサ環境では、1つのプロセッサ上で実行されるSRCU猶予期間検出処理は、他のプロセッサとの注意深い調整を必要とする。synchronize_scru() プリミティブでは、この調整処理は、synchronize_sched() として知られている調整関数に対し幾つかの呼び出しを行うことにより扱われる。これが、RCUの非プリエンプタブル・バージョン内で使用される、猶予期間検出プリミティブであることに留意されたい。このプリミティブは、各プロセッサ上で猶予期間をスケジュールすることにより、各プロセッサにコンテキスト・スイッチを通過させる。前述のように、このタイプの自然なコンテキスト・スイッチは、非プリエンプタブルなRCU内では静止状態と見なされる。これは、プリエンプタブルなRCU内で静止状態を実装するための適切な方法ではない。しかし、SRCUは、静止状態を強制するためにsynchronize_sched() プリミティブを使用しない。むしろ、このプリミティブが使用されるのは、これが各プロセッサ上でメモリ・バリアを実装するという副次的な効果を有するためである。このメモリ・バリアの副次的な効果は、SRCUについて必要とされる、必須のマルチプロセッサ調整を提供する。synchronize_scru() プリミティブは、synchronize_sched() への幾つかの呼び出しを行うことにより、猶予期間検出動作の種々の段階でメモリ・バリアを実装する。これは、更新側が参照者の状態を知らずに進行しないように、参照者が更新側でなされる状態変更を知ることを保証する。
図15は、synchronize_scru() プリミティブの従来の動作を例示する。更新者は、synchronize_scru() を呼び出すことにより、所与のサブシステムに関連するSRCUデータ構造を指定して、当該サブシステム内の猶予期間検出を開始する。ブロック70で、synchronize_scru() は、SRCUデータ構造を読み取って、現在の猶予期間カウントを決定する。ブロック72で、synchronize_scru() は、SRCUデータ構造のロックを獲得する。ブロック74で、synchronize_scru() は、同じSRCUデータ構造上で他のプロセッサが既に猶予期間検出を実行中であることを決定する場合、当該SRCUデータ構造のロックを解除する。また、synchronize_scru() は、戻る前に、他のプロセッサが猶予期間の検出を完了することを待機する。さもなければ、ブロック76で、synchronize_scru() は、synchronize_sched() を呼び出す。各プロセッサ上で実行される結果的なメモリ・バリアは、さらなる猶予期間検出処理が実行される前に、synchronize_scru() を呼び出した更新者によって行われた第1段階の更新を、これらのプロセッサが見出すであろうということを保証する。このことは、synchronize_read_lock() への対応する呼び出しに先行するように、他の或るプロセッサが、そのRCU読み取り側クリティカル・セクション内のアクセスを再配列することを禁止し、その結果、かかる参照が実際に保護されるであろうということを保証する。ブロック78で、synchronize_scru() は、現在のプロセッサ対応カウンタ・インデックスを獲得し、猶予期間カウントをインクリメントする(カウンタのフリッピングに帰着する)。ブロック80で、synchronize_scru() は、再びsynchronize_sched() を呼び出す。各プロセッサ上で実行される結果的なメモリ・バリアは、参照者がそれらのRCUクリティカル・セクションに入る前に、古いカウンタを使用する全てのscru_read_lock() の呼び出しが完了しているであろうということを保証する。当該クリティカル・セクションは、依然として実行中であろうが、保護されるであろう。というのは、scru_read_lock() プリミティブそれ自体は、実行を終了しているからである。ブロック82で、synchronize_scru() は、最後の猶予期間に関連するプロセッサ対応のカウンタ(ブロック78で獲得したインデックスに対応するもの)がゼロにデクリメントされるまで待機する。ブロック84で、synchronize_scru() は、再びsynchronize_sched() を呼び出す。各プロセッサ上で実行される結果的なメモリ・バリアは、ブロック82と同時に実行されていた全てのscru_read_unlock() プリミティブがこの時点までに完了していることを保証する。一層重要なことは、メモリ・バリアは、対応するRCU読み取り側クリティカル・セクションが完了し且つRCUで保護されたデータ・アイテムへの対応する参照が終了することを強制するということである。ブロック86で、synchronize_scru() は、SRCUデータ構造のロックを解除することにより、猶予期間検出処理を完了させる。
本明細書に開示した猶予期間最適化技術に従って、synchronize_scru() プリミティブは、synchronize_sched() の呼び出しを修正することにより、ユニプロセッサ動作用に最適化することができる。もし、かかる最適化がコンパイル時に実行されるならば、synchronize_scru() は、synchronize_sched() の代わりに、新しい関数smp_synchronize_sched() を呼び出すように修正することができる。この関数の使用例は、図15に対応する図16に示されている。但し、図15のブロック76、80及び84におけるsynchronize_sched() は、図16のブロック76A、80A及び84Aにおける新しいsmp_synchronize_sched() 関数で置き換えられている。次に、以下のコンパイラ・プリプロセッサ指令を使用して、synchronize_sched() を条件付きで定義することができる。
#ifdefCONFIG_SMP
#define smp_synchronize_sched() synchronize_sched()
#else
#define smp_synchronize_sched() barrier()
#endif
もし、マルチプロセッサ・システムが存在すれば、smp_synchronize_sched()は、オリジナルのsynchronize_sched() プリミティブに変換されるであろう。さもなければ、smp_synchronize_sched()は、「barrier()」という名前のプリミティブに変換される。このプリミティブは、コンパイラがsynchronize_srcu() 内のsmp_synchronize_sched()を横切ってメモリ参照を再配列することを禁止するが、マルチプロセッサ調整に使用されるメモリ・バリアをsynchronize_sched() 内で実装しない。
もし、実行時にユニプロセッサの最適化を実行することが望まれるならば、マルチプロセッサ環境内でsynchronize_sched() を条件付きで呼び出し、そしてユニプロセッサ環境内でbarrier() を呼び出すように、synchronize_srcu() を修正することができる。その場合、synchronize_sched() は、synchronize_srcu() 内で、図17に示す処理を実行するラッパ関数(例えば、synchronize_sched_wrapper())と置き換えることができる。ブロック90で、synchronize_sched_wrapper() は、それがユニプロセッサ環境又はマルチプロセッサ環境の何れにあるかを決定する。再び、これを行うことができる3つの可能な方法は、コンパイル時、ブート時又は実行時に提供される、システム構成情報(例えば、図12の構成変数30)を検査するというものである。もし、ユニプロセッサ環境が検出されるならば、ブロック92で、barrier() への呼び出しが行われる。一方、マルチプロセッサ環境が検出されるならば、ブロック94で、synchronize_sched() への呼び出しが行われる。
<例2−リアルタイムRCU>
リアルタイムRCUは、参照者がプリエンプトされる場合でさえ、RCU参照者を時期尚早の猶予期間処理から保護する、プリエンプタブルなRCUバージョンである。参照者は、現在の猶予期間番号を使用してインデックスされる、プロセッサ対応のカウンタ・ペアを使用して追跡される。SRCUのように、プロセッサ対応のカウンタのうちの1つは、現在の猶予期間中にRCUクリティカル・セクションを開始した参照者によってインクリメント/デクリメントされる。プロセッサ対応の他のカウンタは、最後の猶予期間中にRCUクリティカル・セクションを開始した参照者によって使用される。一旦新しい猶予期間が開始されると、以前の猶予期間に関連するカウンタはデクリメントされるだけであり、従って参照者がクリティカル・セクションを完了すると、最終的にゼロまでカウント・ダウンするであろう。リアルタイムRCU実装では、図10の参照者登録コンポーネント22は、rcu_read_lock() プリミティブを使用して実装することができる。このプリミティブは、現在の猶予期間に関連するプロセッサ対応のカウンタをインクリメントすることにより、RCUクリティカル・セクションの参照者を登録する。リアルタイムRCU実装内の参照者登録抹消コンポーネント24は、rcu_read_unlock() プリミティブを使用して実装することができる。このプリミティブは、rcu_read_lock() によって以前にインクリメントされたプロセッサ対応のカウンタをデクリメントするか、又は参照者がプリエンプトされ且つ異なるプロセッサ上で復元されたならば、当該参照者の猶予期間に対応する新しいプロセッサ上のプロセッサ対応のカウンタをデクリメントすることにより、RCUクリティカル・セクション処理の後に当該参照者を登録抹消する。
リアルタイムRCU実装内の猶予期間検出コンポーネント26は、rcu_try_flip() プリミティブによって実装することができる。このプリミティブによって実装される猶予期間検出アルゴリズムは、複数のプロセッサ上の猶予期間処理を調整するために、状態マシンを使用する。図18は、状態マシン100及びその猶予期間検出状態102〜108を示す。rcu_try_flip() によって実装される猶予期間検出アルゴリズムは、各スケジューリング・クロック割り込みで各プロセッサ上で呼び出される。状態ごとに、rcu_try_flip() は、(状態102〜108の名前によって表される)別個の関数を呼び出す。もし、この関数がゼロを戻すならば、状態マシンは、同じ状態に留まる。一方、この関数が1を戻すならば、状態マシンは前進する。所与の猶予期間を完了するためには、幾つかのサイクルが必要とされる。
状態102は、アイドル状態であり、その状態では如何なる猶予期間検出も進行中ではない。この状態では、rcu_try_flip() は、rcu_try_flip_idle() という関数を呼び出す。図19は、この関数の処理を示す。ブロック110で、この関数は、1つ以上の更新者が第1段階のRCU更新動作を実行しているために新しい猶予期間が必要とされるか否かを決定する。そうでなければ、ブロック112で、この関数はゼロの値を戻し、そしてrcu_try_flip() 状態マシンは、アイドル状態に留まる。一方、新しい猶予期間が必要とされるならば、ブロック114で、当該期間が開始される。ブロック116では、他のプロセッサが新しい猶予期間を見るように、メモリ・バリア命令が実行される。ブロック118で、各プロセッサは、新しい猶予期間を確認するように要求される。ブロック120で、この関数は1の値を戻し、そしてrcu_try_flip() 状態マシンは、次の状態104に前進する。
状態104は、各プロセッサが状態102で要求された確認を実行することを待機する、wait_for_ACK 状態である。この状態では、rcu_try_flip() は、rcu_try_flip_waitack() として知られている関数を呼び出す。図20は、この関数の処理を示す。ブロック122で、この関数は、全てのプロセッサから新しい猶予期間の確認が受け取られたか否かを決定する。そうでなければ、ブロック124で、この関数はゼロの値を戻し、そしてrcu_try_flip() 状態マシンは、wait_for_ACK 状態に留まる。一方、全ての確認が受け取られたならば、カウンタのモニタリングが行われる前に全ての確認が受け取られることを保証するために、ブロック126で、メモリ・バリア命令が実行される。次に、ブロック128で、この関数は1の値を戻し、そしてrcu_try_flip() 状態マシンは、次の状態106に前進する。
状態106は、以前の猶予期間に関連する全てのカウンタがゼロに達するのを待機する、wait_for_zero 状態である。この状態では、rcu_try_flip() は、rcu_try_flip_waitzero() として知られている関数を呼び出す。図21は、この関数の処理を示す。ブロック130で、この関数は、以前の猶予期間に関連するプロセッサ対応の全てのカウンタの和がゼロであるか否かを決定する。そうでなければ、ブロック132で、この関数はゼロの値を戻し、そしてrcu_try_flip() 状態マシンは、wait_for_zero状態に留まる。一方、当該カウンタの和がゼロであれば、これらのカウンタの全てが実際にゼロとなる前に後続の処理に進まないことを保証するために、ブロック134で、メモリ・バリア命令が実行される。次に、ブロック136で、この関数は、全てのプロセッサがメモリ・バリアを実装することを要求する。これは、第2段階のRCU更新動作が実行される前に、参照者によって全てのRCUクリティカル・セクション処理が完了されているであろうということを保証する。次に、ブロック138で、この関数は1の値を戻し、そしてrcu_try_flip() 状態マシンは、次の状態108に前進する。
状態108は、全てのプロセッサがメモリ・バリアを実装するのを待機する、wait_for_mb 状態である。この状態では、rcu_try_flip() は、rcu_try_flip_waitmb() として知られている関数を呼び出す。図22は、この関数の処理を示す。ブロック140で、この関数は、全てのプロセッサがメモリ・バリアを実装したか否かを決定する。そうでなければ、ブロック142で、この関数はゼロの値を戻し、そしてrcu_try_flip() 状態マシンは、wait_for_mb 状態に留まる。一方、全てのメモリ・バリアが実装されたならば、メモリ・バリアの検査が任意の後続猶予期間の前進に先行することを保証するために、ブロック144で、メモリ・バリア命令が実行される。次に、ブロック146で、この関数は1の値を戻し、そしてrcu_try_flip() 状態マシンは、次のアイドル状態102に前進する。状態マシン100を通しての追加サイクルの後、第2段階のRCU更新動作を実行する(例えば、以前の猶予期間に関連する古いデータを解放する)ことができる。
図23は、rcu_try_flip() によって実行される、状態マシンの処理を示す。ブロック150で、rcu_try_flip() は、rcu_try_flip_idle() 関数(図19)を呼び出し、その戻り値を検査する。この戻り値がゼロであれば、ブロック152で、rcu_try_flip() は、新しい状態に前進することなくブレークする。一方、この戻り値が1であれば、ブロック154で、rcu_try_flip() は、wait_for_ACK 状態104に前進する。
ブロック156で、rcu_try_flip() は、rcu_try_flip_waitack() 関数(図20)を呼び出し、その戻り値を検査する。この戻り値がゼロであれば、ブロック158で、rcu_try_flip() は、新しい状態に前進することなくブレークする。一方、この戻り値が1であれば、ブロック160で、rcu_try_flip() は、wait_for_zero状態106に前進する。
ブロック162で、rcu_try_flip() は、rcu_try_flip_waitzero() 関数(図21)を呼び出し、その戻り値を検査する。この戻り値がゼロであれば、ブロック164で、rcu_try_flip() は、新しい状態に前進することなくブレークする。一方、この戻り値が1であれば、ブロック166で、rcu_try_flip() は、wait_for_mb 状態108に前進する。
ブロック168で、rcu_try_flip() は、rcu_try_flip_waitmb() 関数(図22)を呼び出し、その戻り値を検査する。この戻り値がゼロであれば、ブロック170で、rcu_try_flip() は、新しい状態に前進することなくブレークする。一方、この戻り値が1であれば、ブロック172で、rcu_try_flip() は、アイドル状態102に前進する。再び、この時点で、第2段階のRCU更新動作を実行することができる。
本明細書に開示した猶予期間最適化技術に従って、リアルタイムRCUのrcu_try_flip() プリミティブは、図18の状態104及び108を除去することにより、ユニプロセッサ動作用に最適化することができる。もし、この最適化がコンパイル時に実行されるのであれば、rcu_try_flip() 状態マシン・プリミティブは、ユニプロセッサのために状態104及び108をバイパスするようにコンパイルすることができる。代替的に、状態104及び108に関連するrcu_try_flip_waitack() 及びrcu_try_flip_waitmb() 関数は、他の任意の処理を実行することなく、(状態マシンを前進させるために)単に1の値を戻すように、ユニプロセッサ動作用にコンパイルすることができる。
もし、ユニプロセッサの最適化を実行時に実行することが望まれるのであれば、rcu_try_flip() 状態マシンは、マルチプロセッサ環境では条件付きで状態104及び108に入り、ユニプロセッサ環境ではそれらの状態をバイパスするように修正することができる。代替的に、状態104及び108に関連するrcu_try_flip_waitack() 及びrcu_try_flip_waitmb() 関数は、条件付きで他の任意の処理を実行することなく、(状態マシンを前進させるために)1の値を戻すように修正することができる。再び、これを行うことができる3つの可能な方法は、コンパイル時、ブート時又は実行時に提供される、システム構成情報(例えば、図12のシステム構成変数30)を検査するというものである。
図24及び図25は、ユニプロセッサ又はマルチプロセッサ・システムの何れが得られるかに従って、実行時に猶予期間検出処理が動的に条件付けられる、rcu_try_flip() 状態マシンの修正されたバージョンを例示する。先ず、図24を参照して説明する。ブロック180で、rcu_try_flip() は、try_flip_idle() 関数(図19)を呼び出し、その戻り値を検査する。この戻り値がゼロであれば、ブロック182で、rcu_try_flip() は、新しい状態に前進することなくブレークする。一方、この戻り値が1であれば、ブロック184で、rcu_try_flip() は、マルチプロセッサ環境が存在するか否かを検査する。そうであれば、ブロック186で、状態マシンは、wait_for_ACK 状態104に前進する。
ブロック188で、rcu_try_flip() は、rcu_try_flip_waitack() 関数(図20)を呼び出し、その戻り値を検査する。この戻り値がゼロであれば、ブロック190で、rcu_try_flip() は、新しい状態に前進することなくブレークする。一方、この戻り値が1であれば、ブロック192で、rcu_try_flip() は、wait_for_zero状態106に前進する。また、ブロック184で、ユニプロセッサ環境が存在することを決定する場合にも、状態マシンは、wait_for_zero 状態106に前進する。その場合、wait_for_ACK 状態104は、不要であり除去することができる。
次に、図25を参照して説明する。ブロック194で、rcu_try_flip() は、rcu_try_flip_waitzero() 関数(図21)を呼び出し、その戻り値を検査する。この戻り値がゼロであれば、ブロック196で、rcu_try_flip() は、新しい状態に前進することなくブレークする。一方、この戻り値が1であれば、ブロック198で、rcu_try_flip() は、マルチプロセッサ環境が存在するか否かを検査する。そうであれば、ブロック200で、状態マシンは、wait_for_mb 状態108に前進する。
ブロック202で、rcu_try_flip() は、rcu_try_flip_mb() 関数(図22)を呼び出し、その戻り値を検査する。この戻り値がゼロであれば、ブロック204で、rcu_try_flip() は、新しい状態に前進することなくブレークする。一方、この戻り値が1であれば、ブロック206で、rcu_try_flip() は、アイドル状態102に前進する。また、ブロック198で、ユニプロセッサ環境が存在することを決定する場合にも、状態マシンは、アイドル状態102に前進する。その場合、wait_for_mb 状態108は、不要であり除去することができる。
従って、ユニプロセッサ・システム用の猶予期間検出最適化技術が開示された。当業者には明らかなように、前述の概念は、データ処理システム、コンピュータ実装方法及びコンピュータ・プログラムのうち任意のもので種々に具体化され、そしてそのプログラミング手段は、必要とされる諸機能を実行するようにデータ処理システムを制御する際に使用するための1つ以上のコンピュータ可読媒体によって提供される。図26は、かかるプログラミング手段を提供するために使用することができる、コンピュータ可読媒体300を例示する。この媒体300は、市販ソフトウェアの販売に一般に使用される、読み取り専用のCD−ROM、読み書き可能なCD−R/W及びDVDのような、可搬型の光ストレージ・ディスクとして示されている。かかる媒体は、本発明のプログラミング手段を単独で格納するか、又はオペレーティング・システムのような必要とされる機能を組み込んだ他のソフトウェア製品と共に格納することができる。また、このプログラミング手段は、可搬型の磁気媒体(例えば、フレキシブル・ディスク、フラッシュ・メモリ・スティック等)、ドライブ・システム(例えば、ディスク・ドライブ)と組み合わされた磁気媒体、或いはランダム・アクセス・メモリ(RAM)、読み取り専用メモリ(ROM)、又は他の半導体若しくは固体メモリのようなデータ処理プラットフォームに統合された媒体によって提供することができる。広義には、この媒体は、データ処理システム、コンピュータ、他の命令実行システム又は装置によって、又はこれらに関連して使用するためのプログラミング手段を保持し、格納し、通信し、伝播し又は移送することができる、電子、磁気、光学、電磁気、赤外線、半導体システム若しくは装置、伝送媒体若しくは信号、又は他のエンティティのうち任意のものとすることができる。
以上、本発明の種々の実施形態を説明したが、本発明に従って多数の変形及び代替的な実施形態を実装されることは明らかである。従って、本発明は、請求項の記載事項及びそれらの均等物の精神に従う場合を除き、限定されるべきものではない。
A〜C・・・・・・データ要素
B’・・・・・・・データ要素Bの更新バージョン
r1、r2・・・・読み取り動作(参照者)
u1・・・・・・・更新動作(更新者)
2・・・・・・・・ユニプロセッサ・コンピュータ・システム
2A・・・・・・・対称型マルチプロセッサ(SMP)コンピュータ・システム
〜4・・・・・プロセッサ
6・・・・・・・・共通システム・バス
8・・・・・・・・共用メモリ
10〜10・・・キャッシュ・メモリ
12〜12・・・キャッシュ・コントローラ
14・・・・・・・メモリ・コントローラ
16・・・・・・・共用データセット
18〜18・・・更新動作(更新者)
20〜20・・・RCUインスタンス(RCUサブシステム)
21〜21・・・読み取り動作(参照者)
22・・・・・・・・参照者登録コンポーネント
24・・・・・・・・参照者登録抹消コンポーネント
26・・・・・・・・猶予期間検出コンポーネント
30・・・・・・・・システム構成変数
300・・・・・・コンピュータ可読媒体

Claims (7)

  1. プリエンプタブルなデータ参照者を有するデータ処理システムにおいて、当該データ参照者に影響する共用データの更新動作の後に猶予期間検出を最適化するための方法であって、
    前記データ処理システムがユニプロセッサ・システム又はマルチプロセッサ・システムの何れであるかを決定するステップと、
    前記データ処理システムがユニプロセッサ・システムである場合は、第1の猶予期間検出技術を使用して、猶予期間検出処理を実行するステップと、
    前記データ処理システムがマルチプロセッサ・システムである場合は、第2の猶予期間検出技術を使用して、猶予期間検出処理を実行するステップと、
    前記猶予期間検出処理が、プリエンプションの対象である参照者が静止状態を通過し且つ前記共用データの更新前のビューへの参照を維持することができない、猶予期間の終わりを決定するステップとを含み、
    前記第1の猶予期間検出技術又は前記第2の猶予期間検出技術の何れかを実行するために前記猶予期間検出処理が動的に条件付けられるように、前記決定するステップが実行時に実行される、方法。
  2. 前記第1の猶予期間検出技術が、マルチプロセッサ調整処理を含まず、前記第2の猶予期間検出技術が、前記マルチプロセッサ調整処理を含む、請求項記載の方法。
  3. 前記マルチプロセッサ調整処理が、メモリ・バリアを実行すること及び新しい猶予期間の確認を待機することの一方又は両方を含む、請求項2記載の方法。
  4. データ処理システムであって、
    1つ以上のプロセッサと、
    前記1つ以上のプロセッサに結合されたメモリとを備え、
    前記メモリ内に格納された少なくとも1つのプログラムの命令が、プリエンプタブルなデータ参照者に影響する共用データの更新動作の後に猶予期間検出を最適化するために、前記1つ以上のプロセッサに
    前記データ処理システムがユニプロセッサ・システム又はマルチプロセッサ・システムの何れであるかを決定するステップと、
    前記データ処理システムがユニプロセッサ・システムである場合は、第1の猶予期間検出技術を使用して、猶予期間検出処理を実行するステップと、
    前記データ処理システムがマルチプロセッサ・システムである場合は、第2の猶予期間検出技術を使用して、猶予期間検出処理を実行するステップと、
    前記猶予期間検出処理が、プリエンプションの対象である参照者が静止状態を通過し且つ前記共用データの更新前のビューへの参照を維持することができない、猶予期間の終わりを決定するステップとを実行させ
    前記第1の猶予期間検出技術又は前記第2の猶予期間検出技術の何れかを実行するために前記猶予期間検出処理が動的に条件付けられるように、前記決定するステップを実行時に実行させる、システム。
  5. プリエンプタブルなデータ参照者に影響する共用データの更新動作の後に猶予期間検出を最適化するためのコンピュータ・プログラムであって、
    データ処理システムに
    前記データ処理システムがユニプロセッサ・システム又はマルチプロセッサ・システムの何れであるかを決定するステップと、
    前記データ処理システムがユニプロセッサ・システムである場合は、第1の猶予期間検出技術を使用して、猶予期間検出処理を実行するステップと、
    前記データ処理システムがマルチプロセッサ・システムである場合は、第2の猶予期間検出技術を使用して、猶予期間検出処理を実行するステップと、
    前記猶予期間検出処理が、プリエンプションの対象である参照者が静止状態を通過し且つ前記共用データの更新前のビューへの参照を維持することができない、猶予期間の終わりを決定するステップとを実行させ
    前記第1の猶予期間検出技術又は前記第2の猶予期間検出技術の何れかを実行するために前記猶予期間検出処理が動的に条件付けられるように、前記決定するステップを実行時に実行させる、コンピュータ・プログラム。
  6. プリエンプタブルな参照者を有するデータ処理システムにおいて、共用データの更新動作の後に猶予期間検出を最適化するための方法であって、
    共用データ上で第1段階のデータの更新動作を実行するとともに、当該更新動作中に前記共用データを同時に参照中の参照者のために前記共用データの更新前のビューを一時的に保存するステップと、
    前記データ処理システムがユニプロセッサ・システム又はマルチプロセッサ・システムの何れであるかを動的に決定するステップと、
    前記データ処理システムがユニプロセッサ・システムである場合は、第1の猶予期間検出技術を使用して、猶予期間検出処理を実行するステップと、
    前記データ処理システムがマルチプロセッサ・システムである場合は、第2の猶予期間検出技術を使用して、猶予期間検出処理を実行するステップと、
    前記猶予期間検出処理が、プリエンプションの対象である参照者が静止状態を通過し且つ前記共用データの前記更新前のビューへの参照を維持することができない、猶予期間の終わりを決定するステップと、
    前記猶予期間の後に第2段階の更新動作を実行するステップとを含み、
    前記第1の猶予期間検出技術又は前記第2の猶予期間検出技術の何れかを実行するために前記猶予期間検出処理が動的に条件付けられるように、前記動的に決定するステップが実行時に実行される、方法。
  7. 請求項1乃至請求項または請求項の何れか1項に記載の方法の各ステップをコンピュータに実行させるためのコンピュータ・プログラム。
JP2009148307A 2008-07-28 2009-06-23 ユニプロセッサ・システム上のプリエンプタブルな読み取り・コピー・更新のための猶予期間検出の最適化 Expired - Fee Related JP5398375B2 (ja)

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
US12/181125 2008-07-28
US12/181,125 US7953708B2 (en) 2008-07-28 2008-07-28 Optimizing grace period detection for preemptible read-copy update on uniprocessor systems

Publications (2)

Publication Number Publication Date
JP2010033554A JP2010033554A (ja) 2010-02-12
JP5398375B2 true JP5398375B2 (ja) 2014-01-29

Family

ID=41569576

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2009148307A Expired - Fee Related JP5398375B2 (ja) 2008-07-28 2009-06-23 ユニプロセッサ・システム上のプリエンプタブルな読み取り・コピー・更新のための猶予期間検出の最適化

Country Status (3)

Country Link
US (1) US7953708B2 (ja)
JP (1) JP5398375B2 (ja)
KR (1) KR20100012805A (ja)

Families Citing this family (39)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2009025847A2 (en) 2007-08-21 2009-02-26 Nodality, Inc. Methods for diagnosis, prognosis and methods of treatment
US8195893B2 (en) * 2008-11-03 2012-06-05 International Business Machines Corporation Eliminating synchronous grace period detection for non-preemptible read-copy update on uniprocessor systems
US8407503B2 (en) 2010-09-27 2013-03-26 International Business Machines Corporation Making read-copy update free-running grace period counters safe against lengthy low power state sojourns
US8615771B2 (en) 2011-06-20 2013-12-24 International Business Machines Corporation Effective management of blocked-tasks in preemptible read-copy update
US9189413B2 (en) 2011-06-20 2015-11-17 International Business Machines Corporation Read-copy update implementation for non-cache-coherent systems
US9250978B2 (en) 2011-06-27 2016-02-02 International Business Machines Corporation Asynchronous grace-period primitives for user-space applications
US20140157279A1 (en) * 2011-07-29 2014-06-05 Nec Corporation Information processing apparatus, information processing system, information processing method and control program storage medium
US9009122B2 (en) 2011-12-08 2015-04-14 International Business Machines Corporation Optimized resizing for RCU-protected hash tables
US8661005B2 (en) 2011-12-08 2014-02-25 International Business Machines Corporation Optimized deletion and insertion for high-performance resizable RCU-protected hash tables
US9256476B2 (en) 2011-12-10 2016-02-09 International Business Machines Corporation Expedited module unloading for kernel modules that execute read-copy update callback processing code
US9003420B2 (en) 2012-05-18 2015-04-07 International Business Machines Corporation Resolving RCU-scheduler deadlocks
US8938631B2 (en) 2012-06-30 2015-01-20 International Business Machines Corporation Energy efficient implementation of read-copy update for light workloads running on systems with many processors
US8874535B2 (en) 2012-10-16 2014-10-28 International Business Machines Corporation Performance of RCU-based searches and updates of cyclic data structures
US8924655B2 (en) 2013-02-04 2014-12-30 International Business Machines Corporation In-kernel SRCU implementation with reduced OS jitter
US8972801B2 (en) 2013-02-04 2015-03-03 International Business Machines Corporation Motivating lazy RCU callbacks under out-of-memory conditions
US9348765B2 (en) 2013-03-14 2016-05-24 International Business Machines Corporation Expediting RCU grace periods under user mode control
US9244844B2 (en) 2013-03-14 2016-01-26 International Business Machines Corporation Enabling hardware transactional memory to work more efficiently with readers that can tolerate stale data
US9396226B2 (en) 2013-06-24 2016-07-19 International Business Machines Corporation Highly scalable tree-based trylock
US9389925B2 (en) 2013-12-03 2016-07-12 International Business Machines Corporation Achieving low grace period latencies despite energy efficiency
US9245619B2 (en) 2014-03-04 2016-01-26 International Business Machines Corporation Memory device with memory buffer for premature read protection
US9690709B2 (en) * 2014-07-14 2017-06-27 Oracle International Corporation Variable handles
US9720836B2 (en) 2015-05-11 2017-08-01 International Business Machines Corporation Preemptible-RCU CPU hotplugging while maintaining real-time response
US9552236B2 (en) 2015-05-12 2017-01-24 International Business Machines Corporation Tasks—RCU detection of tickless user mode execution as a quiescent state
US9886329B2 (en) 2015-06-25 2018-02-06 International Business Machines Corporation Scalable RCU callback offloading
US9965432B2 (en) 2015-10-02 2018-05-08 International Business Machines Corporation Handling CPU hotplug events in RCU without sleeplocks
US10140131B2 (en) 2016-08-11 2018-11-27 International Business Machines Corporation Shielding real-time workloads from OS jitter due to expedited grace periods
US10353748B2 (en) 2016-08-30 2019-07-16 International Business Machines Corporation Short-circuiting normal grace-period computations in the presence of expedited grace periods
US10282230B2 (en) 2016-10-03 2019-05-07 International Business Machines Corporation Fair high-throughput locking for expedited grace periods
US10146577B2 (en) 2016-12-11 2018-12-04 International Business Machines Corporation Enabling real-time CPU-bound in-kernel workloads to run infinite loops while keeping RCU grace periods finite
US10372510B2 (en) 2017-03-15 2019-08-06 International Business Machines Corporation Using expedited grace periods to short-circuit normal grace-period computations
US11055271B2 (en) 2017-11-13 2021-07-06 International Business Machines Corporation Funnel locking for sleepable read-copy update
US10983840B2 (en) 2018-06-21 2021-04-20 International Business Machines Corporation Consolidating read-copy update types having different definitions of a quiescent state
US10268610B1 (en) 2018-08-16 2019-04-23 International Business Machines Corporation Determining whether a CPU stalling a current RCU grace period had interrupts enabled
US10831542B2 (en) 2018-10-01 2020-11-10 International Business Machines Corporation Prevent counter wrap during update-side grace-period-request processing in tree-SRCU implementations
US10613913B1 (en) 2018-10-06 2020-04-07 International Business Machines Corporation Funnel locking for normal RCU grace period requests
US11386079B2 (en) 2019-06-26 2022-07-12 International Business Machines Corporation Replacing preemptible RCU with an augmented SRCU implementation
US10977042B2 (en) 2019-07-26 2021-04-13 International Business Machines Corporation Using expedited RCU grace periods to avoid out-of-memory conditions for offloaded RCU callbacks
US11321147B2 (en) 2019-08-29 2022-05-03 International Business Machines Corporation Determining when it is safe to use scheduler lock-acquiring wakeups to defer quiescent states in real-time preemptible read-copy update
US11288095B2 (en) * 2019-09-30 2022-03-29 Advanced Micro Devices, Inc. Enhanced atomics for workgroup synchronization

Family Cites Families (22)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5515538A (en) * 1992-05-29 1996-05-07 Sun Microsystems, Inc. Apparatus and method for interrupt handling in a multi-threaded operating system kernel
US5442758A (en) 1993-07-19 1995-08-15 Sequent Computer Systems, Inc. Apparatus and method for achieving reduced overhead mutual exclusion and maintaining coherency in a multiprocessor system utilizing execution history and thread monitoring
US6173375B1 (en) * 1997-02-28 2001-01-09 Lucent Technologies Inc. Method for accessing a shared resource in a multiprocessor system
US6886162B1 (en) 1997-08-29 2005-04-26 International Business Machines Corporation High speed methods for maintaining a summary of thread activity for multiprocessor computer systems
US6490671B1 (en) * 1999-05-28 2002-12-03 Oracle Corporation System for efficiently maintaining translation lockaside buffer consistency in a multi-threaded, multi-processor virtual memory system
US7430627B2 (en) 2000-12-19 2008-09-30 International Business Machines Corporation Adaptive reader-writer lock
US6996812B2 (en) 2001-06-18 2006-02-07 International Business Machines Corporation Software implementation of synchronous memory barriers
US7426511B2 (en) 2004-03-08 2008-09-16 International Business Machines Corporation Efficient support of consistent cyclic search with read-copy-update
US7349926B2 (en) 2004-03-30 2008-03-25 International Business Machines Corporation Atomic renaming and moving of data files while permitting lock-free look-ups
US7287135B2 (en) 2004-09-29 2007-10-23 International Business Machines Corporation Adapting RCU for real-time operating system usage
US7472228B2 (en) 2004-10-27 2008-12-30 International Business Machines Corporation Read-copy update method
US7454581B2 (en) 2004-10-27 2008-11-18 International Business Machines Corporation Read-copy update grace period detection without atomic instructions that gracefully handles large numbers of processors
US20060112121A1 (en) 2004-11-23 2006-05-25 Mckenney Paul E Atomically moving list elements between lists using read-copy update
US8126843B2 (en) 2004-11-30 2012-02-28 International Business Machines Corporation Cluster-wide read-copy update system and method
US8176489B2 (en) 2004-12-09 2012-05-08 International Business Machines Corporation Use of rollback RCU with read-side modifications to RCU-protected data structures
US8250047B2 (en) 2005-05-20 2012-08-21 International Business Machines Corporation Hybrid multi-threaded access to data structures using hazard pointers for reads and locks for updates
US7395263B2 (en) 2005-10-12 2008-07-01 International Business Machines Corporation Realtime-safe read copy update with lock-free readers
US7395383B2 (en) 2005-11-01 2008-07-01 International Business Machines Corporation Realtime-safe read copy update with per-processor read/write locks
US7353346B2 (en) 2006-03-24 2008-04-01 International Business Machines Corporation Read-copy-update (RCU) operations with reduced memory barrier usage
US7818306B2 (en) 2006-03-24 2010-10-19 International Business Machines Corporation Read-copy-update (RCU) operations with reduced memory barrier usage
US7734879B2 (en) 2006-07-27 2010-06-08 International Business Machines Corporation Efficiently boosting priority of read-copy update readers in a real-time data processing system
US20080082532A1 (en) 2006-10-03 2008-04-03 International Business Machines Corporation Using Counter-Flip Acknowledge And Memory-Barrier Shoot-Down To Simplify Implementation of Read-Copy Update In Realtime Systems

Also Published As

Publication number Publication date
KR20100012805A (ko) 2010-02-08
US7953708B2 (en) 2011-05-31
JP2010033554A (ja) 2010-02-12
US20100023559A1 (en) 2010-01-28

Similar Documents

Publication Publication Date Title
JP5398375B2 (ja) ユニプロセッサ・システム上のプリエンプタブルな読み取り・コピー・更新のための猶予期間検出の最適化
US8195893B2 (en) Eliminating synchronous grace period detection for non-preemptible read-copy update on uniprocessor systems
US8495641B2 (en) Efficiently boosting priority of read-copy update readers while resolving races with exiting and unlocking processes
US8924655B2 (en) In-kernel SRCU implementation with reduced OS jitter
US9081803B2 (en) Performance of RCU-based searches and updates of cyclic data structures
US7734879B2 (en) Efficiently boosting priority of read-copy update readers in a real-time data processing system
JP5547208B2 (ja) シーケンシャル・プログラムを複数スレッドに分解し、スレッドを実行し、シーケンシャルな実行を再構成するシステム、方法および装置
US8615771B2 (en) Effective management of blocked-tasks in preemptible read-copy update
US8997110B2 (en) Resolving RCU-scheduler deadlocks
US8612949B2 (en) Methods and apparatuses for compiler-creating helper threads for multi-threading
US7395383B2 (en) Realtime-safe read copy update with per-processor read/write locks
JP4551452B2 (ja) 多数のプロセッサをグレースフルに処理するアトミック命令なしリード・コピー・アップデートの猶予時間検出
US8020160B2 (en) User-level read-copy update that does not require disabling preemption or signal handling
US20080082532A1 (en) Using Counter-Flip Acknowledge And Memory-Barrier Shoot-Down To Simplify Implementation of Read-Copy Update In Realtime Systems
US9720836B2 (en) Preemptible-RCU CPU hotplugging while maintaining real-time response
US10162644B2 (en) Shielding real-time workloads from OS jitter due to expedited grace periods
US10282230B2 (en) Fair high-throughput locking for expedited grace periods
US5408658A (en) Self-scheduling parallel computer system and method
US20170097916A1 (en) Handling CPU Hotplug Events In RCU Without Sleeplocks
Hong et al. Fence-Free Synchronization with Dynamically Serialized Synchronization Variables
Steffan et al. Extending cache coherence to support thread-level data speculation on a single chip and beyond
Mowry Extending Cache Coherence to Support Thread-Level Data Speculation on a Single Chip and Beyond

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20120216

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20130717

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20130723

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20130912

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20131001

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20131022

R150 Certificate of patent or registration of utility model

Free format text: JAPANESE INTERMEDIATE CODE: R150

LAPS Cancellation because of no payment of annual fees