为什么linux需要物理内存分配器?


任何操作系统中最基本的部分之一就是管理内存。该子系统通常称为内存管理单元或MMU。这个子系统是一个非常复杂的子系统,但是对我们来说幸运的是,它有很多文献记录。当我们谈论内存时,通常是我们所指的物理RAM。总物理RAM是您要在新PC或服务器中寻找的最重要属性之
一。但是,最终使用RAM的是操作系统。操作系统充当应用程序和物理内存之间的抽象层。该层将物理RAM划分为虚拟“页面”,这是操作系统可以使用的最小数据单元。默认情况下,在Linux系统中,页面大小为4KB,因为单独处理每个位将太复杂而无法高效。当Linux使用系统RAM时,它将创建一个虚拟内存层,然后将进程分配给虚拟内存。虚拟内存实际上是RAM和交换空间的结合。交换空间是硬盘驱动器中的一部分,如果可用的RAM用完了,则指定为可用空间。这里是额外的抽象层,因此每个正在运行的进程都不会重叠,并尝试使用已被另一个进程使用的内存。这也意味着虚拟内存可以扩展到物理RAM容量之外,即使在效率不高的情况下,这也可能有用。如前所述,操作系统允许进程访问RAM的一部分。该进程完全无法控制内存分配。因此,在应用程序上工作的开发人员,尤其是用高级代码编写的开发人员,不必担心使用内存。通常,任何文件或文件系统的一部分都使用系统命令mmap进行映射,并称为内存映射文件。如果一个内存页面文件没有任何关联的文件,则称为匿名内存,并且使用“malloc”函数分配ut。通过使用分配文件映射的内存和匿名内存的方式,操作系统可以使使用相同文件的进程与相同的虚拟内存页面一起工作,从而更有效地使用内存。有时,一个进程正在占用另一个进程所需的内存。在这种情况下,操作系统使用OOM(内存不足)杀手。该实用程序选择一个进程,然后将其内存页重新分配给其他进程。在Linux中,默认情况下启用此OOM杀手。如果禁用它,则除了扩展到硬盘驱动器之外,如果系统用尽了内存,则基本上无权使用系统。“Cgroups”是用于将进程隔离到特定内存地址的实用程序,该程序将进程分组为逻辑组并为其分配一定数量的内存。Linux中包含cgroup实际上为当今使用的容器(例如Docker和OpenVZ)奠定了基础。Linux还能够使用NUMA(非统一内存访问)与多处理器系统一起使用。这样做的目的是尝试为最接近物理RAM的CPU上运行的进程分配内存。

内核也是用的类似malloc的东西申请内存的。对内核来说,kmalloc()也是一个内存分配器。你说的“linux需要物理内存分配器”,不管是用户态的应用级的,还是上面说的,内核态的“应用级”的,其实都是一个东西。但是,在它俩下面,还有一个系统级的“内存管理层”,或“虚拟内存管理层”,管理页表的创建,维护什么的。你提的问题,应该是两个不同层面的问题,不要把它们放在一起想malloc是在进程址空间中分配,并不能完成实际物理内存分配。再说为什么不直接访问物理内存:其次,虚拟内存管理以及到物理内存的映射是现代处理器和操作系统必备功能,因为没有虚拟内存管理的话,就不能实现诸如动态分页,Swap等。如果直接访问物理内存,就像featurephone或嵌入式系统,内存访问出错容易导致系统崩溃或者破坏其它程序的数据。再次,有虚拟内存管理,才可能有多进程。最后,Linux确实是对内存分页了,但不可能按你说的方法,因为页的大小是固定的,而内核与应用申请时不一定是固定大小,这会导致内存使用效率低下。最后,你可以去读一下关于Linux内存管理的文档,或者《深入理解Linux内核》中关于内存管理