Linux

linux虚拟内存与交换空间的机制问题详解

对于一台64位的操作系统来说,假设它有一定空间的物理内存4G,物理内存分成了很多8k位单位大小的页框,这些**页框就是我们所说的存储进程的最小单位,即为页面。

为了解决系统运行过程中不同进程之间内存合理的分配和利用(简单来说就是保证系统能够在较多的进程中能够不出错),防止不同进程同一时刻在物理内存中运行而对物理内存的争夺和践踏(简而言之,就是防止一旦某一进程失去控制,占用你的资源不断增大,就会将物理内存占满,并导致其他进程中端,导致服务器崩溃,这是很危险的事情),基于这种情况,Linux采用的是虚拟内存。
我们所了解的是,进程是用户发起运行在内核之上的用户空间的程序

**虚拟内存存在的意义在于使不同进程在运行过程中,它所看到的是自己独自占有了当前系统的8G内存(虚拟空间是物理空间的2倍),当然这是一个假象。**在这种假象之下,内核悄悄的将当前进程所占有的内存转化为了物理内存。

虚拟内存只是进程所看到的假象(自认为占据了所有内存),实际进程运行过程中,进程还是通过物理内存上被CPU调用和执行。线程是进程运行的最小单位,也是CPU运行和调用的最小单位。每一个进程可以包含多个线程,线程作为CPU调用的最小单位被映射到物理内存中。线程映射到物理内存后,物理内存会分配指定的页框给该线程,线程与页框之间的映射是随机的,非线性的。

随着进程的增加,线程的数量也会增加,物理内存的空间有限,页框将有耗尽,物理内存的空间几乎将要要被占满,接近上限,这是如果继续运行下去,内存将要崩溃,服务器死机,将会产生不可预测的结果,这是我们不想看到的,那么该怎样解决这个问题呢?

接下来是解决该问题的方法。内核决定在硬盘上找一段存取速率较高的存储空间,模拟物理内存,并将其内部划分为类似页框的存储小格子。当物理内存将要崩溃的时候,将物理内存中最近一段时间最少频率使用到的页框移出物理内存,放进该存储空间,这段存储空间我们称之为交换空间(swap space)。当新创建的进程放进内存,发现当前物理内存已经被占满,此时内核便需要交换空间来协调。协调的方法如下:

1)内核首先将线程1移到交换空间,并取消包含线程1的进程与物理内存的映射
2)随后,将要进来的线程2移进物理内存中刚刚腾出来的进程的空间上。此时该进程获得了系统内存资源,等待被CPU调用执行。
3)当线程1再次被唤醒时,内核会将使用频率最不频繁的线程3一道交换空间,取消该线程的映射。
4)然后内核加你个线程1移到线程3刚刚腾出来的空间上,并建立新的映射关系,获取系统内存资源。

其中交换空间的存在意义在于:允许内存过载使用。

当然这个过程页框来回的进出也会大大地降低系统的性能,所以应当谨慎使用交换空间。

最后附上一张图,便于理解(以下是官方解释)
在这里插入图片描述
操作系统内核的主要功能之一就是内存管理。内核不仅管理服务器上的可用物理内存,还可以创建和管理虚拟内存(即实际并不存在的内存)。

内核通过硬盘上的存储空间来实现虚拟内存,这块区域称为交换空间(swap space)。内核不断地在交换空间和实际的物理内存之间反复交换虚拟内存中的内容。这使得系统以为它拥有比物
理内存更多的可用内存(如上图所示)

内存存储单元按组划分成很多块,这些块称作页面(page)。内核将每个内存页面放在物理内存或交换空间。然后,内核会维护一个内存页面表,指明哪些页面位于物理内存内,哪些页面被换到了磁盘上。

内核会记录哪些内存页面正在使用中,并自动把一段时间未访问的内存页面复制到交换空间区域(称为换出,swapping out)——即使还有可用内存。当程序要访问一个已被换出的内存页面时,内核必须从物理内存换出另外一个内存页面给它让出空间,然后从交换空间换入请求的内存页面。显然,这个过程要花费时间,拖慢运行中的进程。只要Linux系统在运行,为运行中的程序换出内存页面的过程就不会停歇。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值