Nothing Special   »   [go: up one dir, main page]

JP7082275B2 - 配列制御プログラム、配列制御方法、配列制御装置 - Google Patents

配列制御プログラム、配列制御方法、配列制御装置 Download PDF

Info

Publication number
JP7082275B2
JP7082275B2 JP2017215461A JP2017215461A JP7082275B2 JP 7082275 B2 JP7082275 B2 JP 7082275B2 JP 2017215461 A JP2017215461 A JP 2017215461A JP 2017215461 A JP2017215461 A JP 2017215461A JP 7082275 B2 JP7082275 B2 JP 7082275B2
Authority
JP
Japan
Prior art keywords
block
write
area
written
link
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.)
Active
Application number
JP2017215461A
Other languages
English (en)
Other versions
JP2019087080A (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.)
Fujitsu Ltd
Original Assignee
Fujitsu Ltd
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 Fujitsu Ltd filed Critical Fujitsu Ltd
Priority to JP2017215461A priority Critical patent/JP7082275B2/ja
Priority to US16/176,010 priority patent/US10809946B2/en
Publication of JP2019087080A publication Critical patent/JP2019087080A/ja
Application granted granted Critical
Publication of JP7082275B2 publication Critical patent/JP7082275B2/ja
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F3/00Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
    • G06F3/06Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
    • G06F3/0601Interfaces specially adapted for storage systems
    • G06F3/0668Interfaces specially adapted for storage systems adopting a particular infrastructure
    • G06F3/0671In-line storage system
    • G06F3/0683Plurality of storage devices
    • G06F3/0688Non-volatile semiconductor memory arrays
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F3/00Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
    • G06F3/06Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
    • G06F3/0601Interfaces specially adapted for storage systems
    • G06F3/0668Interfaces specially adapted for storage systems adopting a particular infrastructure
    • G06F3/0671In-line storage system
    • G06F3/0683Plurality of storage devices
    • G06F3/0689Disk arrays, e.g. RAID, JBOD
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F3/00Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
    • G06F3/06Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
    • G06F3/0601Interfaces specially adapted for storage systems
    • G06F3/0602Interfaces specially adapted for storage systems specifically adapted to achieve a particular effect
    • G06F3/0604Improving or facilitating administration, e.g. storage management
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F3/00Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
    • G06F3/06Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
    • G06F3/0601Interfaces specially adapted for storage systems
    • G06F3/0602Interfaces specially adapted for storage systems specifically adapted to achieve a particular effect
    • G06F3/061Improving I/O performance
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F3/00Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
    • G06F3/06Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
    • G06F3/0601Interfaces specially adapted for storage systems
    • G06F3/0628Interfaces specially adapted for storage systems making use of a particular technique
    • G06F3/0629Configuration or reconfiguration of storage systems
    • G06F3/0631Configuration or reconfiguration of storage systems by allocating resources to storage systems
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F3/00Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
    • G06F3/06Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
    • G06F3/0601Interfaces specially adapted for storage systems
    • G06F3/0628Interfaces specially adapted for storage systems making use of a particular technique
    • G06F3/0638Organizing or formatting or addressing of data
    • G06F3/064Management of blocks
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F3/00Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
    • G06F3/06Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
    • G06F3/0601Interfaces specially adapted for storage systems
    • G06F3/0628Interfaces specially adapted for storage systems making use of a particular technique
    • G06F3/0646Horizontal data movement in storage systems, i.e. moving data in between storage devices or systems

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Human Computer Interaction (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Stored Programmes (AREA)
  • Memory System (AREA)

Description

本発明は,配列制御プログラム、配列制御方法、配列制御装置に関する。
配列(array)は、データ集計等で使用する基本的なデータ構造の一つである。配列はインデックスに対応してデータである値を記憶する記憶領域(主領域)を有する。配列は、インデックス0≦i<Nに対して、読み出し(read)と書込み(write)を実行し、あるインデックスiに対して読み出しを行うとインデックスiの主領域に最後に書き込まれた値を返す。通常の配列の初期化は、全てインデックスの主領域に初期値を書き込む初期化処理を行うため、配列サイズNに比例した初期化時間がかかる。
一方、初期化可能配列(initializable array)というデータ構造は、上記の読み出し(read)と書込み(write)に加えて、初期化(initialize)を行うと全てのインデックス0≦i<Nの値を初期値にする。初期化可能配列は、初期化を特別にサポートする構成を有し、初期化処理を配列サイズNにかかわらず一定時間で行う。例えば、word RAM(Random Access Machine)モデルにおいて、初期化initialize(x)が呼ばれた時に初期値xを記憶しておき、各インデックスiに書込み(write)されたかどうかを示す管理情報を記憶しておき、書込みが行われていないインデックスに読み出し(read)が呼ばれた場合は初期化で記憶した初期値xを返す技術が知られている。
このような初期化可能配列のデータ構造は、例えば、リアルタイムで動作しなければならないアプリケーションプログラムにおいて、初期化処理を配列のサイズNに依存しない固定時間で行う必要がある場合に利用される。配列のデータ構造については以下の特許文献、非特許文献に記載がある。
特開平05-158783号公報 特開2002-207634号公報 特開2004-30353号公報 特表2009-521049号公報
A. Aho, J. Hopcroft, and J. Ullman, "The Design and Analysis of Computer Algorithms" Addison-Wesley, 1974 2 G. Navarro, "Dynamic dictionaries in constant worst-case time" Technical Report TR/DCC-2007-11, University of Chile, Department of Computer Science, October 2007
しかしながら、従来の初期化可能配列は、インデックスに書込みが行われたか否かを示す管理情報を記憶するための追加領域が、配列の主領域に加えて必要である。
さらに、初期化可能配列において配列の要素が「NULL」や「NONE」などの通常のデータ以外の特殊な状態を持つ配列(オプショナルアレイ:Optional Arrayと称する)を実現しようとすると、配列の要素に通常のデータと区別可能なフラグや、通常データの組み合わせで区別するエスケープ処理を行う必要がある。そのようなフラグやエスケープ処理は、配列の記憶容量の増大を招き、好ましくない。
そこで,実施の形態の第1の側面の目的は,記憶容量を抑制しつつ特殊な状態を記憶する配列の配列制御プログラム、配列制御方法、配列制御装置を提供することにある。
第1の側面は,少なくともアドレスワードとデータワードを含む2以上の定数個のワードをそれぞれ有する複数のブロックを連続して構成する配列を有し、前記配列の複数のブロックの二分割位置を示す境界を記憶し、前記二分割された第1領域内の未書き込みブロックの数と、前記二分割された第2領域内の書込み済みブロックの数とが整数比になる位置を前記境界とするオプショナル配列を制御する処理をコンピュータに実行させる配列制御プログラムであって、前記処理は、
前記第1領域の未書込みブロックまたは前記第2領域の未書込みブロックに対する有効値書込みが呼ばれると、前記境界を移動して前記第1領域を拡張し前記第1領域内に任意値書込済み書込みブロックを生成するエクステンド処理を行い、
前記有効値書込みの書込み先ブロックが、前記エクステンド処理で生成した任意値書込済み書込み済みブロックと同じではなく、前記第2領域の未書込みブロックの場合、前記エクステンド処理で生成した第1領域の任意値書込済み書込みブロックのアドレスワードと、前記第2領域の前記書込み先ブロックのアドレスワードとに、互いのアドレスを記憶してリンクを形成し、
前記第2領域の前記書込み先ブロックに前記有効値を書き込み、
書込み先ブロックを前記第2領域の書込み済みブロックとする特殊値書込みが呼ばれると、前記境界を移動して前記第1領域を縮小するシュリンク処理を行って、前記境界に隣接する第1領域側の第1隣接ブロックを前記第2領域側に移動し、
前記第1隣接ブロックが書込み済みブロックの場合、
前記第1隣接ブロックのアドレスワードと、前記書込み先ブロックとリンクを形成する第1リンク先ブロックのアドレスワードとに、互いのアドレスを記憶してリンクを形成し、前記書込み先ブロックのリンクを解消して前記書込み先ブロックを未書込みブロックに変更し、
前記第1隣接ブロックが未書込みブロックの場合、
前記第1隣接ブロックとリンクを形成する第2リンク先ブロックのアドレスワードと、前記第1リンク先ブロックのアドレスワードとに、互いのアドレスを記憶してリンクを形成し、前記書込み先ブロックのリンクを解消して前記書込み先ブロックを未書込みブロックに変更する
ことを有する配列制御プログラム、である。
第1の側面によれば,配列の記憶容量を抑制しつつ特殊な状態を記憶することができる。
オプショナル配列と配列制御プログラムの一例を示す図である。 配列制御装置の構成例を示す図である。 本実施の形態におけるオプショナル配列を示す図である。 図3の配列の値の保存場所を説明する図である。 初期化と非リンクの制御を示すフローチャート図である。 初期化処理を示す図である。 読み出しの制御を示すフローチャート図である。 読み出し制御を示す図である。 非リンクの制御を示す図である。 エクステンドextend()の制御のフローチャート図である。 境界に隣接するW領域のブロックB1の種別がWSの場合のエクステンド制御E1を示す図である。 境界に隣接するW領域のブロックB1の種別がWPの場合のエクステンド制御E2を示す図である。 有効値書込みwrite(i,V)の制御を示すフローチャート図である。 有効値書込みの処理W1を示す図である。 有効値書き込み処理W2-1を示す図である。 有効値書き込み処理W2-2を示す図である。 有効値書き込み処理W2-3を示す図である。 NULL書込みwrite(i,NULL)の制御を示すフローチャート図である。 NULL書込みの処理WN1を示す図である。 NULL書込み処理WN2-1を示す図である。 NULL書込み処理WN2-2を示す図である。 NULL書込み処理WN2-3を示す図である。 NULL書込み処理WN3-1を示す図である。 NULL書込み処理WN3-2を示す図である。 NULL書込み処理WN3-3を示す図である。 配列ARの具体例と、初期化を示す図である。 図16で説明した書込みW2-2の具体例を示す図である。 図16で説明した書込みW2-2の具体例を示す図である。 図16で説明した書込みW2-3の具体例を示す図である。 図16で説明した書込みW2-1の具体例を示す図である。 図16で説明した書込みW1の具体例を示す図である。 読み出しreadの3種類の具体例を示す図である。 読み出しreadの1種類の具体例の具体例を示す図である。 NULL書込みの具体例を示す図である。 通常のデータである有効値以外に、特殊値であるNULLを配列に記憶するデータ例を示す図である。 本実施の形態のNULL状態を記憶するための追加メモリ容量を示す図である。 配列の第1の例を示す図である。 初期化可能配列の2つの例を示す図である。 図38の2つの配列をハイブリッド化した配列の例である。
図1は、オプショナル配列と配列制御プログラムの一例を示す図である。図1には、配列制御プログラムがオプショナル配列に対して行う制御が示される。図1中、処理制御部2は、処理対象データ1について所定の処理を実行し、その所定の処理に伴ってオプショナル配列4に初期化(initialize)、読み出し(read)、書込み(write)を実行する。そして、配列制御部3は、配列に対する初期化処理、書き込み処理、読み出し処理などの制御を実行する。配列4には、配列の書込み済み(または未書込み)要素などの管理情報を記憶する管理領域5が設けられる。
配列4は、配列の要素のデータ(値)を記憶するメモリなどの記憶装置である。また、管理領域5は、書込み済み(または未書込み)要素などの管理情報を記憶するメモリなどの記憶装置である。
そして、処理制御部2は、コンピュータのプロセッサがあるアプリケーションプログラム(以下単にアプリケーション)を実行することにより構築される。また、配列制御部3は、プロセッサが配列制御プログラムを実行することにより構築される。
図2は、配列制御装置の構成例を示す図である。配列制御装置は、プロセッサであるCPU(Central Processing Unit)10と、CPUによりアクセスされるRAM(Random Access Memory)などのメインメモリ12と、外部とのインターフェース14とを有し、それらがバス28を介して接続される。また、バス28には大容量の補助記憶装置20-26がCPUからアクセス可能に設けられる。補助記憶装置には、基本プログラムであるOS(Operating System)や各種ミドルウエアを格納する記憶装置20と、アプリケーションプログラム(以下、アプリケーションと称する)22と、処理対象データ23と、配列制御プログラム24とを記憶する記憶装置とを有する。さらに、CPUが配列制御プログラム24を実行して、記憶装置26内に記憶した配列に対してアプリケーション22からの初期化処理、書き込み処理、読み出し処理を行う。記憶装置26内には配列の主領域に加えて、その管理データを記憶する管理領域が記憶される。
ここで、初期化可能配列について一例に基づいて説明する。配列はインデックスに対応してデータを記憶する複数の要素を含む主領域を有する。そして、配列の「初期化」とは全ての要素を初期値で初期化することで、「書込み」とは初期化された要素に書込み値を上書きすることで、「未書込み」とは初期化されたままの要素で未だ書込み値が上書きされていないことをそれぞれ意味する。
図37は、配列の第1の例を示す図である。配列ARは、インデックスに対応してデータ(値)をそれぞれ記憶する複数の要素を含む主領域を有する。図37の配列ARは、主領域にインデックス0-7それぞれに対応する8つの要素を有する。また、主領域に加えて、ある集計値を記憶する集計値領域AGを有する。例えば、プロセッサがアプリケーションを実行して、8名のユーザのうちサーバに1日3回以上アクセスしたユーザ数をリアルタイムに集計する場合を想定する。つまり、配列ARのインデックス0-7は8名のユーザに対応し、各要素には各ユーザのアクセス回数が書き込まれる。そして、アクセス回数が3回以上のユーザ数が、集計値として集計値領域AGに記憶される。
配列AR1は、初期化した状態を示す。すなわち、アプリケーションからの初期化処理の呼び出しに応答して、プロセッサは配列制御プログラムを実行して、配列AR1の全ての要素に初期値0(アクセス数0回)を、集計値領域AG1には初期値0(0人)をそれぞれ書き込む。そして、配列AR2では、インデックス2に対応するユーザがアクセスしたことに伴い、アプリケーションによりインデックス2の要素の値「2」が加算されて「3」が書き込まれる。同時に、集計値領域AG1の値「3」が加算されて「4」が書き込まれる。最後に、アプリケーションにより、要求された任意のタイミングで、配列AR3に対応する集計値領域AG3の値「4」が読み出される。そして、毎日所定のタイミングで、配列が初期化処理される。上記の初期化処理、配列の要素の値の読み出し処理、書込み処理は、配列制御プログラムによりプロセッサが実行する。
図37の例では、初期化処理では、全てのインデックスに初期値「0」を書き込む必要がある。したがって、初期化処理は、配列サイズNに比例した時間O(N)がかかり、初期化処理中は配列に対して書込みや読み出しを実行できない。一方、読み出しと書込みは定数時間O(1)で可能である。図37の配列は、リアルタイムのサーバへのアクセス回数を記録するアプリケーションには不向きである。なお、前記Oはオーダーの頭文字である。
図38は、初期化可能配列の2つの例を示す図である。初期化可能配列とは、初期化を高速に行うことができるデータ構造である。初期化可能配列がサポートする機能には、次のものがある。
(1)読み出しread(i)では、インデックスiの要素の値を返す。
(2)書込みwrite(i,x)では、インデックスiの要素にxを書き込む。
(3)初期化initialize(x)では、全てのインデックス0≦i<Nの要素にxを書き込む。
そして、プロセッサは、配列制御プログラムを実行することにより、初期化initialize(x)が呼ばれたとき、配列の全ての要素に初期値xを書き込まず単に初期値xを記憶し、各インデックスについて書込みされたか否かの管理情報を記憶する。そして、書き込みされてないインデックスiへの読み出しread(i)が呼ばれた場合、初期化で記憶した初期値xを返す。これにより、初期化処理を配列のサイズNに依存しない固定時間で行う。
図38(A)の配列では、インデックス0-15のN=16の要素を有する配列ARが、4要素ずつのブロック0-3に分割され、管理領域として、各ブロックの未書込みと書込み済みを区別するビットマップBT_MPと、配列の全要素の初期値を記憶する初期値領域INTとを有する。プロセッサが配列制御プログラムを実行し、初期化が呼ばれると初期値領域INTに初期値「0」が書き込まれ、ビットマップブロックに「0」が書き込まれる。初期化では全インデックスに初期値を書き込むことは行わない。書き込みが呼ばれると、そのブロックの書込み先インデックスに書込み値が書き込まれ残りのインデックスに初期値「0」が書き込まれ、ビットマップの対応するブロックに書込み済みを示す「1」が書き込まれる。ビットマップは、書込みが行われたブロックには「1」を、未書込みのブロックには「0」を記憶し、書込み済みブロックと未書込みブロックの管理情報を記憶する。
図38(A)の配列では、初期化は図37の配列より短い時間O(N/logN)で完了するが、ビットマップを初期化する必要があるので初期化時間は配列サイズNに依存する時間o(N)である。なお、時間o(N)=O(N/logN)は、時間O(N)より短いことを意味し、logは底を2とする二進対数である。但し、管理情報として初期値INTに加えてビットマップBT_MPが含まれるので、管理にO(N/logN)=o(N)の追加領域が必要になる。つまり、ビットマップはブロック毎の要素を有するので、配列サイズNに依存した領域O(N)より小さいが領域o(N)が必要である。
図38(B)の配列は、インデックス0-15のN=16の要素を有する配列ARに加えて、管理情報を記憶するための補助領域AUX、スタック領域ST、スタックポインタ領域ST_P、初期値領域INTを有する。補助領域とスタック領域は共に16の要素を有する。この配列では、配列制御プログラムを実行するプロセッサが、配列ARのあるインデックスに書込みを行うと、補助領域の同じインデックスの要素とスタック領域の最小未書込み要素とに互いのインデックスを書き込んで双方向リンクを生成する。双方向リンクの生成とともに、スタックポインタが最大書込み要素のインデックスに更新される。
図38(B)の例では、配列ARには5つのインデックスの要素に書込みが行われ、補助領域AUXの同じ5つのインデックスの要素とスタック領域の要素との間に双方向リンクが形成されている。例えば、配列のインデックス3には値「0」が書き込まれ、補助領域の同じインデックス3の値「4」に対応するスタック領域のインデックス4には補助領域のインデックス「3」が書き込まれ、補助領域とスタック領域との間で双方向リンクが形成されている。また、スタックポインタの値「4」は、スタック領域内の双方向リンクが形成されている最大インデックスを指している。
読み出しが呼ばれると、プロセッサは、読み出し先インデックスiの補助領域の要素が双方向リンクを形成していれば、配列の読み出し先インデックスの値を返し、形成されていなければ初期値領域INTの値を返す。
この配列において、初期化が呼ばれると初期値領域INTに初期値「0」を書込み、スタックポインタST_Pに最小インデックス「0」を書き込む。したがって、初期化に要する時間は配列サイズNに依存せず定数時間O(1)である。しかし、管理領域は配列の主領域の200%程度を要し、追加領域は配列サイズNに依存するO(N)である。
図39は、図38の2つの配列をハイブリッド化した配列の例である。図39では、図38(A)と同様の配列ARの主領域とビットマップBT_MPを有する。さらに、ビットマップについて、図38(B)と同様の補助領域AUX、スタックST、スタックポインタST_Pを有する。ビットマップが配列ARの主領域より小さいサイズであり、その分管理領域を小さくできる。
この例では、初期化が定数時間O(1)で可能である。一方、管理情報を記憶する管理領域にO(N/logN)=o(N)の追加領域が必要である。一般に、図38(A)のビットマップ法の3倍程度の追加領域になる。
図37,図38(A),図38(B),図39をまとめると、図37の配列は、初期化時間は配列サイズNに依存する(O(N))が、管理の追加領域は定数サイズ(O(1))である。図38(A)の配列は、初期化時間は配列サイズNに依存する時間よりも短く(O(N/logN)=o(N))、管理の追加領域も同様である(O(N/logN)=o(N))。図38(B)の配列は初期化時間は定数時間(O(1))であるが、管理の追加領域は配列サイズNに依存するサイズ(O(N))。そして、図39の配列は、初期化時間は定数時間(O(1))、管理の追加領域は配列サイズに依存するサイズより小さい(O(N/logN)=o(N))。
[第1の実施の形態の初期化可能配列]
以下説明する本実施の形態の配列は、通常のデータ以外の特殊状態を少ないメモリ容量で記憶することができ、特殊状態(特殊値)への初期化時間は定数時間、管理の追加領域も少ない容量である。
配列はインデックスに対応してデータを記憶する複数の要素を含む主領域を有する。各要素は複数のインデックスに対応する複数のワード(アドレスワードとデータワード)を有する。そして、配列の「初期化」とは全ての要素を特殊状態(以下特殊状態(特殊値)の一例であるNULLで説明する)で初期化すること、「有効値の書込み」とはNULL(特殊値)が記憶されている要素に有効な値(有効値)である書込み値を上書きすること、「特殊値の書込み」とは要素を有効なデータが書き込まれていない(保存されていない)、言い換えると、特殊値(NULL)が書き込まれた状態にすることをそれぞれ意味する。
図35は、通常のデータである有効値以外に、特殊値であるNULLを配列に記憶するデータ例を示す図である。(1)は表現したいデータ例である。この例は、配列の主領域内の要素に、通常データ(有効値)とNULL(特殊値)とを混在して記憶する例である。通常データは0と1からなる二進数であり、図中16進数表記で示される。例えば、「FF」は二進数の「1111 1111」であり、「AC」は二進数の「1010 1100」である。但し、NULLは通常データとは異なる特殊値であるので、通常データと混在することはできない。
(2)はフラグを利用してNULLを記憶する例である。この場合、配列の要素の主領域に加えて、各要素に1ビットのフラグ領域FLAGを有する。そして、フラグFLAGが「0」であれば通常データ(有効値)、「1」であればNULL(特殊値)とすることで、NULLを記憶する。
(3)はエスケープ方式でNULLを記憶する例である。エスケープ方式では、通常データFFを「FF FF」と、NULLを「FF 00」とそれぞれ定義する。主領域の各要素には、00~FEはそのまま記憶され、FFは「FF FF」と記憶され、NULLは「FF 00」と記憶される。
上記のフラグ方式では、配列にフラグビットを記憶するフラグ領域を追加する必要がある。また、エスケープ方式でも、配列の各要素を「FF FF」「FF 00」を記憶するために、通常データを記憶する場合の主領域と同じ容量の追加領域が必要になる。
図3は、本実施の形態におけるオプショナル配列を示す図である。この配列は、読み出しと書き込みが配列サイズに依存しない定数時間で行われ、初期化も定数時間で行われる。さらに、要素にNULLを書き込むために要素の領域に追加される領域はない。また、管理の追加領域は配列サイズに依存するが非常に少ない記憶サイズである。
図3の配列ARは、インデックス0≦i<16でN(=16/2)個の要素を有し、アドレスワードとデータワードを含む2以上の定数個(図3の例は2個)のワード(主領域の各要素に対応)をそれぞれ有する複数(図3の例は8個)の要素(またはブロック)を連続して構成する。
図3の例では、各要素(ブロック)には2個のワードが含まれ(1要素(1ブロック)が2ワードを含む)、要素(ブロック)内の最小インデックスのワードは後述する双方向リンクのリンク先インデックスを書き込むアドレスワード、その他のインデックスのワードは有効値を書き込むデータワードである。但し、アドレスワードにもデータが書き込まれる。したがって、各要素(ブロック)は偶数インデックスで特定され、各ワードはインデックスで特定される。
ここで、値が書き込まれる要素内の2つの領域をワードと称する理由は、書き込まれる値が8ビット、32ビット、64ビットなどのワードであることに起因する。
さらに、管理領域として、配列の複数のブロックの二分割位置を示す境界BDを記憶する境界ポインタBD_Pを有する。境界ポインタBD_Pには境界BDの右側のインデックス「6」が書き込まれている。
境界で二分割された左側の第1領域は未書込みブロックの数が記憶されるM領域と、右側の第2領域は書込みブロックの数が記憶されるW領域と、それぞれ称する。分割方法は、M領域の未書込みブロック(MPと称する)の数と、W領域の書込み済みブロック(WPと称する)の数とが同数になる位置に境界BDを選択することである。この境界は一意に定まる。
さらに、M領域の未書込みブロックMPとW領域の書込み済みブロックWPとを一対一に対応付ける。一対一の対応付けは、両ブロックMP,WP間に双方向リンクを形成することで行われる。図中、双方向リンクは実線の矢印で示される。
具体的には、インデックス0,1の未書込みブロックMPとインデックス12,13の書込み済みブロックWPの場合、未書込みブロックMPのアドレスワードAWD(インデックス0)には書込み済みブロックWPのインデックス「12」が書き込まれ、書込み済みブロックWPのアドレスワードAWD(インデックス12)には未書込みブロックMPのインデックス「0」が書き込まれる。これにより両ブロックMP,WPは双方向リンクを形成する。インデックス2,3のブロックMPとインデックス8,9のブロックWPも同様に双方向リンクを形成する。M領域内の未書込みブロックMPの数とW領域内の書込み済みブロックWPの数が同じになるよう境界BDを管理し、両ブロックMP、WPの間に双方向リンクを形成することで、M領域の未書込みブロックMPとW領域の書込み済みブロックWPを管理情報として記憶する。また、境界BDの両側の両ブロックMP、WPの数を同数に管理する。
双方向リンクを形成するとW領域の書込み済みブロックWPのアドレスワードAWD(インデックス12)には値を書き込むことができない。そこで、W領域の書込み済みブロックWPのリンク先のM領域の未書込みブロックMPのデータワードDWD(インデックス1)にブロックWPの値を書き込む。この点については後で詳述する。
一方、M領域の書込み済みブロックMSとW領域の未書込みブロックWSとが、一対一に対応付けされないように、つまり上記の双方向リンクができないように、W領域のブロックのアドレスワードにM領域の書込みブロックMSのインデックスが格納されないよう制御する。
具体的には、インデックス4,5の書込み済みブロックMSのアドレスワードには「14」が書き込まれているので、インデックス14,15のブロックに片方リンクを形成している。そこで、インデックス14,15のブロックのアドレスワードにはM領域のインデックスが記憶されないようにする。図3の例では、インデックス14,15のブロックのアドレスワードには自分のインデックス「14」が書き込まれている。また、インデックス6,7のブロックWS、インデックス10,11のブロックWSは、未書込みブロックであり記憶されている値は読み出しでは参照されず(図中?で示す。)、特殊値のNULLが読み出される。
ブロックの種別は、対応付けのあるブロックをP(pair)ブロック、対応付けのないブロックをS(single)ブロックと称する。したがって、M領域とW領域にそれぞれPブロックとSブロックが存在しうるので、ブロックの種別は以下の4種類になる。
M領域
MP:未書込みブロック、NULLのブロック、WPと双方向リンクが形成される。
MS:書込み済みブロック、mビットの要素であるブロック内の2つのワードにそれぞれm/2ビットの有効値が書き込まれ、W領域のブロックと双方向リンクは形成されない。
W領域
WP:書込み済みブロック、MPと双方向リンクが形成される。mビットの要素であるブロック内の2つのワードのうち最小インデックス以外のデータワードと、リンク先のブロックMPの最小インデックス以外のデータワードとにm/2ビットの有効値がそれぞれ書き込まれる。
WS:未書込みブロック、NULLのブロック、M領域のブロックと双方向リンクは形成されない。
図4は、図3の配列の値の保存場所を説明する図である。図4の配列ARは図3の配列ARと同じである。まず、M領域の書込み済みブロックMSには、そのブロックの2つのワードに値を保存する。例えば、インデックス4,5のブロックMSが例である。
次に、W領域の書込み済みブロックWPには、そのブロックWPのデータワードDWDと、ブロックWPと双方向リンクするM領域の未書込みブロックMPのデータワードDWDと に2つの値を保存する。つまり、M領域の未書込みブロックMPとW領域の書込み済みブロックWPは双方向リンクを形成するためにアドレスワードAWDにはリンク先インデック スが互いに書き込まれる。したがって、アドレスワード以外のワードに値を保存する。例えば、ブロックWPのインデックス8に保存する値「0」はリンク先ブロックMPのインデックス3のデータワードDWDに保存される。また、ブロックWPのインデックス12に保存される値「0」はリンク先ブロックMPのインデックス1のデータワードDWDに保存される。なお、1つのブロックの最小インデックスはアドレスワードであり、残りのインデックスはデータワードである。1ブロックのワード数をb≧2とすると、対応付けられた1対のブロックの2*bワードのうち、2ワードがアドレスワードに、2*b-2のワードがデータワードとして使用される。
最後に、未書込みブロックMP、WSは、NULLが保存されているとみなし、但し、ブロックMP,WSのワードには任意の値が保存される。たとえば、インデックス14,15のブロックWSの読み出し値は、NULLである。
図4には、実際に保存されている値が示される実配列ARに対応して、保存されているインデックスと値を論理的に示した論理配列L_ARが示されている。特にインデックス8,12に書き込まれた値「9」「0」は、それぞれインデックス3,1に保存されていることが論理配列L_ARに示される。
図3の初期化可能配列は、以下のような特徴を有する。
(1)配列の未だ書き込みが行われていない主領域に、書込み済み領域(ブロックWP)と未書込み領域(ブロックMP)を区別する管理情報(双方向リンク)を保存することで、管理の追加領域を境界ポインタBD_Pにする。したがって、管理の追加領域は配列サイズNに依存するオーダーより小さいO(logN)になる。
(2)配列の主領域の書込み済み領域と未書込み領域を区別する管理情報として、書込み済み領域のインデックスを記憶すると、書込みが進むに従い配列内の未書込み領域が減少するので、管理情報を保存できる領域が不足する。一方、管理情報として未書込み領域を記憶すると、初期化処理で全ての領域が未書込み領域になるので、初期化処理が配列サイズに依存する時間を要し定数時間で完了できない。そこで、書込み済み領域を記憶することと未書込み領域を記憶することをハイブリッド化する。すなわち、配列の主領域を、未書込み領域を管理するM領域と、書込み領域を管理するW領域とに分割し、初期化ではM領域のサイズを0にし、書込みが進むにつれてW領域のサイズが減少しM領域のサイズが増加するようにする。それにより、初期化時間を定数時間で完了し(境界ポインタをインデックス0にし全要素をWSブロックにして全要素をNULLにする)、書込みが進むにつれて管理するW領域の書込み済み領域WPの数を減らして管理情報(双方向リンク)が減少するよう制御する。また、書き込み時に管理情報(境界BD、双方リンク)の変更を行う。
(3)管理情報は配列の未書込み領域に保存するが、ユーザがどこに書き込むかどこに書き込まないかを決定するので、未書込み領域が断片化してしまう。そこで、配列の主領域をアドレスワードとデータワードを持つ要素(ブロック)単位で管理し、1対のブロックのアドレスワードを利用して双方向リンクを生成して管理情報を保存し、ユーザデータの一部を双方向リンク先のブロックのデータワードに保存する。
(4)そして、未書込みブロックMP,WSをNULLと定義することで、有効なデータとNULLとを区別可能にする。つまり、境界ポインタと双方向リンクを含む管理情報により、NULLを記憶する要素(ブロック)を区別可能にする。
[配列制御プログラム]
次に、プロセッサにより実行される配列制御プログラムの処理、配列の全要素(ブロック)をNULLにする初期化initialize(x)、インデックスiの読み出しread(i)、インデックスi(iは偶数)の要素(ブロック)に有効値[x1,x2]を書き込む書込みwrite(i,[x1,x2])と、インデックスi(iは偶数)の要素(ブロック)にNULLを書き込むwrite(i,NULL)と、書込み機能を実現するための補助機能であるインデックスiのブロックの非リンクunlink(i)、境界BDを右シフトしてM領域を拡張するエクステンドextend()、境界BDを左シフトしてW領域を拡張するシュリンク、それぞれの制御方法を説明する。
まず、プロセッサは、配列制御プログラムを実行して、初期化initialize(x)が呼ばれると以下の初期化処理を行い、読み出しread(i)が呼ばれるとインデックスiの値を読み出して返し、有効値書込みwrite(i,[x1,x2])が呼ばれるとインデックスiの要素の2つのワードに値[x1,x2]を書き込む。さらに、NULL書込みwrite(i,NULL)が呼ばれるとインデックスiの要素をNULL記憶状態にする。
[初期化initialize(x)]
図5は、初期化と非リンクの制御を示すフローチャート図である。図6は、初期化処理を示す図である。初期化initialize(x)が呼ばれると、配列制御プログラムを実行するプロセッサは、境界ポインタBD_Pにインデックス0を保存して境界を左端に移動して初期化する(S1)。境界ポインタBD_Pには境界の右側のインデックス0が保存される。境界の初期化により配列ARの主領域は全てW領域になり、双方向リンクはなくなり、W領域は全て未書込みブロックWSになり、NULL記憶状態のブロックになる。図5の非リンクは後述する。
[インデックスiの読み出しread(i)]
図7は、読み出しの制御を示すフローチャート図である。図8は、読み出し制御を示す図である。ここでは読み出し先インデックスiのブロックをB1と称する。
読み出しread(i)(iは偶数)が呼ばれると、配列制御プログラムを実行するプロセッサは、インデックスiのブロックB1の種別をチェックする(S21)。ブロックの種別の判別は、インデックスiが境界ポインタより小さいか(M領域)以上か(W領域)の判定と、インデックスiのブロックが双方向リンクを持つか否か(双方向リンクならMP,WP、それ以外ならMS,WS)により行う。インデックスiのブロックB1の種別がM領域の未書込みブロックMPまたはW領域の未書込みブロックWSの場合(S21のMPまたはWS)、NULLを返して終了する(S22)。図8中のA:read(14)が一例である。
インデックスiのブロックB1の種別がM領域の書込み済みブロックMSの場合(S21のMS)、インデックスiとi+1に保存されている値を返して終了する(S23)。図8中のB:read(4)が一例である。
インデックスiのブロックB1の種別がW領域の書込み済みブロックWPの場合(S21のWP)、ブロックB1に対応付けられた(双方向リンクされた)ブロックMPの該当するデータワードに保存されている値と、インデックスi+1の値を返して終了する(S25)。図8中のC:read(8)が一例である。図8の例ではブロックのデータワードは1個しかないので、インデックス2のブロックMPのインデックス3のデータワードの値と、インデックス9の値を返す。1つのブロックが複数のデータワードを有する場合、あらかじめ決められたデータワードに双方向リンク先のアドレスワードに書き込まれる値が保存される。
次に、有効値書込みwrite(i,V)(iは偶数、Vは有効値または有効データ)が呼ばれると、以下の非リンクunlink(i)と、境界をシフトするエクステンドextend()とを適宜呼んで、インデックスiのブロックに値V(インデックスiにx1、i+1にx2)を書き込む処理が行われる。エクステンドextendは2種類のエクステンド処理E1,E2がある。有効値書込みwriteは4種類の書込み処理W1、W2-1,W2-2,W2-3がある。また、それぞれの処理で、意図しないリンクが形成されたM領域のブロックのリンクを切断して種別MSにする非リンクunlink処理が行われる。つまり、エクステンドextendと非リンクunlinkは、書き込みの補助機能である。
[インデックスiのブロックの非リンクunlink(i)]
図5は、非リンクの制御を示すフローチャート図である。図9は、非リンクの制御を示す図である。非リンクunlinkは、種別MSのブロックの値を書き替えた時にW領域のブロックと偶然双方向リンクができてしまう場合、意図してないリンクを切断して種別MSを維持するなどの目的で使用する。非リンクは、例えば偶然生成された双方向リンクのW領域側のブロックのアドレスワードを自身のインデックスで書き換えることで行われる。
非リンクunlink(i)が呼ばれると、配列制御プログラムを実行するプロセッサは、M領域のインデックスiのブロックB1に双方向リンクが形成されたW領域のブロックB2が存在するかチェックし(S11)、存在する場合、W領域のブロックB2のアドレスワードをM領域のブロック以外のインデックスに書き換える(S12)。具体的には、例えばW領域のブロックB2のアドレスワードを自身のインデックスに書き換える。
図9の具体例では、配列AR1でブロックB1がM領域の書込み済みブロックMSであり、一方W領域内の未書込みブロックWS(B2)のアドレスワードに偶然「2」が保存されていたとする。配列AR2にて、インデックス2に値「10」が書き込まれると、偶然にM領域の書込み済みブロックB1とW領域の未書込みブロックB2との間に意図しない双方向リンクが発生する。そこで、非リンクunlink(2)を呼び出し、W領域のブロックB2のアドレスワードに自身のインデックス「10」を書き込んで意図しないリンクを切断する。非リンクにはW領域のインデックスを書き込めばよいが、前述のように自身のインデックスを書き込んでも良い。
[エクステンドextend()]
エクステンドextendは、未書込みブロックMPまたはWSに有効値書込みが行われる場合、未書込みのブロックのうち一つのブロックに任意値を書込み、任意値が書き込まれた種別MSのブロックを生成し返す処理である。そして、有効値書込みwrite処理では、この任意値書込済ブロックMSに書込みが行われるか、任意値書込済ブロックMSの位置をユーザの書込み先に実質的に移動させ移動した任意値書込済ブロックに書込みが行われる。1つのブロックは2つ以上のワードを有しその2つのワードに書込みが行われる。したがって、任意値書込済ブロックMSを取得し、その任意値書込済ブロックMSの2つのワードに書込み値を書き込む(または移動した任意値書込済ブロックの1つのワードに書込み値を書き込む)。
別の言葉で説明すると、未書込みブロックMPまたはWSに有効値書込みが行われると、未書込みブロックMPまたはWSが1つ減り、書込み済みブロックMSまたはWPが1つ増加する。そこで、エクステンドextend処理は、M領域のブロックMSとW領域のブロックWPの数を等しく保つための処理を行う。
上記の通り、エクステンドで取得した任意値書込済ブロックMSには書込み値(有効値)の書込みが行われるので、以下のエクステンド処理では任意値の書込み処理S32,S36を省略することができる。つまり、任意値であるから、任意値の書き込み処理S32,S36を省略してもそのブロックMSが任意値書込済であることに変わりはない。
図10は、エクステンドextend()の制御のフローチャート図である。図11は、境界に隣接するW領域のブロックB1の種別がWSの場合のエクステンド制御E1を示す図である。図12は、境界に隣接するW領域のブロックB1の種別がWPの場合のエクステンド制御E2を示す図である。
図10のフローチャートに示されるとおり、エクステンドextend()が呼ばれると、配列制御プログラムを実行するプロセッサは、境界に隣接するW領域のブロックB1(境界ポインタのインデックスのブロック)の種別を判定する(S31)。
(E1)図11に示されるとおり、境界に隣接するW領域のブロックB1が種別WSの場合(S31のWS)、プロセッサは、この未書込みブロックWS(B1)に任意値を書込み(S32)、境界をシフトしてM領域を1ブロック分拡張し(S33)、必要な場合非リンクunlink処理してブロックB1の種別をMS(B1)にする(S34)。この任意値書込み済みブロックMS(B1)が、書き込み対象の空ブロックMSとしてリターンされる(S35)。つまり、この処理では、境界隣接のW領域のブロックWS(B1)を直接任意値書込済MS(B1)に変更し、直接境界隣接のW領域のブロックWS(B1)を1減らしMS(B1)を1増やし、MPとWPの数に変動がなく、MPとWPの数が等しい状態を維持する。
(E2)一方、図12に示されるとおり、境界に隣接するW領域のブロックB1が種別WPの場合(S31のWP)、プロセッサは、この書込み済みブロックWP(B1)のアドレスワードに、ブロックWP(B1)のリンク先ブロックMP(B2)のデータワードに書き込んでいたデータを書込み(コピー)(S36)、リンク先ブロックMP(B2)の全てのワードに任意値を書込む(この書込みは省略可)(S37)。そして、境界をシフトしてM領域を1ブロック拡張し(S38)、必要な非リンクunlink処理し(S39)、境界に隣接するW領域のブロックWP(B1)とそのリンク先ブロックMP(B2)を共に任意値書込み済みMS(B1),MS(B2)にする。そして、任意値書込み済みブロックMS(B2)がリターンされる(S40)。つまり、この処理では、エクステンドによりWP(B1)が1減るので、MP(B2)を1減らしMS(B2)を1増やすことで、MPとWPの数が等しい状態を維持する。但し、境界に隣接するW領域のブロックWP(B1)のリンク先のMP(B2)を任意値書込み済みMSに変更することができないので、境界右ブロックWP(B1)にそのリンク先MP(B2)のデータを書き込んでMS(B1)に変更し、リンク先MP(B2)に任意値を書き込んで任意値書込み済みMS(B2)を生成する。これにより、M領域のMPとW領域のWPの数を等しく保つ数合わせを行う。
上記のとおり、エクステンドextend処理の意味は次の通りである。例えば、未書込みブロックMPに書込みが行われて書込み済みMSに変更されるとM領域のMPが減少し、一方、未書込みブロックWSに書込みが行われて書込み済みブロックWPに変更されるとW領域のWPが増加し、M,W領域の管理対象ブロックMP,WPのうちMPの減少またはWPの増加になる。その結果、MP,WPの数を同じに保つという条件を維持するために、境界を右側にシフトさせて、MPの減少にはMPの追加を行い、WPの増加にもMPの追加を行うことが必要になる。
この数合わせのために、エクステンドextend処理を行う。上記の通り、エクステンドextend処理では、境界を右シフトし任意値書込み済みMSを生成する。そして、以下に説明するwrite処理では、この任意値書込み済みMSに書込み値が直接書き込まれるか、任意値書込み済みMSの位置を変更して変更後のブロックに書込み値が書き込まれる。
[インデックスiの要素に有効値Vの書込みwrite(i,V)但しiは偶数、V=[x1,x2]]
図13は、有効値書込みwrite(i,V)の制御を示すフローチャート図である。また、図14は、有効値書込みの処理W1を示す図である。図15,図16,図17は、有効値書き込み処理W2-1,W2-2,W2-3をそれぞれ示す図である。ここでは、書込み先インデックスのブロックをB1、エクステンドextendにより取得するブロックをB2、書込み先ブロックB1と対応付けられているブロックをB3と称する。
有効値書込みwrite(i,V)の呼び出しがあると、配列制御プログラムを実行中のプロセッサは、書込み先インデックスiのブロックB1の種別を判別する(S51)。
(W1)図14に示されるとおり、書込み先のインデックスiのブロックB1の種別が書込み済みブロックMSまたはWPの場合(S51のMSまたはWP)、読み出しread処理と同じ方法で書込み先を特定し、その書込み先に書込み値xを書き込む。例えば、インデックスiのブロックB1がMSの場合、インデックスiのブロックB1(MS)のインデックスi、i+1のワードに書込み値V=[x1,x2]を書込み(S52)、非リンクunlinkを使って意図しないリンクを切断する(S53)。また、インデックスiのブロックB1がWPの場合、書込み先のブロックWP(B1)のリンク先ブロックMPのデータワードに値x1を、インデックスi+1に値x2をそれぞれ書き込む(S56)。図14には、write(0,[12,0])が工程S52で書き込まれ、write(8,[12,12])が工程S56で書き込まれることが示される。
(W2)書込み先のインデックスiのブロックB1の種別が未書込みブロックMPまたはWSの場合(S51のMPまたはWS)、エクステンドextend処理を行って任意値書込み済みブロックB2(MS)を取得する(S57)。
(W2-1)図15に示すとおり、書込み先ブロックB1と任意値書込み済みブロックB2とが同じブロックの場合(S58のYES)、書込み先ブロックB1が任意値書込み済みMS(B1)であるので、書込み先がMSの場合と同様にインデックスi、i+1に値V=[x1,x2]を書込み(S52)、必要なunlink処理をして意図しないリンクを切断してMS(B1)を維持する(S53)。図15では、write(2,[12,0])について、extendで書込み先ブロックB1(MP)がMS(B1)に変更され、代わりにインデックス6のブロックがB1のリンク先ブロックWPのリンク先に変更されている。そして、MSに変更された書込み先ブロックMS(B1)のインデックス2,3に値[12,0]が書き込まれ、unlink(2)によりリンクが切断されている。
つまり、書込みW2-1では、エクステンド処理で取得した任意値書込み済みブロックB2(MS)が書込み先ブロックB1と一致したので、書込み先インデックスi,i+1に値を書き込む。
(W2-2)図16に示す通り、書込み先ブロックB1と任意値書込み済みブロックB2とが異なるブロックで(S58のNO)、B1の種別がWSの場合(S59のWS)、書込み先ブロックB1(WS)とエクステンドで生成した任意値書込み済みブロックB2(MS)の間に双方向リンクを作成して対応付け(S60)、書込み先ブロックB1(リンク付けでWSから変更したWP)に任意値を書込む(S61)。そして、書込み先ブロックB1(WP)がWPの場合と同様にインデックス10,11に書込み値V=[12,0]を書き込む(S56)。
つまり、書込み先ブロックB1(WS)をWSから任意値書込み済みWP(B1)に変更して書き込む必要があるので、extendで取得した任意値書込み済みブロックB2(MS)を上記任意値書込み済みWP(B1)のリンク先ブロックMP(B2)に変更する。この変更は、実質的に、extend処理で取得した任意値書込み済みブロックB2(MS)の位置を、書込み先ブロックB1(WP)に移動させたことを意味する。
(W2-3)図17に示す通り、書込み先ブロックB1と初期化済みブロックB2とが異なるブロックで(S58のNO)、B1の種別がMPの場合(S59のMP)、書込み先ブロックB1(MP)のデータワードの値をextendで得た任意値書込み済みブロックB2(MS)に書き込んで(S62)、書込み先ブロックB1(MP)のリンク先ブロックB3(WP)と任意値書込み済みブロックB2(WP)間にリンクを張る(S63)。この結果、任意値書込み済みブロックB2(MS)はMSからMPに変更される。そして、書込み先ブロックB1に任意値を書込んで(S64)任意値書込み済みブロックB1(MS)とする。これによりextend処理で取得したブロックB2(MS)が実質的に書込み先ブロックB1(MS)に移動する。そして、書込み先ブロックB1(MS)がMSの場合と同様に値を書き込む(S52,S53)。すなわち、書込み先ブロックB1(MS)に書込み値V=[12,0]を書込み(S52)、unlink処理で意図しないリンクを切断する(S53)。
つまり、書込み先ブロックB1をMPから任意値書込み済みMSにして書き込む必要があるので、エクステンドで生成した任意値書込み済みブロックB2(MS)を、書込み先ブロックB1(MP)に代えて、ブロックB3(WP)のリンク先MPに変更する。これにより、実質的に、extendで取得したブロックB2(MS)を、書込み先B1(MS)のリンク先だったB3(WP)のリンク先に変更し、書込み先ブロックB1を任意値書込み済みMSに変更してそのB1(MS)に値を書き込む。
[インデックスiの要素にNULLを書込みwrite(i,NULL)]
図18は、NULL書込みwrite(i,NULL)の制御を示すフローチャート図である。また、図19は、NULL書込みの処理WN1を示す図である。図20,21,22は、NULL書き込み処理WN2-1,WN2-2,WN2-3をそれぞれ示す図である。図23,24,25は、NULL書込み処理WN3-1、WN3-2,WN3-3をそれぞれ示す図である。
ここでは、書込み先インデックスのブロックをB1、境界に隣接するM領域のブロック(以下、境界M側隣接ブロックと称する)をB2、B1のリンク先をB3、B2のリンク先をB4とそれぞれ称する。
NULL書込みは、書込み先ブロックが未書込みブロックMP,WSの場合、既にNULLを記憶した状態であるので特に処理を行う必要がない。
一方、書込み先ブロックが書込み済みブロックMS、WPの場合、境界をM領域側に1ブロックシフトしW領域を1ブロック増加するシュリンク処理と、書込み先ブロックについて、MSをMPにまたはWPをWSに変更する処理が必要になる。
その場合、書込み先ブロックがMSの場合、書込み先ブロックMSをNULL記憶状態のMPに変更するための新たなリンクの生成処理が必要になる。一方、書込み先ブロックがWPの場合、書込み先ブロックWPをNULL記憶状態のWSに変更するために、書込み先ブロックWPと対応付けられているMPとのリンクの削除処理が必要になる。
さらに、境界M側隣接ブロックがMPの場合、シュリンク処理に対応して境界M側隣接ブロックMPと対応付けられているWPとの既存のリンクの処理が必要になる。
NULLの書込みは6種類の処理を有する。即ち、NULL書込みは、書込み先ブロックがMSの場合、B2がB1と同じ場合の処理WN2-1と、B2がB1と異なる場合で境界M側隣接ブロックB2がMSかMPかの2つの場合の処理WN2-2,WN2-3がある。さらに、NULL書込みは、書込み先ブロックがWPの場合、B2がB3と同じ場合の処理WN3-1と、B2がB3と異なる場合で境界M側隣接ブロックB2がMSかMPかの2つの場合の処理WN3-2,WN3-3がある。
図18において、NULL書込みwrite(i,NULL)の呼び出しがあると、配列制御プログラムを実行中のプロセッサは、書込み先インデックスiのブロックB1の種別を判別する(S71)。
(WN1)図19に示されるとおり、書込み先のインデックスiのブロックB1の種別が未書込みブロックMPまたはWSの場合(S71のMPまたはWS)、プロセッサは、何も行わない。即ち、書込み先ブロックB1(MP),B1(WS)は、未書込み状態であるので既にNULL状態である。したがって、プロセッサは特に書き込み処理を行わない。
(WN2)図18のとおり、プロセッサは、書込み先ブロックB1の種別が書込み済みブロックMSまたはWPの場合(S71のMSまたはWP)、境界に隣接するM領域のブロックをB2と設定し(S72)、書込み先ブロックB1の種別がMSの場合(S73のMS)、以下のNULL書込みWN2-1~WN2-3を実行する。
(WN2-1)図20は、NULL書込み処理WN2-1を示す図である。図18のとおり、プロセッサは、ブロックB2とB1が同じ場合(S74のYES)、書込み先ブロックB1のアドレスワードの値を自分のブロックのインデックス(図20中インデックス「4」)に書き換えて意図しないリンクを削除し(S75)、境界を移動してM領域を1ブロック縮小する(S76)。この境界を移動する処理は、M領域を縮小するのでシュリンク(Shrink)処理と称する。2つの処理S75,S76の順番が逆でも良い。この結果、書込み先ブロックB1は未書込みブロックWSになるので、NULLが書込まれた状態になる。
このように、NULL書き込みは、境界をM領域側に移動してM領域を縮小する処理と、書込み先ブロックB1を未書込み状態MPまたはWSにする処理である。つまり、後者の処理は、書込み先ブロックB1が最終的にM領域になるならMPにする処理で、W領域になるならWSにする処理である。以下のNULL書込みも同様である。
(WN2-2)図21は、NULL書込み処理WN2-2を示す図である。図18のとおり、NULL書き込み処理WN2-2は、書込み先ブロックB1が書込み済みブロックMSの場合(S73のMS)、さらに境界M側隣接ブロックB2と書込み先ブロックB1が異なる場合(S74のNO)、そして境界M側隣接ブロックB2がMSの場合(S77のMS)の処理である。書込み先ブロックB1(MS)を未書込みブロックB1(MP)にする必要があるので、W領域内にそのリンク先ブロックWPを取得する必要がある。
そこで、プロセッサは、境界を移動してM領域を1ブロック縮小する(S76:シュリンク処理)。さらに、境界M側隣接ブロックB2(MS)を書込み先ブロックB1(MS)のリンク先にするために、ブロックB2(MS)のアドレスワードの値「1」をブロックB1(MS)のデータワードに書込み(移動し) (S78)、ブロックB2(MS)とブロックB1(MS)のアドレスワードに互いのインデックス「2」「6」をそれぞれ書込み、ブロックB2,B1との間にリンクを形成する(S78)。その結果、書込み先ブロックB1は未書込みブロックMPになり、NULL状態になる。
(WN2-3)図22は、NULL書込み処理WN2-3を示す図である。図18のとおり、NULL書き込み処理WN2-3は、書込み先ブロックB1が書込み済みブロックMSの場合(S73のMS)、さらに境界M側隣接ブロックB2と書込み先ブロックB1が異なる場合(S74のNO)、そして境界M側隣接ブロックB2がMPの場合(S77のMP)の処理である。この場合も、書込み先ブロックB1(MS)を未書込みブロックB1(MP)にする必要があるので、W領域内にそのリンク先ブロックWPを取得する必要がある。
そこで、プロセッサは、境界を移動してM領域を1ブロック縮小する(S76:シュリンク処理)。さらに、境界M側隣接ブロックB2(MP)のリンク先ブロックB4(WP)を書込み先ブロックB1(MS)のNULL書込み後のリンク先にするために、ブロックB2(MP)のデータワードの値「8」をブロックB1(MS)のデータワードに書込み(移動し) (S80)、ブロックB1(MS)のアドレスワードにブロックB4(WP)のインデックス「10」を書き込み(S80)ブロックB4(WP)とブロックB1(MS)のアドレスワードに互いのインデックス「10」「2」をそれぞれ書込み、ブロックB4,B2との間にリンクを形成する(S80)。つまり、ブロックB2とB4間のリンクを、ブロックB1とB4間のリンクに置き換える。その結果、書込み先ブロックB1は未書込みブロックMPになり、NULL状態になる。
(WN3)図18のとおり、プロセッサは、書込み先ブロックB1の種別が書込み済みブロックMSまたはWPの場合(S71のMSまたはWP)、境界に隣接するM領域のブロックをB2と設定し(S72)、書込み先ブロックB1の種別がWPの場合(S73のWP)、以下のNULL書込みWN3-1~WN3-3を実行する。
(WN3-1)図23は、NULL書込み処理WN3-1を示す図である。図18のとおり、NULL書き込み処理WN3-1は、書込み先ブロックB1がWPの場合(S73のMP)で、境界M側隣接ブロックB2と書込み先ブロックB1のリンク先B3とが同じブロックの場合(S82のYES)の処理である。この場合、書込み先ブロックB1(WP)のリンクを解消してWSにする必要がある。
そこで、プロセッサは、書込み先ブロックB1のリンク先ブロックをB3に設定し(S81)、境界を移動してM領域を1ブロック縮小する(S76:シュリンク処理)。この結果、書込み先ブロックB1は未書込みブロックWSになるので、NULLが書込まれた状態になる。NULL書き込みの結果、W領域の書込み済みブロックWPが1つ減るので、シュリンク処理により境界M側隣接ブロックMP(未書込みブロック)をWSに変更し、B1,B2間のリンクが削除され、WPとMPの数が等しく保たれる。
(WN3-2)図24は、NULL書込み処理WN3-2を示す図である。図18のとおり、NULL書き込み処理WN3-2は、書込み先ブロックB1が書込み済みブロックWPの場合(S73のWP)、さらに境界M側隣接ブロックB2が書込み先ブロックB1のリンク先B3と異なる場合(S82のNO)、そして境界M側隣接ブロックB2がMSの場合(S83のMS)の処理である。この場合、書込み先ブロックB1(WP)を未書込みブロックB1(WS)にする必要があるので、ブロックB3(MP)のリンク先である書込み先ブロックB1(WP)の代わりに、新たにB3のリンク先ブロックWPを取得する必要がある。また、書込み先ブロックB1(WP)に対応付けられたブロックB2(MP)が存在する。
そこで、プロセッサは、書込み先ブロックB1のリンク先ブロックをB3に設定する(S81)。そして、プロセッサは、境界を移動してM領域を1ブロック縮小する(S76)。さらに、境界M側隣接ブロックB2(MS)をブロックB3(MP)の新たなリンク先にするために、ブロックB2(MS)のアドレスワードの値「1」をブロックB3(MP)のデータワードに書込み(移動し)(S84)、ブロックB3(MP)とブロックB2(MS→WP)のアドレスワードに互いのインデックス「2」「6」を書き込んで、ブロックB3,B2との間にリンクを形成する(S83)。即ち、プロセッサは、B3-B1間のリンクをB3-B2間のリンクに置き換えることで、書込み先ブロックB1をWSに変更し、NULL状態にする。そして、リンクが維持され、W領域のWPとM領域のMPの数も変更されない。
(WN3-3)図25は、NULL書込み処理WN3-3を示す図である。図18のとおり、NULL書き込み処理WN3-3は、書込み先ブロックB1が書込み済みブロックWPの場合(S73のWP)、さらに境界M側隣接ブロックB2が書込み先ブロックB1のリンク先B3と異なる場合(S82のNO)、そして境界M側隣接ブロックB2がMPの場合(S83のMP)の処理である。この場合、書込み先ブロックB1(WP)を未書込みブロックB1(WS)にする必要があり、ブロックB1とB3間のリンクが解消されるので、MPブロックB3(MP)のリンク先である書込み先ブロックB1(WP)の代わりに、新たにB3のリンク先ブロックWPを取得する必要がある。また、境界M側隣接ブロックB2がMPでありシュリンク処理によりそのリンクが解消される。
そこで、プロセッサは、書込み先ブロックB1のリンク先ブロックをB3に設定する(S81)。そして、プロセッサは、境界を移動してM領域を1ブロック縮小し(S76)する。さらに、ブロックB1(WP)のリンク先B3と、境界M側隣接ブロックB2(MP)のリンク先B4との間に新たなリンクを形成するために、ブロックB2(MS)のデータワードの値「2」をブロックB3(MP)のデータワードに書込み(移動し) (S86)、ブロックB3(MP)とブロックB4(WP)のアドレスワードに互いのインデックス「10」「2」を書き込んで、ブロックB3,B4との間にリンクを形成する(S86)。即ち、プロセッサは、B3-B1間のリンクを解消し、B2-B4間のリンクを解消し、B3-B4間のリンクを形成して、その結果、書込み先ブロックB1(WP)をWSに変更し、NULL状態にし、リンクを1つ減らして、W領域のWPとM領域のMPの数を等しく保つ。
[初期化、書込み、読み出しの具体例]
次に、初期化、書込み、読み出しを具体例に沿って説明する。以下の具体例では、通常データの書き込みでは、未書込みブロックWSに書込みして書込み済みブロックWPが1増加し双方向リンクも増加し、境界W側ブロックがWPの場合のエクステンドにより書込み済みブロックWPが1減少することを示す。また、エクステンドによりM領域が増加し、W領域が減少することを示す。さらに、W領域が少なくなると双方向リンクの数が減少し管理情報量が減少することを示す。そして、NULL書込みではシュリンク処理とリンクの変更により書込み済みブロックが未書込み状態に変更されてNULL状態になることを示す。
図26は、配列ARの具体例と、初期化を示す図である。配列AR0は、配列の長さ16、1要素(1ブロック)が2ワードを含む配列である。境界ポインタBD_Pの値「12」により境界BDがインデックス11と12の間にあることが示される。したがって、配列の主領域の値は、境界ポインタの値が「0」の初期状態では不定値であり、境界ポインタの値が「0」より大きいと書込み済みブロックMS、WP内の値は真の値であり、未書込みブロックMP,WS内のデータはNULL状態である。また、ブロックの種別MS,MP,WS,WPは実際に値が保存されているわけではない。ブロックの種別は、ブロックのインデックスi、境界ポインタBD_P、ブロック内のアドレスワードの値により定数時間で計算可能である。
初期化initialize(0)が呼ばれると、プロセッサは、配列AR1で、境界ポインタBD_Pの値を「0」に書き換える(図5のS1)。境界ポインタが「0」になるので、全てのブロックの種別は未書込みブロックWS(NULL状態)になる。また、全インデックスの値は不定値となる。
図27は、図16で説明した書込みW2-2の具体例を示す図である。配列AR2は初期状態の配列AR1と同じである。配列AR2で、書込みwrite(4,[0,9])が呼ばれ、以下の通り、プロセッサがインデックス4のブロックに値[0,9]を書き込む。この書込みの場合、書き込むブロックの種別は未書込みブロックWSであり、境界BDに隣接するW領域のブロックの種別はWSである。
そこで、配列AR3では、プロセッサが、エクステンドextendにより境界ポインタBD_Pを「2」に書き換えて境界BDをシフトし、M領域内に任意値書込み済み(任意値「0、0」が書き込まれた)ブロックMS(B2)を生成する(S57)。このエクステンドextendは図11の処理E1である。また、任意値の書込みは省略可能である。さらに、配列AR4では、プロセッサが書込み先ブロックB1とブロックMS(B2)との間に双方向リンクを作成し(S60)、書込み先ブロックB1のアドレスワードに書込み値「9」を、リンク先ブロックB1のデータワードに書込み値「0」をそれぞれ書込む(S55)。このように、境界BDに隣接するW領域のブロック以外の未書込みブロックWSへの書込みが発生すると、エクステンドで境界がシフトしてM領域が増加しW領域が減少し、双方リンクが1増加する。
図28は、図16で説明した書込みW2-2の具体例を示す図である。配列AR5(=AR4)で、書込みwrite(10,[8,0])が呼ばれてプロセッサがインデックス10のブロックに値[8,0]を書き込む。この書込みの場合、書き込むブロックの種別は未書込みブロックWSであり、境界BDに隣接するW領域のブロックの種別はWSである。
そこで、配列AR6で、プロセッサが、エクステンドextendにより境界ポインタBD_Pを「4」に書き換えて境界BDをシフトし、M領域内に任意値書込み済ブロックMS(B2)を生成する(S57)。このエクステンドextendは図11の処理E1である。さらに、配列AR7では、プロセッサが書込み先ブロックB1と任意値書込み済ブロックMS(B2)との間に双方向リンクを作成し(S60)、書込み先インデックス10がWPであるので、書込み先ブロックB1のリンク先ブロックB2のデータワード(インデックス3)に書込み値「8」を書込み、書込み先ブロックB1のデータワードに書込み値「0」を書き込む(S56)。図27と同様に、境界BDに隣接するW領域のブロック以外の未書込みブロックWSへの書込みが発生すると、境界がシフトしてM領域が増加しW領域が減少し、双方リンクが1増加する。
図29は、図16で説明した書込みW2-3の具体例を示す図である。配列AR8(=AR7)で、書込みwrite(2,[14,0])が呼ばれ、プロセッサがインデックス2に値[14,0]を書き込む。この書込みの場合、書き込むブロックの種別は未書込みブロックMPであり、境界BDに隣接するW領域のブロックの種別はWPである。
そこで、配列AR9で、プロセッサが、エクステンドextendにより境界ポインタBD_Pを「6」に書き換えて境界BDをシフトし、M領域内に任意値書込み済ブロックMS(B2)を生成する(S57)。このエクステンドは図12の処理E2である。さらに、配列AR10で、プロセッサが書込み先ブロックB1(MP)の値[10,8]を任意値書込み済ブロックB2(MS)に書込み(S62)、書込み先ブロックB1のリンク先ブロックB3(WP)のアドレスワードにB2のインデックス0を書き込んでブロックB2とB3との間に双方向リンクを変更する(S63)。また、書込み先ブロックB1に任意値を書き込んで任意値書込み済ブロックMSに変更する(S64)。その後、配列AR11で、プロセッサが書込み先ブロックB1に書込み値[14,0]を書込み(S52)、配列AR12で書込み先ブロックB1に生成された意図しないリンクを切断する(S53)。この場合、エクステンドextendによりM領域が増加しW領域が減少し、さらに書込み済みブロックWPが1減少し、双方向リンクも1減少している。
図30は、図16で説明した書込みW2-1の具体例を示す図である。配列AR13(=AR12)で、書込みwrite(6,[10,0])が呼ばれ、プロセッサがインデックス6の要素に値[10,0]を書き込む。この書込みの場合、書き込むブロックの種別は未書込みブロックWSであり、書込み先ブロックB1と境界W側ブロックB2とが同じブロックである。
そこで、配列AR14で、プロセッサが、エクステンドextendにより境界ポインタBD_Pを「8」に書き換えて境界BDをシフトし、M領域内に任意値書込み済ブロックMS(B2)を生成する(S57)。このエクステンドは図12の処理E1である。そして、配列AR14では、書込み先ブロックB1とエクステンドで生成した任意値書込み済ブロックMS(B2)とが一致している(S58のYES)。そこで、配列AR15で、プロセッサが書込み先ブロックB1(MS)に値[10,0]を書込み(S52)、書込み先ブロックB1に意図しないリンクが発生しないことを確認する(S53)。この場合、エクステンドextendによりM領域が増加しW領域が減少し、しかし未書込みブロックMPと書込み済みブロックWPの数は不変で、双方向リンク数も不変である。
図31は、図16で説明した書込みW1の具体例を示す図である。配列AR16(=AR15)で、書込みwrite(4,[8,12])が呼ばれ、プロセッサがインデックス4のブロックに値[8,12]を書き込む。この書込みの場合、書き込むブロックの種別は書込み済みブロックMSである(S51のMS)。書込み済みブロックに書き込むので、エクステンドextendにより境界をシフトして任意値書込み済ブロックMSを生成する必要はない。
そこで、配列AR17で、プロセッサが書込み先ブロックB1(MS)に値[8,12]を書込む(S52)。この書き込みにより、書込み先ブロックB1にインデックス8のブロックとの間に意図しないリンクが発生している。そこで、配列AR18で、インデックス8に自身のインデックス8を書き込んで意図しないリンクを切断する(S53)。この場合、M領域とW領域の数は不変で、未書込みブロックMPと書込み済みブロックWPの数も不変、双方向リンク数も不変である。
以上のとおり、配列への書込みが繰り返されると境界が徐々にシフトしM領域が増加していく。初期化直後は双方向リンク数が少ないので、M領域のブロック数が少なくても少ない管理情報(双方向リンクの情報)を配列の主領域に保存することができる。その後、未書込みブロックWSへの書込みにより境界がシフトし徐々に双方向リンク数が増えるが、M領域のブロック数も増えるので増加する管理情報(双方向リンクの情報)を配列の主領域に保存できる。そして、境界がW領域の最大インデックスに近づいてくると、書込み済みブロックWPがエクステンドにより書込み済みブロックMSに変更されるなどにより双方向リンク数が減ってくる。その結果、W領域のブロック数が少なくても減少した管理情報を保存することができる。つまり、M領域の未書込みブロック数とW領域の書込み済みブロック数を管理するというハイブリッド的管理により、双方向リンクの最大数を抑制し、且つ合計書き込み数が少ないほど及び合計書き込み数が多いほど双方向リンクの数が少なく、配列内に双方向リンクの管理情報を保存することができる。
図32は、読み出しreadの3種類の具体例を示す図である。配列AR19(=AR18)で、読み出しread(0)が呼ばれ、プロセッサがインデックス1の値を読み出す。読み出し先ブロックの種別が未書込みブロックMPであるので(S21のMP)、プロセッサはNULLを読み出して返す(S22)。
配列AR20で、読み出しread(2)が呼ばれ、プロセッサがインデックス2のブロックの値を読み出す。読み出し先ブロックの種別が書込み済みブロックMSであるので(S21のMS)、プロセッサはインデックス2の値[14,0]を読み出して返す(S23)。
配列AR21で、読み出しread(8)が呼ばれ、プロセッサがインデックス8のブロックの値を読み出す。読み出し先ブロックの種別が未書込みブロックWSであるので(S21のWS)、プロセッサはNULLを読み出して返す(S22)。
図33は、読み出しreadの1種類の具体例の具体例を示す図である。配列AR22(=AR21)で、読み出しread(10)が呼ばれ、プロセッサがインデックス10のブロックの値を読み出す。読み出し先ブロックの種別が書込み済みブロックWPであるので(S21のWP)、プロセッサは読み出し先ブロックWPのリンク先の未書込みブロックMPのデータワードの値「8」(インデックス1の値)と、読み出し先ブロックWPのデータワードの値「0」を読み出して返す(S25)。
図34は、NULL書込みの具体例を示す図である。図34では、NULL書込みwrite(10,NULL)が呼ばれる。したがって、書込み先ブロックB1はWP、境界M側隣接ブロックB2はMSであり、B2とB1は異なるブロックであり、図24のNULL書込みWN3-2の処理が行われる。
プロセッサは、境界を移動してM領域を1ブロック縮小する(S76)。さらに、境界M側隣接ブロックB2(MS)をブロックB3(MP)の新たなリンク先にするために、ブロックB2(MS)のアドレスワードの値「10」をブロックB3(MP)のデータワードに書込み(移動し) (S84)、ブロックB3(MP)とブロックB2(MS→WP)のアドレスワードに互いのインデックス「2」「6」を書き込んで、ブロックB3,B2との間にリンクを形成する(S83)。それにより、書込み先ブロックB1をWSに変更し、NULL状態にする。
図36は、本実施の形態のNULL状態を記憶するための追加メモリ容量を示す図である。本実施の形態では、mビットの要素の場合、配列長N≦ 2^(m/2)までの配列を、境界値を記憶する追加領域m/2ビットでオプショナル配列に拡張できる。このオプショナル配列は、1要素が2^m種類の通常のデータと1つの特殊状態(NULL状態)とを持つことができる。但し、配列長が2^(m/2) より長い場合は、 2^(m/2) ごとに追加領域 m/2 bitを使用する。「^」はべき乗を意味する。
その理由は、要素がmビットの場合、要素の小さい側のインデックスのアドレスワードがm/2ビットになるため、配列の要素数である配列長Nは最大で2^(m/2)までとなる。そこで、配列長が最大長2^(m/2)を超える場合は、配列長N=2^(m/2)の配列を必要な数有し、配列毎に追加領域m/2ビットを有する。
図36に示した例では、要素サイズmが8ビット、配列長が1000の場合、本実施の形態では配列長16(=2^(8/2))の配列を63個(1000/16 = 62.5, よって 63個)有し、追加領域が63個の配列毎に追加領域8/2ビット(4ビット)を有するので、追加領域は合計で63*4 = 252 bitとなる。
それに対して、フラグ方式は、配列長Nに対してNビットの追加領域が必要である。すなわち、配列長1000に対応して各要素に1ビットのフラグが必要となるので、追加領域は1,000ビットである。
また、エスケープ方式は、最悪でも全要素に「FF FF」、「FF 00」を書き込む必要があるので、各要素に8*2ビットを記憶するために、追加領域は8,000bitとなる。すなわち、エスケープ方式の場合は、mビットの要素、配列長Nの場合、最悪でm*Nビットの追加領域が必要になる。
他の要素サイズ、他の配列長も同様にして算出できる。
AR:配置(Array)
BD:境界(Boundary)
BD_P:境界ポインタ(Boundary Pointer)
INT:初期値(Initial Value)
M:未書込みブロックを記憶するM領域、第1領域
MP:M領域の未書込みブロック
MS:M領域の書込み済みブロック
W:書込み済みブロックを記憶するW領域、第2領域
WS:W領域の未書込みブロック
WP:W領域の書込み済みブロック
EX_C:エクステンド完了フラグ
read:読み出し
write(i,V):有効値書込み
write(i,NULL):特殊値書込み
extend:エクステンド、エクステンド処理
initialize:初期化処理

Claims (12)

  1. 少なくともアドレスワードとデータワードを含む2以上の定数個のワードをそれぞれ有する複数のブロックを連続して構成する配列を有し、前記配列の複数のブロックの二分割位置を示す境界を記憶し、前記二分割された第1領域内の未書き込みブロックの数と、前記二分割された第2領域内の書込み済みブロックの数とが同数になる位置を前記境界とするオプショナル配列を制御する処理をコンピュータに実行させる配列制御プログラムであって、
    前記処理は、
    前記第1領域の未書込みブロックまたは前記第2領域の未書込みブロックに対する有効値書込みが呼ばれると、前記境界を移動して前記第1領域を拡張し前記第1領域内に任意値書込済み書込みブロックを生成するエクステンド処理を行い、
    前記有効値書込みの書込み先ブロックが、前記エクステンド処理で生成した任意値書込済み書込みブロックと同じではなく、前記第2領域の未書込みブロックの場合、前記エクステンド処理で生成した第1領域の任意値書込済み書込みブロックのアドレスワードと、前記第2領域の前記書込み先ブロックのアドレスワードとに、互いのアドレスを記憶してリンクを形成し、
    前記第1領域の前記任意値書込済み書込みブロックのデータワードに前記有効値の一部分を書き込み、前記第2領域の前記書込み先ブロックのデータワードに前記有効値の残りの部分を書き込み、
    書込み先ブロックを前記第2領域の書込み済みブロックとする特殊値書込みが呼ばれると、前記境界を移動して前記第1領域を縮小するシュリンク処理を行って、前記境界に隣接する第1領域側の第1隣接ブロックを前記第2領域側に移動し、
    前記第1隣接ブロックが書込み済みブロックの場合、
    前記第1隣接ブロックのアドレスワードと、前記書込み先ブロックとリンクを形成する第1リンク先ブロックのアドレスワードとに、互いのアドレスを記憶してリンクを形成し、前記書込み先ブロックのリンクを解消して前記書込み先ブロックを未書込みブロックに変更し、
    前記第1隣接ブロックが未書込みブロックの場合、
    前記第1隣接ブロックとリンクを形成する第2リンク先ブロックのアドレスワードと、前記第1リンク先ブロックのアドレスワードとに、互いのアドレスを記憶してリンクを形成し、前記書込み先ブロックのリンクを解消して前記書込み先ブロックを未書込みブロックに変更する
    ことを有する配列制御プログラム。
  2. 前記処理は、さらに、
    書込み先ブロックを前記第1領域の書込み済みブロックとする特殊値書込みが呼ばれると、前記シュリンク処理を行って、前記境界に隣接する第1領域側の第1隣接ブロックを前記第2領域側に移動し、
    前記第1隣接ブロックが書込み済みブロックの場合、
    前記第1隣接ブロックのアドレスワードと、前記書込み先ブロックのアドレスワードとに、互いのアドレスを記憶してリンクを形成し、前記書込み先ブロックを未書込みブロックに変更し、
    前記第1隣接ブロックが未書込みブロックの場合、
    前記第1隣接ブロックとリンクを形成する第2リンク先ブロックのアドレスワードと、前記書込み先ブロックのアドレスワードとに、互いのアドレスを記憶してリンクを形成し、前記書込み先ブロックを未書込みブロックに変更する
    ことを有する、請求項1に記載の配列制御プログラム。
  3. 前記処理は、さらに、
    初期化が呼ばれると、全てのブロックが前記第2領域の未書込みブロックになるよう前記境界の位置を初期化することを有する、請求項1に記載の配列制御プログラム。
  4. 前記処理は、さらに、
    読み出しが呼ばれると、
    読み出し先ブロックが未書込みブロックの場合、前記特殊値を返し、
    前記読み出し先ブロックが書込み済みブロックの場合、読み出し先の値を返すことを有する、請求項3に記載の配列制御プログラム。
  5. 前記処理は、さらに、
    前記有効値書込みが呼ばれると、前記有効値書込みの書込み先ブロックを示すアクセス先インデックスと前記境界とに基づいて前記書込み先ブロックが前記第1領域のブロックかまたは第2領域のブロックかを判別し、前記書込み先ブロックが前記リンクを形成するか否かに基づいて前記書込みブロックが前記第1領域の未書込みブロックかまたは前記第2領域の書込み済みブロックかを判別することを有する、請求項1に記載の配列制御プログラム。
  6. 前記処理は、さらに、
    前記リンクの形成を目的とせず前記第1領域の書込み済みブロックの値を書き換えた場合、前記第2領域の未書込みブロックのアドレスワードを、前記第1領域の書込み済みブロックとリンクが形成されないよう制御する非リンクすることを有する、請求項1に記載の配列制御プログラム。
  7. 書込み先ブロックを前記第2領域の書込み済みブロックとする特殊値書込みが呼ばれると、
    前記第1隣接ブロックと前記書込み先ブロックとリンクを形成する第1リンク先ブロッ
    クとが同じブロックの場合、前記リンクを形成する処理を行わない、請求項1に記載の配列制御プログラム。
  8. 書込み先ブロックを前記第1領域の書込み済みブロックとする特殊値書込みが呼ばれると、
    前記第1隣接ブロックと前記書込み先ブロックとが同じブロックの場合、前記リンクを
    形成する処理を行わない、請求項1に記載の配列制御プログラム。
  9. 前記処理は、さらに、
    前記書込みの書込み先ブロックが、前記第1領域の未書込みブロックまたは前記第2領域の未書込みブロックであり、前記エクステンド処理で生成した任意値書込済み書込みブロックと同じ場合、前記書込み先ブロックに値を書込み、前記書込み先ブロックの不要なリンクを切断する非リンクを行うことを有する、請求項1に記載の配列制御プログラム。
  10. 前記処理は、さらに、
    前記書込みの書込み先ブロックが、前記エクステンド処理で生成した任意値書込済み書込みブロックと同じではなく、前記第1領域の未書込みブロックの場合、
    前記書込み先ブロックである前記第1領域の未書込みブロックの値を、前記エクステンド処理で生成した前記第1領域の任意値書込済み書込みブロックに書込んで、前記書込み先ブロックである前記第1領域の未書込みブロックのリンク先の第2領域の書込み済みブロックと前記エクステンド処理で生成した前記第1領域の任意値書込済み書込みブロックとの間にリンクを生成し、前記書込み先ブロックである前記第1領域の未書込みブロックに前記有効値を書き込むことを有する、請求項1に記載の配列制御プログラム。
  11. 少なくともアドレスワードとデータワードを含む2以上の定数個のワードをそれぞれ有する複数のブロックを連続して構成する配列を有し、前記配列の複数のブロックの二分割位置を示す境界を記憶し、前記二分割された第1領域内の未書き込みブロックの数と、前
    記二分割された第2領域内の書込み済みブロックの数とが同数になる位置を前記境界とするオプショナル配列を制御する配列制御方法であって、
    前記第1領域の未書込みブロックまたは前記第2領域の未書込みブロックに対する有効値書込みが呼ばれると、前記境界を移動して前記第1領域を拡張し前記第1領域内に任意値書込済み書込みブロックを生成するエクステンド処理を行い、
    前記有効値書込みの書込み先ブロックが、前記エクステンド処理で生成した任意値書込済み書込みブロックと同じではなく、前記第2領域の未書込みブロックの場合、前記エクステンド処理で生成した第1領域の任意値書込済み書込みブロックのアドレスワードと、前記第2領域の前記書込み先ブロックのアドレスワードとに、互いのアドレスを記憶してリンクを形成し、
    前記第1領域の前記任意値書込済み書込みブロックのデータワードに前記有効値の一部分を書き込み、前記第2領域の前記書込み先ブロックのデータワードに前記有効値の残りの部分を書き込み、
    書込み先ブロックを前記第2領域の書込み済みブロックとする特殊値書込みが呼ばれると、前記境界を移動して前記第1領域を縮小するシュリンク処理を行って、前記境界に隣接する第1領域側の第1隣接ブロックを前記第2領域側に移動し、
    前記第1隣接ブロックが書込み済みブロックの場合、
    前記第1隣接ブロックのアドレスワードと、前記書込み先ブロックとリンクを形成する第1リンク先ブロックのアドレスワードとに、互いのアドレスを記憶してリンクを形成し、前記書込み先ブロックのリンクを解消して前記書込み先ブロックを未書込みブロックに変更し、
    前記第1隣接ブロックが未書込みブロックの場合、
    前記第1隣接ブロックとリンクを形成する第2リンク先ブロックのアドレスワードと、前記第1リンク先ブロックのアドレスワードとに、互いのアドレスを記憶してリンクを形成し、前記書込み先ブロックのリンクを解消して前記書込み先ブロックを未書込みブロックに変更する
    ことをコンピュータが実行する配列制御方法。
  12. 少なくともアドレスワードとデータワードを含む2以上の定数個のワードをそれぞれ有する複数のブロックを連続して構成する配列を有し、前記配列の複数のブロックの二分割位置を示す境界を記憶し、前記二分割された第1領域内の未書き込みブロックの数と、前記二分割された第2領域内の書込み済みブロックの数とが同数になる位置を前記境界とするオプショナル配列を記憶する記憶装置と、
    前記記憶装置にアクセス可能なプロセッサとを有し、
    前記プロセッサは、
    前記第1領域の未書込みブロックまたは前記第2領域の未書込みブロックに対する有効値書込みが呼ばれると、前記境界を移動して前記第1領域を拡張し前記第1領域内に任意値書込済み書込みブロックを生成するエクステンド処理を行い、
    前記有効値書込みの書込み先ブロックが、前記エクステンド処理で生成した任意値書込済み書込みブロックと同じではなく、前記第2領域の未書込みブロックの場合、前記エクステンド処理で生成した第1領域の任意値書込済み書込みブロックのアドレスワードと、前記第2領域の前記書込み先ブロックのアドレスワードとに、互いのアドレスを記憶してリンクを形成し、
    前記第1領域の前記任意値書込済み書込みブロックのデータワードに前記有効値の一部分を書き込み、前記第2領域の前記書込み先ブロックのデータワードに前記有効値の残りの部分を書き込み、
    書込み先ブロックを前記第2領域の書込み済みブロックとする特殊値書込みが呼ばれると、前記境界を移動して前記第1領域を縮小するシュリンク処理を行って、前記境界に隣接する第1領域側の第1隣接ブロックを前記第2領域側に移動し、
    前記第1隣接ブロックが書込み済みブロックの場合、
    前記第1隣接ブロックのアドレスワードと、前記書込み先ブロックとリンクを形成する第1リンク先ブロックのアドレスワードとに、互いのアドレスを記憶してリンクを形成し、前記書込み先ブロックのリンクを解消して前記書込み先ブロックを未書込みブロックに変更し、
    前記第1隣接ブロックが未書込みブロックの場合、
    前記第1隣接ブロックとリンクを形成する第2リンク先ブロックのアドレスワードと、前記第1リンク先ブロックのアドレスワードとに、互いのアドレスを記憶してリンクを形成し、前記書込み先ブロックのリンクを解消して前記書込み先ブロックを未書込みブロックに変更する配列制御装置。
JP2017215461A 2017-11-08 2017-11-08 配列制御プログラム、配列制御方法、配列制御装置 Active JP7082275B2 (ja)

Priority Applications (2)

Application Number Priority Date Filing Date Title
JP2017215461A JP7082275B2 (ja) 2017-11-08 2017-11-08 配列制御プログラム、配列制御方法、配列制御装置
US16/176,010 US10809946B2 (en) 2017-11-08 2018-10-31 Array control program, array control method, and array control apparatus

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2017215461A JP7082275B2 (ja) 2017-11-08 2017-11-08 配列制御プログラム、配列制御方法、配列制御装置

Publications (2)

Publication Number Publication Date
JP2019087080A JP2019087080A (ja) 2019-06-06
JP7082275B2 true JP7082275B2 (ja) 2022-06-08

Family

ID=66327133

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2017215461A Active JP7082275B2 (ja) 2017-11-08 2017-11-08 配列制御プログラム、配列制御方法、配列制御装置

Country Status (2)

Country Link
US (1) US10809946B2 (ja)
JP (1) JP7082275B2 (ja)

Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2004030353A (ja) 2002-06-27 2004-01-29 Nec Corp 配列の定数代入方法

Family Cites Families (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPS62243033A (ja) * 1986-04-16 1987-10-23 Pioneer Electronic Corp デ−タ格納装置
JPH0235539A (ja) * 1988-07-25 1990-02-06 Fujitsu Ltd プログラムデータ領域管理方式
JP3299294B2 (ja) 1991-12-11 2002-07-08 富士通株式会社 メモリブロック制御方式
JP2002207634A (ja) 2001-01-10 2002-07-26 Fuji Xerox Co Ltd 記憶領域管理方法及び記憶装置
CN101346702B (zh) 2005-12-21 2012-09-05 Nxp股份有限公司 具有可块擦除单元的存储器
US20070294492A1 (en) * 2006-06-19 2007-12-20 John Rudelic Method and apparatus for reducing flash cycles with a generational filesystem
US9747363B1 (en) * 2012-03-01 2017-08-29 Attivio, Inc. Efficient storage and retrieval of sparse arrays of identifier-value pairs
JP6694141B2 (ja) * 2016-09-02 2020-05-13 富士通株式会社 配列制御プログラム、配列制御方法、配列制御装置

Patent Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2004030353A (ja) 2002-06-27 2004-01-29 Nec Corp 配列の定数代入方法

Also Published As

Publication number Publication date
US10809946B2 (en) 2020-10-20
US20190138250A1 (en) 2019-05-09
JP2019087080A (ja) 2019-06-06

Similar Documents

Publication Publication Date Title
US11656763B2 (en) File management method, distributed storage system, and management node
KR100577380B1 (ko) 플래시 메모리와 그 제어 방법
JP2685173B2 (ja) メモリ書き込み制御方法
US7930451B2 (en) Buffer controller and management method thereof
US8055681B2 (en) Data storage method and data storage structure
US9141539B2 (en) System and method for object deletion in persistent memory using bitmap windows
US20100228914A1 (en) Data caching system and method for implementing large capacity cache
CN107256196A (zh) 基于闪存阵列的支持零拷贝的缓存系统及方法
CN108897642A (zh) 持久性事务内存系统中日志机制的优化方法及装置
US20060282620A1 (en) Weighted LRU for associative caches
KR20020016513A (ko) 메모리 저장 장치 관리 시스템 및 방법, 프로그램 저장 장치
US7007135B2 (en) Multi-level cache system with simplified miss/replacement control
EP4137963A1 (en) Persistent key value storage device with hashing and method for operating the same
JP7082275B2 (ja) 配列制御プログラム、配列制御方法、配列制御装置
US11256630B2 (en) Cache address mapping method and related device
JP6694141B2 (ja) 配列制御プログラム、配列制御方法、配列制御装置
US20050270876A1 (en) Selectively changeable line width memory
US7133997B2 (en) Configurable cache
CN107562639A (zh) 擦除块读请求处理方法与装置
JP3801176B2 (ja) メモリ制御方法、記憶装置、制御プログラムおよび可読記録媒体
CN117971899B (zh) 一种数据查找方法、装置、设备及存储介质
JP2749752B2 (ja) メモリの書き込み制御装置
WO2023273858A1 (zh) 表项存储系统、方法、资源管理单元及存储介质
JP6715297B2 (ja) 半導体記憶装置の制御方法
WO2022021337A1 (zh) 闪存控制方法和装置

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20200807

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20210728

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20210928

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20211129

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: 20220426

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20220509

R150 Certificate of patent or registration of utility model

Ref document number: 7082275

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150