バナーをクリックすれば目次に戻ります
Copyright 1999 Rogue Wave Software
Copyright 1999 Sun Microsystems, Inc.
RWVirtualPageHeap
#include <rw/vpage.h> (抽象基底クラス)
メンバー関数 allocate() を呼び出して抽象ヒープからページを割り当てます。この関数は、RWHandle 型のオブジェクトであるメモリー "ハンドル" を返します。このハンドルは、論理的にページを表しています。
割り当てられたページを使用するためにはまず、ハンドルを引数としてメンバー関数 lock() を呼び出し、ページを "ロック" しなければなりません。ハンドルに対応するページをスワップインし、それを物理メモリーに持ち込むのに必要なすべての作業を行うのは、RWVirtualPageHeap の特殊化クラスです。実際のスワップ媒体は、ディスクや EMS/XMS メモリー、またはネットワーク上のどこかにあるマシンに設定できます。lock() は、メモリー上に存在するページへのポインタを返します。
一度ページをメモリーに取ると、ページに対して自由に処理を行えます。ただし、ページの内容を変えた場合は、メンバー関数 dirty() を呼び出してからページをアンロック (ロックを取り消すこと) しなければなりません。
ロックされたページはメモリーを使いきります。特殊化クラスによっては、スワップを行うだけの決まった数のバッファしか持っていないものもあります。ページを使用しないときは、unlock() を呼び出す必要があります。unlock() を呼び出した後は、lock() が返した元のアドレスはすでに無効になっています。ページをもう一度使用するためには、lock() で再びロックしなければなりません。
ページに対する処理をすべて終了したら、deallocate() を呼び出してページを抽象ヒープに返します。
実際、ロックやアンロック、避けられない型キャストの管理などは、厄介な作業かもしれません。メモリーを自動的にスワップインまたはスワップアウトするには通常、抽象ヒープを使用するよりもクラスを設計する方が簡単です。これは、型 T の要素からなる仮想配列を表現するクラス RWTValVirtualArray<T> が実行してくれます。型 T の要素は、アドレス指定されると必要に応じて自動的にスワップインされます。
#include <rw/vpage.h> struct Node { int key; RWHandle next; }; RWHandle head = 0; void addNodes(RWVirtualPageHeap& heap, unsigned N) { for (unsigned i=0; i<N; i++){ RWHandle h = heap.allocate(); Node* newNode = (Node*)heap.lock(h); newNode->key = i; newNode->next = head; head = h; heap.dirty(h); heap.unlock(h); } } |
RWVirtualPageHeap(unsigned pgsize);
virtual ~RWVirtualPageHeap();
unsigned pageSize() const;
virtual RWHandle allocate() = 0
virtual void deallocate(RWHandle h) = 0;
virtual void dirty(RWHandle h) = 0;
virtual void* lock(RWHandle h) = 0;
virtual void unlock(RWHandle h) = 0;