データメモリ領域には以下に示す 3 種類があり、 それぞれの領域に対して指定した大きさのメモリブロックの獲得 / 解放等の機能を提供している。
1 つのプロセス内でのみ使用可能なメモリ領域であり、
他のプロセスからはアクセスできない。
ローカルメモリとして確保した領域は、
プロセス終了時に自動的に解放される。
すべてのプロセスから使用可能なメモリ領域である。
獲得したプロセスの存在とは無関係に存在するが、
獲得したプロセスの終了時に自動的に解放することもできる。
システム ( OS やデバイスドライバー等 )
からのみ使用可能なメモリ領域である。
アプリケーションプロセスからは使用できない。
プロセスとは無関係に存在する。
基本的にはブロック単位 ( 例えば 4KB 単位 ) でメモリを割り当てる機能のみを OS は提供する。 さらに細かく内部を分割するのはライブラリ、 またはアプリケーション自身で行う。 通常は、システムコールを直接使用せずにライブラリを利用する。 ライブラリの機能では不十分な場合のみシステムコールを直接利用する。
獲得したメモリブロックは連続した ( 論理 ) アドレスを持ち、 その先頭 ( 論理 ) アドレスがアプリケーションに戻される。 一度獲得したメモリブロックの ( 論理 ) アドレスは変更されることはないため、 得られたアドレスにより直接メモリブロックをアクセスすることができる。 獲得したメモリブロックへのデータの書込み / 読込みは自由にできるが、 原則として実行することはできない。
メモリ管理機能のある CPU の場合には、 原則として、共有メモリ、システムメモリは負のアドレスとなり、 ローカルメモリは正のアドレスとなる。 CPU の種類によってはこの原則通りにならない場合がある。 また、メモリ管理機能のない CPU の場合は、この限りではない。
メモリに対する排他アクセス制御の機能はないので、 必要であればセマフォなどを利用してアプリケーションで行う。
#define M_COMMON 0x00000001 /* 共有 */ #define M_SYSTEM 0x00000003 /* システムのみ */ #define M_RESIDENT 0x00004000 /* 常駐 */
typedef struct m_state { W blksz; /* ブロックサイズ */ W total; /* 全ブロック数 */ W free; /* 残りブロック数 */ } M_STATE;
|
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 : 不正なコンテキストから呼び出した。
|
ERR rel_mbk( VP adr )
VP adr 解放するメモリブロックのアドレス
=0 正常 < 0 エラー(エラーコード)
adr
で示すメモリブロックを解放する。
adr
は
get_mbk()
で得たアドレスでなければならない。
ER_MPTR : メモリブロックのアドレスが不正である。 ER_CTX : 不正なコンテキストから呼び出した。
|
ERR mbk_sts( M_STATE *sts )
M_STATE sts メモリ状態を返す領域
typedef struct m_state { W blksz; /* ブロックサイズ */ W total; /* 全ブロック数 */ W free; /* 残りブロック数 */ } M_STATE;
=0 正常 <0 エラー(エラーコード)
現在のメモリ使用状況などを取得する。
blksz
:
total
:
free
:
仮想記憶を行っているシステムでは、
全ブロック数、残りブロック数が一意に決定できない場合がある。
したがって、具体的な意味はインプリメントに依存する。
ただし、free ÷ total
が残りメモリの割合の参考値となるような値とする。
インプリメントにより、
具体的な値が設定できない場合は、
全ブロック数、残りブロック数ともに -1
を設定するものとする。
ER_ADR : アドレス(sts)のアクセスは許されていない。
|
void* malloc( size_t size )
size_t size 獲得したいメモリのバイト数(> 0)
≠NULL 正常(獲得したメモリアドレス) =NULL エラー
非常駐ローカルメモリから指定したサイズのメモリを割り当て、その先頭アドレスを戻す。
|
void* calloc( size_t nelem, size_t elsize )
size_t nelem 獲得したい要素数( > 0) size_t elsize 1要素のバイト数( > 0)
≠NULL 正常(獲得したメモリアドレス) =NULL エラー
非常駐ローカルメモリから elsize
の大きさの
nelem
個の要素を格納する領域を割り当て、その先頭アドレスを戻す。
割り当てた領域は 0 で初期化される。
|
void* realloc( void *ptr, size_t size )
void *ptr サイズ変更したい領域のアドレス NULL を指定した場合は新規獲得 size_t size 獲得したいメモリのバイト数(≧0) 0 を指定した場合は解放
≠NULL 正常(獲得したメモリアドレス) =NULL エラー
非常駐ローカルメモリ中の
ptr
で指定される領域のサイズを
size
に変更して再獲得し、その先頭アドレスを戻す。
ptr
は、
malloc(), calloc(), realloc()
で返されたアドレスでなければならない。
|
void free( void *ptr )
void *ptr 解放したい領域のアドレス
ptr
で指定された非常駐ローカルメモリ内の領域を解放する。
ptr
は、
malloc(), calloc(), realloc()
で返されたアドレスでなければならない。
|
void* Smalloc( size_t size )
size_t size 獲得したいメモリのバイト数(> 0)
≠NULL 正常(獲得したメモリアドレス) =NULL エラー
非常駐共有メモリから指定したサイズのメモリを割り当て、その先頭アドレスを戻す。
|
void* Scalloc( size_t nelem, size_t elsize )
size_t nelem 獲得したい要素数(> 0) size_t elsize 1 要素のバイト数(> 0)
≠NULL 正常(獲得したメモリアドレス) =NULL エラー
非常駐共有メモリから elsize
の大きさの
nelem
個の要素を格納する領域を割り当て、その先頭アドレスを戻す。
割り当てた領域は 0 で初期化される。
|
void* Srealloc( void *ptr, size_t size )
void *ptr サイズ変更したい領域のアドレス NULL を指定した場合は新規獲得 size_t size 再獲得したいメモリのバイト数(≧0) 0 を指定した場合は解放
≠NULL 正常(獲得したメモリアドレス) =NULL エラー
非常駐共有メモリ中の ptr
で指定される領域のサイズを
size
に変更して再獲得し、その先頭アドレスを戻す。
ptr
は、同じプロセス内で獲得したメモリ領域で、
Smalloc(), Scalloc(), Srealloc()
で返されたアドレスでなければならない。
|
void Sfree( void *ptr )
void *ptr 解放したい領域のアドレス
ptr
で指定された非常駐共有メモリ内の領域を解放する。
ptr
は、同じプロセス内で獲得したメモリ領域で、
Smalloc(), Scalloc(), Srealloc()
で返されたアドレスでなければならない。
|
void* Kmalloc( size_t size )
size_t size 獲得したいメモリのバイト数(> 0)
≠NULL 正常(獲得したメモリアドレス) =NULL エラー
常駐システムメモリから指定したサイズのメモリを割り当て、その先頭アドレスを戻す。
※ アプリケーションプロセスからは使用できない。
|
void* Kcalloc( size_t nelem, size_t elsize )
size_t nelem 獲得したい要素数(> 0) size_t elsize 1 要素のバイト数(> 0)
≠NULL 正常(獲得したメモリアドレス) =NULL エラー
常駐システムメモリから elsize
の大きさの
nelem
個の要素を格納する領域を割り当て、その先頭アドレスを戻す。
割り当てた領域は 0 で初期化される。
※ アプリケーションプロセスからは使用できない。
|
void* Krealloc( void *ptr, size_t size )
void *ptr サイズ変更したい領域のアドレス NULL を指定した場合は新規獲得 size_t size 再獲得したいメモリのバイト数(≧0) 0 を指定した場合は解放
≠NULL 正常(獲得したメモリアドレス) =NULL エラー
常駐システムメモリ中の ptr
で指定される領域のサイズを size
に変更して再獲得し、その先頭ドレスを戻す。
ptr
は、
Kmalloc(), Kcalloc(), Krealloc()
で返されたアドレスでなければならない。
※ アプリケーションプロセスからは使用できない。
|
void Kfree( void *ptr )
void *ptr 解放したい領域のアドレス
ptr
で指定された常駐システムメモリ内の領域を解放する。
ptr
は、Kmalloc(), Kcalloc(), Krealloc()
で返されたアドレスでなければならない。
※ アプリケーションプロセスからは使用できない。
|
void* Vmalloc( size_t size )
size_t size 獲得したいメモリのバイト数(> 0)
≠NULL 正常(獲得したメモリアドレス) =NULL エラー
非常駐システムメモリから指定したサイズのメモリを割り当て、その先頭アドレスを戻す。
※ アプリケーションプロセスからは使用できない。
|
void* Vcalloc( size_t nelem, size_t elsize )
size_t nelem 獲得したい要素数(> 0) size_t elsize 1 要素のバイト数(> 0)
≠NULL 正常(獲得したメモリアドレス) =NULL エラー
非常駐システムメモリから elsize
の大きさの nelem
個の要素を格納する領域を割り当て、その先頭アドレスを戻す。
割り当てた領域は 0 で初期化される。
※ アプリケーションプロセスからは使用できない。
|
void* Vrealloc( void *ptr, size_t size )
void *ptr サイズ変更したい領域のアドレス NULL を指定した場合は新規獲得 size_t size 再獲得したいメモリのバイト数(≧0) 0 を指定した場合は解放
≠NULL 正常(獲得したメモリアドレス) =NULL エラー
非常駐システムメモリ中の ptr
で指定される領域のサイズを
size
に変更して再獲得し、その先頭アドレスを戻す。
ptr
は、Vmalloc(), Vcalloc(), Vrealloc()
で返されたアドレスでなければならない。
※ アプリケーションプロセスからは使用できない。
|
void Vfree( void *ptr )
void *ptr 解放したい領域の先頭アドレス
ptr
で指定された非常駐システムメモリ内の領域を解放する。
ptr
は、Vmalloc(), Vcalloc(), Vrealloc()
で返されたアドレスでなければならない。
※ アプリケーションプロセスからは使用できない。