メモリ管理、Buddyシステム

					2010年01月12日
情報科学類 オペレーティングシステム II

                                       筑波大学 システム情報工学研究科 
                                       コンピュータサイエンス専攻, 電子・情報工学系
                                       新城 靖
                                       <yas@is.tsukuba.ac.jp>

このページは、次の URL にあります。
http://www.coins.tsukuba.ac.jp/~yas/coins/literacy-2009/2010-01-12
あるいは、次のページから手繰っていくこともできます。
http://www.coins.tsukuba.ac.jp/~yas/
http://www.cs.tsukuba.ac.jp/~yas/

■今日の大事な話

■前回資料

◆exitシステム・コール

印刷資料は、先週配布済み。

■メモリ管理

◆Unixにおけるメモリに関するシステム・コールとライブラリ

◆OSに求められる機能

x86 には、その他、Multics 由来の「セグメント」がある。Linux 等の複数アー キテクチャで動作する OS は、x86 依存の機能には依存しない形で設計される。

◆ページ構造体

include/linux/mm_types.h
  40: struct page {
  41:         unsigned long flags;            /* Atomic flags, some possibly
  42:                                          * updated asynchronously */
  43:         atomic_t _count;                /* Usage count, see below. */
...
  54:         union {
  55:             struct {
...
  63:                 struct address_space *mapping;
  70:             };
...
  75:             struct page *first_page;    /* Compound tail pages */
  76:         };
...
  81:         struct list_head lru;
...
  95:         void *virtual;                  /* Kernel virtual address (NULL if
  96:                                            not kmapped, ie. highmem) */
...
 109: };
page構造体のflags(主要部分)
PG_locked ページがピン留めされている。ページアウトされない。入出力の処理中に設定され、完了後に解除される。
PG_error このページに対して入出力エラーが生じた。
PG_referenced ディスク入出力のために参照されている。
PG_uptodate ページの内容が有効である。入力処理が完了した。
PG_dirty ページの内容が変更された。
PG_lru ページングのための LRU リストにある。
PG_active ページがアクティブである。
PG_slab スラブ・アロケータで割り当てられた。
PG_arch_1 アーキテクチャ固有のページ状態
PG_reserved ページアウト禁止、または、ブード時のメモリ・アロケータで割り当てられた
PG_private ページの内容が無効(page->private が有効な内容を保持している)
PG_writeback 書き戻し中
PG_compound 複合ページ
PG_reclaim 開放すべきページ

◆メモリ・ゾーン

歴史的な都合やハードウェアの制約で、メモリ・ページを「ゾーン」と呼ばれる領域に分割して管理する。

よく使われるゾーンの種類。

ZONE_DMA
(古いデバイスでも) DMA でアクセス可能なページ・フレーム。 x86 では、0-16M。 ISA バスのデバイスで 0-16M しかアクセスできないものがあった。
ZONE_NORMAL
(古いデバイスの)DMA ではアクセスできないが、カーネルの仮想アドレス空間に常にマップされている。
ZONE_HIGMEM
普段はカーネルの仮想アドレス空間にマップされていない。 使うときにはマップして使い、使い終わったらアンマップする。

◆zone構造体

include/linux/mmzone.h

 274: struct zone {
...
 278:         unsigned long watermark[NR_WMARK];
...
 309:         struct free_area        free_area[MAX_ORDER];
...
 386:         wait_queue_head_t       * wait_table;
 387:         unsigned long           wait_table_hash_nr_entries;
 388:         unsigned long           wait_table_bits;
...
 414: } ____cacheline_internodealigned_in_smp;

 153: enum zone_watermarks {
 154:         WMARK_MIN,
 155:         WMARK_LOW,
 156:         WMARK_HIGH,
 157:         NR_WMARK
 158: };

  22: /* Free memory management - zoned buddy allocator.  */
  23: #ifndef CONFIG_FORCE_MAX_ZONEORDER
  24: #define MAX_ORDER 11
  25: #else
  26: #define MAX_ORDER CONFIG_FORCE_MAX_ZONEORDER
  27: #endif
  28: #define MAX_ORDER_NR_PAGES (1 << (MAX_ORDER - 1))

◆ページフレームの割当てと開放

ページ・フレームは、物理メモリ。 Linux カーネル内では、次のような手続きで、割り当てられる。
  • ページフレームに対応したpage 構造体(void *)を返す
    include/linux/gfp.npr
     312: #define alloc_page(gfp_mask) alloc_pages(gfp_mask, 0)
    
     308: #define alloc_pages(gfp_mask, order) \
     309:                 alloc_pages_node(numa_node_id(), gfp_mask, order)
    
     279: static inline struct page *alloc_pages_node(int nid, gfp_t gfp_mask,
     280:                                                 unsigned int order)
     281: {
     282:         /* Unknown node is current node */
     283:         if (nid < 0)
     284:                 nid = numa_node_id();
     285: 
     286:         return __alloc_pages(gfp_mask, order, node_zonelist(nid, gfp_mask));
     287: }
    
     272: static inline struct page *
     273: __alloc_pages(gfp_t gfp_mask, unsigned int order,
     274:                 struct zonelist *zonelist)
     275: {
     276:         return __alloc_pages_nodemask(gfp_mask, order, zonelist, NULL);
     277: }
    
     331: #define __free_page(page) __free_pages((page), 0)
     332: #define free_page(addr) free_pages((addr),0)
    
    

    ◆外部フラグメンテーション

    物理フレームの割当てと開放を繰り返していくと、外部フラグメンテーション (external fragmentation) が生じる。全体としては空きメモリは存在している のに、小さなメモリ・フレームがあちこちに分散していて、大きさのページフ レームが存在しないためにメモリが割り当てられない状態に陥る。

    ◆Buddyシステム

    「Buddy システム」は、Linux で使われている外部フラグメンテーションを起 こしにくいメモリ割当てアルゴリズム。

    zone、free_area、page

    図? Buddyシステムによる空きページの管理(論理的な見方)

    zone、free_area、page

    図? Buddyシステムによる空きページの管理(線形な見方)

    ■クイズ5 メモリ管理、Buddyシステム

    ★問題(501) Buddyシステム

    上の図で、次のようなメモリ要求と開放がなされた時に、どのようなページが 返されるか。ページ・フレーム番号で答えなさい。
    Last updated: 2010/01/25 17:50:57
    Yasushi Shinjo / <yas@is.tsukuba.ac.jp>