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/
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: };
| 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 | 開放すべきページ |
よく使われるゾーンの種類。
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))
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)

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

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