您的位置:首页 > 其它

操作系统—内存管理

2020-04-02 18:59 232 查看

内存管理:

内存管理的功能:
内存的分配和回收,地址变换,内存的扩展,储存保护
程序的执行过程:
程序的执行过程首先要经过编译,将源程序编译成目标模块,之后经过链接的过程,将目标模块和库函数链接在一起,形成装入模块,最后经过装入的过程,把装入模块装入到内存相应的位置,开始执行。
链接的三种方式:
静态链接:当源程序被编译成目标模块时,立刻和库函数链接在一起形成相应的装入模块。
装入时动态链接:源程序被编译成目标模块,当目标模块要被装入到内存的时候采用边装入边链接的方式。
运行时动态链接:当程序运行的过程中需要某些模块时,才对这些目标模块进行链接。
装入的三种方式:
绝对装入:在编译的时候就知道了,程序要驻留的内存的物理地址,编译程序产生了含有目的地址的目标代码。
静态重定位装入:根据内存此时的情况,动态的改变程序需要装入的内存的物理位置,通常在装入后,程序的位置不在改变。操作的过程是,程序的内存物理位置=起始地址+逻辑物理地址。
动态重定位装入:允许程序运行时在内存中移动位置,程序装入到内存时,所有的地址都是相对地址,当程序运行时,要访问相应的指令和数据时,才将相对位置转化成物理位置。转化的过程是利用了基址寄存器的作用。物理地址=基址寄存器内容+逻辑地址。
覆盖和交换:
覆盖技术:在计算机的早期因为内存空间很小,人们为了解决这个问题就开发出了覆盖技术。所谓的覆盖技术,就是把一个大程序分成很多个层次,每个层次都是可以不用同时放入程序的相对独立的程序段,内存会分成相应层次数量的覆盖区,每个覆盖区的大小取决于这个层次里面最大的程序段的大小。当一个层次的程序在内存的覆盖区运行完毕时,相同层次的程序段可以把已经运行完毕的程序段替换下来。
交换技术:交换技术就是把内存中已经不需要的程序段,替换到外存中,可以把要用到的程序段,从外存中替换到内存中去。处理器的三级调度里卖弄的内存调度,就是使用了交换技术。

连续分配管理方式:

单一连续分配:
这个分配方式适用于早期的单任务,单用户的操作系统。这个分配方式将内存分成了两个部分,一个部分是用于存放操作系统的程序,另外一部分才是存放用户作业。单一连续分配管理方式采用的是静态分配,作业一旦进入内存,只有作业结束才会释放内存空间。这个分配方式的优点是:操作简单,只需要很少的硬件支持。缺点是:浪费内存的空间,不适用于多道程序的环境,资源利用率低。
固定分区分配:
将内存分成几个固定大小的分区,这几个分区的大小可以不相等,但是必须事先确定,在运行的时候不能改变。每个分区可以装入一个程序。在固定分区分配中,程序采用静态重定位的方法,将程序装入到分区中。同时系统还需要建立一张分区说明表,用来记录分配的分区号,分区的大小,分区的排列顺序和起始地址等信息。当程序需要进入内存的时候,首先去查分区说明表,选择一个大小能容纳下程序且没有被分配出去的分区。分配给相应的程序。
动态分区分配:
动态分区分配事先并不将内存分为一块一块的分区,而是在作业进入主存的时候,再根据作业的大小将动态地建立分区。
动态分区分配需要两个数据结构来完成一系列的操作:空闲分区表,空闲分区链。
空闲分区表时将空闲的分区按照表格的形式,将空闲分区的起始地址和大小及其编号记录在空闲分区表中。
空闲分区链是用链头指针将空闲分区链接到一起,构成空闲分区链。每个空闲分区的前面几个若干字节用来存放控制信息,比如空闲分区的大小和指向下一个空闲分区的指针。
动态分区分配算法:
首次适应算法:将空闲分区按照地址递增的次序,构建成一个空闲分区的链表,每个进程要分配分区时,进入到链表中开始寻找,顺着链表直到找到合适的空间。将该分区的部分空间分配给进程,剩下的空间留在空闲链表中。首次适应的算法会使低地址留下很多的无法利用的空间,出现外部碎片。
下次适应算法:将空闲分区链表改成循环链表,依旧是按照地址递增的次序。每次不是从队首开始寻找合适的分区,而是从上次分配的空闲分区的下一个分区开始查找。动态分区分配算法的优点是,节约查找合适分区的时间,不用每次重头开始查找。缺点是缺乏大的空闲分区。
最佳适应算法:将空闲分区按照分区大小从小到大的次序形成链表。为进程分配空间的时候,按照链表的顺序,一次查找,直到找到合适的分区大小。最佳适应算法的优点是:能分配给作业做适当的空间,缺点是会产生很多无法利用的外部碎片。
最差适应算法:这个算法是按照分区大小从大到小的次序形成的链表。为作业分配空间的时候。按照链表的顺序,依次查找,直到找到合适的空间大小
。最差适应算法的优点是会留下较大的空间,足够装下其他的作业。缺点是因为大空间总是第一个被分配的,当来了一个大作业的时候,没有足够的空间大小分配。
关于分区的回收和碎片的拼接问题
分区的回收是系统回收已经使用完毕的空闲分区,会将空闲分区和周围的其他空闲分区合并在一起。修改空闲分区表的内容。
拼接是把外部细小而且无法利用的碎片拼接在一起,形成一个较大的空闲分区。拼接的过程主要是通过移动将已经分配出去的分区移动到主存的一端,碎片就会连接成为一个较大的空闲分区。

