浅谈操作系统的内存回收

        从概念上来说,内存分为物理内存和虚拟内存。虚拟内存的提出是为了解决多进程同时操纵一块内存地址从而导致的冲突问题。

        当我们调用malloc或者new进行内存分配的时候,实际上分配的都是虚拟内存。只有进程对这块内存进行读写操作的时候。CPU就会访问这块虚拟内存空间,如果虚拟内存空间没有映射到物理内存中,就会产生一个缺页中断。

        这时候就会从用户态切换到内核态,将这个缺页中断交给内核中的缺页中断函数处理。这时候有两种情况:

        1、当前剩余的物理内存空间可以分配,就直接分配

        2、如果不够的话,就会进行内存回收。内存回收有三种情况:

                (1)后台内存回收:这时候会唤醒一个内核线程:kswapd,进行内存回收。这个操作是异步的,不会阻塞进程。

                (2)直接内存回收:当后台内存回收的速度跟不上进程申请内存的速度,这时候就会进行直接内存回收,这个操作是同步的,会阻塞进程

                (3)OOM机制:当直接内存回收还是无法满足申请空间的大小,就会触发OOM内存回收机制,杀死占用内存空间大的进程。

        对于后台内存回收和直接内存回收,它们可以回收文件页和匿名页两类内存:

                1、文件页:文件页就是物理内存中缓存的磁盘数据文件数据。所谓磁盘数据就是对磁盘写操作的优化,存储的是要写入磁盘的数据。文件数据是对磁盘读操作的优化,存储的是从磁盘中读取的数据。对于文件数据可以直接回收,而磁盘数据的回收分两种情况,如果是干净页,可以直接回收;如果是脏页,就需要先写入磁盘,然后再回收。

                2、匿名页:匿名页不同于文件页,文件页有磁盘当作数据存储的载体。匿名页没有实际的载体,里面存储栈、堆之类的数据,这些数据之后还是需要使用的。匿名页的回收是通过Linux的swap机制。Swap 会把不常访问的内存先写到磁盘中,然后释放这些内存,给其他更需要的进程使用。再次访问这些内存时,重新从磁盘读入内存就可以了。

        文件页和匿名页的回收都是基于LRU回收算法,优先回收不常访问的内存。并且内存回收都会涉及到磁盘I/O操作,以及直接内存回收机制是阻塞的,会影响操作系统的性能。

如何进行优化呢?

        1、我们对比文件页和匿名页回收的方法会发现。文件页的回收不一定会有磁盘的I/O操作,所有我们可以优先回收文件页。

        2、尽早触发后台内存回收,在后台内存回收机制中,有三个阈值:页最小阈值、页低阈值和页高阈值。当剩余的物理内存空间在页最小阈值和页低阈值之间,就说明内存紧张,会触发后台内存回收。如果低于页最小阈值就会触发直接内存回收。我们可以通过调高页低阈值来提早触发后台回收机制。

怎么保证进程不被OOM机制杀死呢?

        在后台内存回收和直接内存回收都满足不了要分配的内存,就会触发OOM机制,对杀死内存占用高的进程。但是有的进程是我们不想被杀死的。

        OOM会通过一种算法对所有的进程计算一个得分,杀死得分最高的。每一个进程都有一个OOM校验值。

通过”目前可用的页面数 * 校验值 / 1000 + 进程占用的页面数“计算得分

        通常进程的校验值为0,所以占用内存越高的得分越高。如果不想进程被杀死,可以通过修改校验值降低得分。校验值的取值范围是[-1000, 1000]。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值