操作系统内存管理

内存是用于存放数据的硬件,程序执行前需要西安从外存移动到内存中,为了缓和cpu和硬盘之间的矛盾设立。

为了实现多个程序并发执行,内存根据不同的程序划分了不同的存储单元,内存地址从0开始,每个地址对应一个存储单元,按字节B编址,即8个二进制位,程序执行时先进入内存,然后执行机器码。

内存管理的概念和内容

内存管理要实现的功能如下:

1,分配与回收

2,空间扩充,逻辑上扩充内存,实现虚拟性。

3,地址转换,逻辑地址与物理地址的转换。

4,内存保护,进程之间互不干扰,可用通过设置上限寄存器和重定位实现。

内存空间的扩充

覆盖与交换

覆盖是内存大小不够时,将程序分为多个段,常用的段常驻内存,不常用的在需要时第哦啊如,内存中分为一定固定区和若干覆盖区,常驻内存的段放在固定区,进程调入后调出不常用的段放在覆盖区,不会被同时访问的程序段共享同一个覆盖区。
覆盖结构由程序员声明,操作系统自动完成,编程负担大。

交换技术是在内存空间紧张时,将内存某些进程暂时换出外村,把外存某些已具备运行条件的进程换入内存的方法,该技术只适用于离散存储。
磁盘空间分为文件区和对换区两部分,对换区只占很小一部分,为了追求速度都采取连续分配,I/O速度比文件区快。
交换多在进程运行且内存吃紧时运行,系统符合降低时暂停,可优先换出阻塞进程,优先级低的进程,换出的知识进程的程序段和数据段,PCB常驻内存。

覆盖在同进程中进行,交换在不同进程之间进行。

这里也想到日常使用电脑的说法,说东西不要存在C盘,存多了电脑使用就变卡了,可能就是文件占满了交换区,一些阻塞进程或不常用的进程不能换出到外存导致执行效率变低。

虚拟存储技术

传统的存储方式是连续存储或非连续存储,内存一次性分配给作业,大作业无法装入时则不能运行,大量作业不能同时执行,并发度下降,作业放入内存一直驻留直到运行结束,实际同一时间段只需要访问作业的一小部分数据即可正常运行。

虚拟存储技术是基于局部性原理,只将程序使用的部分装入内存,要访问的信息不在内存时由操作系统从外存调入内存,内存不够时操作系统暂时将用不到的信息换出到外存,实现基于离散分配的内存管理方式。

内存的分配回收

单一连续分配

连续分配管理方式,系统为用户进程分配的必须是连续的内存空间,内存分为系统区和用户区,内存中只能有一道用户程序,用户程序独占整个用户空间。

该方法实现简单,无外部碎片,操作系统可采用覆盖扩充内存,不一定需要内存保护,但只能用于单用户单任务,有内部碎片,存储器利用率低。

固定分区分配

将用户空间划分为若干固定大小的分区,每个分区只装入一道作业,分区大小相等,缺乏灵活性,适用于一台计算机控制多个相同对象的场合,比如炼钢厂控制多台相同锅炉,也有分区大小不等的分配方法,增加了灵活性,根据常在系统中运行的作业大小情况分配。

该方法的分配回收管理通过分区说明表实现,该表包括对应分区的大小,起始地址和状态,该方法实现简单,无外部碎片,但程序太大单个分区无法满足时会不得已采用覆盖技术,产生内部碎片,利用率低。

内部碎片是指给进程分配的内存区域有部分没用上
外部碎片是指内存某些空闲分区太小,难以利用,可用紧凑技术解决,挪出空间来。

动态分区分配

该方法是在进程装入内存后再根据进程大小动态建立分区。记录内存使用情况通过空闲分区表实现,该表记录分区号、分区大小、分区起始地址和状态等信息;也有空闲分区链的结构,空闲分区间形成链表,起始部分记录信息。

分配时更新表项中大小和起始地址等信息,回收时将多个相邻空闲分区合并为一个,再更新分区表,否则新建表项。

动态分区分配算法

多个空闲分区都能满足此次进程分配要求时的分配方法。

首次适应算法

从低地址查找,找到第一个能满足大小的空闲分区,空闲分区以地址递增的次序排列,分配内存时顺序查找空闲分区。

最佳适应算法

该算法希望尽可能多地留下大片空闲区,优先使用更小的空闲区,空闲分区容量递增次序连接,分配内存时顺序查找。

该方法会留下越来越多的小内存块,产生很多外部碎片。

最坏适应算法

优先使用最大连续空闲区,剩余的空闲区不会太小,方便使用,空闲区容量递减次序连接。

该算法会迅速用完大分区,后续大进程到达会无空闲区可用。

临近适应算法

首次适应算法每次从链头查找,会在低地址留下很多小的空闲分区,每次查找要经过这些区域,增加开销,所以该算法每次查找都从上次查找结束的位置开始检索,空闲分区地址递增顺序排列,每次从上次查找结束的位置查找空闲分区链。

