Chinaunix首页 | 论坛 | 博客
  • 博客访问: 304660
  • 博文数量: 77
  • 博客积分: 394
  • 博客等级: 一等列兵
  • 技术积分: 562
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-19 16:15
文章分类
文章存档

2015年(17)

2014年(1)

2012年(59)

分类:

2012-05-11 15:17:03

4.2   Linux交换调度
Linux系统的内存主要采用称为请求页式管理的动态管理方法。当某一个程序开始运行时,一个新的进程创建,整个可执行文件映像和该程序引用的所有相关共享库同时装入进程的虚拟地址空间中。Linux在建立进程的时候,整个执行文件映像并没有装入物理内存,只是链接到进程的虚拟地址空间中,进程只分配到极少的内存页面,占用很少的物理空间。在整个进程生命周期中,进程所拥有的内存页面总是动态变化的。管理好内存页面和外部存储器,正确地模拟内存特殊区域的工作,保证系统有足够的内存,让尽可能多的进程并发执行,是Linux交换调度的主要任务。
4.2   Linux交换调度
Linux系统的内存主要采用称为请求页式管理的动态管理方法。当某一个程序开始运行时,一个新的进程创建,整个可执行文件映像和该程序引用的所有相关共享库同时装入进程的虚拟地址空间中。Linux在建立进程的时候,整个执行文件映像并没有装入物理内存,只是链接到进程的虚拟地址空间中,进程只分配到极少的内存页面,占用很少的物理空间。在整个进程生命周期中,进程所拥有的内存页面总是动态变化的。管理好内存页面和外部存储器,正确地模拟内存特殊区域的工作,保证系统有足够的内存,让尽可能多的进程并发执行,是Linux交换调度的主要任务。
4.2.1  交换空间
现代操作系统中普遍采用基于虚拟存储器的概念来统一管理内存和外存,实现逻辑上的大容量存储空间。
从内存中换出的页面保存在外存的交换空间中,Linux统提供两种不同类型的外存保存方式。一种是利用整个块设备,比如磁盘的一个分区,这样的分区具有特殊的格式,通常称为交换区或交换设备。另一种是利用文件系统中特殊的文件,这种文件具有固定的长度,称为交换文件。
Linux系统可以同时管理多个交换空间,最大个数由参数MAX-SWAPFILES指定(默认值是8),在文件include/linux/swap.h中定义。交换空间按照优先级排序,当需要分配一个交换页面时,Linux首先使用仍然拥有空间、拥有最高优先级的交换空间,交换区和交换文件都可以用来存储内存中换出的页,达到扩充内存的目的。使用交换区的交换存取过程中,系统直接针对磁盘进行。交换文件是文件系统中的特殊文件,在文件系统建立之后创建。在实际使用过程中,通常以交换区为主,以交换文件为辅。首先设置能够满足日常工作需要的交换区,当需要更多交换空间的时候,临时增加几个交换文件,这样,不再需要时可以方便地撤消交换文件。
4.2.2  进程的内存组织
Linux系统中进程虚拟存储空间管理的基本单位是虚拟存储段(Vitual Memory Area VMA),用vm-area-struct 结构来描述。一个VMA段是某个进程的一段连续的虚拟空间,这段存储空间的所有单元(页)拥有相同的特征,这些特征可以包括访问权限、保护情况可加锁情况等等,同时,还定义了一组建立在这个数据结构基础上的对内存的操作方法,这些操作方法具体实现进程对虚拟存储段的操作,见图4.2。进程的虚拟内存实际是由一组指向vm-area-struct 结构的指针的链表来具体实现的,链表的头接点记录在该进程所指向的mm-struct结构中。
当可执行程序映射到进程的虚拟地址空间时,系统建立一系列 vm-area-struct结构来描述虚拟内存区域的起始点和终止点,每一个结构代表可执行程序的一个部分,可能是可执行代码,也可能是初始化的变量或未初始化的数据。随着整个vm-area-struct结构组成的链表的生成,这个结构所描述的虚拟内存区域上的标准操作函数也由Linux初始化。
进程映射到虚拟空间中并开始执行后,因为只有很少一部分被装入了物理内存,因此不久进程就会存取尚未装入物理内存的虚拟内存页,这时,处理器向Linux告一个页故障及其对应的故障原因,根据实际情况,系统必须把进程执行所需要的内容装入到物理内存,换入工作开始了。
4.2.3  换入
进程内存页的换入是从缺页故障开始的,这种页故障出现的原因可能有两种,第一种情况是程序出现内存访问错误;另一种情况就是正常的缺页中断,虚拟地址有效,但其所对应的页当前不在物理内存中,这时,操作系统必须从磁盘映像或交换空间中将所需的页装入物理内存。
进程运行过程中遇到缺页中断后,系统保存当前进程的现场,当前进程进入等待状态。Linux系统转入缺页中断处理程序,根据处理器提供的缺页地址信息(在I386系统中是控制寄存器CR2),系统必须迅速地找到用来表示出现缺页的虚拟存储区所对应的vm-area-struct结构。
为了实现快速查找出现页故障虚拟内存相应的vm-area-struct结构的位置目标,Linux内核把所有vm-area-struct结构组成一个AVL树。如果搜索不到缺页所对应的内存区域,则说明进程访问了非法存储区,该虚拟地址是无效的,系统向进程发送SIGSEGV信号。
接着,系统进行缺页访问模式合法性检测。因为进程也有可能在虚拟地址上进行的操作非法而产生页故障。这时操作系统会同样发送内存错误信号SIGSEGV给该进程。有关页的访问控制信息包含在页表项中。
这两项检测通过之后,就表明该虚拟地址有效。对有效的虚拟地址,必须区分页所在的位置。如果页表项是无效但非空,则说明该页处于交换空间中,操作系统要从交换空间装入页,否则,页面就位于磁盘的可执行映像中。默认情况下,Linux会分配一个新的物理页面并建立一个有效的页表项,更新页表项的相关属性信息,把所需要的页面装入内存。
这时,所需的页装入了物理内存,页表项也同时被更新,然后进程就可以继续执行了。这就是请求页式管理的请求调页过程。
处理缺页故障过程中操作系统唤醒另外的进程占有处理机资源,当前进程转入等待状态。换入结束后,进程转入就绪状态,参与处理机资源的竞争。
4.2.4  换出
系统为了保证有足够的空闲物理内存,必须及时把内存中暂时不会用到的物理页面淘汰掉,或者说置换出去,可能是置换到交换空间,也可能直接扔掉,这取决于页面本身的访问情况。
Linux系统提供内核交换进程kswapd来实现页面淘汰功能。kswapd进程号为5,属于一种特殊的进程,Linux中称为内核线程,内核线程不是通常意义的线程,它是具有高优先级的实时进程,不共享其他进程的内容,本身没有虚拟存储空间,运行于内核态,直接访问物理空间,这种特性决定了它可以快速地使用内存,提高整个内存管理的效率。属于这个类型的进程还有initbdflush等等。
内核线程kswapd主要是保证系统中总是有足够的空闲页面,保持整个存储管理子系统高效地运行。这个线程周期性地运行,可以保证系统总能及时释放足够多的内存页面。
交换内核线程kswapd周期性地被唤醒,首先检测现有的空闲内存页面数据,Linux系统使用固定的值作为空闲页面的警戒值。
交换内核线程kswapd是高优先级实时进程,依次通过三种途径缩减已使用的内存页面——一是缩减page cachebuffer cache;二是换出SYSTEM  共享内存占用的页面;三是换出或者丢弃其他进程占用的页面。释放一部分页面之后,系统再次拥有足够多的空闲页面,交换内核线程转入等待状态。
缩减page cachebuffer cacheLinux操作系统首选的释放页面途径。page cache是系统为了提高磁盘文件访问速度而设置的,磁盘文件中正在访问的一部分以页为单位映射到内存中。buffer cache是系统块设备使用的缓冲区,其目标是提高块设备的访问速度。在释放物理内存时,淘汰cache页面是最简便的办法。
如果缩减page cachebuffer cache没有得到足够多的空闲页面,就采取第二步措施,换出SYSTEM Ⅴ共享内存。共享页面由多个进程访问,只能换出到交换空间中,而且共享页面同时涉及到多个进程,因此在换出过程中必须依次对每一个进程的页表进行修改,这也需要多次访问内存,增加了工作量。
上述两种措施仍然没有得到足够的空闲页面时,系统就要对所有进程进行扫描,寻找适合换出的候选进程。好的候选进程应该有一个或多个可以丢弃或换出的页面,系统选择其中部分页面丢弃或换出。
Linux系统采用记龄(aging)置换算法。Linux系统根据访问次数来决定是否适合换出,优先换出那些很长时间没有访问的页面。与前两种途径相比,换出或者丢弃其他进程占用的页面的效率最低。
总的来看,请求页式存储管理方法在进程建立时只分配少量内存,通过页面的交换来保证进程运行的时候能够得到需要的页面,可以同时在内存中安排多个进程。但是,内存利用率的提高是以牺牲系统时间开销为代价换来的。

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