说明一些概念:
虚拟页面:指虚拟空间中,一段固定大小、边界与页面大小对齐的区间及其内容。
物理页面:虚拟页面映射到的介质上,可以在内存上(
内存页面),也可以在磁盘上(
盘上页面)。
页面的换进换出指的是页面内容
页面的换进换出也需要一个数据结构
内核定义了swap_infp_struct,用来描述用以管理页面交换的文件和设备
49 struct swap_info_struct {
50 unsigned int flags;
51 kdev_t swap_device;
52 spinlock_t sdev_lock;
53 struct dentry * swap_file;
54 struct vfsmount *swap_vfsmnt;
55 unsigned short * swap_map;
56 unsigned int lowest_bit;
57 unsigned int highest_bit;
58 unsigned int cluster_next;
59 unsigned int cluster_nr;
60 int prio; /* swap priority */
61 int pages;
62 unsigned long max;
63 int next; /* next entry on swap list */
64 };
页面的周转:
周转主要包括两部分
第一,页面的分配、使用和回收,不涉及交换
第二,页面的交换,交换的最终是页面的回收
notice:只有用户空间的页面才会换进换出,而内核页面则不会,内核空间可以访问所有的物理页面
用户空间页面:
1 普通的用户空间页面:包括进程的代码、数据、堆栈,以及动态堆
2 通过mmap映射的文件内容
3 进程的共享内存区
这些页面涉及页面周转的
两部分
内核空间页面:
内核中使用的内存页面只涉及第一部分,也就是
页面的分配、使用和回收,但是不涉及交换(只在内存中)
1 使用直接释放
都是一些使用kmalloc和vmalloc申请的临时性结构
2 使用完后仍有保留价值
其内容有保留的价值。条件允许时,把这些页面“养起来”,可以提高以后的操作效率
比如一些缓存的文件目录结构、
缓存的一些inode结构、
文件读写的缓冲区等等
这些页面释放后立即回收亦可,但是会付出更多代价
页面交换:
1 消极的页面交换:
有空闲的页面就直接分配;
当没有没有空闲时,将一个或几个内存页面换到磁盘上
notice:这种做法比较消极,忙碌的时候没有调度的余地
2 积极的页面交换
定期的,或者在系统比较空闲的时候挑选一些页面进行换进换出
挑选的规则一般都是LRU(最近最久未使用),但是这样也带来一些问题,因为实际上没有一种方法可以准确的预测对页面的访问,所以完全有可能发生抖动(刚换出就被访问)
3 带有暂存的积极页面交换