今回は,2 章 メモリ管理で説明した,メモリの動的割り当て,解放 を用いて,さらに抽象的なメモリ管理について説明する.
動的メモリ割当て(dynamic memory allocation) は,OS の機能では, もっとも低レベルであることは,2 章 メモリ管理で説明した.しかし, 実際の OS では,並列に処理する複数のプロセスの中で,メモリの割当て,解放, アクセスを行わなければならない.4 章 同期処理で説明した「有限バッファ」は, 複数のデバイスにアクセスするための中間的なメモリ(緩衝材)として機能するが, 複数のプロセス間で扱うメモリとして都合がよい.
この章では,Xinu の高レベルメモリとして,「バッファ」を生成し,アクセスする 方法を提供する.通常,同じ大きさのバッファを複数割り当てることが必要である ため,「バッファ」を複数集めたメモリを「バッファプール」とする. プログラムの際は,
「バッファプール」は,以下のような構造をしている.
bptab[]という配列が,バッファプールを管理している.bptab[poolid] で, poolid が示す「バッファプール」の情報を保持している. 「バッファプール」へのポインタは,bptab[poolid].bpnext で保持している. この「バッファプール」を生成するためには,mkpool 関数を呼び出せばよい.
返答には,poolid を返す.
「バッファ」は,「バッファプール」より,一つづつ割当てられる. getbuf 関数を呼び出せばよい.
「バッファ」を割り当てると,以下のようになる.
「ポインタ」の部分が,poolid に置き換えられている.これは,再び, バッファを開放し,同じ「バッファプール」へ戻されるときに,用いる.
「バッファ」解放は,メモリのポインタを操作するだけでよい.
「バッファ」は,バッファプールの番号 poolid をもつバッファプールへ戻される. bptab[poolid].bpnext 最も最近解放された「バッファ」を指す.
一般に,多くの OS は,複数のデバイスを扱う必要があるので,「同期」を 必要とするメモリ領域(プロセス間で共有など)は,さまざまな種類が必要となる. UNIX 系の OS でも,ネットワーク通信,次章で説明するプロセス間通信など では,プロセス間で共有するメモリ領域を適宜,割り当てている.