分页存储管理

非连续的分配管理方式,内存空间分为一个个大小相等的分区,称为页框、内存块或物理快,操作系统把进程的逻辑地址空间也分为与页框大小相等的一个个部分,每个部分成为页。

操作系统以页框为单位为各个进程分配内存空间,进程每个页面分别放入一个页框中,进程页面与内存页框是一一对应关系,即操作系统把进程页面放入内存页框中。

操作系统记录进程每个页面在内存中存放位置的数据结构是页表,一个进程一张页表,一个页面对应一个页表项,记录页面与页框的对应关系,通常存在PCB中,每个表项占用的字节看内存中有多少个内存块,比如4GB内存的页面为4KB,有2^20个内存块,内存块号至少要用20b来表示,则块号为3B,页号连续,可用隐含,不显式存放在页表中。

地址转换

1,确定逻辑地址对应的页号P
2,查页表找到P在内存中的起始地址
3,确定逻辑地址A的页内偏移量w
4,物理地址=起始地址+偏移量

页号=逻辑地址/页面长度 取整
页内偏移量=逻辑地址%页面长度 取余

基本地址变换机构

用于实现逻辑地址到物理地址转换的一组硬件机构,页表寄存器PTR,存放页表在内存中的起始地址F和页表长度M,进程未执行时在PCB中,调到内存时放在PTR中,硬件变换过程如下:

1,根据逻辑地址计算出页号,页内偏移量
2,页号与PTR中M比较,判断地址是否越界
3,查询页表,确定页面存放的内存块号
4,用内存块号和页内偏移量得到物理地址
5,访问目标单元

页式管理系统中每个页面的大小确定,其逻辑地址结构确定,因此页式管理中地址是一维的,只需逻辑地址就可自动计算出页号和页内偏移。

具有快表的地址变换机构

快表,又称联想寄存器TLB,是一种访问速度比内存快很多的高速缓存,用于存放最近访问的页表项的副本,可加速地址变换速度,对应的内存中的页表称为慢表。

计算机内存储设备速度依次为:外存—内存—高速缓存—寄存器,后两者通常集成在cpu内部。

未越界的逻辑地址先去快表查,没有再访问慢表,一次查找需要两次访存,最近使用过的页表放入快表,若命中只需一次访存,只能存放一部分副本,装满后按一定算法替换。

快表的查询速度极快,也可以使用快慢表同时查询双保险,一般来说命中率可达90%,因为局部性原理,具体有时间和空间局部性,即某条指令执行后很可能再次访问,某个存储单元附近的单元也很可能被访问。

两级页表

单级页表的页表项需连续存放,由局部性原理,没必要让整个页表都常驻内存,可以用虚拟技术解决。连续性可以将页表拆分再建立一张页表,上级页表为页目录表,数据为存储页表号和内存块号,各级页表大小不能超过一个页面,访问时多一级多一次访问次数,其实就是用空间换连续性。

分段存储管理

进程地址空间按照自身逻辑划分为若干段,每个段有段命,在编程时使用,每段从0开始编址,内存分配以段为单位,每段内存连续但各不相邻,逻辑地址=段号+段内地址。

段表由段号,段长,基址构成,每个段表项长度相同,段号可以隐藏,存在进程PCB中,进程运行时将段表始址F和段表长度M放入段表寄存器中,地址变换过程如下:

1,由逻辑地址A计算出段号s和段内地址w,在寄存器判断是否越界。
2,查询段表找到对应段表项。
3,检查段内地址是否超过段长(分页不用检查,因为页面大小固定)
4,计算得到物理地址
5,访问内存单元

与分页存储的区别

页为物理单位,对用户不可见,用于实现内存的离散分配,地址是一维的,只要给了逻辑地址就能计算位置

段是逻辑单位,为了更好满足用户需求产生,地址是二维的,需要给出段名和段内地址,分段更容易实现信息的共享和保护,因为分页是固定划分大小,不好标记访问权限。

段页式管理

分页具有空间利用率高,不产生外部碎片,只有少量内部碎片的优点,但不方便按逻辑实现信息的共享和保护,分段方便按逻辑实现信息共享和保护,但段长设置过大时不方便分配连续空间,容易产生外部碎片,综合二者优点开发出了段页式管理。

段页式管理是将进程按逻辑分段,再将各段分页,进程将各页分别装入大小相同的内存块中,逻辑地址由段号,页号,页内地址组成,分段对用户可见,分页对用户不可见。

逻辑地址转换为物理地址

1,逻辑地址得到段号,页号和页内偏移量
2,判断段号是否越界,是则产生越界中断
3,查询段表找到对应段表项
4,检查页号是否越界,是则产生越界中断
5,根据页表存放的块号,页号,查询页表,找到对应页表项
6,根据内存块号,页内偏移量得到最终物理地址
7,访问目标内存单元

一次转换需要三次访存,同样可引入快表,如果快表命中则只需要一次访存。

请求分页/段/段页式管理

访问信息不在内存时从外存调入,内存空间不够时换出外存,虚拟存储技术的管理方式,与原有管理方式相比增加了请求调页功能和页面置换功能。

请求页表

原有页表中加入以下字段:

状态位,表示是否调入内存
访问字段,记录最近被访问的次数等信息,用于操作系统将不常访问的页面调出
修改位,调入内存后是否被修改过,未修改则无需写回外存
外存地址,页面在外存中的存放位置

缺页中断机构

访问页面不在内存时会产生缺页中断,由操作系统的缺页中断处理程序处理,具体过程如下:

1,阻塞缺页进程,调页完成再唤醒并调入就绪队列
2,进程有空闲块则将所缺页面装入该块,并修改表项目;没有空闲块则由页面置换算法选一个页面淘汰,若该页面在内存修改过则写回外存,否则不用写回

该中断属于内中断的故障分类

页面置换算法

页面置换算法是决定换出哪个页面的算法,页面换入换出需要磁盘I/O,有较大开销,所以该算法追求更少的缺页率,即缺页中断次数/总访问次数。

最佳置换算法OPT

淘汰以后永不适用的或最长时间不会再次访问的页面,这是最理想的算法,但是进程执行过程中无法预判,实际是不可能实现的。

先进先出FIFO

淘汰最早进入内存的页面,会且仅有该算法会产生belady异常,即为进程分配的物理块增大缺页情况不减反增,该算法实现简单,但与进程实际运行规律不适应,算法性能差。

最近最久未使用LRU

淘汰最近最久未使用的页面,由访问字段记录该页面自上次访问以来所经历的时间t,淘汰t最大的页面,该算法性能好,但实现困难,开销大,需要专门的硬件支持。

时钟置换算法CLOCK

每个页面设置访问位,访问时置为1,淘汰时检查访问位,0则换出,1则置为0,页面通过链接指针形成循环队列,一次换出可能需要两轮扫描。

改进型时钟置换算法

原有算法仅考虑一个页面最近是否被访问过,若被访问的页面未被修改过则无需执行I/O操作就可以写回外存,其他条件相同时,此类页面也应该优先换出,避免输入输出操作。

增加新的修改位,0表示未修改,
第一次查找(0,0),最近未被访问且未修改过;
第二轮查找(0,1),并将修改位置为1访问位置位0,最近未访问但被修改过,将优先级下调为未访问,但修改过,便于与后续页面相区别;
第三轮查找(0,0),其实就是找原本(1,0);
第四轮查找(0,1),
一次查找最多四轮。

页面分配策略

先引入驻留集概念,即请求分页存储管理中给进程分配的物理块的集合,就是所有可用内存,虚拟存储技术的系统中,驻留集大小一般小于进程总大小,驻留集太小会造成频繁缺页,太大则导致并发度下降,目前有固定分配、可变分配,进程内局部变换和全局置换进行的组合分配策略,但没有固定分配全局置换。

固定局部分配

进程执行缺页时,在进程内部选择一页换出,但很难在进程调入时就分配好确定的物理块。

可变全局分配

操作系统保持一个空闲物理块队列,缺页时选一块分配,没有空闲块时,选一个未锁定页面换出外存,再将物理块分给缺页进程,被选中的进程拥有的物理块减少。

可变局部分配

只允许进程从自己的物理块选一个换出外存,若频繁缺页,操作系统为该进程多分配物理块,缺页率低则减少分配。

页面调入时机

预调页策略

由空间局限性,一次性调入若干相邻页面可减少缺页率,但目前预测成功率只有50%,一般用于进程的首次调入,即运行前调入。

请求调页策略

运行时缺页才调入内存,输入输出开销大,运行时调入策略。

页面调入来源

磁盘的对换区是连续分配,读写速度较文件区快,磁盘足够时调入在内存与对换区进行,不够时不会被修改的页面从文件区调入,unix采取的方法是第一次调入从外存,换出则在对换区进行。

抖动现象

页面刚换入就换出,频繁的页面调度称为抖动,主要原因是进程频繁访问的页面数高于可用的物理块数,分配的物理块不够,故分配原则一般是驻留集大小要大于时间内进程实际访问页面的集合大小。

内存映射文件

操作系统给上层程序员提供的功能,方便程序员访问文件数据和多个进程共享一个文件。

传统访问方式要使用open系统调用打开文件,seek移动指针,read读入若干数据,write将内存数据写回磁盘。
内存映射访问方式为:open打开文件,mmap文件映射到进程的虚拟地址空间,类似缺页中断,用户可用使用逻辑地址访问方式访问文件,读写由操作系统自动完成,进程关闭文件时操作系统自动将数据写回磁盘。

多个进程可映射同一个文件,实现共享,操作系统可优化磁盘的输入输出效率。

总结

本章学习了操作系统的内存管理,主要是扩充内存,分配回收,地址转换和进程保护功能,最主要的内存的分配回收策略,请求分页管理的过程,调入算法等。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值