非连续分配管理方式

非连续分配管理方式是将一个程序分散地装入到内存中去,常见地三种非连续存储方式有:基本分页式管理方式,基本分段式管理方式,段页式管理方式。
基本分页式管理方式:
分页式管理方式是将用户作业的地址空间划分成若干个大小相等的区域,称为页。在内存中也划分成大小相等物理区域,称为块。可以将用户程序中的任意一页放入到内存中的物理块中。
分页式管理方式的逻辑地址是:页号+页内偏移量
同时系统还设立了一个页表的数据结构,页表可以将逻辑地址里面的页号映射成为内存里面的物理块号。
同时,分页管理方式,还需要页表寄存器,这个寄存器里面放置了页表的起始地址和页表的长度。还需要的硬件有基址寄存器和快表。
地址变换的过程:首先用逻辑地址里面的页号去查询快表,如果快表里面能查到相应的页号对应的块号,则取出块号,再和页内偏移量形成物理地址,再进行访存。如果找不到,就将页号和基址寄存器的页表长度进行对比。如果页号大于页表长度,则出现越界中断现象。如果没有,则取页表起始地址+页号页表项长度,得出在内存中相应的页表项的物理位置,找到该页表项,取出相应的块号。并将此页表项放入到快表中。将得到块号和逻辑地址中的页内偏移量结合到一起,得到物理地址,再去访存。
两级页表:
页表是连续储存在内存中的,当页表太大时,需要连续的储存在内存空间中,比较麻烦。就产生两级页表。两级页表的逻辑地址是:外层页号+外层页内地址+页内地址。
地址转换的过程如下:首先利用外层页号,在外层页表里面寻找二级页表的首地址,根据二级页表的首地址和外层页内地址,可以去二级页表里面寻找到相应的物理块号。物理块号和页内地址组成物理地址。
基本分页式管理的优缺点:
优点:基本分页式管理实现了离散分配,而且内存的利用率高,没有外部碎片。缺点是:会产生内部碎片,而且不易于共享,需要硬件的支持,内存的访问效率不高。
基本分段式管理方式:
段的大小是程序员自己定义的,段的大小不一,一般是按照程序逻辑关系进行分段。分段的方式便于编程,信息共享和信息保护。在分段储存管理方式中。逻辑地址是:段号+段内偏移量。
同样,系统也会设置一个数据结构,叫做段表,段表记录了,段号+段长+段内偏移量。同时还需要两个硬件的支持,一个是段表寄存器,另外一个是基址寄存器。段表寄存器存放了段表的起始地址和段表的长度。
地址转换的过程:首先,将逻辑地址里面的段号取出,和基址寄存器的段表长度进行对比,如果段号的大小超过了段表的长度,则产生越界中断。如果没有,就根据段表的起始地址和段号计算出,对应的段表项的地址位置。找到该段表项,将逻辑地址里面的段内偏移量和段表项中的段长经行比较,如果段内偏移量大于段长,则产生越界中断。如果没有,则将该段的起始地址和段内偏移量结合起来,得到物理地址,使用物理地址去访问内存。
基本分段式管理方式的优缺点:
优点是:便于模块化的管理,便于共享,没有内部碎片
缺点是:会产生外部碎片,也分页管理方式相同,需要硬件的支持。
分页式管理和分段式管理的区别:
分页式管理,页是信息的物理分配单位,分页是为了实现离散分配,减少外部碎片,提高利用率。段是信息的逻辑单位,可以减少内部碎片,是为了满足用户的需要。
基本段页式储存管理方式:
段页式的储存管理方式是结合了段式和页式的方法。
大概的思想是将程序分段,在段里面进行分页。
段页式的逻辑地址形式是=段号+页号+页内偏移量
段页式需要的数据结构有两个分别是段表和页表,段表的内容和分段式的段表的内容不同,段页式的段表的内容里面是段号,页表长度和页表的起始地址。页表的内容是页号和块号。
段页式还需要两个硬件设施,分别是段表寄存器和基址寄存器。段表寄存器里内容是段表长度和段表起始地址。
段页式的地址转化的过程如下:首先将逻辑地址的段号和段表寄存器里面的段表长度进行对比,如果段号大于段表长度,则发生越界中断。如果没有,则段表起始地址和段号加起来,得到段表项在内存中的位置。找到相应的段表项,取出里面的页表的长度,与逻辑地址的页号经行比较,如果页号大于页表长度,则发生越界中断。如果没有,则取出页表起始地址+页号页表项长度,得到相应的页表项在内存中的地址。找到相应的页表项,取出物理块号,加上页内偏移量,形成物理地址,进行访存。
段页式管理的特点:段页式没有外部碎片,但还是会产生内部碎片。段页式的地址变化过程需要进行三次的访存。

