操作系统 学习笔记(四) 存储器管理

4.1存储器的层次结构

采用多层结构存储器的原因:
存储器要求有速度快、容量大、便宜三个特点,由于至今无法同时满足,所以采用多级结构。

4.1.1多层结构的存储器系统

1.存储器的多层结构

存储层次

CPU寄存器
寄存器
主存/主存储器/可执行存储器
高速缓存
主存储器
磁盘缓存
赋存
固定磁盘
可移动存储介质

越往上,速度越快,价格越高,容量越小

2.可执行存储器
可执行存储器
CPU寄存器
主存

可执行存储器因为与辅存访问机制不同,速度更快

4.1.2主存储器和寄存器

1.主存储器

作用
保存进程运行时的程序和数据

2.寄存器

与处理机速度相同,所以贵且小

4.1.3高速缓存和磁盘缓存

1.高速缓存

作用
备份主存中较常用的数据,以减少处理机对主存的访问次数

2.磁盘缓存

作用
备份=磁盘中较常用的数据,以减少对磁盘的访问次数
特点
磁盘缓存不是实际存在的,而是利用主存中的一部分作为磁盘缓存

4.2程序的装入和链接

程序要运行必须先装入内存,再转变为可以执行的程序
装入内存的步骤

  1. 编译:编译程序对用户源程序进行编译,形成若干个目标模块
  2. 链接:由链接程序将一组目标模块和需要的库函数链接在一起,形成完整的装入模块
  3. 装入:装入程序将装入模块装入内存

4.2.1程序的装入

逻辑地址:程序中写的地址
绝对地址:内存中的地址
以下为无需进行链接的单个目标块的装入方式

1.绝对装入方式

条件
系统小,单道程序,知道程序在内存什么位置
过程
程序编译后的绝对地址,和之前程序中写的逻辑地址是相同的,所以可以直接按照原有逻辑地址进行装入
注意事项
程序中采用符号地址,编译后后才转变为绝对地址

2.可重定位装入方式

条件
多道程序中,编译程序不知道将会把目标程序放在内存的何处,所以形成的绝对地址会与逻辑地址不同
过程
将所有的逻辑地址自加上装入位置的首地址
注意
所有的指令地址和指令中操作的地址都要自加

地址变换在程序装入时一次完成,所以又称静态重定位

3.动态运行时的装入方式

条件
上一种方法一开始就确定了绝对地址,所以不可在程序运行时修改程序的位置,否则绝对地址就会发生错误。
该方法允许这种情况
过程
程序装入内存后不立刻修改地址,而是在程序即将运行时修改地址

4.2.2程序的链接

根据进行链接的时间不同进行分类
该过程将各个互相diaoyong

1.静态链接方式

链接后不再拆开
该过程将各个互相调用的模块装在一起之后,需要响应修改程序和命令中的逻辑地址。

2.装入时动态链接

在目标程序装入的时候再链接,即装入时需要调用哪个模块,再将该模块找来装入
这样便于模块的共享和修改

3.运行时动态链接

由于程序运行时要运行哪些模块是不确定的,所以按照上面的方法,需要全部链接和装入
该种方法是在程序运行时需要哪些再链接、装入哪些。

4.3连续分配存储管理方式

程序进入内存,需要分配一块内存空间。
连续分配方式时早出现的一种存储器分配方法,曾广泛用于60~80年代。
具体表现为:逻辑地址相邻则分配的绝对地址相邻。
以下为四种方式:

4.3.1单一连续分配

内存中只装有一个程序,用于单道程序环境下

4.3.2固定分区分配

在多道程序系统下,将内存分为几个分区,每个分区运行一个程序。
划分分区的方法

  • 等分(因为一个计算机一般处理差不多大小的任务,所以可用性不低)
  • 不等分
    内存分配方法
    将分区按照大小排序后,建立一个使用表
    通过查表进行分配

4.3.3动态分区分配/可变分区分配

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

1.数据结构

作用:
描述分区的分配情况

形式

  • 空闲分区表:设置一个表,一个空闲分区占一个表目,包括分区号,分区大小,分区地址等
  • 空闲分区链:分区头部设置一个一个节点,包括该分区的状态、分区大小和链接前后分区的头部节点的指针等
2.分配算法

即4.3.4和4.3.5

3.分区分配操作

分配内存
检索分区表或链,找到大于需要空间的内存分区,若它比需要内存大出的那一部分小于事先规定的最小分割大小,则全分给他,否则就将多出来的留下来下次用,然后再把正好的分给它。

回收内存
进程运行完要回收内存,要回收的那一部分称为回收区,此时有四种情况

  • 前面有空闲区F,此时不用为回收区建立新表项,该F1大小为F1和回收区大小之和
  • 后面有空闲区F,将两者合并,回收区首地址作为首地址,大小为两者和
  • 前后都有空闲分区,合并,方法与上类似
  • 前后无分区,新建一表项

4.3.4基于顺序搜索的动态分区分配算法

顺序搜索就是使用链结构,依次查找

1.首次适应算法

方法
让空闲分区链以地址递增的方式链接,从最低地址即链头部开始查找,找都合适的就分配

优点
留下高地址的大空间,为后来的大作业分配空间创造了机会
缺点
低地址会留下很多无法利用的小空间,每次从低地址开始,会浪费时间

2.循环首次适应算法

方法
是上一方法的改进,设置一个指针来指向上次查找停止的位置,从这一位置的下一个开始查找,若到头,则从链头重新开始查找。

优缺点和上一方法完全相反

3.最佳适应算法

方法
链按照从小到大排列,从头依次寻找,第一个合适的就是最小的满足条件的分区,将该分区分配出去
缺点
形成难以利用的碎片空间

4.最坏适应算法

和上一个刚好相反
优点是效率高,缺点是会缺少大空间

4.3.5基于索引搜索的动态分区分配算法

这种算法适用于中大型系统,上一种适用于小型系统

1.快速适应算法/分类搜索法

方法
将分区按照大小进行分类,同一类设置一个链表来链接。设置一个管理索引表,来记录这些链表。分配时,根据索引表找到最小的符合项,将该表项对应的链第一个分配给他,不会进行分割。
分类是按照常用空间大小分类,如2,4,8.像7这样的大小可以分到4或者特许空间区链表
优点
快,不会留下碎片
缺点
归还方式复杂,不切割导致空间利用率低

2.伙伴系统

保证每一个空闲分区和非空闲分区都是2n。根据n的大小对分区进行分类。
每次需要一个大小为m的分区,就找大小为2i大小的分区。
保证:2(i-1)<m2i
然后将该分区分给它。
如果没有,则找2i+1的分区,将该分区分为两个,一个分配,一个加入2i类别。
还没有则找2i+2,分割,一个加入2i+1 类别,另一个分割后同上一句话。
以此类推

优点是增加空间利用率,缺点是效率降低

3.哈希算法

利用哈希快速查找的方法完成

4.3.6动态可重定位分区分配

1.紧凑

为了利用内存中的碎片内存,将已用内存进行移动,从而使碎片内存和为一个大内存,该过程为紧凑

2.动态重定位

动态运行时装入方法中有一个重定位寄存器,记录程序的开头地址,发生紧凑时,只需要改变这个地址即可。

3.动态重定位分区分配算法

与动态分区分配类似。额外加一个,如果没有分区可以分,但是碎片加起来可以大于所需内存,则进行紧凑然后分配内存。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值