操作系统-内存管理/1

操作系统-内存管理

这部分其实很多人容易忽略,面试的时候被问到就会很尴尬,真的就想不起来了,但其实这部分内容很重要的,而且不管是对以后的学习和工作都很有帮助。

今天我们就来一起学习吧!

内存管理主要做了什么
  • 内存的分配与回收:对进程所需的内存进行分配和释放。malloc 函数:申请内存、free函数:释放内存。

  • 地址转换:将程序中的虚拟地址转换成内存中的物理地址

  • 内存扩充:当系统没有足够的内存时,利用虚拟内存技术或自动覆盖技术,从逻辑上扩充内存

  • 内存映射“将一个文件直接映射到进程的进程空间中,这样可以通过内存指针用读写内存的办法直接存取文件内容,速度更快

  • 内存优化:通过调整内存分配策略和回收算法来优化内存使用效率

  • 内存安全:保证进程之间使用内存互不干扰,避免一些恶意程序通过修改内存来破坏系统的安全性

内存碎片

内存碎片是由内存的申请和释放产生的,会导致内存利用率下降。分为两种:内部内存碎片和外部内存碎片

  • 内部内存碎片:简称内存碎片。已经分配给进程使用但未被使用的内存。

    导致内部内存碎片的主要原因,当采用固定比例进行内存分配时,进程所分配的内存可能会比其实际所需要的大。比如,一个进程只需要 65 字节的内存,但为其分配了 128 大小的内存,那么剩下的63字节的内存就成为了内部内存碎片

  • 外部内存碎片:简称外部碎片。并未分配给内存但又不能使用的内存。

    由于未分配的连续内存区域太小,以至于不能满足任意进程所需要的内存分配请求,这些小片段且不连续的内存空间被称为外部碎片。

    导致原因:分段机制

碎片整理过程

内存碎片整理是一个减少内存碎片以提高内存分配效率的过程。

具体过程:

  • 设置指针:在整理开始前,内存区的头部和尾部各设置一个指针。头指针从内存区的起始位置向尾部扫描,寻找可以移动的页(即可被重新分配的内存页),而尾指针则从内存区的尾部向头部扫描,寻找空闲的页(未被分配的内存页)。

  • 扫描与复制:当这两个指针相遇时,整理过程终止。在整理过程中,可移动页的内容会被复制到空闲页中,这样可以保证原有数据不会丢失,并且释放原来占用的页,使其成为新的空闲页,从而减少碎片。

  • 内存状态更新:整理完成后,内存区的状态会发生变化,连续的空闲页增多,这样就可以满足对大块连续内存的申请需求。

  • 时机与条件:内存碎片整理通常在系统需要分配大块连续内存而现有碎片无法满足需求时触发。例如,如果系统尝试申请3个地址连续的内存页但因碎片过多而失败,此时就会触发内存碎片整理。

  • 结果:整理后,如果再次申请相同数量的连续内存页,系统将能够成功分配,因为整理过程中已经减少了外部碎片,增加了连续的空闲内存空间。

此外,内存碎片整理可能因为某些原因提前结束,例如,如果整理过程中空闲页的数量已经满足当前的分配要求,整理就会提前结束。同时为了避免频繁整理对性能的影响,每个内存区域都有一个整理推迟计数器,用于控制整理的频率。

碎片整理过程中用到了哪些东西

碎片整理过程通常用于减少外部碎片,以优化内存的使用效率。在操作系统中,尤其是在使用分页或分段存储管理的系统中,这个过程可能包括以下步骤和组件:

  1. 内存分析

    • 内存管理器:负责监控和分析内存使用情况,识别出哪些内存区域是碎片化的。

    • 数据结构:如链表、树、图等,用于记录内存块的大小、位置和使用情况。

  2. 选择策略

    • 算法:例如首次适应、最佳适应、最坏适应或快速适应等,这些算法帮助决定如何选取内存块进行合并。

    • 启发式方法:可能会根据系统的具体使用情况,选择不同的策略来减少碎片。

  3. 迁移数据

    • 物理拷贝:将数据从一个内存片段移动到另一个较大的连续空间内,这需要CPU的算力以及时间。

    • 内存复制例程:实际执行数据搬迁的程序代码。

  4. 更新映射关系

    • 页表更新:如果是基于分页的系统,需要更新页表以反映新的内存地址映射。

    • 段表/段寄存器更新:如果是分段存储系统,相关段的起始地址可能需要被修改。

  5. 回收并合并空闲内存块

    • 空闲内存列表更新:将迁移后释放出来的内存块加入到空闲内存列表中,并与其他相邻的空闲块合并。

  6. 处理硬件和软件的兼容性问题

    • 硬件抽象层(HAL):确保在不同类型的硬件上能够顺利执行内存操作。

    • 驱动程序:与硬件交互,保证内存操作得到正确执行。

  7. 性能考量

    • 锁定机制:防止在碎片整理过程中发生并发操作导致的数据一致性问题。

    • 缓存机制:为了减少对系统性能的影响,合理的缓存策略可以减少整理过程中的I/O开销。

  8. 用户态与内核态的交互

    • 系统调用:如malloc, free, sbrk等,允许用户态程序请求内存分配或释放。

    • 信号量和中断:用于在用户态和内核态之间同步和通信。

  9. 安全机制

    • 访问控制:确保只有具备权限的进程可以请求内存整理操作。

    • 审计和日志:记录内存操作的细节,便于排查问题和进行安全审计。

