天天3分钟操做系统修炼秘籍(12):OOM和swap分区

点我查看秘籍连载算法

OOM和swap分区

进程的虚拟内存空间是映射到整个物理内存空间的,因此在进程自身看来它拥有了整个物理内存,它也能使用整个物理内存,只需在使用的时候请求操做系统帮忙分配更多空间便可。服务器

可是,操做系统上并不是只运行了一个进程,若是一个进程无休止的申请物理内存空间,最终会致使物理内存耗尽或即将耗尽,使得操做系统没法建立新进程,由于建立新进程须要为它分配虚拟内存。ide

因此,操做系统必须得监视物理内存的使用状况,在出现物理内存耗尽或即将耗尽的时候,若是进程继续请求分配内存,将报错out-of-memory(OOM)表示内存不足,而且在出现OOM的时候,操做系统将触发OOM Killer程序从进程列表中筛选出一个内存密集型进程杀掉,从而释放大片内存。但显然,这是不怎么友好的方式,很多服务器都专门或主要运行一个服务,若是这个服务进程正好申请了大量内存,它极可能会被OOM Killer杀掉,从而致使服务中止。操作系统

其实,早期内存通常都比较小,很容易就出现内存不足的问题,因此很早就提出了一个交换分区(swap partition)的概念。线程

swap分区是将磁盘看成内存使用,使得虚拟地址空间的范围大小能够超出物理内存的实际大小,在物理内存空间不足时,能够将物理内存中的一些不重要数据拷贝到磁盘的swap分区中,从而让出内存空间,而且在须要那些已被拷出数据时再从swap分区中拷回到内存,从而再也不那么容易发生OOM错误。翻译

可是swap分区毕竟是在磁盘上,而且要在内存和磁盘之间传递数据,因此要访问swap分区上的数据时速度会很是慢。在目前大内存都已足够廉价的状况下,已经没有多少必要使用swap分区。blog

虽然,如今swap分区对进程来讲不多派上用场,但涉及到的一些技术和概念有必要简单介绍下。进程

使用swap分区第二个要解决的问题是,如何让虚拟地址空间的页映射到磁盘swap分区的页上。也就是,如何将虚拟页翻译成swap页,而且在访问时怎么知道这不是内存的物理页。内存

由于在物理内存的基础上引入了swap分区,因此每一个虚拟页中都有一个存在位来表示该页是否存在于内存中,若是该位的值为1,表示驻留在内存中,若是为0则表示在swap分区而非内存。其中,全部驻留在内存中的页也称为驻留集(Resident Set)。资源

当访问一个虚拟页的时候,若是发现不在内存中,这时候会产生缺页异常(page fault),也称为页未命中(page miss),因而陷入操做系统,启动页错误处理程序,从swap分区中找到对应的页(显然,这里须要将虚拟内存页翻译成swap分区页的地址)并拷贝到内存中。从swap分区拷入页的过程称为换入页(page in)。

这里产生了一个新问题,既然已经使用了swap分区,说明此时物理内存已经处于紧张状态,从swap中page in的页如何放进内存中?其实,这里也须要先进行page out,将该进程的一页或多页page out以便腾出内存。那么哪些运气很差的页会被page out呢?这里又出现了策略算法,称为页替换策略算法,用来决定哪些页应该被page out,好比使用FIFO算法换出那些先进入的页,使用随机算法随机选择换出的页,使用LRU算法选择最近最不经常使用的页等等。

其实,除了page out换出页腾出少许内存空间外,操做系统还设置了两个关于空闲页数量(显然,这是物理页)的水位线:高水位线(High Watermark,HW)和低水位线(Low Watermark,LW)。当操做系统发现空闲页的数量少于低水位线的值时,就会自动启动一个称为swap daemon(也称为page daemon)的后台线程kswapd,该线程会扫描全部进程并从中选出一些候选进程,而后将这些进程的全部页都拷贝到swap分区,直到空闲物理内存页的数量达到高水位线的值。

提示:高水位线和低水位线

在计算机领域中,常会使用高水位线和低水位线来监视进程的一些可用性资源。当这类可用性资源的数量高于或临近高水位线的值时,代表资源充足。当可用性资源的数量已经低于低水位线,说明资源紧张,应当采起一些措施恢复一些资源。

其中,换出进程全部页到swap分区的过程称为swap out,而从swap分区拷入进程全部页的过程(好比再次调度到该进程)称为swap in。将这两个概念与page out和page in区分如下:

  • page in和page out是拷入或拷出进程的一页或某些页
  • swap in和swap out是拷入或拷出进程的全部页

关于swap分区,能不用的话最好仍是不用,由于当真正用到swap分区的时候,内存已经进入了紧张状态,以后的绝大多数进程基本上都会涉及到swap分区,不断地出现page fault而进行换页,这会致使进程抖动(thrashing),使得总体效率低下,并且这个状态是持续的,直到释放足够的内存空间。这时候还不如采起其它办法释放内存空间,例如杀掉某些无关进程、重启内存密集型服务、重启机器等。

相关文章
相关标签/搜索