内核内存分配(伙伴系统和slab系统)
在操作系统设计中,**内核内存分配**是一个关键方面,它涉及为内核级操作和数据结构分配内存。当进程在用户模式下执行并请求额外内存时,内核会从空闲页帧列表中维护页面的分配。
因此,内核内存分配可以定义如下:
“操作系统内核为其内部操作和数据结构分配内存的过程称为**内核内存分配**”。
换句话说,在操作系统的内核空间中分配内存的过程称为内核内存分配。其中,内核空间是为操作系统保留的一部分内存。内核空间主要用于运行系统级作业,例如调度任务、硬件设备管理、内存管理等。因此,内核内存与用户级内存不同。内核内存通常受到保护,以防止用户级进程直接访问或修改它。
在操作系统中,分配内核内存是一项关键任务,因此必须正确有效地执行。
根据系统的需求和内存分配的类型,有两种重要的内核内存分配技术,即**伙伴系统**和**slab系统**。在本文中,我们将讨论这两种分配内核内存的方法,即伙伴系统和slab系统。让我们从伙伴系统开始。
什么是伙伴内存分配系统?
大小相等的部分称为伙伴。在操作系统的上下文中,伙伴系统是一种用于内存分配的算法。在**伙伴系统**中,可用的内存空间被划分为大小固定且相等的块。然后,这些块以二叉树结构的形式组织起来。在这个二叉树结构中,每个块都有一个伙伴块,其大小与其相邻块的大小相同。
伙伴系统是一种高效的内存分配技术,因为它避免了内存空间的碎片。伙伴系统确保所有分配的块都具有相同的大小,以便可以轻松地将其与伙伴块合并在一起。伙伴系统的另一个主要优点是它允许快速分配和释放内存块,这是实时系统中的一个重要要求,可以提高性能。
在伙伴系统中,每当发出内存分配请求时,内存分配器都会查找适当大小的内存块。如果找到一个大小大于所需大小的块,则会将其重复划分为更小的块,直到获得所需大小的块。一旦找到所需大小的块,分配器就会将其标记为已分配,并向请求进程发送指针。
此外,如果一个内存块从一个进程中释放,则分配器会搜索其伙伴块,并检查它是否也空闲。如果伙伴块也空闲,则将这两个块合并在一起以形成一个更大的块。然后将这个更大的块标记为空闲,并将其添加回二叉树结构。合并空闲块的过程会重复进行,直到不再可能合并为止。
伙伴系统的优点
以下是伙伴系统的主要优点:
与其他内存分配算法相比,伙伴系统涉及的外部碎片更少。
伙伴系统使用二叉树结构来表示已使用或未使用的内存块。
在伙伴系统中,合并相邻块很容易。
伙伴系统提供快速分配和释放内存。
伙伴系统分配正确大小的内存块。
伙伴系统的缺点
尽管伙伴系统有几个优点,但它也有一些缺点,如下所示:
伙伴系统会导致内部碎片。
伙伴系统使用二叉树,因此它要求所有分配单元都是2的幂。
什么是Slab内存分配系统?
**Slab系统**是另一种用于分配内核内存的技术。Slab内存分配系统的主要优点是它消除了由于内存分配和释放导致的碎片。换句话说,slab分配系统是在操作系统中用于管理内核内存的一种内存分配策略。
**注意** - 在slab系统中,两个必需的术语是:slab和cache。
**Cache** - Cache是一个非常高速的小型内存空间。在slab系统中,一个cache包含一个或多个slab。对于每个唯一的内核数据结构,都存在一个单一的cache空间。
**Slab** - Slab是一个容器,用于存储特定类型内核对象的的数据。它由物理上连续的页组成,如上图所示。
在slab内存分配系统中,为内核数据结构分配内存是在固定大小的块中进行的,称为**slab**。每个slab包含一个或多个相同类型的对象。一旦分配了slab,就可以根据需要有效地分配和释放其对象。
我们还可以使用slab分配系统来管理用户空间程序无法直接访问的内核内存。此过程包括内核本身使用的数据结构,以及设备驱动程序和其他内核模块使用的数据结构。
每当发出为特定数据结构分配内存的请求时,分配器都会搜索适当大小的slab。如果已存在所需大小的slab,则将其用于分配必要的内存。如果不存在所需大小的slab,则会为该特定数据结构保留的内存池中分配一个新的slab。
在slab系统中,同一个slab用于分配所有相同大小的对象,因此它有助于减少内核内存的碎片。它还有助于通过减少与内存分配和释放相关的开销来提高系统性能。
因此,在操作系统中,用于分配内核内存的slab系统也是一种有效的策略来管理内核内存。
结论
在操作系统中,分配内核内存是一个关键部分,需要仔细考虑以确保稳定的系统性能。根据需求和要存储数据的性质,有两种最常用的分配技术,即伙伴分配系统和slab分配系统,用于分配内核内存。在本文的上述部分中,我们详细讨论了这两种方法。