说明一些概念: 虚拟页面:指虚拟空间中,一段固定大小、边界与页面大小对齐的区间及其内容。 物理页面:虚拟页面映射到的介质上,可以在内存上( 内存页面),也可以在磁盘上( 盘上页面)。 页面的换进换出指的是页面内容
页面的换进换出也需要一个数据结构 内核定义了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 带有暂存的积极页面交换