• 内存管理总结


    内存管理的概念

    操作系统对内存的划分和管理,就是内存管理的概念。·

    内存管理的功能:

    1.地址转换
    2.内存保护
    3.内存空间的扩展
    4.内存空间的分配与回收

    1. 地址转换

    程序员只需要关注相对地址,而逻辑地址到物理地址的转换(地址重定位)由操作系统来完成;

    绝对装入:程序的逻辑地址和物理地址相同,仅支持单道程序环境(早期单道程序)
    静态重定位:在装入时一次性将逻辑地址转换为物理地址,由转入程序来完成,用于早期多道批处理系统(早期多道批处理)
    动态重定位:程序把装入模块装入内存后,并不立即把装入模块的相对地址转换为物理地址,而是在程序真正要执行的时候才转换地址; 允许程序在内存中移动,只更改重定位寄存器中的值(现代操作系统)
    重定位寄存器存的是起始位置,起始位置+相对地址=物理地址

    2. 内存保护

    保证各个进程在【各自的存储空间内】运行,互不干扰,如普通进程不能访问操作系统的内存空间

    方法一:设置上下限寄存器
    当进程的指令要去访问内存时,cpu会根据内存地址和内存上下限进行对比,在上下限内存范围内才允许访问;
    方法二:采用界地址寄存器
    界地址寄存器含有相对地址的最大值,如果装入模块的相对地址没超过界地址寄存器的值,就加上重定位寄存器(存的是起始地址)转换为物理地址

    3. 内存空间的扩展

    使用虚拟技术,从【逻辑上】扩充内存(虚拟性,即将物理上小内存扩展为逻辑上很大的内存)

    1.覆盖技术(历史)
    将用户内存空间分为固定区和覆盖区,经常活跃的放在固定区,其他部分按关系分段放在磁盘,在需要的时候去调用放入覆盖区,替换覆盖区中原有的内存。
    特点:打破了必须将继承的全部信息装入主存才能运行的限制
    内存更新的地方只有覆盖区
    缺点:需要程序员声明覆盖结构,增加编程负担

    2.交换技术(目前使用)
    把处于等待的程序从内存移到辅存,把内存空间腾出来(挂起态)—换出;
    把将要运行的程序从辅存移到内存—换入;
    为了效率,需要使每个进程的执行时间 > 交换时间
    交换技术主要在不同【进程之间】进行,覆盖是同一个【进程内】进行

    3.虚拟技术
    比覆盖、交换技术更先进,后文详解。
    虚拟技术是【进程内】进行!

    4. 内存的分配与回收

    4.1. 连续分配管理方式

    指的用户进程占用的是一整段连续的内存空间;

    1.单一连续分配方式
    内存分为系统区和用户区,系统区仅有操作系统来使用,用户区只有一道程序!用户程序独占用户区,不支持并发!且有内部碎片(程序小于固定分区大小时造成的空间浪费),无外部碎片;

    2.固定分区分配
    用户区被划为多个固定大小的区,每个分区只装入一个程序;有内部碎片,无外部碎片,利用率低。

    3.动态分区分配
    不会预先划分内存分区,而是【在程序装入内存时】,根据进程的大小动态地建立分区,使分区大小刚好适合进程的需要;
    分区的大小和数目是可变的;
    相邻的空闲分区会被合并;
    采用空闲分区表、空闲分区链的数据结构来记录内存的使用情况;
    外部碎片(用户去外的空闲内存),使用紧凑技术来来解决,即使用重定位寄存器来对程序进行移动整理,将进程PCB中的起始地址修改掉并放入重定位寄存器

    4.1. 非连续分配管理方式

    为用户进程分配的是分散的内存空间;

    引入:
    连续分配的缺点:
    固定分区不灵活,产大量内部碎片
    动态分区产生外部碎片,需要使用紧凑技术来整理,但是时间代价比较高;
    那么就想到将进程分散地装入到不相邻的分区中,既可以充分利用内存也不需要使用紧凑技术

    1.基本分页存储
    ①把内存分为一个个相等的小分区即页框
    ②再按照页框大小将进程拆成一个个小的部分—即页面
    ③进程的每一个页面会被放入内存的页框中
    页式管理通过页表对应逻辑地址和物理地址,页表记录了页面号+页框号

    优点:页的粒度小,提高了内存利用率,减少了碎片;
    缺点:页面之间没有逻辑关系,进程被拆分为固定大小的页面,不利于安全和保护

    多级页表:
    页表需要一段连续的内存来存放,如果页表过大的话,这显然是不现实的----多级页表
    将页表拆分为多个小页表,每个页表的大小一样,4KB,可以放到页框当中,由一个顶级页表记录二级页表的位置,顶级页表记录页表号和对应的页框号;
    多级页表属于时间换空间的典型场景。

    快表
    快表可以直接理解为页式内存管理的高速缓存(Cache)
    作用:加速虚拟地址到物理地址的转换速度
    系统总是先通过页面号与快表中的所有表项进行比较。如果发现匹配的页,则将块号直接从快表中取出,而不必通过页表。
    读写内存数据时CPU要访问两次主存。有了快表,有时只要访问一次高速缓冲存储器(比RAM内存更快),一次主存。

    2.基本分段存储
    虽然页式管理提高了内存利用率,但是页式存储的页没有意义,而每个段定义了一组逻辑信息,如主程序MAIN,子程序X,数据段D等;
    段式管理通过段表对应逻辑地址和物理地址

    进程的地址空间:按照程序自身的逻辑关系划分为若干个段,每个段都有一个段名,每个段 从0开始编制
    内存以段为单位,每个段在内存中占据连续空间,但各段直接可以不相邻

    优点: 分段存储是暗中逻辑功能来划分,用户编程更方便,可读性高;
    缺点: 会产生外部碎片

    分段、分页管理的对比:
    1.页是信息的物理单位,分页目的是为了实现离散分配内存,提高内存利用率,分页仅仅是系统管理上的需要,对用户不可见
    段是信息的逻辑单位,目的是更好满足用户需求,一个段通常包含一组属于一个逻辑块的信息,
    分段对用户是可见的,编程时需要显示给出段名
    2.页的大小是固定的,段的长度不固定,取决于用户编程
    3.分段比分页更容易实现信息的共享和保护,如果要让不同的进程实现共享一块内存,只需要让进程的段表项指向同一个段就可以实现共享;分段容易实现安全保护,只需要标记段为不允许访问即可。

    3.段页式存储
    引入:
    在这里插入图片描述
    分段管理产生外部碎片的原理和连续分配中的动态分配类似,也使用紧凑技术来解决,时间开销大

    而段页式管理先按逻辑模块分段,再将各个段分页
    段页式系统的逻辑地址结构由段号、页号、页内地址(页内偏移量)组成

    分段对用户是可见的,程序员只需要给出段号和段内地址; 而把各个段分为页面的过程对用户是不可见的,系统会自动把段内地址划分为页号和页内偏移量;

    系统会为每个进程建立段表,每个段表项由段号、页表长度、页框号
    在段页式中,一个进程对应一个段表,但可能对应多个页表

    虚拟内存管理

    传统存储管理方式的特征、缺点:
    一次性:作业必须一次性全部装入内存才能开始运行。会造成:
    ①作业很大不能全部装入内存
    ②大作业运行时,由于内存无法容纳所有作业,因此只能少量作业运行,导致并发度下降
    驻留性:一旦作业被装入内存,就会一直驻留在内存中,直至结束。而事实上,在一个时间段内,只需要访问一小部分数据即可正常运行,这就导致内存中主流大量用不到的数据

    以上缺点可以由虚拟存储技术解决,
    虚拟技术的提出源于局部性原理
    时间局部性原理:程序执行某条指令时,不久后该可能被再次执行;某数据被访问后不久可能会被再次访问(因为程序中存在大量的循环)
    空间局部性原理:程序访问了某个存储单元,不久后其附近的存储单元也将被访问,B树在存储的应用(因为很多数据在内存中是连续存放的)

    基于局部性原理,在程序装入时,可以将程序很快会用到的部分放到内存,暂时用不到的放入磁盘;
    当访问的信息不在内存时,由操作系统将所需信息从磁盘调入
    在操作系统管理下,在用户看来似乎有比实际内存大得多的内存----------虚拟技术(时间换空间)
    (交换技术是把整个进程换出内存)

    虚拟内存的特征:
    在这里插入图片描述
    多次行和兑换性对应传统内存管理的一次性和驻留性,

    虚拟技术的实现:

    允许一个作业多次调入内存,如果采用连续分配方式,会不方便实现;因此虚拟内存的实现建立在非连续分配的基础上;

    传统的非连续分配和虚拟内存实现的主要区别:
    ①当访问信息不在内存时,要由操作系统将所需信息从外存将信息调入内存,然后继续执行------请求调页功能(段)
    ②当内存不够时,由操作系统将内存中不用的信息换出到外存----页面置换功能(段)

    请求分页存储管理:
    在这里插入图片描述
    请求分页存储的页表:
    状态位标记是否调入内存,修改位标记是否被修改过,如果没被修改过就不需要写回外存,外存地址标记页面在外村的存放地址,通过关键字段以此对进程的页面进行调入调出。

    页面置换算法:

    若内存不足,需要将不用的信息换出到外存----页面置换,而页面置换算法决定应该换出哪个页面
    页面的换入、换出需统磁盘I/O,会有较大的开销,因此好的页面置换算法应该追求更好的缺页率(即让换入换出的次数尽可能少)

    最佳置换算法OPT:
    选择的被淘汰页面将是以后永不使用的,或者是在最长时间内不再被访问的页面,这样可以保证获得最低的缺页率。但由于人们目前无法预知进程在内存下的若千页面中哪个是未来最长时间内不再被访问的,因而该算法无法实现。一般作为衡量其他置换算法的方法。

    先进先出算法FIFO:
    总是淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面进行淘汰。但是先进入的页面也有可能经常被访问;
    容易实现,算法性能差。

    最近最久未使用页面置换算法LRU:
    LRU 算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间 T,当须淘汰一个页面时,选择现有页面中其 T 值最大的,即最近最久未使用的页面予以淘汰。
    需要硬件来实现,性能好,开销大,实现困难,最接近最佳置换算法

    时钟置换算法CLOCK:
    时钟置换算法是一种性能和开销较为均衡的算法,
    实现:将内存中过的页面都通过连接指针连成一个循环队列,页面的访问位为1代表访问过,页面的访问位为0代表未访问过;当需要淘汰页面时,会扫面队列,找到访问位为0的并换出该页面,并将访问位为1的全都置为0;如果全都是1,则第二轮扫描就会遇到为0 的页面并换出

  • 相关阅读:
    Mybatis
    Ubuntu开机黑屏原因及解决(recovery Mode)
    区间DP day42
    Java中SpringBoot四大核心组件是什么
    Apache Doris 巨大飞跃:存算分离新架构
    Go 学习之 channel 篇
    leetcode做题笔记171. Excel 表列序号
    018-Java类与对象案例分析
    01-spring源码概述
    redis-shake 2.x说明
  • 原文地址:https://blog.csdn.net/Swofford/article/details/125595789