虚拟内存管理

请求分页式管理方式:
请求分页式管理方式,是根据局部性原理,将部分的程序装入到内存中运行,当程序所要访问的消息不在内存中时,再把相应的页面从外存中调入到内存中。这样在逻辑上扩大了内存的容量,所以成这样的系统为虚拟储存器。
请求分页式管理系统的功能:
请求分页=基本分页+请求调页+页面置换功能
请求分页管理方式采用的数据结构依旧是页表,不过页表的结构发生了变化。页表的结构,有页号,物理块号,状态位,访问字段,修改位,外存地址。
请求分页管理方式的一次运行过程:
首先,如果程序需要访问的信息存在于内存中,则基本的地址变化和分页管理方式相同,如果程序要访问的信息不存在于内存之中,则会产生缺页中断,此时用户程序被中断,CPU来处理缺页中断的程序。首先按照一点算法,淘汰内存中的某个页面,查看页面的修改位,看这个页面是否被修改过,如果被修改过了,要将此页面写回外存中,腾出了空闲的物理块后,将页面从外存中调入到内存。并修改页表项的内容。
缺页中断和普通中断的区别:
一般的中断时在CPU指令执行完毕后的中断周期进行检查,看是否有中断信号产生,再去响应的。而缺页中断时在一条指令执行的周期内发现需要访问的指令或者数据不在内存中,而进行的中断。
请求分页式管理方式的优缺点:
优点:请求分页式管理方式实现了离散存储,提供了虚拟存储器,在逻辑上增大了储存器的空间。
缺点:需要硬件的支持,在某些情况下会产生抖动的现象。
页面置换算法:
最佳置换算法:这个算法是理想的,无法实现的算法,因为他是遇见了未来的情况,需要知道未来程序需要访问页面有哪些,从进行页面的置换。但这个算法为其他的页面置换算法提供了标准。
先进先出算法:
这个算法的思想很简单,就是每次都置换出去最早进入内存的页面。先进先出算法可能会产生belady现象,就是随着分配的物理块号的增加,反而缺页次数增多。同时先进先出的算法,和实际运行的规律不同,效果不好。
最近最少使用算法:
这个算法是将最近没有使用过的算法淘汰掉,用以往的页面的引用情况来,预测未来的情况。
时钟置换算法:
时钟置换算法是最近最少使用算法和先进先出算法的结合版。这个算法将所有的页面构成一个循环链表,如果一个页面被访问过,则这个页面的标志位被置为1,如果此时程序执行的过程中,需要的页面不在内存中,而且,内存的位置不够,需要淘汰页面时。算法的指针会从上次的淘汰的页面的下一个页面开始扫描,如果遇见的页面状态为1,则将状态位改成0,如果状态位为0,则淘汰该页面。
改良时钟未置换算法:
这个算法是时钟置换算法的升级版,这个算法考虑了修改位的影响。大体的执行过程和时钟置换算法的过程相同。
关于页面在外存中的位置问题:
在请求分页管理方式中,外存被分为两个部分,一个是文件区,另外一个是对换区。当页面要从外存中调入到内存中时,首先将有关的文件从文件区复制到对换区中,再从对换区调入到内存中。
页面分配的策略;
固定分配局部置换,可变分配局部置换,可变分配全局置换
抖动现象
抖动现象就是一个页面刚被调出外存中,又被选中调入到内存,这样反反复复的过程称为抖动现象。

  • 点赞
  • 收藏
  • 分享
  • 文章举报
还不快点滚去看书? 发布了8 篇原创文章 · 获赞 0 · 访问量 222 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: