Chinaunix首页 | 论坛 | 博客
  • 博客访问: 925299
  • 博文数量: 63
  • 博客积分: 568
  • 博客等级: 中士
  • 技术积分: 3435
  • 用 户 组: 普通用户
  • 注册时间: 2012-10-05 11:44
文章分类
文章存档

2016年(4)

2015年(6)

2014年(3)

2013年(27)

2012年(23)

分类: LINUX

2012-10-14 22:51:02


页面回收牵扯到内存管理、文件系统、块设备驱动的相关知识。在内核学习中建议安排在靠后一点的位置。首先来说页面回收机制,主要是目前正在看相关的内容,于是将相关的内容分析记录。

页面回收就是将已经分配出去的页面释放出来,提供给伙伴系统做后续的页面申请分配。可被回收的也有多种:1、进程中被映射文件的页面;2、进程中的匿名页面;3、磁盘高速缓存;而内核中动态申请的页面是不能并回收的。

可回收页面可以分为两大类,一类就是像映射了文件的映射页面和磁盘高速缓存,这种页面都有后备存储设备,回收页面只需要将页面写入到后备存储器后就能将页面回收。而另外一种就是匿名页面,这个需要在系统中建立交换分区,将页面写入交换分区,才能回收释放页面。




1、交换分区

交换分区可以是一个独立的磁盘分区也可以是一个分区上面的一个文件。

为了管理每一个交换区,内核定义了一个数据结构


  1. struct swap_info_struct {

  2. unsigned long flags;

  3. int prio;    /* swap priority */

  4. int next;    /* next entry on swap list */

  5. struct file *swap_file;

  6. struct block_device *bdev;

  7. struct list_head extent_list;

  8. struct swap_extent *curr_swap_extent;

  9. unsigned short *swap_map;

  10. unsigned int lowest_bit;

  11. unsigned int highest_bit;

  12. unsigned int lowest_alloc;    /* while preparing discard cluster */

  13. unsigned int highest_alloc;    /* while preparing discard cluster */

  14. unsigned int cluster_next;

  15. unsigned int cluster_nr;

  16. unsigned int pages;

  17. unsigned int max;

  18. unsigned int inuse_pages;

  19. unsigned int old_block_size;

  20. };

Prio是交换分区的优先级,系统中可以设置多个交换分区,不同磁盘的速度不同,如果不同磁盘上设置了交换分区,可以为这些分区设置不同的优先级。系统优先将换出的页面保存到优先级高的交换分区中。

Swap_file 和 bdev保存分区所在的文件或者硬盘分区的fileblock_device结构体指针。

Curr_swap_extent保存了一个链表,由于交换分区有可能使用的是交换文件,交换文件在磁盘上占据的block不一定都是连续的。所以,swap_extent结构体就是表示page槽位和block对应关系的一个数据结构


  1. struct swap_extent {
  2.     struct list_head list;
  3.     pgoff_t start_page;
  4.     pgoff_t nr_pages;
  5.     sector_t start_block;
  6. };

Swap_map表示该交换区中对应的页槽是否被分配出去。0表示空闲,正数表示被页表项引用的计数,还有页表槽位不可用的标识



lowest_bithighest_bit分别表示有空闲page槽位的最小索引值和最大索引值。cluster_next表示分配下一个page槽位的索引值。

阅读(1896) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~