一:动态内存分配:
动态内存分配是指在程序运行过程中,根据需要动态地分配和释放内存空间。常用的就是malloc、free:
malloc():用于分配指定字节数的内存空间,并返回指向该内存的指针。
free():释放之前通过malloc()分配的内存空间。
使用动态内存分配可以灵活地管理内存,特别适用于以下情况:
需要在程序运行时根据具体需求动态分配内存的情况,例如处理可变长度的数据结构。
需要在堆上分配较大的内存块,超出栈空间的限制。
需要在程序中动态创建和释放对象。
但需要注意,动态内存分配需要开发者负责手动释放分配的内存,以避免内存泄漏。此外,使用动态内存也增加了内存管理的复杂性,如果使用不当可能会导致内存泄漏、内存溢出等问题。
二:伙伴算法
伙伴算法(Buddy System Algorithm)是一种用于管理内存的动态分配算法。它的主要目标是解决内存碎片化的问题,提高内存利用率。
在伙伴算法中,内存空间被划分为一系列固定大小的块,通常是2的幂次方大小。每个块都被认为是内存管理的最小单位,称为伙伴块。这些伙伴块按照大小进行组织,例如有大小为1KB、2KB、4KB和8KB的块集合。
当应用程序请求内存时,伙伴算法会找到与请求大小最接近的合适伙伴块。如果找到的伙伴块比请求的内存稍大,并且可以被分割成两个大小相等的子块,那么一个子块将被分配给应用程序,另一个子块将被标记为未分配状态。如果找到的伙伴块与请求的内存大小完全匹配,它将直接分配给应用程序。
当应用程序释放内存时,伙伴算法会将被释放的内存块合并回原来的伙伴块。合并操作将检查被释放块的伙伴块是否也是未分配状态,如果是,则两个伙伴块将被合并成更大的伙伴块。这个合并过程会递归地继续,直到找到所有的伙伴块都是已分配状态或无法合并为止。
伙伴算法的优点是可以减少外部碎片,使得内存的利用率更高。然而,它会增加内部碎片的存在,因为每个伙伴块的大小都是固定的,而并非完全匹配应用程序的内存需求。此外,伙伴算法的实现相对较复杂,需要维护空闲块列表和处理合并过程。
三:Slab 算法
Slab算法是一种在计算机操作系统中用于内存管理的技术。它最早在Linux内核中实现,并被广泛应用于许多操作系统中。
Slab算法通过将内存划分为多个大小相等的固定块(slab),用于管理内核对象的分配和释放。每个slab可以容纳一定数量的对象,并使用链表来组织这些对象。
当需要分配一个对象时,Slab算法首先检查有无空闲的slab。如果存在空闲的slab,则在该slab中分配一个对象,并更新相应的链表。如果没有空闲的slab,算法会从操作系统申请新的内存页面,并将其划分为新的slab。
当对象不再使用时,Slab算法将其返回给相应的slab,并将其标记为空闲状态。这样,当下次需要分配对象时,可以直接从空闲的slab中获取,而无需频繁地向操作系统申请新的内存。
通过使用Slab算法,操作系统可以提高内存分配和释放的效率,减少内存碎片化的问题,并减少对操作系统的频繁内存申请的需求,从而提高整体系统性能。
总之,Slab算法是一种用于操作系统内存管理的技术,通过划分内存为固定大小的slab来管理内核对象的分配和释放,以提高系统的性能和效率。
参考:
https://www.cnblogs.com/alantu2018/p/8527821.html
https://blog.csdn.net/qq_22238021/article/details/80214759