(57)【要約】      （修正有）【課題】多くのブロックを有するハードドライブなどの永続記憶装置にデータを格納する場合にリード・モディファイ・ライトサイクルを経るのを回避することができる記録方法を提供する。【解決手段】方法は、ドライバがデータを仮想位置に書き込むための要求を受信する工程と、当該データを永続記憶装置上の物理的位置に書き込む工程と、仮想位置から物理的位置へのマッピングを記録する工程とを含む。物理的位置は永続記憶装置上のブロックの順番における次の空きブロックに対応している。【選択図】図１
2020042805.tif 000002
【特許請求の範囲】
【請求項１】
データを仮想位置に書き込むための要求を受信する工程と、
前記データを永続記憶装置上の物理的位置に書き込む工程と、
前記仮想位置から前記物理的位置へのマッピングを記録する工程と
を含み、
前記物理的位置は前記永続記憶装置上のブロックの順番における次の空きブロックに対応していることを特徴とする方法。
【請求項２】
前記仮想位置と前記物理的位置は相関していない、請求項１に記載の方法。
【請求項３】
前記物理的位置は先頭カウンタによって決定される、請求項１または２に記載の方法。
【請求項４】
前記データの前記物理的位置への書き込み後に前記先頭カウンタを更新する工程をさらに含む、請求項３に記載の方法。
【請求項５】
仮想位置に対応するさらなるデータを書き込むための１つ以上の要求を受信する工程をさらに含み、
前記データと前記さらなるデータはデータストリームを形成している、
請求項１〜４のいずれか１項に記載の方法。
【請求項６】
前記データの第２の位置への書き込みは前記永続記憶装置からの読み出しを行うことなく生じる、請求項１〜５のいずれか１項に記載の方法。
【請求項７】
前記データのためのチェックサムを計算する工程と、
前記チェックサムを前記永続記憶装置に関連づけられたメタデータに記録する工程と
をさらに含む、請求項１〜６のいずれか１項に記載の方法。
【請求項８】
ガベージコレクション条件が満たされていることを決定する工程をさらに含む、請求項１〜７のいずれか１項に記載の方法。
【請求項９】
前記ガベージコレクション条件は、
前記永続記憶装置上のギャップの数が所定の閾値を超えること、
前記永続記憶装置の活動レベルが閾値未満になること、
前記永続記憶装置の空き容量が閾値未満になること、または
期間が経過したこと
のうちの１つ以上を含む、請求項８に記載の方法。
【請求項１０】
ガベージコレクション条件が満たされていることを決定する工程に応答して、
ブロックの順番の末尾にあるブロックを決定する工程と、
前記ブロックにあるデータをブロックの順番の先頭に書き込む工程と、
前記書き込みに基づいて前記マッピングを更新する工程と
をさらに含む、請求項８または９に記載の方法。
【請求項１１】
前記データを永続記憶装置上の物理的位置に書き込む前記工程は、
前記物理的位置がストライプ内のブロックに対応し、前記ストライプは対応する複数のブロックを含み、各ブロックが複数の永続記憶装置のそれぞれの上の物理的位置であることを特徴とする前記データを永続記憶装置上の物理的位置に書き込む前記工程を含む、請求項１〜１０のいずれか１項に記載の方法。
【請求項１２】
前記ストライプ内の所定の数のブロックが書き込まれたことを決定する工程と、
前記ストライプ内の前記所定の数のブロックに書き込まれたデータに対応するパリティを計算する工程と、
パリティデータを前記ストライプ内の１つ以上のブロックに書き込む工程と
をさらに含む、請求項１１に記載の方法。
【請求項１３】
前記取り出したデータのためのチェックサムを取り出す工程と、
前記取り出したデータのためのチェックサムを計算する工程と、
前記計算したチェックサムを前記取り出したチェックサムと比較する工程と
をさらに含む、請求項１２に記載の方法。
【請求項１４】
ストライプのブロックが欠けていることを決定する工程と、
前記欠けているブロックにあるデータを前記ストライプ内の１つ以上の他のブロックから再構成する工程と、
前記データをブロックの順番の先頭に書き込む工程と、
前記書き込みに基づいて前記マッピングを更新する工程と、
をさらに含む、請求項１１〜１３のいずれか１項に記載の方法。
【請求項１５】
前記複数の永続記憶装置の中の１つの永続記憶装置が利用不可能であることを決定する工程をさらに含み、
前記データを永続記憶装置上の物理的位置に書き込む前記工程は、
前記データを前記複数の永続記憶装置のうちの異なる１つの永続記憶装置上の物理的位置に書き込む工程
を含む、
請求項１１〜１４のいずれか１項に記載の方法。
【請求項１６】
前記仮想位置から前記物理的位置へのマッピングを記録する工程は、
前記仮想位置から前の物理的位置へのマッピングを特定する工程と、
前記仮想位置から前記物理的位置へのマッピングを記録するために前記マッピングを更新する工程と
を含む、請求項１〜１４のいずれか１項に記載の方法。
【請求項１７】
前の物理的位置に対応するブロックをダーティとして記録する工程をさらに含む、請求項１６に記載の方法。
【請求項１８】
前記データの複製物をその後の物理的位置に書き込む工程をさらに含む、請求項１〜１７のいずれか１項に記載の方法。
【請求項１９】
１つ以上のプロセッサと、
メモリと
を備え、
前記メモリは、前記１つ以上のプロセッサによって実行された場合に、前記１つ以上のプロセッサを請求項１〜１８のいずれか１項に記載の方法を実行するように構成する命令を含むことを特徴とするシステム。
【請求項２０】
１つ以上のプロセッサによって実行された場合に前記１つ以上のプロセッサに請求項１〜１８のいずれか１項に記載の方法を実行させる命令を含む１つ以上の非一時的コンピュータ可読媒体。
【請求項２１】
１つ以上のプロセッサによって実行された場合に、前記１つ以上のプロセッサに請求項１〜１８のいずれか１項に記載の方法を実行させるコンピュータプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
これは永続記憶装置の管理に関する。
【背景技術】
【０００２】
多くのブロックを有するハードドライブなどの永続記憶装置にデータを格納することがある。データをドライブに書き込むための要求により、データを書き込む場所である永続記憶装置の物理的位置（ブロックなど）を指定することができる。データをドライブから読み出すための要求により、データを読み出す場所である永続記憶装置の物理的位置（ブロックなど）を指定することができる。
【発明の概要】
【０００３】
第１の例示的実施形態では、データを仮想位置に書き込むための要求を受信する工程と、当該データを永続記憶装置上の物理的位置に書き込む工程と、仮想位置から物理的位置へのマッピングを記録する工程とを含み、物理的位置は永続記憶装置上のブロックの順番における次の空きブロックに対応していることを特徴とする方法が提供される。
【０００４】
本説明は特定の実施形態を示す図面を参照しながら例として記載されている。但し、これらは例示のためにのみ提供されている。
【図面の簡単な説明】
【０００５】
【図１】書き込み要求を処理するための例示的手法を示す。
【図２】図１の手法の実例を示す。
【図３】データをストライプ内に格納する場合の書き込み要求を処理するための例示的手法を示す。
【図４Ａ】図３の手法の実例を示す。
【図４Ｂ】図３の手法の実例を示す。
【図５】読み出し要求を処理するための例示的手法を示す。
【図６】欠けているブロックのブロック再構成を処理するための例示的手法を示す。
【図７】更新要求を処理するための例示的手法を示す。
【図８】ガベージコレクションのための例示的手法を示す。
【図９】図８の手法の実例を示す。
【図１０】例示的コンピュータシステム９００のブロック図を示す。
【発明を実施するための形態】
【０００６】
いくつかの実施形態では、ドライバがデータを仮想位置に書き込むための要求を受信し、データを次の空き物理的位置に順次に書き込み、かつ仮想位置と物理的位置とのマッピングを記録する方法が提供される。常にデータをディスク上の次の空きブロックに格納することにより、これを使用してディスクがリード・モディファイ・ライトサイクルを経るのを回避することができる。これにより処理能力および書き込み速度を向上させることができる。
【０００７】
この場合、「次」とはブロックの順番における次を指してもよい。この順番は特定の永続記憶装置の構成に基づいて決定してもよい。例えば「次」は少なくとも部分的に、現在のブロックから最も短い期待シーク時間を有するブロックに基づいていてもよい。
【０００８】
この方法はドライバを介して実装されていてもよい。ドライバはデータを書き込み、データを読み出し、かつデータを更新するための機能を提供してもよい。このように、ドライバは永続記憶装置などのブロックデバイスのための全ての必要な機能を提供する。特にドライバは、カーネルモジュールからシステムコールを受信し、かつ次いで基礎となる永続装置にデータを書き込むユーザ空間アプリケーションであってもよい。
【０００９】
書き込み
図１は、ドライバがハードドライブなどの永続記憶装置への書き込み要求を処理する例示的手法を示す。これはシステムを実行しているドライバに実装されていてもよい。
【００１０】
工程１０１では、データを永続記憶装置の第１の位置に書き込むための要求を受信する。この要求はドライバの関数呼び出しによって受信してもよい。この要求は当該データを含んでいてもよく、あるいは当該データを取り出すことができる場所へのポインタ（例えばメモリアドレス）を含んでいてもよい。
【００１１】
第１の位置は永続装置上の物理的位置に対応していないことがあるため、仮想位置である。但し、ドライバによるリダイレクションはドライバのユーザから見えないため、第１の位置は物理的位置であるかのように構造化されている。従ってこの要求は、ブロックのインデックスなどの第１の位置の識別子およびディスク識別子を含んでいてもよい。従って仮想位置から当該データを読み出すためのその後の要求は、当該データの物理的位置に関わらず同じデータを戻さなければならない。
【００１２】
場合によっては、当該データはデータの流れの一部であってもよい。従ってデータを書き込むための要求は、その流れの中のブロックごとに受信される（または受信されながら処理される）。
【００１３】
工程１０２では、当該データを第２の位置に書き込む。第２の位置は、永続記憶装置上のブロックに対応する物理的位置である。但し、これは仮想位置によって指示されている任意のブロックとは異なってもよい。仮想位置は物理的位置とは相関していなくてもよい。
【００１４】
特に物理的位置は、永続記憶装置の先頭、すなわち永続記憶装置の次の空きブロックまたは永続記憶装置の次の空きブロックの順番であってもよい。これは永続記憶装置の次の空きブロックのインデックスを記録する先頭カウンタによって永続記憶装置に記録することができる。空きブロックは全くデータが格納されていないブロックであるか、データが格納されている場合、そのデータを取り出し可能にする必要はない。このように、当該ブロックは既に書き込まれているブロックの順番に追加される。
【００１５】
次の空きブロック（これは定義どおり空いている）に書き込むことにより、指示されているブロックのデータが変更されたか否かを決定する必要はない。これにより最初に当該ブロックから読み出す必要性を回避し、従って向上したパフォーマンスを得ることができる。
【００１６】
さらに、物理的位置は仮想位置と相関している必要はないため、要求側（プログラムなど）はこれを達成するために次の空きブロックがどこにあるかを決定する必要はない。データを取り出すためのラベルとしての位置の機能は、永続記憶装置を維持するための機構としての位置の機能とは切り離されている。これらの機能は仮想位置および物理的位置によってそれぞれ実行される。
【００１７】
工程１０３では、物理的位置によって指示されているブロックにあるデータのためのチェックサムを計算する。チェックサムは暗号学的ハッシュであってもよい。これを使用してその後に当該ブロックから取り出されたデータが当該ブロックに格納されているデータと同じであるかを確認することができる。場合によっては、チェックサムは当該ブロックにおけるいくつかのエラーを訂正することができるパリティ情報を含んでいてもよい。
【００１８】
工程１０４では、永続記憶装置のためのメタデータを更新する。
【００１９】
メタデータは仮想位置から物理的位置へのマッピングを含む。これは、仮想位置（要求側または別のプロセスがこれを使用して意図されているデータを取り出すように指示することができる）を物理的位置（実際のデータが格納されている場所）にリンクさせる。メタデータは各ブロックのためのチェックサムをさらに含む。
【００２０】
メタデータは永続記憶装置に格納されていてもよい。例えば、これは永続記憶装置の所定の部分であってもよい。追加または代わりとしてメタデータは、キャッシュとして使用するために最適化されていてもよい別個の永続記憶装置に格納されている。
【００２１】
場合によっては、ブロックのためのメタデータを更新する工程は、第１の位置によって指示されているブロックのためのメタデータが既に存在するか否かを決定することを含む。それが存在する場合、元のメタデータを更新し、かつ置換メタデータを挿入してもよい（または新しいメタデータを元のメタデータの上に上書きしてもよい）。これは、メタデータが同じデータの複数のエントリを有するのを防止することができる。前の位置に対応する物理的位置は自由に上書きできることを示すダーティ（ｄｉｒｔｙ）としてマークしてもよい。
【００２２】
工程１０５では、次の空きブロックを反映させるために先頭カウンタを更新する。
【００２３】
これは、先頭カウンタを永続記憶装置のブロックの順番における次のブロックまでインクリメントすること（または最後のブロックまで到達したら第１のブロックに戻すこと）を含んでもよい。但し場合によっては、特定のブロックをスキップしてもよい（例えば、それらが永続記憶装置の不良部分に対応していたり、永続記憶装置が見つからなかったりする場合）。
【００２４】
これは末尾を計算することを必要としてもよい。末尾はデータが書き込まれた先頭の前のブロックの順番において最も早いブロックに対応してもよい。最も早いブロックは最小インデックスを有していなくてもよい。インクリメントされた先頭カウンタが末尾と等しい場合、これは先頭カウンタによって指示されている名目上の次の空きブロックが実際には空いてないこと、すなわちそこにはデータが書き込まれていることを示す。この場合、通知、警告またはエラーを発行してもよく、かつ／またはガベージコレクションプロセスを行ってもよい。例示的なガベージコレクションプロセスは図８を参照しながら示されている。ガベージコレクションプロセスが完了するまで、ドライバはデータを書き込むためのそれ以上の要求を処理することを拒否してもよい。
【００２５】
あるいは、末尾はデータを順次に書き込むことができる位置であってもよい。場合によっては、これはガベージコレクションされる領域に対応してもよい。
【００２６】
場合によっては、末尾はガベージコレクション手順に基づいて更新される末尾カウンタとして記録されてもよい。
【００２７】
いくつかの従来の書き込み手法のリード・モディファイ・ライトサイクルが回避され得るため、この手法はデータを永続記憶装置に書き込む高パフォーマンス手法を提供する。またデータは順次に書き込まれるので、これにより典型的により速い書き込み速度が得られる。
【００２８】
さらなる利点は、本手法を用いて永続記憶装置の寿命を延ばすことができることである。従来の手法では、単一のブロックが故障するかその最大数の書き込みに到達した場合に装置全体が取り替えられることが多い。例えばハードディスクの場合、単一のホットスポット（１つの物理アドレスに対応する）により、大容量の永続記憶装置が一度も書き込まれていないとしても永続記憶装置はその寿命の終わりに達してしまう可能性がある。しかし本手法では、先頭は永続記憶装置全体を隈なく移動する。データは常に先頭に書き込まれるので、これにより当然のことながら永続記憶装置全体にわたって等しいレベルの書き込みが生じる。すなわち、各ブロックは一般に、書き込まれているデータの仮想アドレスに関わらずあらゆるブロックが二度書き込まれる前に一度書き込まれる。従ってこの手法により、永続記憶装置の時期尚早の摩耗を回避することができる。
【００２９】
書き込みの例
図２は、図１に示されている手法をどのように使用してデータの流れを永続記憶装置に書き込むことができるかの実例を示す。図２では、ドライバはデータを単一の永続記憶装置（ハードドライブなど）に書き込む。
【００３０】
２００では本システムはその初期状態で示されている。先頭カウンタは、書き込まれる次の空きブロックとして位置０を示している。そのマッピングは空である。
【００３１】
２０１では、ドライバは、データを仮想位置６に書き込むための要求ａを受信する。先頭カウンタは、次の空きブロックとして物理的位置０を指示しているので、データａはチェックサムｈ（ａ）と共に物理的位置０に書き込まれる。仮想位置６から物理的位置０へのマッピングを示すためにそのマッピングは更新される。先頭カウンタは物理的位置１までインクリメントされる。末尾を計算すると先頭カウンタとは異なる物理的位置０にある。
【００３２】
２０２では、ドライバは、データを仮想位置３に書き込むための要求ｂを受信する。先頭カウンタは次の空きブロックとして物理的位置１を指示しているので、データｂはチェックサムｈ（ｂ）と共に物理的位置１に書き込まれる。仮想位置３から物理的位置１へのマッピングを示すためにそのマッピングは更新される。先頭カウンタは物理的位置２までインクリメントされる。末尾を計算すると先頭カウンタとは異なる物理的位置０にある。
【００３３】
２０３では、ドライバは、データを仮想位置２に書き込むための要求ｃを受信する。先頭カウンタは次の空きブロックとして物理的位置２を指示しているので、データｃはチェックサムｈ（ｃ）と共に物理的位置２に書き込まれる。仮想位置２から物理的位置２へのマッピングを示すためにそのマッピングは更新される。先頭カウンタは物理的位置３までインクリメントされる。末尾を計算すると先頭カウンタとは異なる物理的位置０にある。
【００３４】
２０４では、ドライバは、データを仮想位置３に書き込むための要求ｂ’を受信する。先頭カウンタは次の空きブロックとして物理的位置３を指示しているので、データｄはチェックサムｈ（ｂ’）と共に物理的位置３に書き込まれる。仮想位置３から物理的位置３へのマッピングを示すためにそのマッピングは更新される。これにより仮想位置３から物理的位置１への前のマッピングを置き換える。従って物理的位置１はダーティとしてマークされ、ガベージコレクションプロセスにおいて解放することができる。但し、物理的位置１にあるデータはこのガベージコレクションプロセスが生じるまで物理的位置１に残ったままである。
【００３５】
先頭カウンタは物理的位置４までインクリメントされる。末尾を計算すると先頭カウンタとは異なる物理的位置０にある。
【００３６】
この例は本手法による書き込みの順次性を実証している。ドライバは様々なデータを仮想位置に書き込むための要求を受信しながら、ドライバは実際に順次に書き込む。これにより書き込み動作の間にドライバが永続記憶装置から読み出す必要性を回避し、従ってランダムデータを書き込むためにより高いパフォーマンスを提供することができる。
【００３７】
アレイへの書き込み
同様の手法を使用して、データを永続記憶装置のアレイを跨るストライプとして書き込んでもよい。このように、当該装置のサブセットをデータのために使用することができ、かつその残りの装置をパリティのために使用することができる。
【００３８】
構成中に、ドライバを特定の障害許容力を有するように構成してもよい。すなわち、ｎ個の永続記憶装置のアレイの中で、データは当該データを跨るストライプ内に格納される。各ストライプはｎ個のブロックを含み、そのうちの１つは各永続記憶装置上にある。各ストライプ内のｋ個のブロックはデータを含み、ｍ個のブロックはパリティであり、故にｎ＝ｋ＋ｍである。従って、ストライプ内のブロックの任意のｋ個が利用可能であれば（当該ブロックがデータであるかパリティであるかは問わない）当該データを回復させることができる。これはｋ＋ｍパリティと記述してもよい。１つの一般的な配置は８＋２パリティ（ここではストライプの中に８個のデータブロックおよび２個のパリティブロックが存在している）であるが、任意の値のｋおよびｍを使用してもよい。
【００３９】
そのようなスキームにおいてパリティデータを生成するための１つの手法は消失訂正符号を使用することである。消失訂正符号については以下により詳細に記載されている。
【００４０】
各ストライプのブロックは、全ての永続記憶装置上の同じインデックスが付された物理的位置に格納される。例えば、ストライプ０は全ての装置上の位置０にあるブロックからなる。従ってドライバは当該装置の全てに共有する単一の先頭カウンタを維持することができる。
【００４１】
分かりやすくするために単一の先頭カウンタが記載されているが、実際には各永続記憶装置が別個の先頭カウンタを維持してもよい。これにより１つの装置上でガベージコレクションを行いながら別の装置上で書き込みを行うことが可能になる。
【００４２】
その後のストライプがパリティのために異なるドライブを使用することは有用であり得る。これを管理するための１つの方法は、ストライプ０がドライブ０で開始し、ストライプ１がドライブ１で開始する…のように、各ストライプのために開始ドライブを指定することである。これにより、当然のことながらパリティブロック（これはデータブロックの後に書き込まれる）は異なるドライブ上に位置づけられる。
【００４３】
図３は、データがそのようなストライプに格納される書き込み要求を処理するための例示的手法を示す。これはシステム上で動作しているドライバに実装されていてもよい。
【００４４】
工程３０１では、ｋ個のデータブロックを書き込むための要求を受信する。この要求は工程１０１で受信される要求に対応する。
【００４５】
工程３０２では、ｋ個のデータブロックを受信した後に、ドライバは書き込まれたデータに基づいてパリティデータを計算する。これによりｍ個のパリティデータブロックが得られる。
【００４６】
工程３０３では、ｋ個のデータブロックおよびｍ個のパリティデータブロックのそれぞれを先頭カウンタによって指示されている物理的位置において対応する永続記憶装置に書き込む。これによりそのストライプが完成する。またｋ＋ｍ個のチェックサムを、それぞれがブロックに対応しているメタデータに書き込む。
【００４７】
工程３０４では、工程１０５と同様の方法で各装置にある次の空きブロックの物理的位置を反映させるために先頭カウンタを更新する。ブロックを先頭カウンタによって指示されている物理的位置において各永続記憶装置に書き込んだら、先頭カウンタをその順番における次の空き位置までインクリメントしてもよい。
【００４８】
この手法はいくつかの従来の書き込み手法のリード・モディファイ・ライトサイクルを回避することができるため、データを永続記憶装置のアレイに書き込むための高パフォーマンス手法を提供する。
【００４９】
これは、従来の手法ではより高いパリティと共に生じるペナルティも回避する。データを修正することができる場合、全ての修正後にパリティを更新しなければならない。従って、ストライプに２個のパリティブロックが存在する場合、１個のデータを修正するには、当該データ自体のリード・モディファイ・ライトサイクル＋各パリティブロックのための２回のさらなるリード・モディファイ・ライトサイクルが必要になる。この拡大は従来のシステム内で実用的であるパリティのレベルに対してパフォーマンス限界を課す。実際にはパリティは、このような理由で従来のシステムでは２つに制限される。
【００５０】
対照的に、図３に示されている手法はどんなリード・モディファイ・ライトサイクルも必要としない。従って、パリティを増加させてもオーバヘッドが増加する速度は従来の手法よりも非常に遅い。従ってパリティはほぼ無制限であってもよく、実際には２個、４個または１２個のパリティを使用することができる。
【００５１】
同様に、図３に示されている手法は任意の特定のサイズのアレイに限定されず、アレイに数百の永続記憶装置が存在してもよい。実際には約１０個の永続記憶装置を有するアレイを使用することができる。
【００５２】
さらに、各装置における動作数は比較的少ないので、より遅い永続記憶装置であっても高レベルのパフォーマンスを提供することができる。
【００５３】
場合によっては、アレイ内の１つの装置が故障したりそれ以外の理由で利用不可能になったりしてもよい。このような問題が生じた場合、その装置に書き込まれることが意図されていたかもしれないブロックは単にアレイ内の次の装置に書き込むことができる。このように、故障した装置は実質的に書き込みを妨害しない。
【００５４】
そのような場合、本システムはなおｋ＋ｍパリティを使用すると言える。但し各ストライプについては、ｍ個のパリティブロックを維持するために、ｋ個よりも少ないデータブロック（装置の故障が原因）がストライプ内に書き込まれる結果となり得る。
【００５５】
アレイへの書き込みの例
図４Ａおよび図４Ｂは、データの流れを永続記憶装置のアレイに書き込むために図３に示されている手法を使用できるようにする例示的プロセスを示す。図４Ａおよび図４Ｂでは、ドライバはデータを５つの永続装置のアレイに書き込む。ドライバは３＋２パリティ（すなわち、全ての３個のデータブロックのために２個のパリティブロック）を使用するように構成されている。
【００５６】
４００では、当該システムはその初期状態で示されている。先頭カウンタは、書き込まれる次の空きブロックとして位置０を指示している。そのマッピングは空である。ドライブ０、１、２、３および４のそれぞれが空である。
【００５７】
４０１では、ドライバは、仮想位置６にデータａを書き込むための要求を受信する。先頭カウンタは次の空きブロックとして物理的位置０を指示しているので、データａはチェックサムｈ（ａ）と共にドライブ０上の物理的位置０に書き込まれる。そのマッピングは仮想位置６からドライブ０上の物理的位置０へのマッピングを示すために更新される。そのストライプはまだ完成していないので、先頭カウンタはインクリメントされていない。
【００５８】
４０２では、ドライバは、仮想位置３にデータｂを書き込むための要求を受信する。先頭カウンタは次の空きブロックとして物理的位置０を指示しているので、データｂはチェックサムｈ（ｂ）と共にドライブ１上の物理的位置０に書き込まれる。そのマッピングは仮想位置３からドライブ１上の物理的位置０へのマッピングを示すために更新される。そのストライプはまだ完成していないので、先頭カウンタはインクリメントされていない。
【００５９】
４０３では、ドライバは、仮想位置２にデータｃを書き込むための要求を受信する。先頭カウンタは次の空きブロックとして物理的位置０を指示しているので、データｃはチェックサムｈ（ｃ）と共にドライブ２上の物理的位置０に書き込まれる。そのマッピングは仮想位置２からドライブ２上の物理的位置０へのマッピングを示すために更新される。そのストライプはまだ完成していないので、先頭カウンタはインクリメントされていない。
【００６０】
３個のデータブロックが書き込まれたので、パリティブロックを２つの残っている装置に追加することによってそのストライプは完成する。パリティデータは当該装置に書き込まれたデータに基づいて計算される。これは当該装置から読み込んでもよく、あるいはメモリに格納されていてもよい。これによりパリティデータｄおよびパリティデータｅが得られる。
【００６１】
４０４では、先頭カウンタは次の空きブロックとして物理的位置０を指示しているので、パリティデータｄはチェックサムｈ（ｄ）と共にドライブ３上の物理的位置０に書き込まれ、パリティデータｅはチェックサムｈ（ｅ）と共にドライブ４上の物理的位置０に書き込まれる。また、そのストライプが完成したので、先頭カウンタはその順番における次の空き位置までインクリメントされて現時点で１である。
【００６２】
このように、ドライバが書き込み動作中に永続記憶装置から読み出すことを必要とすることなくストライプを書き込むことができ、従って任意のレベルのパリティと共にランダムデータを書き込むためにより高いパフォーマンスを提供することができる。
【００６３】
読み出し
図５は読み出し要求を処理するための例示的手法を示す。これは図１の手法と同じように実装されていてもよい。
【００６４】
工程５０１では、データを仮想位置から読み出すための要求を受信する。この要求は工程１０１における要求と同じように受信してもよい。例えば、これはドライバの関数呼び出しによって受信してもよい。この要求は、当該データが取り出されると格納されるべきポインタ（例えばメモリアドレス）を含んでいてもよい。
【００６５】
工程５０２では、第１の位置に対応する当該データのための物理的位置をメタデータから得る。これはメタデータのマッピング内の仮想位置を見つけること、および工程１０４において前に格納された対応する物理的位置を見つけることによって得てもよい。
【００６６】
メタデータが仮想位置に対する参照を含んでいない場合、読み出し要求は失敗する場合があり、エラーが生じる場合がある。
【００６７】
工程５０３では、当該データを適当な永久記憶装置における物理的位置から読み出すことにより取り出す。次いで当該データをこの要求において指示されているメモリ位置または別の位置に格納してもよい。
【００６８】
工程５０４では、取り出したデータが元々格納されていたデータであることを保証するために、取り出したデータを検証する。これは取り出したデータのためのチェックサムを計算すること、およびそれを当該データと共に格納されているチェックサムと比較することを必要としてもよい。そのチェックサムが一致すれば、当該データの取り出しが成功した可能性が非常に高い。
【００６９】
そのチェックサムが一致しないが当該データを回復させることができる場合に、これを行ってもよい。これは当該データと同じストライプに格納されているパリティ情報を利用してもよい。エラーを訂正することができない場合、通知、警告またはエラーを発行してもよい。
【００７０】
次いで、取り出したデータを読み出し要求を発行したプロセスに戻すことができる。これは、関数呼び出しへの戻り値としての成功値（０など）を提供することを含んでもよい。
【００７１】
場合によっては、工程５０４は省略してもよい。例えば読み出し時に処理能力を最大化することが望ましい場合には、工程５０４を選択的にスキップしてもよい。
【００７２】
他の要求側の視点から見れば、当該データは仮想位置に格納され、かつそこから取り出された。従って永続記憶装置の維持および構成は、当該データを読み出すことを試みるプロセスからは見えない。
【００７３】
ブロックの再構成
時として、特定の物理的位置にあるデータを取り出すことが不可能な場合があったり、物理的位置が過度に遅かったりする場合がある。これはブロックまたは装置のハードウェア故障により工程５０３が成功しない場合または取り出されたが検証されないデータにより工程５０４が成功しない場合に生じ得る。これが生じた場合、ブロック再構成プロセスを行ってもよい。
【００７４】
図６は欠けているブロックのブロック再構成を処理するための例示的手法を示す。この例では、当該データは、ｋ＋ｍパリティを使用するように構成されている永続記憶装置のアレイに格納されている。
【００７５】
工程６０１では、ドライバは欠けているブロックと同じストライプ内の少なくともｋ個のブロックからデータを読み出す。そのストライプ内の各ブロックは異なる永続記憶装置からのものであるため、実際にストライプ内の複数のブロックが同時に利用不可能になるという可能性は非常に低い。
【００７６】
工程６０２では、ドライバは利用可能なデータを使用して欠けているブロックからのデータを再構成する。ｋ＋ｍパリティの場合、ストライプの任意のｋ個のブロックを使用してそのストライプ内の全てのブロックを再構成することができるので、これが可能である。ストライプ内のブロックがパリティを生成するために消失訂正符号を用いて符号化されている場合、あらゆる欠けているブロックは以下に記載されるように消失復号によって導出することができる。
【００７７】
工程６０３では、再構成されたデータを先頭（すなわち、先頭カウンタによって指示されている次の空きブロック）に書き込む。これは工程１０２および１０３と同じように実装されていてもよい。
【００７８】
工程６０４では、欠けているブロックに対応する仮想位置が再構成されたデータが書き込まれたブロックにすぐにマップされるように、メタデータを更新する。次いで欠けているブロックをダーティとしてマークすること（ハードウェア問題が存在しない場合）、または使用不可能なものとして記録すること（ハードウェア問題がある場合）ができる。
【００７９】
このように、１回の読み出しの失敗直後に当該データを回復させることができる。故障したブロックのみを再書き込みすればよいため、ブロック再構成プロセスは迅速に行われる。これは速度損失を最小にすることができ、最初の読み出し後に当該データを再構成する際に僅かな遅れが存在し得るが、あらゆるその後の読み出しはハードウェア問題が解決されていないとしても元の速度に戻る。
【００８０】
永続記憶装置の故障によりブロックの再構成が必要となる場合、全てのブロックを再構成して故障していない装置に再書き込みしてもよい。このプロセスが行われると、当該アレイの速度は、他の故障していない永続記憶装置のあらゆるデータの再書き込みを必要とすることなく低下状態から回復する。
【００８１】
複製
場合によっては複数の物理アドレスに対応する単一の仮想アドレスを有することが望ましいことがある。同じデータを各物理アドレスに複製する。
【００８２】
このように、読み出し要求は仮想アドレスに対応する物理アドレスのいずれかから読み出してもよい。物理アドレスのうちの１つにあるブロックが故障した場合、その読み出し要求は他の物理アドレスのいずれかから解決してもよい。故障したブロックは上記ブロック再構成技術を用いて再構成してもよい。これにより、まだ再構成を行うことができるという条件である限り再構成の遅れを回避することができる。
【００８３】
あるいは、場合によっては複製データを１つ以上の直後の物理アドレスに格納してもよい。第１の物理アドレスが利用不可能であれば、当該データが複製されている次の物理アドレスから当該データを取り出すことができる。
【００８４】
従ってユーザの視点から見れば、当該アレイ内の永続記憶装置の故障があったとしても、当該アレイは決して遅いようには見えない。
【００８５】
更新
図７は更新要求を処理するための例示的手法を示す。これは図１の手法と同じように実装されていてもよい。
【００８６】
工程７０１では、仮想位置からのデータを更新するための要求を受信する。この要求は工程１０１における要求と同じように受信してもよい。例えば、これはドライバの関数呼び出しによって受信してもよい。
【００８７】
工程７０２では、仮想位置に対する参照をメタデータから除去し、対応する物理的位置をダーティとしてマークする。これは物理的位置を後での使用のために空けておくことを指示する。
【００８８】
メタデータを更新したら、さらなる永続記憶装置の動作は必要でなくなる。仮想位置がメタデータ中に存在しない場合、物理的位置にある対応するデータを取り出すことができない。物理的位置は最終的にガベージコレクションプロセスが行われた後に再使用される。
【００８９】
ダーティブロック
データの更新について、ダーティとしてマークされている選択されたブロックの観点で説明してきた。これはストライプ内の未使用のブロックの数のカウンタを維持している各ストライプによって実行されてもよい。ブロックがダーティとしてマークされているかアクセス不可能である場合（例えば、対応する装置が故障していることが原因）、ストライプのギャップの数をインクリメントしてもよい。各データブロックを先頭に再書き込みした場合（例えば、ガベージコレクションの間）、ストライプのギャップの数もインクリメントしてもよい。カウンタが所定の限界に達したら（これはストライプ内に格納されているノンパリティブロックの数であってもよい）、そのストライプは…てもよい。
【００９０】
ガベージコレクション
仮想位置によって指示されているデータを更新する場合、対応する物理的位置を、物理的位置を再使用することができるということを示すダーティとしてマークしてもよい。従って、最初はデータを永続記憶装置に順次に書き込むことができるが、時間と共にデータの順番にギャップが現れる場合がある。
【００９１】
これを軽減する１つの方法はガベージコレクションを定期的に行うことである。この目的は、順番においてギャップが存在しなくなるまで、データを末尾（すなわち、書き込まれたブロックの順番において最も早いダーティでないブロック）から先頭に移動させることである。
【００９２】
ガベージコレクションは、１つ以上のガベージコレクション条件が満たされていることに応答して行ってもよい。
【００９３】
第１のガベージコレクション条件は、永続記憶装置上のギャップの数が所定の閾値を超えることであってもよい。例えばギャップの数が永続記憶装置の容量の１％を超える場合にガベージコレクション条件が満たされてもよい。
【００９４】
第２のガベージコレクション条件は、永続記憶装置の活動レベルが閾値未満になることであってもよい。例えば永続記憶装置が数分間使用されていない場合に、ガベージコレクションプロセスが開始してもよい。
【００９５】
第３のガベージコレクション条件は、永続記憶装置の空き容量が閾値未満になることであってもよい。例えば先頭カウンタが末尾に近くなった場合に、いくつかの使用可能な空間の回復を試みることが有用であり得る。
【００９６】
第４のガベージコレクション条件は、特定の期間が経過したことであってもよい。すなわち、ガベージコレクションプロセスを定期的に開始することが有用であり得る。
【００９７】
追加または代わりとして、ドライバが要求を処理していない時であって１つ以上のダーティブロックが存在するときにはいつでもガベージコレクションを行ってもよい。
【００９８】
図８は例示的なガベージコレクションプロセスを示す。
【００９９】
工程８０１では末尾を計算する。末尾は書き込まれたブロックの順番において最も早いダーティでないブロック（すなわち、データを格納しているブロック）である。言い換えると、これは最も古い書き込まれたダーティでないブロックである。
【０１００】
工程８０２では、末尾に格納されているデータを先頭カウンタによって指示されているブロックに書き込む。
【０１０１】
工程８０３では、永続記憶装置のためのメタデータを更新する。新しく書き込まれたブロックのための仮想アドレスを先頭カウンタにマッピングする新しいエントリは、そのブロックのための前のエントリを置き換える。
【０１０２】
工程８０４では、工程１０５と同じように次の空きブロックを反映させるために先頭カウンタを更新する。
【０１０３】
ガベージコレクション条件のうちの１つがもはや満たされないかダーティブロックが残っていない状態になるまでこのプロセスを繰り返す。ブロックを末尾から先頭に繰り返し移動させることにより、最終的に残っているギャップが存在しなくなる。これはあらゆる〜を回避する。
【０１０４】
さらに、このプロセスはいつでも停止することができる。工程８０４が終了すると、ドライバはさらなる要求を処理する準備が整う（新しいブロックを書き込むことを含む）。このように、著しいダウンタイムを引き起こすことなくガベージコレクションを開始および停止することができる。
【０１０５】
このように、他の要求のパフォーマンスを制限することなくデータを更新する場合に、記憶装置容量全体を回復させることができる。
【０１０６】
ガベージコレクションの例
図９はガベージコレクションを行うための手法の実例を示す。例えば図１の方法を行うドライバと同じドライバによってこれを行ってもよい。
【０１０７】
図９では、ドライバは２＋１パリティ（すなわち、各２個のデータブロックのために１個のパリティブロック）を使用するように構成されている。実際には、同じ手法をあらゆるレベルのパリティに適用してもよい。先頭カウンタおよびマッピングは図９では省略されている。
【０１０８】
９００では、当該システムは前に書き込まれたデータと共に示されている。ドライブ０は物理的位置０および２にダーティとしてマークされたブロックを有する。ドライブ１は物理的位置１にダーティとしてマークされたブロックを有する。ドライブ２は物理的位置１にダーティとしてマークされたブロックを有する。全てのドライブにおいて位置６および７にあるブロックは空である。全てのドライブにおける全ての他のブロックはダーティでないデータを有する。先頭カウンタは次の空きブロックを表すという理由から物理的位置６にある。ドライブ１上の位置０にあるブロックが最も古いダーティでないノンパリティブロックであるという理由から末尾は０にある。
【０１０９】
９０１では、末尾（位置０）にある全てのダーティでないノンパリティブロック内のデータは先頭に移動されている。ドライブ０上の位置０にあるデータ（ａ）はダーティとしてマークされているため移動されていない。ドライブ２上の位置０にあるデータ（ａｂ）はパリティデータであるため移動されていない。ドライブ１上の位置０にあるデータ（ｂ）のみが先頭に移動されている。これはドライブ０上の位置６に移動されている。位置６は先頭カウンタ（これは次の空きブロックとして位置６を指示している）から導出される。ドライブ０は各ストライプの開始ドライブまで循環させることにより導出される。すなわち、位置５にあるストライプはドライブ２により開始したため、位置６にあるストライプはドライブ０により開始する。
【０１１０】
その移動後に、前にドライブ１上の位置０にマップされた仮想位置がすぐにドライブ０上の位置６にマップするように、そのマッピングは更新される。ドライブ１上の位置０は、当該データがもはや必要とされず、かつ当該ブロックを再使用することができるので、ダーティとしてマークされている。先頭カウンタは６にあるままである。次の最も古いダーティでないノンパリティデータはドライブ２上の位置２にあるので、末尾は２に移動する。位置１の全てが全てのドライブ上でダーティまたはパリティである（あるいは言い換えると、ストライプ１内のギャップの数は２である）。
【０１１１】
９０２では、末尾（位置２）にある全てのダーティでないノンパリティブロック内のデータは先頭に移動されている。ドライブ１上の位置１にあるデータ（ｃ）、ドライブ２上の位置１にあるデータ（ｄ）およびドライブ０上の位置２にあるデータ（ｆ）はダーティとしてマークされているため移動されていない。ドライブ０上の位置１にあるデータ（ｃｄ）およびドライブ１上の位置２にあるデータ（ｅｆ）はパリティデータであるため移動されていない。ドライブ２上の位置２にあるデータ（ｅ）のみが先頭に移動されている。これはドライブ１上の位置６に移動されている。位置６は先頭カウンタから導出される（これは次の空きブロックとして位置６を指示している）。ドライブ１はストライプ内の前の書き込まれたブロックから導出される。すなわち、ドライブ０は前に書き込まれたので、ドライブ１は順番における次のドライブである。
【０１１２】
その移動後に、ドライブ２上の位置２に前にマップされた仮想位置がすぐにドライブ１上の位置６にマップするように、そのマッピングは更新される。ドライブ２上の位置２は、当該データがもはや必要とされず、かつ当該ブロックを再使用することができるため、ダーティとしてマークされている。
【０１１３】
ストライプ６内のデータはその時点で完成しているので、パリティデータ（ｂｅ）を計算し、ストライプ６内の残っているブロック（すなわち、ドライブ１上の位置６にある）に書き込む。次の空きブロックは位置７にあるため、先頭カウンタは７に移動する。次の最も古いダーティでないノンパリティデータはドライブ０および１上の位置３にあるため、末尾は３に移動する。
【０１１４】
このガベージコレクションプロセス後に、全てのドライブ上の位置０、１および２の全てはその時点で使用のために空いている。ストライプ７が完成すると、先頭カウンタはストライプ０にループする。従ってガベージコレクションにより永続記憶装置または永続記憶装置のアレイをより完全に利用することができる。
【０１１５】
消失訂正符号
上述のように、消失訂正符号は１個のデータを符号化してｎ個のデータ断片を形成する手法である。元のデータは任意のｋ個のデータ断片（ｋ≦ｎ）から回復可能である。各データ断片はｗビットのワードであり、ｗは任意の正の整数であればよい。例えば、１ビットおよび８ビットが一般的である。一般にｎおよびｗの値が高くなるほど、消失訂正符号および復号プロセスはより計算集約的となる。
【０１１６】
第１に、元のデータをｗ×ｋビットのデータセグメントにセグメント化する。
【０１１７】
第２に、各データセグメントをｋ個のｗビットサイズのデータワードに分離することにより、ｋ個のデータ断片ｄ１…ｄｋを形成する。これらはデータワードである。
【０１１８】
第３に、以下：
【数１】
2020042805.tif 000003
（式中、演算はガロア体ＧＦ（２ｗ）上で定義される）のように、係数を有するデータワードの一次結合に基づいてｍ＝ｎ−ｋ個のデータ断片ｃ１…ｃｍを形成する。これらは符号ワードである。
【０１１９】
当該データ断片が永続記憶装置全体に分散されるように、当該データ断片は永続記憶装置のアレイ上のストライプ内に格納することができる。場合によっては、異なる永続記憶装置は異なる数のデータ断片を保持することができる。任意に当該データセグメントに基づくチェックサムも格納する。全てのデータセグメントを格納したら、元のデータに基づくさらなるチェックサムも格納することができる。
【０１２０】
係数を選択するための複数の方法が存在する。１つの手法はＣａｕｃｈｙ  Ｒｅｅｄ−Ｓｏｌｏｍｏｎ符号を使用することである。これは以下：
【数２】
2020042805.tif 000004
（式中、演算はガロア体ＧＦ（２ｗ）上で定義される）になるように、ＧＦ（２ｗ）の中でｎの数を選択し、かつそれらを
【数３】
2020042805.tif 000005
という条件で２つの別々のセットＸ＝｛ｘ１，…，ｘｍ｝およびＹ＝｛ｙ１，…，ｙｋ｝に分割することにより行う。
【０１２１】
当該データを格納したら、当該データを取り出すために任意のｋ個の当該データ断片を使用することができる。例えば、当該データワードｄ１…ｄｋを得た場合、それらがセグメント化された方法の逆を用いてこれらを結合することができる。符号ワードｃｉを使用する場合、上記方程式に基づく連立方程式を解いて欠けているデータ断片を得ることができる。
【０１２２】
いくつかの状況では、この要求自体は１つ以上のＣＰＵによって処理しながら、消失訂正符号を１つ以上のＧＰＵを用いて効率的に行うことができる。これによりパフォーマンス全体の向上を得ることができる。
【０１２３】
消失訂正符号は高い障害許容力および柔軟性を可能にする手法を提供する。当該データ断片は複数の独立したシステムを跨って格納することができる。ｍ個以下の断片が失われた場合、対応するデータセグメントを回復させることができ、従って元のデータを計算することができる。また元のデータを回復させるために任意のｋ個のデータ断片を使用することができ、これは格納システムのいずれかが応答するのを可能にする。
【０１２４】
システム
図１０は例示的なコンピュータシステム１０００のブロック図を示す。
【０１２５】
システム１０００は、ＣＰＵ（中央処理装置）１０１０、メインメモリ１０２０、１つ以上の周辺装置１０３０およびＧＰＵ（グラフィックス処理装置）１０５０を備える。ＣＰＵ１０１０、メインメモリ１０２０、周辺装置１０３０およびＧＰＵ１０５０はバス１０４０によって接続されている。ＰＣＩｅ（ピーシーアイエクスプレス）トポロジの場合、バス１０４０としてはルートコンプレックスが挙げられ、周辺装置１０３０およびＧＰＵ１０５０のそれぞれがＰＣＩｅエンドポイントである。ＧＰＵ１０５０はバス１０４０を直接介して周辺装置１０３０と通信することができる。場合によっては、２つ以上のＣＰＵ１０１０および／または２つ以上のＧＰＵ１０５０が設けられる。
【０１２６】
周辺装置１０３０としては、永続記憶装置（ハードディスクドライブまたはソリッドステートドライブなど）、記憶コントローラ（ＲＡＩＤコントローラなど）、ネットワークコントローラ（ネットワークインタフェースカードなど）、スイッチ（さらなる周辺装置を接続するように構成されたＰＣＩｅスイッチなど）、あるいは様々な装置のいずれかが挙げられる。
【０１２７】
周辺装置１０３０およびＧＰＵ１０５０はバス１０４０を介したメインメモリ１０２０へのアクセスを有していてもよい。ＤＭＡ（ダイレクトメモリアクセス）を通して、これは周辺装置１０３０またはＧＰＵ１０５０がメインメモリからデータを読み出し、かつそこにデータを書き込むことを可能にすることができる。これは当該データをメインメモリ１０２０から周辺装置１０３０またはＧＰＵ１０５０にローカルなメモリにコピーすることを含んでもよい。
【０１２８】
場合によっては、ＣＰＵ１０１０およびＧＰＵ１０５０のためのメモリ空間は統合された仮想メモリを介して共有することができる。これにより、メインメモリ１０２０とローカルメモリとの間でデータをコピーすることを必要とすることなく、単一のメモリアドレスへのポインタをＣＰＵとＧＰＵとの間で行き来させることができる。
【０１２９】
コンピュータシステム５００を使用して上記方法を実行してもよい。例えばＣＰＵ１０１０またはＧＰＵ１０５０は、記憶装置周辺装置１０３０のうちの１つ以上へのドライバとして動作するプログラムを実行してもよい。
【０１３０】
記憶装置周辺装置１０３０は異なる種類のものであってもよい。比較的速い記憶装置周辺装置１０３０を使用してメタデータ（仮想装置と物理的位置とのマッピングなど）を格納してもよく、比較的遅い記憶装置周辺装置１０３０のアレイを使用して基礎となるデータを格納してもよい。場合によっては、基礎となるデータを格納するために使用される記憶装置周辺装置１０３０のいくつかは、１つ以上のハードディスクドライブ、ソリッドステートドライブ、ＲＡＭ装置または不揮発性ＲＡＭ装置を含む混合型であってもよい。
【０１３１】
解釈
多くの方法を上に記載してきた。当然のことながら、これらの方法のいずれかを一連の命令によって具体化してもよく、これによりコンピュータプログラムを形成してもよい。これらの命令またはこのコンピュータプログラムは非一時的であってもよいコンピュータ可読媒体に格納されていてもよい。実行された場合に、これらの命令またはこのプログラムはＣＰＵまたはＧＰＵなどのプロセッサに上記方法を実行させてもよい。
【０１３２】
プロセッサによって実行されるものとして１つの手法が記載されている場合、これは複数のプロセッサを含んでもよい。すなわち、少なくともプロセッサの場合、単数は複数を含むものとして解釈されるべきである。方法が複数の工程を含む場合、異なる工程または工程の異なる部分は異なるプロセッサによって行ってもよい。場合によっては、１つの工程は第１の種類のプロセッサによって行ってもよく（例えば、大きなセットのデータの処理はＧＰＵによって行ってもよく）、別の工程は第２の種類のプロセッサによって行ってもよい（例えば、メタデータのルックアップはＣＰＵによって行う）。
【０１３３】
１つの工程が行われた別の工程によって決まる場合、または文脈がそれ以外を要件とする場合を除いて、工程が順不同または同時に行われるように方法の中の工程の順序を変更してもよい。
【０１３４】
「〜を含む（ｃｏｍｐｒｉｓｅ）」という用語および他の文法形式は、特に断りのない限り包括的な意味を有することが意図されている。すなわち、それらは列挙されている構成要素および場合により他の指定されていない構成要素または要素の包含を意味するように解釈されるべきである。
【０１３５】
本発明を特定の実施形態の記載および図面の参照により説明してきたが、本発明はそのような詳細に限定されることは意図されていない。さらなる利点および修正は当業者に容易に明らかになるである。従って、本発明はそのより広い態様において特定の詳細、代表的な装置および方法ならびに図示および記載されている説明例に限定されない。従って、一般的な発明の概念の趣旨または範囲から逸脱することなくそのような詳細からの逸脱が可能である。
【図１】
2020042805.tif 000006
【図２】
2020042805.tif 000007
【図３】
2020042805.tif 000008
【図４Ａ】
2020042805.tif 000009
【図４Ｂ】
2020042805.tif 000010
【図５】
2020042805.tif 000011
【図６】
2020042805.tif 000012
【図７】
2020042805.tif 000013
【図８】
2020042805.tif 000014
【図９】
2020042805.tif 000015
【図１０】
2020042805.tif 000016
【外国語明細書】
2020042805000001.pdf