大阪市中央区 システムソフトウェア開発会社

営業時間:平日09:15〜18:15
MENU

プログラミング言語C – UNIXシステムインタフェース 記憶割り当て

株式会社クローバーフィールドの経営理念
著者:津路高広
公開日:2018/11/25
最終更新日:2018/11/25
カテゴリー:技術情報
タグ:

津路です。

プログラミング言語C 第2版 ANSI規格準拠 K&R著(共立出版)を読んで、気になるところを書いています。
8.7節に、記憶割り当てがあります。
ここでは、malloc プログラムが説明されています。
ページ227に以下の記述があります。
「mallocでは、文字数で表わされる要求サイズはヘッダ・サイズ単位で適当な数に繰り上げられる。割り当てられる実際のブロックはヘッダ自身のために1単位多くなる。これがヘッダのsizeフィールドに記憶される値である。」
mallocへの要求サイズは、文字数で表わされるのでしょうか。バイト数では?

ページ229には、以下の記述があります。
「関数morecoreは、OSからメモリを得るのに使われる。システムにメモリを要求することはかなり高価な処理であるから、mallocの呼び出しごとにそれをするのは損である。」
原語では、「asking the system for memory is comparatively expensive」ですので、「比較的高価な処理」です。
続けて、「したがって、morecoreでは要求は少なくともNALLOC単位にしている。より大きくなったこのブロックは必要ならば切り取られる。」
ここでNALLOCは、1kbyteです。後半の文がわかりずらいです。切り取られるの部分は、原文ではchopped upです。ここでは、「大きめに得られたこのブロックは、必要に応じて細分化される」といった意味だと思います。

「次にUNIXのシステム・コールsbrk(n)はメモリへ追加するnバイトへのポインタ(スペースがなければ-1)を返す。これは本来はNULLと設計すべきだったところである。」
原文では、「sbrk returns -1 if there was no space, even though NULL would have been a better design」ですので、後半の説明は、-1ではなくNULLとすべきだった、という意味です。

次に、morecore関数が記述されています。

#define NALLOC 1024 /* 要求する最少の単位数 */
/* morecore: システムにもっとメモリを要求する */
static Header *morecore(unsigned nu)
{
  char *cp, *sbrk(int);
  Header *up;

  if(nu < NALLOC)
    nu = NALLOc;
  cp = sbrk(nu * sizeof(Header));
  if (cp == (char *) -1)  /* スペースが全然ない */
    return NULL;
  up = (Header *) cp;
  up->s.size = nu;
  free((void *)(up+1));
  return freep;
}

NALLOCのコメントは変です。「要求する最小単位のバイト数」
morecoreのコメントも少し変です。「システムにより多くのメモリを要求する」
ではないでしょうか。

    上に戻る