操作系统:内存管理总结

一. 内存管理的概念

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

基本要求:

创建进程首先要将程序和数据装入内存;
将用户源程序变为可在内存中执行的程序,需要:编译链接装入(逻辑地址→物理地址);

为什么要有虚拟地址(逻辑地址)?

1.可以把进程所使用的地址「隔离」开来,即让操作系统为每个进程分配独立的一套「虚拟地址」,不用担心装入内存时产生冲突;
2.程序可以使用一系列虚拟地址来访问大于可用物理内存的内存缓冲区

二. 内存管理的功能

1.地址转换(装入的时候)
2.内存保护
3.内存空间的扩展
4.内存空间的分配与回收

1. 地址转换

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

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

2. 内存保护

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

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

3. 内存空间的扩展 ★

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

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

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

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

4. 内存的分配与回收

4.1. 连续分配管理方式

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

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

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

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

4.2. 非连续分配管理方式

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

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

1.基本分页存储
①把整个内存分为一个个相等的小分区即页框
②再按照页框大小将进程拆成一个个小的部分—即页面
③进程的每一个页面会被放入内存的页框中;
页式管理通过 页表 对应逻辑地址和物理地址,页表记录了页面号+页框号
在这里插入图片描述
页表记录了进程的页面和实际存放的页框之间的对应关系;

将进程地址空间分页之后,操作系统如何实现逻辑地址到物理地址的转换?
连续分配中:
的动态重定位方法里,使用重定位寄存器存放起始地址,在运行时才将逻辑地址加上重定位寄存器的起始地址转换为物理地址 ;
分页技术中:
逻辑地址分为两部分,页面号页内偏移
进程的逻辑地址会被分为多个页面,这些页面会被放到内存的页框当中,每个页框有自己的起始位置,
页框号 x 页框大小= 页框的起始地址
页框的起始位置 + 逻辑地址的偏移量 = 物理地址

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

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

快表
快表可以直接理解为页式内存管理的高速缓存cache
作用:每次访问主存时,首先查找快表,快速形成物理地址。提高虚拟地址到物理地址的转换速度;
如果把页表放在主存中,无疑会影响系统的性能。这是因为每次访问主存,首先必须访问页表,读出页描述字,之后根据页表形成的实际地址再访问主存,这样使访问主存的次数加倍,因而使总的处理速度明显下降。
为了解决这个问题人们采用一组硬件寄存器,存放当前访问页的页描述子,此硬件寄存器即超高速缓存,称为“快表”;

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

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

段表 记录了各个逻辑段(段号)、段长、和在内存中存放的位置(段内地址
在这里插入图片描述

优点: 分段存储是按照逻辑功能来划分,用户编程更方便,可读性高;易于实现信息的共享和保护;
缺点: 会产生外部碎片;

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

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

结构:
而段页式是段式和页式的结合,每个进程先按逻辑模块①先分段,②再将各个段分页
段页式系统的逻辑地址结构由段号、页号、页内地址(页内偏移量)组成
在这里插入图片描述

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

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

三. 虚拟内存管理

引入:传统存储管理方式的缺点
一次性:作业必须一次性全部装入内存才能开始运行。会造成:
①作业很大不能全部装入内存
②大作业运行时,由于内存无法容纳所有作业,因此只能少量作业运行,导致并发度下降;

驻留性:一旦作业被装入内存,就会一直驻留在内存中,直至结束。而事实上,在一个时间段内,只需要访问一小部分数据即可正常运行,这就导致内存中驻留了大量用不到的数据

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

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

虚拟内存和局部性原理的关系:

  • 时间局部性是通过将近来使用的指令和数据保存到高速缓冲存储器中,并使用高速缓存的层次结构实现;
  • 空间局部性通常是使用较大的高速缓存,并将预取机制集成到高速缓存控制逻辑中实现。虚拟内存技术实际上就是建立了“内存—外存”的两级存储器的结构,利用局部性原理实现高速缓存。

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

1. 虚拟技术的实现:

虚拟内存的实现需要建⽴在非连续分配的内存管理⽅式的基础上;

与传统非连续存储比较:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

请求分页存储的页表: 在这里插入图片描述

状态位标记是否调入内存,修改位标记是否被修改过,如果没被修改过就不需要写回外存,外存地址标记页面在外存的存放地址,通过关键字段来实现对进程的页面进行调入调出。

2. 页面置换算法:

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

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

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

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

最少使用页面置换算法LFU:
即淘汰 【一定时期内】被访问次数最少的页;
缺点:
1.最新加入的数据常常会被踢除,因为其起始方法次数少
2.它需要给每个记录项维护频率信息,每次访问都需要更新,这是个巨大的开销

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

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值