导图社区 操作系统存储器的管理
操作系统的内存管理,包含连续分配管理、离散分配管理、程序的装入和链接、存储器的层次结构等内容,可收藏。
编辑于2021-08-23 19:30:02存储器的管理
连续分配管理
连续分配是指为一个用户程序分配一个连续的内存空间。
分配方式(4种)
单一连续分配
将内存分为系统区和用户区只能用于单用户、单任务的操作系统整个用户区(系统区以外的全部内存空间)只给一个任务用
固定分区分配
将内存用户空间划分为若干个固定大小的区域。每个区域装一道程序
优点
分区简单,收回内存简单
缺点
会造成碎片,浪费空间程序大小受分区大小的限制
划分分区的方法(两种,按照大小)
相同大小分区所有分区大小相同,缺乏灵活性分区太小装不下,分区太大浪费空间。不同大小分区将分区按照大小进行排列,一个分区只能有一个任务(后来的任务会覆盖前面的)。
回收算法
只需将分区说明表中相应的状态标志位置成“0”即可。
动态分区分配
根据进程的实际需要,动态的为之分配内存空间。
要解决的三个问题
分配时所用的数据结构(2种,一表一链)
空闲分区表(分区号、分区大小、分区始址、状态)空闲分区链(有一个向前指针和一个向后指针、分配信息、状态位)
分区分配算法
顺序式搜索算法(4个)
首次适应算法FF(主存中所有空闲按照物理地址递增顺序链接)。从低址空闲区开始查找,知道找到第一个能满足要求的空闲区。优点:高地址很少被利用,为大作业保留了空闲区。缺点:地址不断被划分,留下了难于使用的空闲分区。查找开销大(要找到第一个满足要求的空闲区) 循环首次适应算法(将上面的首次适应算法的链表改为循环链表)每次查找不再从首地址开始,而是从上一次找到的空闲分区开始 最佳适应算法(分配能满足要求,且又最小)。实现时将空分区从小到大排序,寻找最小且能满足要求的分区。优点:剩余空间最小。缺点:每次分配之后又得重新排序 最坏适应算法(从大到小排序),大的空闲区不断分割成小的,给其它的进程用。缺点:大的空闲区划小,大的进程就缺少空闲区
基于搜索的动态分区算法(3个)
快速适应算法(有一个索引表,该表的每一项对应一种空闲分区的类型)。查找效率高。分区归还算法较复杂,系统开销大,还是有空闲区没有利用。伙伴关系:对固定分区和动态分区的折衷。使用的查找算法为哈希算法。每一个区是固定的,分配是动态的,一个区不断往下分(一分为二),分给区小的。可重定位分区分配:将分散的空闲区域紧凑在一起,合成一个大的空闲区。需要动态重定位(重新算地址)和紧凑技术。优点:解决了可变分区分配所引入的零头问题。减少碎片。缺点:提高硬件成本,紧凑时花费CPU。
分区分配和回收
分配
分配内存(比较请求分区大小和表中空闲分区大小)。就看够不够分
回收
若回收区与空闲区相邻,就将其合并,取合并的第一个地址为首地址若回收区不与空闲区相邻,则单独为一个表项
动态重定位分区分配
通过移动把多个分散拼接成大片分区。
重定位的实现
重定位算法
动态分配分区算法+紧凑功能
优点
解决可变分区分配所引入的“零头”问题消除内存碎片,提高内存利用率
缺点
提高硬件成本,紧凑时花费CPU时间
离散分配管理
使用离散分配方式,将进程直接分散的分配在多个不相邻的分区。
对换
将内存中暂时不能运行的进程或不需要(进程、程序、数据)的给外存,再将外存中能运行的或需要的进程给内存。即是:进程、程序、数据在内外存之间交换提高内存利用率。
实现机制
中级调度
实现方式
进程对换(整体对换):分时系统部分对换:页面/分段对换,虚拟存储技术
对换所需要实现的功能
对换空间的管理进程的换入处于静止就绪的进程和静止阻塞的进程都可以换入。还要考虑换出时间,时间长的先换入,免得饥饿。进程的换出看进程状态(阻塞),优先级(低),内存驻留时间(短)。选择换出的进程将该进程的数据传到对换区上若传送过程中未出现错误,便可回收该进程所占用的内存空间。并对进程的PCB作修改。
对换空间得管理
文件区
主要目标:提高文件储存空间的利用率。分配方式:离散分配方式
对换区
主要目标:提高进程的换入、换出速度配置相应的数据结构(空闲盘块分区表、空闲链表)对换区分配方式:连续分配,较少考虑外存中的碎片问题分配算法和回收方法同动态分区分配的算法 对换区:存放从内存中换出的进程
基本单位(3个)
分页分段段页
基本分页存储管理
基本概念
物理块和页面:逻辑地址分页,物理地址分块。若干页装入若干块中,最后一页装入块里时,可能装不满造成浪费。物理编号和页面编号——编号不一样但是内存的大小对应。物理块是内存空间的划分。页面是进程逻辑地址的划分。内存页表(物理块,用位示图表示)进程页表:页面映射表及其表项(物理块号、存取控制字段),页表的大小是物理块的大小
物理块
页面
页表
地址结构
页内位移量:页内地址页内位移量越大,碎片越大。位移量越小,则进程就需要划分的越小,页就越多,页表就越长。页号:P=INT[A/L]。偏移量d=A mod L(A为逻辑空间中的地址,L为页面大小)。也就是说:页内偏移量位于低位,页号位于高位。页内地址和物理地址一一对应
地址变换机制
将逻辑地址转换为物理地址转换方法:将逻辑地址的页号转变为物理地址的块号,而对页内地址不必转换。逻辑页号与物理块号的映射——页表完成页表寄存器PTR:用于存放内存的起始地址和页表长度 两次访存:通过页表找到块号,和通过物理地址访问内存
具有块表的地址转换机制
增加一个具有并行能力的特殊高速缓冲寄存器(快表,即高速缓冲寄存器),存放当前访问频繁的页表项查快表与查内表并行进行。
两级页表
只将当前需要的部分页表调入内存,其余的页表项仍驻留在磁盘上,需要时再调入 页表再来分页,并离散的存放在不同的物理块中。为离散分配的页表再建立一张页表,称为外层页表。外层页表:
基本分段存储管理
段页式存储方式
两方优点
分页的优点:提高内存利用率分段优点:方便用户,易于共享、保护、动态链接。
基本原理
先将用户程序分成若干段,再把每个段分成若干个页,并未每一个段赋予一个段名
地址映射
利用段表和页表实现地址映射 段号与段表寄存器是一样的页号长度与页表长度一样。最后要三次访存,段表、页表、最后访存。
程序的装入和链接
程序运行的过程
编译(源程序编译为目标代码)链接(将目标代码和库代码链接起来,形成可执行的代码,机器语言)装入(到主存,逻辑地址空间存储到物理地址空间)执行
装入
从逻辑地址到物理地址
分类(3类)
绝对装入编译链接的时候就已经制定了地址(程序将被存储在什么位置)。这个地址由编译或汇编时给出,给可有程序猿给出。只适用于单道系统。可重定位装入静态重定位。地址在装入时一次完成,之后不再改变。对装入是对目标程序中的指令和数据修改过程(重定位)。(静态的,地址不可以移动)此时的绝对地址=相对地址(逻辑地址)+内存的起始地址。可用于多道程序环境。动态运行时装入在程序运行时也允许在内存中移动位置。将程序装入内存后,并不立即将逻辑地址转为物理地址。需要重定位寄存器的支持。
链接
源程序经过编译后会得到一个目标模块。链接程序的功能是将这组目标模块及他们所需要的库函数装配成一个完整的装入模块。将目标模块加上库函数
分类(3类)
静态链接程序运行前,将目标模块所需要的库函数链接成一完整的装配模块,以后不再拆开需要解决的问题:对相对地址进行修改变换外部掉换符号(将每个模块中所用的外部调用符号变换为相对地址)存在的问题:对程序的修改不方便不容易共享动态装入链接边装入边连接:解决了以上两个问题。优点:便于修改和更新便于实现对目标模块的共享运行时动态链接因为每次要运行的模块可能不同。在装入时,一些模块可能根本不运行。执行过程:将对某些模块的链接推迟到程序执行完才进行。
存储器的层次结构
其中寄存器和主存储器又称为可执行的存储器。
要解决的五个问题
记录存储单元的存储情况(哪些地方装了,哪些地方没装)回收存储单元实现逻辑地址与物理地址的转换装入的问题(装入一部分的问题)如何保护已装入的进程