[操作系统系列]存储管理

操作系统存储管理

存储器管理的对象是主存储器(内存)。主存是CPU直接存取指令数据的存储器,在计算机系统中是个关键性资源。是否能合理使用,在很大程度上将影响到整个计算机系统的性能。

先介绍一些铺垫知识:

程序的装入和链接:
多道程序环境下,程序要运行就必须先装入内存,而一个用户程序要装入内存变成一个可以运行的程序就要经过:
[编译]:源代码—>目标代码
[链接]:目标代码+所需库函数=装入模块(将经过编译后得到的一组目标模块及它们所需要的库函数装配成一个完整的装入模块。)
[装入]:将装入模块装入内存
在这里插入图片描述
地址重定位:
逻辑地址转换成物理地址的过程称为地址重定位(地址映射)。
源程序经编译链接后形成的程序模块中的地址称为逻辑地址。
目标程序中所限定的逻辑地址范围,简称为地址空间。所有
逻辑地址空间的起始地址都是“0” 。要将程序装入内存中执行,就要确定装入内存的实际物理单元编号,这些物理单元 的编号称为物理地址。因此需要将程序的逻辑地址变换为物理地址。
【静态重定位】:
在程序执行之前由装配程序完成的重定位。
优点:
(1)可以在一般机器上全部用软件实现。
(2)装入程序可以实现静态连接。
缺点:
1)执行期间程序不能在主存储器中移动,且存储空间必须是连续的,所以对提高主存储器的利用率不利。
2)若程序空间大于被分配的物理空间,则要由程序员自行采取某种手段来解决空间不足问题。
3)难以实现共享代码。
【动态重定位】:
在程序执行的过程中进行的地址重定位,确切的说是在每一次访问每一个地址单元之前进行地址变换
动态重定位需要硬件——重定位寄存器支持
优点:
1)目标模块进入内存时不需要任何更改,也可以任意移动。程序的存储空间也可以是不连续的。
2)在程序开始执行之前,不一定要把整个程序都调入到主存中。一个程序可以被分配在多个不连续的主存物理空间内, 以提高主存储器的利用率。
3)几个程序可以共享存放在主存中的同一个程序段。
4)支持虚拟存储技术。
缺点:
需要硬件支持,实现算法比较复杂。

链接:
指将编译后的一组模块以及所需要的库函数装配成一个完整的装入模块。
【静态链接】:在程序运行之前事先进行链接。
【装入时动态链接】:在装入模块遇到另一个模块时再进行链接
【运行时动态链接】:在运行过程中,若发现被调用的模块没有装入内存,再去找该模块并装入内存,并连接到调用模块。

存储管理方式:

【单一连续分区】:
操作系统占有一部分主存空间, 剩余的连续空间全部分配给用户程序,任何时候内存中最多只存在一个用户作业。
[地址保护]:使用界限寄存器,当用户执行每一条指令时其物理地址和界限寄存器进行比较,当确
定没有超出用户地址范围时在执行指令,否则产生越界中断,并停止执行用户程序。
采用静态重定位的方式实现地址映射
在这里插入图片描述
【固定分区】:
在系统初始化时,将内存空间划分为若干个任意大小的或相等的分区,每个分区只分配给一个
作业使用,作业必须一次性连续装入一个分区内。会产生片内碎片(内部碎片)。
特点:
采用静态重定位的方式实现地址映射,支持多道程序设计技术,但内存空间的利用率不高 适用于作业的大小及数量都事先比较清楚的系统中。
【可变分区】:
也称为动态分区,不预先划分内存空间,而是通过在作业装入和处理的过程中,根据作业大小来划分并分配存储空间。若 无空闲的存储空间或无足够大的空闲存储空间,则令申请空间的作业等待。
为了实现可变分区,必须配置相应的数据结构用来记录内存的使用情况。
特点:
采用动态重定位的方式实现地址映射
空间分配更灵活, 内存利用率有所提高
存在“内存碎片”问题
要求作业一次性全部装入连续的空间内,不便于内存共享
【动态重定位分区】:
在动态分区分配方式中,经过一段时间的分配和回收后,内存中会产生很多小的空闲分区。可能有用户程序应找不到足够 大的分区而难以装入,当所有空闲分区容量的总和却足以满足该程序的要求。动态重定位将内存中的所有作业进行移动, 从而将原来分散的多个空间分区移到同一端拼接成一个大的空闲分区,以装入用户的作业。
动态重定位虽然可以解决碎片问题,但由于需要进行大量信息移动,为此需要付出的代价很大。

