对linux内存管理机制的深入理解

在早期的计算机,程序直接运行在物理内存。换句话说,它是程序运行过程中访问的物理地址。如果系统只能运行一个程序,只要该程序所需的物理内存不超过机器的内存不会一个问题,我们不需要考虑内存管理的麻烦,反正你的程序,所以内存小,吃不吃那是你的事,但现在的系统是支持多任务,多进程,这样CPU和其他硬件的使用率会更高,我们必须在物理内存中考虑分配系统是有限的,如何及时有效地对多个程序在这个时候,我们称之为MEM论管理。

下面是一个早期计算机系统中内存分配管理的例子,使您更容易理解。

加入我们,我们有三个节目,节目1, 2, 3。程序.1,在1个操作过程中需要10M内存。在程序2的操作中,我们需要100内存,在程序3的运行中需要2000内存,如果系统需要同时运行A和B程序,那么早期的内存管理过程就可能是这样的。物理内存的前10M分配给一个,然后10m-110m分配到这种内存管理方法相对直接。好的,假设我们同时运行C程序。同时,假设我们的系统内存只有128M。显然,按照这种方法,C是由于内存不足,无法运行。我们都知道,虚拟存储技术可以用。当存储空间不够,我们可以交换数据的程序不需要的磁盘空间达到扩展存储空间的目的。让我们在这个内存管理模式存在比较明显的问题看,文章开头提到的,这是最好的了解一个很深的理解方式,其发展过程中有一定的技术。

1。进程地址空间不能被隔离。

因为程序直接访问物理内存,程序所使用的内存空间不是孤立的。例如,像上面说的地址空间是0-10m范围,但如果有一段代码的地址空间内的数据10m-128m操作,那么程序B和C可能会崩溃(每个程序可以整个系统地址空间)。这样,很多恶意程序或木马程序可以很容易地破坏其他的程序,并对系统的安全性也不能保证,这也是不能容忍的用户。

2。内存使用效率低。

正如上面提到的,如果我们要像A,B,C,让程序同时运行,所以唯一的办法是使用虚拟内存的一些节目不临时数据写入到需要的时候再读回内存从磁盘。这个程序运行,将开关软盘显然是不够的,因为程序需要一个连续的地址空间需要20m C程序内存,和一个只有10M的空间,所以交换磁盘需要B计划,而B为100m,你能看到的C程序需要100M数据从内存到磁盘的操作,然后需要运行时再从硬盘读取到内存中的B计划,我们知道IO操作费时费力,所以效率会很低。

3个地址。程序未确定

每当一个程序运行所需要的,不需要在内存中的一个足够大的空闲区,而问题是免费的位置不能确定,这将带来一些重新定位,重新定位,确定参考程序问题在地址的变量和函数,如果鞋不懂检查数据汇总。

内存管理无非是想解决上面的三个问题。如何隔离进程的地址空间,提高内存使用效率,以及在程序运行时如何解决迁移问题

它引用了计算机世界中的一句名言:计算机系统中的任何问题都可以通过引入中间层来解决。

目前的内存管理方法并介绍程序和物理内存之间的虚拟内存的概念,虚拟内存是程序和房间的记忆之间,和程序只能看到虚拟内存和物理内存不能被直接访问,每个程序都有自己独立的进程地址空间,这样的过程是孤立的,进程地址空间,这里指的是虚拟地址。顾名思义,它是虚拟的地址,即虚拟地址空间,而不是实际存在的。

现在我们在程序和物理地址空间之间添加虚拟地址,我们必须解决如何从虚拟地址映射到物理地址,因为程序最终将在物理内存中运行,而且主要有两种技术:分段和分页。

分割(分割):这种方法是人们最初使用的方法之一。其基本思想是将虚拟空间的内存地址空间大小映射到某个程序中。

物理地址空间。







段映射机制

每个程序都有自己独立的、虚拟的、独立的进程地址空间,你可以看到,A和B两个程序从0x00000000虚拟地址空间,虚拟地址空间我们将两块相同尺寸和实际物理地址空间的映射,在每个字节的虚拟地址空间对应的每个字节实际地址空间的映射过程建立软件映射机制,实际的转换是由硬件完成。

这种分割机制解决进程地址空间隔离和拆迁程序的地址在文章开头提到的3个问题。程序A和B有自己独立的虚拟地址空间和虚拟地址空间映射到物理地址空间不重叠,如果在范围0x00000000-0x00a00000来虚拟地址空间的访问计划,然后内核会拒绝这一要求,因此解决地址空间隔离的问题。我们的应用只需要关心它的虚拟地址空间0x00000000-0x00a00000,我们不需要关心它是映射到物理地址。所以程序总是把变量根据虚拟地址空间,和代码不需要重新定位。

在任何情况下,分割机制都解决了上述两个问题,这是一个很大的进步,但仍然与内存效率问题无关,因为内存映射机制仍在程序单元中。当内存不足时,整个程序需要切换到磁盘,所以内存使用效率仍然很低。因此,如何利用高效的内存。事实上,根据程序的局部操作原则,只有小部分数据会被频繁使用在一定时期当一个程序正在运行,所以我们需要一个更精细的内存分割和映射的方法,如果我们认为Linux的伙伴算法和Slab内存分配机制,哈哈。把虚拟地址转换成物理地址的另一种方法是分页机制的出现。

分页机制:

分页的内存地址空间分为多个小的固定大小的页,每一页内存的大小所决定的,ext文件系统的Linux磁盘被分成若干块,这样做是为了提高内存和磁盘的利用率。想象一下,如果磁盘空间分为N个部分,每一份的大小(一块)是1M,如果我想存储在磁盘上的文件是1K字节,然后999字节的休息不浪费。所以我们需要更细粒度的磁盘分区,我们可以设置块较小,这当然是存储文件大小的考虑,似乎有点跑题了,我只是想说,记忆与EXT文件系统的磁盘分区机制分页机制非常相似R.

在Linux的页面大小是4KB。我们通过页面分割来加载进程的地址空间,将常用的数据和代码页加载到内存中,而不使用存储在磁盘中的常用代码和数据。





处理虚拟地址空间、物理地址空间和磁盘之间的页面映射关系

的虚拟地址空间,我们可以看到过程1和过程2被映射到物理地址空间是不连续的(伟大的意义,如果有一天我们的连续物理地址空间不够,但是不连续的地址空间,没有技术,没有办法运行程序),即使他们分享一部分的物理地址空间,共享内存。

虚拟页VP2和VP3步骤1切换到磁盘。当程序需要两页时,Linux内核将生成一个缺少异常的页面,然后异常管理器将把它读到内存中。

这就是分页机制的原理。当然,Linux中分页机制的实现还是相当复杂的。通过全球目录和上级目录的分页机制,页中间目录,页表等,其基本工作原理是不会改变的。

分页机制的实现需要硬件实现。硬件叫MMU(内存管理单元),它负责从虚拟地址到物理地址的转换,即从虚拟页面,找到物理页。