内存管理

作者: 柳亮亮 | 来源:发表于2018-05-23 20:33 被阅读0次

    一、内存管理

    1.内存管理概念

    -程序装入与链接;逻辑地址与物理地址空间;内存保护

    2.交换与覆盖

    3.连续分配管理方式

    4.非连续分配管理方式

    -分页管理方式;分段管理方式;段页式管理方式

    一、内存管理概念

    存储器包括内存(主存)和外存(磁盘)

    -存储器的功能是保存数据,存储器的发展方向是高速、大容量和小体积

    现在一般的存储结构:“寄存器(register)-缓存(cache)-内存(primary storage)-外存(secondary storage)”结构(涉及部分组成原理问题,等以后复习到了再完善下

    缓存

    -Data Cache

    -TLB(Translation Lookaside Buffer)

    内存:DRAM,SDRAM等

    外存:软盘、硬盘、光盘、磁带等

    内存管理的功能有

    内存空间的分配与回收:由OS完成主存储器空间发分配和管理

    地址转换:提供地址变换功能,把逻辑地址转换成相应的物理地址

    内存空间的扩充:利用虚拟存储技术或自动覆盖技术,从逻辑上扩充内存

    存储保护:保证各作业在各自存储空间允许,互不干扰

    物理地址

    -也叫内存地址、绝对地址、实地址

    -把内存分成很多个大小相等的存储单元,每个单元给一个编号,就是物理地址

    物理地址可以直接寻址

    逻辑地址

    -相对地址、虚地址

    -用户程序经编译后形成目标代码,目标代码通常采用相对地址的形式,首地址为0其余指令中的地址都是相对首地址在编程(例如指针所代表的地址,就是一个逻辑地址,我们在程序里可以根据指针的地址做很多内存操作,但是其并不代表真实的物理地址,需要访问内存的时候要先转化为物理地址,然后访问)

    不能用逻辑地址在内存中读取信息

    地址映射:把逻辑地址转化为物理地址的方法

    程序的装入和链接

    程序要运行必须为之创建进程,二创建进程的第一件事就是分配内存

    通常要经过编译(compile)-链接(link)-装入(load)这三个步骤

    编译:有编译程序将源代码编译称若干个目标模块

    链接:有链接程序将编译后形成的一组目标模块以及所需的库函数链接在一起,形成一个完整的装入模块

    装入:将装入模块装入内存中

    举一个例子吧:要把公鸡装冰箱,一共分几步(肯定不是那三步了)先把公鸡各部位分割,例如分割成鸡胸肉、鸡腿、鸡翅、鸡爪等,然后把不同的部位用不同的标签链接起来,最后根据需要放到适合的冰柜,有些适合冷藏的放冷藏,有些适合冰冻的放冰冻。

    装入分三种

    绝对装入方式:事先确定了程序将驻留的绝对地址(物理地址=逻辑地址,古老的方式)

    可重定位装入方式:又称静态重定位,类似于连续数组,必须事先请求所有的地址空间才能装入,连续存储

    动态运行时装入:又称动态重定,类似链表,可以非连续存储

    链接分三种

    静态链接:事先确定了各目标模块及其所需的库函数,以后不再拆开

    装入时动态链接:在装入内存时,边装边链接

    运行时动态链接:程序需要用到时,才进行链接(便于修改更新,便于模块共享)

    内存保护

    1.界地址保护:上下界保护和地址检查机制(若访问的地址不在分配的地址上下界内,则出错)

    2.基址、限长寄存器和动态地址转换机构:告诉你开始地址和长度,在这个范围以内可以访问,超出就出错

    3.存储键保护:通过保护键匹配来判断存储访问方式是否合法

    二、交换与覆盖

    覆盖主要用于早期操作系统中的单一连续管理技术,现在以及不再使用。覆盖打破了必须将一个程序的全部信息装入内存后才能运行的限制,在一定成都西解决了小内存运行大程序的矛盾。

    交换:把内存中暂时用不到的程序或数据调出到外存上,以便腾出足够的内存空间,再吧已具备运行条件的进程调入内存。

    如果对换是以真个进程为单位,则称为整体对换或进程对换(现在也不用了)

    如果是以页或段为单位进行的,则称页面对换或分段对换又称部分对换

    三、连续分配管理方式

    1.单一连续分配(只能用于单用户单任务的OS)

    把内存分为系统区和用户区,系统区仅供OS使用,通常在低地址部分;用户区供用户使用。

    2.固定分区分配

    把空间划分为若干个固定大小的区域,每个分区中只装入一道作业

    划分方法

    大小相等划分:划分的平均大小太大浪费、太小不够用

    大小不等划分:划分为大中小搭配的分区

    3.动态分区分配

    根据进程的实际需要,动态地为之分配内存空间

    -首次适应算法First Fit:从链首开始查找,找到一个大小可满足的空闲分区就使用

    -循环首次适应算法Next Fit:从上一次找到的空闲分区 的下一个空闲区开始找

    -最佳适应算法Best Fit:找一个最合适给它

    -最差适应算法Worse Fit:找一个最大的给它

    首次适应被认为是最好最快的,其次是循环,最差的最佳(每次分配后剩下小碎片,难再分,不得不经常压缩内存,反而浪费CPU)

    碎片

    内部碎片:固定分区产生

    外部碎片:动态分区产生

    我觉得可以这样理解,一个100平米的房间,我们做5个隔断,每个隔断里面的空闲就叫内部碎片,如果我们不做隔断,几个人共享这个房子,每个人把自己的东西放在自己的地方,这个里面的空闲地方就叫外部碎片。

    四、非连续分配管理方式


    分页存储管理

    页面(Page):进程中的块(将一个进程的逻辑地址空间分成若干个大小相等的片,并加以编号,从0开始编制页号)。

    页面大小通常是2的幂,通常是512B~8KB(出题喜欢出4KB)

    页框(Page Frame):内存中的块。

    外存以同样的单位进行划分也直接称为块(Block)。

    地址结构

    页表:为了便于在内存中找到进程的每个页面所对应的物理块,系统为每个进程建立一张页表,记录页面在内存中对应的物理块号,页表一般存放在内容中。

    实际的数据结构中没有页号,只是一个存储块号的线性表,页号也就是数组下标而已。

    表目也称页描述字。

    若已知逻辑空间地址为A,页面大小为L,则页号P和页内地址d可按下式求(必须是10进制)

    P=A/L

    d=A%L

    例如,逻辑空间地址是2170,页面大小是1KB,则页号为2,页内地址为122

    (涉及进制转换问题,需要之后做题,遇到具体的题目具体分析)

    内存分配表:系统建立一张内存分配表来记录内存中的物理块的分配情况。

    由于物理块大小是固定的,所有最简单的办法是用一张位示图来构成内存分配表。

    用01来表示拿些块被占用了,那些块没有被占用

    地址变换机制:实现从逻辑地址到物理地址的转换,将逻辑地址中的页号转为内存地址中的块号,通过页表来完成。

    逻辑地址分为页号和页内地址两部分,物理地址也一样,其中页内地址也就是所谓的偏移量,在逻辑地址和物理地址中的数值都是一样的。

    然后我们要解决的就是页号之间的转换,先把页号放到页表寄存器中,若越界,则中断,反之,带入页表中,找到相应物理地址,就OK了。

    具有快表的地址变换机制:由于页表是存放在内存中的,因此每次CPU存取一个数据要访问两次内存,太慢了。为了提高地址变换速度,在地址变换机制中增设一个具有并行查询能力的高速缓冲寄存器,又称”快表“(差点打成快播,汗)或联想寄存器(TLB)

    两级和多级页表:因为现代操作系统的内存大小非常大,所以用一个页表存放程序的负担比较大,为此,我们引入了两级页表。

    具体方法有

    -采用离散分配的方式来离散安放页表(两级或多级页表)

    -只将当前需要的部分页表调入内存,其余页表仍驻留在磁盘上,需要再调(虚拟内存)

    两级页表:将页表分页,并离散地将各个页面分布存放在不同的物理块中,同样要为离散分配的页表在建立一张页表,称为外层页表,每个页表项中记录了页表页面的物理块号。

    多级页表:为了方便查询,顶级页表最多只能有一个。

    基本分段存储管理

    与分页不同,分段并不给出固定的长度,而是获得段首地址和段长度,用这两个来表示所占用的空间。

    段表

    地址变换机制

    最终的起始物理地址=基址+位移量

    把段号放入控制寄存器,若越界则中断,反之带入段表,求得其段长和基址,由基址和位移量得出其最终的起始物理地址。

    分页和分段的主要区别:分页是OS干的,分段更好的满足了用户的需要。分页是一个一维的结构,分段是二维。页的大小固定且由系统觉得,段的长度不确定,取决于用户所编写的程序。分页无外部碎片,分段有。分页提高内存利用率,分段便于信息保护和共享,方便用户使用。

    段页式管理方式

    相关文章

      网友评论

        本文标题:内存管理

        本文链接:https://www.haomeiwen.com/subject/uwsdjftx.html