[分区分配算法]:
1)首次适应算法:将空闲分区表项按分区起始地址递增的次序排,分配存储空间时,从队首搜索,选择第一个满足要求 的空闲区分配给用户作业。如果作业小于该分区,将剩余的部分作为一个新的空闲分区。这种算法存储空间使用不均衡; 低地址端有较多的小空闲区;每次从头搜索,速度相对慢。
2)下次适应算法:是首次适应算法的演变。将空闲分区表项按分区起始地址递增的连接成循环链,每次分配空间时,从上 一次找到的分区的下一个分区开始搜索,选择第一个满足要求的空闲区分配给用户作业。这种算法存储空间利用均衡;但 是没有了较大空闲空间,使大作业无法运行。
3)最佳适应算法:将空闲分区表项按分区大小从小到大排列,为作业选择分区时查找其大小最接近于作业所要求的存储空 间,使得作业放入这样的分区后剩下的部分最小。这样保留了较大的空间有大的作业申请分区时,它就比较容易得到满足; 但留下的空闲区较小,难以再利用。
4)最坏适应算法:将空闲分区表项按分区大小从大到小排列,为用户作业选择存储空间时,总是寻找最大的空闲区,使 得在划分后剩下的空闲区也是较大的。这样剩下的较大空间对以后的分配很可能仍然是有用的;但如果有较大的作业运行, 很难满足需求。

页式存储管理:

页式存储管理允许一个进程分散地分配到许多不相邻的分区中,将进程的逻辑地址空间分成若干个大小相等的片,称为页 面或页,内存空间分成与页大小相等的若干个存储块,称为物理块或页框,在为进程分配内存时,以块为单位,将进程中 的若干页分别装入多个可以不相邻的块中,进程的最后一个页经常装不满一个块,形成不可利用的碎片称为页内碎片但这 是比较容易接受的浪费
【页表】:
页式管理中,进程的若干页离散地存在多个存储块内,为了使用时能找到对应的块,系统在内存中的固定区域为每个进程 建立了一张页表,用以登记每页分别对应的内存块号。页表的作用是实现从页号到存储块号的地址映射
另外系统还应建立一张空闲块表,记录内存中的空闲块(按存储块号小到大排列)
【作业表】:
整个系统建立一张作业表,登记每个作业的基本信息,包括每个作业的页表的内存起始地址等信息 。
[快表]:在分页管理系统中,每一次访问内存指令都要进行两次内存寻址过程:第一次访问页表,获取页面存放的物理块 号; 第二次访问实际需要的内存单元。这将使系统整体运行速度有所降低。为了提高查表速度,可在地址变换机构中加 入一个速度比内存更快的小容量的快速存储器,存放作业运行过程中最常用的页号和对应的块号,该快速页表称为快表
[多级页表]将页表的组织也进行分页,递归形成多级页表
页式存储管理不要求作业的程序段和数据在内存中连续存放,从而有效地解决了内存碎片问题。但由于页面的划分未考虑 作业空间的逻辑意义,所以不容易实现存储共享。因此又有了段式管理

段式管理:

段是信息的逻辑单位。
引入分段存储管理方式, 主要是为了满足用户和程序员的下述一系列需要:

  1. 方便编程
  2. 信息共享
  3. 信息保护
  4. 动态增长
  5. 动态链接
    段式管理将作业地址空间按逻辑意义划分成段,每个段定义一个完整逻辑信息,从“0”开始编址;每个段有唯一的名字,以段为单位分配内存。内存空间使用动态分区的管理方式,每段分配在连续的区域,各段可以不连续存放.
    和页式管理一样,系统为每个进程分配一个段表,实现动态地址转换和存储保护。整个系统中建立一张内存分配表,记录内存中已占用分区和空闲分区的情况,包括分区起始地址、分区长度、分配状态等。为实现段的共享,系统中有一张登 记共享段使用情况的现行分段表。
    当作业申请内存空间时,分段管理首先为作业申请段表空间,再根据段的大小按动态分区分配方式分配内存空间;内存空间的回收也和动态分区管理方案一样。
    分页系统能有效地提高内存的利用率——解决外部碎片问题。分段系统则能更好地满足用户编程的需要——解决段的共享、动态连接等问题(这就导致了段页式管理的出现)

段页式存储管理:

用户作业的地址空间仍按逻辑意义分段,在每个逻辑段空间内再划分成大小相等的页。内存空间则划分成与页大小相同的 块,以块为单位进行分配。这就吸取了段页两者的优点,同时又抛弃了两者的缺点,现代操作系统大多用这种管理方法。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值