この章の目次にもどる
前頁:1.4 グローバル名管理にもどる
次頁:1.6 ファイル管理にすすむ

1.5 メモリ管理

1.5.1 メモリ管理機能の概要

データメモリ領域には以下に示す 3 種類があり、 それぞれの領域に対して指定した大きさのメモリブロックの獲得 / 解放等の機能を提供している。

ローカルメモリ領域 :

1 つのプロセス内でのみ使用可能なメモリ領域であり、 他のプロセスからはアクセスできない。
ローカルメモリとして確保した領域は、 プロセス終了時に自動的に解放される。

共有メモリ領域 :

すべてのプロセスから使用可能なメモリ領域である。
獲得したプロセスの存在とは無関係に存在するが、 獲得したプロセスの終了時に自動的に解放することもできる。

システムメモリ領域 :

システム ( OS やデバイスドライバー等 ) からのみ使用可能なメモリ領域である。 アプリケーションプロセスからは使用できない。
プロセスとは無関係に存在する。

基本的にはブロック単位 ( 例えば 4KB 単位 ) でメモリを割り当てる機能のみを OS は提供する。 さらに細かく内部を分割するのはライブラリ、 またはアプリケーション自身で行う。 通常は、システムコールを直接使用せずにライブラリを利用する。 ライブラリの機能では不十分な場合のみシステムコールを直接利用する。

獲得したメモリブロックは連続した ( 論理 ) アドレスを持ち、 その先頭 ( 論理 ) アドレスがアプリケーションに戻される。 一度獲得したメモリブロックの ( 論理 ) アドレスは変更されることはないため、 得られたアドレスにより直接メモリブロックをアクセスすることができる。 獲得したメモリブロックへのデータの書込み / 読込みは自由にできるが、 原則として実行することはできない。

メモリ管理機能のある CPU の場合には、 原則として、共有メモリ、システムメモリは負のアドレスとなり、 ローカルメモリは正のアドレスとなる。 CPU の種類によってはこの原則通りにならない場合がある。 また、メモリ管理機能のない CPU の場合は、この限りではない。

メモリに対する排他アクセス制御の機能はないので、 必要であればセマフォなどを利用してアプリケーションで行う。

1.5.2 データ/定数の定義

□ メモリ属性

#define M_COMMON        0x00000001      /* 共有 */
#define M_SYSTEM        0x00000003      /* システムのみ */
#define M_RESIDENT      0x00004000      /* 常駐 */

□ メモリ状態

typedef struct m_state {
        W       blksz;          /* ブロックサイズ */
        W       total;          /* 全ブロック数 */
        W       free;           /* 残りブロック数 */
} M_STATE;

1.5.3 システムコール

get_mbk
 
メモリブロックの獲得

【形式】

ERR get_mbk( VP *adr, W nblk, UW atr )

【パラメータ】

VP  *adr    獲得したメモリブロックの先頭アドレスを返す領域
W   nblk    獲得するメモリブロック数( > 0)
UW  atr     メモリブロックの属性
            [ (M_COMMON ‖ M_SYSTEM) ] | [M_RESIDENT] | [DELEXIT]
M_COMMON :

共有メモリを指定する。
共有メモリは、すべてのプロセスからアクセス可能。

M_SYSTEM

システムメモリを指定する。
システムメモリは、システム ( OS やデバイスドライバー等 ) からのみアクセス可能。 この指定は、アプリケーションプロセスからは使用してはいけない。

M_COMMON, M_SYSTEM のいずれの指定もなければ、 ローカルメモリとなる。 ローカルメモリは、メモリブロックを獲得したプロセスからのみアクセス可能。

※ 共有 / システム / ローカルメモリの指定は、 メモリ管理機能がない CPU の場合には特に意味を持たない。 いずれも同じ扱いとなってしまい、保護されない。

M_RESIDENT :

常駐を指定する。指定がなければ非常駐となる。

常駐指定されたメモリブロックは、 ディスクなどにスワップアウトされることなく常に主メモリ上に存在する。

※ 仮想記憶を行っていないシステムの場合には、 特に意味を持たない(常駐と同等になる)。

DELEXIT :

プロセス終了時削除を指定する。

この指定があると、 メモリブロックを獲得したプロセスが終了すると自動的にメモリブロックが解放される。 ただし、ローカルメモリの場合は、この指定の有無に関係なく、 プロセスの終了時に解放される。

【リターン値】

=0  正常
<0  エラー(エラーコード)

【解説】

nblk 個の連続したメモリブロックを獲得し、 その先頭アドレスを *adr に返す。

【エラーコード】

er_adr      : アドレス(adr)のアクセスは許されていない。
er_nomem    : メモリ領域が不足した。
er_nospc    : システムのメモリ領域が不足した。
er_par      : パラメータが不正である。
er_ctx      : 不正なコンテキストから呼び出した。
rel_mbk
 
メモリブロックの解放

【形式】

ERR rel_mbk( VP adr )

【パラメータ】

VP  adr     解放するメモリブロックのアドレス

【リターン値】

=0  正常
< 0 エラー(エラーコード)

【解説】

adr で示すメモリブロックを解放する。 adrget_mbk() で得たアドレスでなければならない。

【エラーコード】

ER_MPTR     : メモリブロックのアドレスが不正である。
ER_CTX      : 不正なコンテキストから呼び出した。
mbk_sts
 
メモリ状態参照

【形式】

ERR mbk_sts( M_STATE *sts )

【パラメータ】

M_STATE   sts   メモリ状態を返す領域
typedef struct  m_state {
    W   blksz;  /* ブロックサイズ */
    W   total;  /* 全ブロック数 */
    W   free;   /* 残りブロック数 */
} M_STATE;

【リターン値】

=0    正常
<0    エラー(エラーコード)

【解説】

現在のメモリ使用状況などを取得する。

blksz :
メモリ割り当ての単位( 1 ブロック)のバイト数。
一般には CPU のページサイズとなる。標準的には 4KB。
total :
システム全体の総ブロック数。
free :
システム全体の未使用ブロック数。

仮想記憶を行っているシステムでは、 全ブロック数、残りブロック数が一意に決定できない場合がある。 したがって、具体的な意味はインプリメントに依存する。 ただし、free ÷ total が残りメモリの割合の参考値となるような値とする。

インプリメントにより、 具体的な値が設定できない場合は、 全ブロック数、残りブロック数ともに -1 を設定するものとする。

【エラーコード】

ER_ADR      : アドレス(sts)のアクセスは許されていない。

1.5.4 ライブラリ

malloc
 
非常駐ローカルメモリの獲得(ライブラリ)
メモリ属性:DELEXIT

【形式】

void*   malloc( size_t size )

【パラメータ】

size_t  size    獲得したいメモリのバイト数(> 0)

【リターン値】

≠NULL  正常(獲得したメモリアドレス)
=NULL  エラー

【解説】

非常駐ローカルメモリから指定したサイズのメモリを割り当て、その先頭アドレスを戻す。

calloc
 
非常駐ローカルメモリの獲得(ライブラリ)
メモリ属性:DELEXIT

【形式】

void*   calloc( size_t nelem, size_t elsize )

【パラメータ】

size_t  nelem   獲得したい要素数( > 0)
size_t  elsize  1要素のバイト数( > 0)

【リターン値】

≠NULL  正常(獲得したメモリアドレス)
=NULL  エラー

【解説】

非常駐ローカルメモリから elsize の大きさの nelem 個の要素を格納する領域を割り当て、その先頭アドレスを戻す。 割り当てた領域は 0 で初期化される。

realloc
 
非常駐ローカルメモリの再獲得(ライブラリ)
メモリ属性:DELEXIT

【形式】

void*   realloc( void *ptr, size_t size )

【パラメータ】

void    *ptr    サイズ変更したい領域のアドレス
                NULL を指定した場合は新規獲得
size_t  size    獲得したいメモリのバイト数(≧0)
                0 を指定した場合は解放

【リターン値】

≠NULL  正常(獲得したメモリアドレス)
=NULL  エラー

【解説】

非常駐ローカルメモリ中の ptr で指定される領域のサイズを size に変更して再獲得し、その先頭アドレスを戻す。
ptr は、 malloc(), calloc(), realloc() で返されたアドレスでなければならない。

free
 
非常駐ローカルメモリの解放(ライブラリ)

【形式】

void    free( void *ptr )

【パラメータ】

void    *ptr    解放したい領域のアドレス

【解説】

ptr で指定された非常駐ローカルメモリ内の領域を解放する。
ptr は、 malloc(), calloc(), realloc() で返されたアドレスでなければならない。

Smalloc
 
非常駐共有メモリの獲得(ライブラリ)
メモリ属性:M_COMMON

【形式】

void*   Smalloc( size_t size )

【パラメータ】

size_t  size    獲得したいメモリのバイト数(> 0)

【リターン値】

≠NULL  正常(獲得したメモリアドレス)
=NULL  エラー

【解説】

非常駐共有メモリから指定したサイズのメモリを割り当て、その先頭アドレスを戻す。

Scalloc
 
非常駐共有メモリの獲得(ライブラリ)
メモリ属性:M_COMMON

【形式】

void*   Scalloc( size_t nelem, size_t elsize )

【パラメータ】

size_t  nelem   獲得したい要素数(> 0)
size_t  elsize  1 要素のバイト数(> 0)

【リターン値】

≠NULL  正常(獲得したメモリアドレス)
=NULL  エラー

【解説】

非常駐共有メモリから elsize の大きさの nelem 個の要素を格納する領域を割り当て、その先頭アドレスを戻す。 割り当てた領域は 0 で初期化される。

Srealloc
 
非常駐共有メモリの再獲得(ライブラリ)
メモリ属性:M_COMMON

【形式】

void*   Srealloc( void *ptr, size_t size )

【パラメータ】

void    *ptr    サイズ変更したい領域のアドレス
                NULL を指定した場合は新規獲得
size_t  size    再獲得したいメモリのバイト数(≧0)
                0 を指定した場合は解放

【リターン値】

≠NULL  正常(獲得したメモリアドレス)
=NULL  エラー

【解説】

非常駐共有メモリ中の ptr で指定される領域のサイズを size に変更して再獲得し、その先頭アドレスを戻す。
ptr は、同じプロセス内で獲得したメモリ領域で、 Smalloc(), Scalloc(), Srealloc() で返されたアドレスでなければならない。

Sfree
 
非常駐共有メモリの解放(ライブラリ)

【形式】

void    Sfree( void *ptr )

【パラメータ】

void    *ptr    解放したい領域のアドレス

【解説】

ptr で指定された非常駐共有メモリ内の領域を解放する。
ptr は、同じプロセス内で獲得したメモリ領域で、 Smalloc(), Scalloc(), Srealloc() で返されたアドレスでなければならない。

Kmalloc
 
常駐システムメモリの獲得(ライブラリ)
メモリ属性:M_SYSTEM | M_RESIDENT

【形式】

void*   Kmalloc( size_t size )

【パラメータ】

size_t  size    獲得したいメモリのバイト数(> 0)

【リターン値】

≠NULL  正常(獲得したメモリアドレス)
=NULL  エラー

【解説】

常駐システムメモリから指定したサイズのメモリを割り当て、その先頭アドレスを戻す。

※ アプリケーションプロセスからは使用できない。

Kcalloc
 
常駐システムメモリの獲得(ライブラリ)
メモリ属性:M_SYSTEM | M_RESIDENT

【形式】

void*   Kcalloc( size_t nelem, size_t elsize )

【パラメータ】

size_t  nelem   獲得したい要素数(> 0)
size_t  elsize  1 要素のバイト数(> 0)

【リターン値】

≠NULL  正常(獲得したメモリアドレス)
=NULL  エラー

【解説】

常駐システムメモリから elsize の大きさの nelem 個の要素を格納する領域を割り当て、その先頭アドレスを戻す。 割り当てた領域は 0 で初期化される。

※ アプリケーションプロセスからは使用できない。

Krealloc
 
常駐システムメモリの再獲得(ライブラリ)
メモリ属性:M_SYSTEM | M_RESIDENT

【形式】

void*   Krealloc( void *ptr, size_t size )

【パラメータ】

void    *ptr    サイズ変更したい領域のアドレス
                NULL を指定した場合は新規獲得
size_t  size    再獲得したいメモリのバイト数(≧0)
                0 を指定した場合は解放

【リターン値】

≠NULL  正常(獲得したメモリアドレス)
=NULL  エラー

【解説】

常駐システムメモリ中の ptr で指定される領域のサイズを size に変更して再獲得し、その先頭ドレスを戻す。
ptr は、 Kmalloc(), Kcalloc(), Krealloc() で返されたアドレスでなければならない。

※ アプリケーションプロセスからは使用できない。

Kfree
 
常駐システムメモリの解放(ライブラリ)

【形式】

void    Kfree( void *ptr )

【パラメータ】

void    *ptr    解放したい領域のアドレス

【解説】

ptr で指定された常駐システムメモリ内の領域を解放する。
ptr は、Kmalloc(), Kcalloc(), Krealloc() で返されたアドレスでなければならない。

※ アプリケーションプロセスからは使用できない。

Vmalloc
 
非常駐システムメモリの獲得(ライブラリ)
メモリ属性:M_SYSTEM

【形式】

void*   Vmalloc( size_t size )

【パラメータ】

size_t  size    獲得したいメモリのバイト数(> 0)

【リターン値】

≠NULL  正常(獲得したメモリアドレス)
=NULL  エラー

【解説】

非常駐システムメモリから指定したサイズのメモリを割り当て、その先頭アドレスを戻す。

※ アプリケーションプロセスからは使用できない。

Vcalloc
 
非常駐システムメモリの獲得(ライブラリ)
メモリ属性:M_SYSTEM

【形式】

void*   Vcalloc( size_t nelem, size_t elsize )

【パラメータ】

size_t  nelem   獲得したい要素数(> 0)
size_t  elsize  1 要素のバイト数(> 0)

【リターン値】

≠NULL  正常(獲得したメモリアドレス)
=NULL  エラー

【解説】

非常駐システムメモリから elsize の大きさの nelem 個の要素を格納する領域を割り当て、その先頭アドレスを戻す。 割り当てた領域は 0 で初期化される。

※ アプリケーションプロセスからは使用できない。

Vrealloc
 
非常駐システムメモリの再獲得(ライブラリ)
メモリ属性:M_SYSTEM

【形式】

void*   Vrealloc( void *ptr, size_t size )

【パラメータ】

void    *ptr    サイズ変更したい領域のアドレス
                NULL を指定した場合は新規獲得
size_t  size    再獲得したいメモリのバイト数(≧0)
                0 を指定した場合は解放

【リターン値】

≠NULL  正常(獲得したメモリアドレス)
=NULL  エラー

【解説】

非常駐システムメモリ中の ptr で指定される領域のサイズを size に変更して再獲得し、その先頭アドレスを戻す。
ptr は、Vmalloc(), Vcalloc(), Vrealloc() で返されたアドレスでなければならない。

※ アプリケーションプロセスからは使用できない。

Vfree
 
非常駐システムメモリの解放(ライブラリ)

【形式】

void    Vfree( void *ptr )

【パラメータ】

void    *ptr    解放したい領域の先頭アドレス

【解説】

ptr で指定された非常駐システムメモリ内の領域を解放する。
ptr は、Vmalloc(), Vcalloc(), Vrealloc() で返されたアドレスでなければならない。

※ アプリケーションプロセスからは使用できない。


この章の目次にもどる
前頁:1.4 グローバル名管理にもどる
次頁:1.6 ファイル管理にすすむ