常见的内存管理方式
  • 连续内存管理:为一个用户程序分配一个连续的内存空间,内存利用率一般不高

  • 非连续内存管理:允许一个程序使用的内存分布在离散或者说不相邻的内存中,相对更加灵活一些

1、连续内存管理

块式管理:早期计算机OS的一种连续内存管理方式,存在严重的内存碎片。块式管理会将内存分为固定大小的块,每个块只包含一个进程。在需要内存时,操作系统就会为其分配一块,但若是程序运行只需要很小的一块空间,分配的这块内存很大一部分几乎被浪费。由于两个内存块之间可能还会有外部内存碎片,会由于太小了无法分配。

解决算法:伙伴系统算法、SLAB

伙伴系统算法:

一种经典的连续内存分配算法,可以有效解决外部内存碎片的问题

主要思想:

将内存按 2 的幂次划分,并将相邻的内存块组合成一对伙伴,在进行内存分配时,伙伴系统会尝试找到大小最合适的内存块。

如果找到的内存块过大,就将其一分为二,分成两个大小相等的伙伴块。如果还是大的话,就继续切分,直到到达合适的大小为止。

假如两块相邻的内存块都被释放,系统会将这两个内存块合并,进而形成一个更大的内存块,以便后续的内存分配。这样就可以减少内存碎片的问题,提高内存利用率。

不足:仍然存在内存利用率不高的问题。主要是因为伙伴系统只能分配大小为 2^n 的内存块,因此当需要分配内存大小不是 2^n 的整数倍时,会浪费一定的内存空间。

SLAB:解决了内部内存碎片问题

2、非连续内存管理
  • 段式管理:以段的形式管理,分配物理内存。应用程序的虚拟地址空间被分为大小不等的段,段是有实际意义的,每个段定义了一组逻辑信息,例如有主程序段 MAIN、子程序段 X、数据段D 及栈段 S 等。

  • 页式管理:把物理内存分为连续等长的物理页,应用程序的虚拟地址空间也被划分为连续等长的虚拟页。现在OS应用广泛的一种内存管理方式

  • 段页式管理机制:结合了段式管理和页式管理的一种内存管理机制,把物理内存先分为若干段,每个段又继续分成若干大小相等的页。

虚拟内存
基本概念

虚拟内存:作为进程访问主存(物理内存)的桥梁并简化内存管理

虚拟内存主要提供下面的能力

1、隔离进程:物理内存通过虚拟地址空间访问,虚拟地址空间与进程一一对应

2、提升物理内存利用率:进程都有一个一致且私有的虚拟地址空间。程序员就不用和真正的物理内存打交道,借助虚拟地址空间访问物理内存,从而简化了内存管理。

3、多个进程共享物理内存:进程在运行过程中会加载许多操作系统的动态库。这些库对于每个进程而言公用的,它们在内存中只会加载一份,这部分称为共享内存

4、提高内存使用安全性:隔离了不同进程的访问权限

5、提供更大的可使用内存空间:当物理内存不够用时,可以利用磁盘充当。

将物理内存页(通常大小为4KB)保存到磁盘文件,数据或代码页会根据需要在物理内存与磁盘之间移动

没有虚拟内存存在的问题

1、安全问题:用户程序可以任意访问物理内存,当操作到系统运行必需的内存时,会造成操作系统崩溃,影响系统的安全

2、同时运行多个程序任意崩溃:当A程序将B程序运行的内存地址覆盖后,B程序就会崩溃。

3、浪费物理内存:程序运行时所有数据载入物理内存,会造成其中很大一部分用不到的内存也保存到物理内存中,浪费了宝贵的物理内存。

虚拟地址和物理地址

物理地址:真正物理内存中的地址。也即是内存地址寄存器中的地址。

虚拟地址:程序中访问的内存地址是虚拟地址。例如:C语言中的指针里面存储的数值。

地址翻译/地址转换:操作系统通过CPU芯片的主要组件 MMU内存管理单元将虚拟地址转换为物理地址的过程。

MMU将虚拟地址翻译为物理地址的主要机制:分段机制 分页机制

虚拟地址空间和物理地址空间
  • 虚拟地址空间是虚拟地址的集合,是虚拟内存的范围。每一个进程都有一个一致且私有的虚拟地址空间

  • 物理地址空间是物理地址的集合,是物理内存的范围

虚拟地址与物理内存地址的映射
  • 分段机制

  • 分页机制

  • 段页机制

参考 by javaguide

明天就详细讲讲这三种映射机制,记得加关注哦!!!

  • 27
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值