目录
1.分区存储管理
1-1单一连续分配
1-1-1基本原理:
1-1-2单一连续分区存储管理的地址变换与地址保护
1-1-3管理特点
1-2固定分区分配
1-2-1基本原理
1-2-2分区划分
1-2-3主存空间的分配与回收
1-2-4地址转换与存储保护
1-2-5管理特点
1-3动态分区分配
1-3-1基本原理
1-3-2主存空间分配与回收
1-3-3地址转换与存储保护
1-3-5管理特点
2.分页存储管理
2-1基本原理
2-2空间分配与回收
2-2-1数据结构
2-2-2页的共享与保护
2-2-3页面大小问题
2-2-4分页存储管理的改进——快表结构
3.分段存储管理
3-1基本原理
3-1-1地址结构
3-2空间分配与回收
3-2-1数据结构
3-2-2主存分配与回收
3-2-3分配算法(查找合适的空闲分区)
3-2-4内存回收
3-3地址转换与内存保护
3-3-1地址转换与地址保护
3-3-2段的共享与保护
3-4分页与分段存储管理的主要区别
4.段页式存储管理
4-1基本原理
4-2内存管理要求
4-3地址转换与保护
1.分区存储管理
在存储管理中涉及到两个问题:
1、是否要把作业全部(一次性)装入内存,分为两种:
- 全部(一次性)装入:非虚拟存储
- 部分(多次性)装入:虚拟存储
2、装入内存时是否要放在内存连续地址空间,分为两种:
- 连续分配:必须放在内存连续的地址空间
- 不连续分配:可以放在内存不连续的地址空间
采用全部装入和连续分配,进程执行时速度快、效率高;
采用部分装入和非连续分配都是为了进一步提高内存的利用率,使有限的内存装入更多更大的作业。
1-1单一连续分配
1-1-1基本原理:
最简单的存储管理方式,在早期的单道批处理系统中使用这种管理方案。
采用这种管理方案时,内存被分成两个区域,一个是系统区域,仅供操作系统使用,可以驻留在内存的低地址部分,也可以驻留在高地址部分(通常设置在内存的低端);另一个是用户区,它是除系统区以外的全部内存区域,这部分区域是提供给用户使用的区域,任何时刻主存储器中最多只有一个作业,作业放在从用户区起始地址开始的连续地址区域。
注:单用户连续存储管理只适用于单用户单任务的情况。
1-1-2单一连续分区存储管理的地址变换与地址保护
单一连续分区使用静态重定位,不需要专门硬件进行地址变换,但是会有硬件保护机构,以确保不干扰系统区中的信息,方法有:上界寄存器和下界寄存器、内核态(系统态/管态)与用户态(目态)工作、不做特别管理。
1-1-3管理特点
- 管理简单
- 资源利用率低
- 不支持覆盖技术、对换技术、虚拟存储等技术,作业地址空间大于内存可用空间就无法运行
1-2固定分区分配
1-2-1基本原理
将内存用户空间划分为若干个固定大小(不是相等大小)的区域,在每个分区中只装入一道作业,放在该分区起始地址开始的连续地址区间内。用户空间划分为几个分区,便允许有几道作业并发运行。当有一空闲分区时,便可以从外存的后备作业队列中选择一个适当大小的作业装入该分区,当该作业结束时,又可再从后备作业队列中找出另一作业调入该分区。实际上每一个分区就相当于一个单用户连续分配区间。固定分区分配很少用于现在的操作系统中,但在某些用于控制多个相同对象的控制系统中仍发挥着一定的作用。
1-2-2分区划分
- 分区大小相等,即所有的内存分区大小相等。
- 分区大小不等。
1-2-3主存空间的分配与回收
1-2-4地址转换与存储保护
固定分区存储管理实际中可采用可重定位装入(静态重定位)方式,也可采用运行时动态装入(动态重定位)方式:静态重定位方式、动态重定位方式
1-2-5管理特点
-
作业长度不能大于分区的大小,一个分区只能装入一个作业,一个作业只能装入一个分区。
-
无外部碎片,有内部碎片(一个分区会有剩余空间),作业大小比分区大小越小时,内部碎片越大,空间比较浪费。
-
分区的数量限制了作业的个数。
1-3动态分区分配
1-3-1基本原理
- 动态划分内存,这种方法不预先将内存划分分区,而是在作业装入内存时,根据作业大小动态进行内存分配,并使分配的内存空间大小正好适合进程的需要。在不断的分配回收过程中,系统中分区的大小和数目是不断变化的。
- 动态分区在开始分配时是比较好的,但随着时间的推移,内存中可能会产生越来越多的小的空闲内存块,内存利用率下降。这些小的空闲内存块称为外部碎片,与固定分区中的内部碎片正好相对。
- 克服外部碎片可以通过紧凑技术来解决,就是系统对进程进行移动和整理。这需要动态重定位的支持,比较费时。紧凑的过程实际上类似于Windows系统中的磁盘整理,只不过后者是对外存空间的紧凑。
1-3-2主存空间分配与回收
(1)数据结构
- 已分分区表
- 空闲分区表
- 空闲分区表
(2)内存分配(主要是分配算法)
- 首次适应(FF):分配内存时每次都从空闲分区表的第一项开始顺序查找,找到大小能满足要求的第一个空闲分区。
- 循环首次适应(NF):分配内存时从上次查找空闲分区表结束的位置开始继续查找。
- 最佳适应(BF):空闲分区按分区大小递增排序,从第一项开始找到第一个能满足要求的空闲分区
- 最坏适应(WF):空闲分区以分区大小递减排序。从第一项开始找到第一个能满足要求的空闲分区,也就是挑选出最大的分区。
效果比较:首次适应算法可能比最佳适应法效果好,而它们两者一定比最大适应法效果好。另外注意,在算法实现时,分配操作中最佳适应法和最大适应法需要对可用块进行排序或遍历查找,而首次适应法和邻近适应法只需要简单查找;回收操作中,当回收的块与原来的空闲块相邻时(有三种相邻的情况,比较复杂),需要将这些块合并。在算法实现时,使用数组或链表进行管理。除了内存的利用率,这里的算法开销也是操作系统设计需要考虑的一个因素。
1-3-3地址转换与存储保护
- 使用动态重定位
- 硬件支持:基址寄存器和限长(界限)寄存器
1-3-5管理特点
- 分区长度不预先固定,而按作业的实际需求划分的;分区的个数也不预先设定,而是由装入内存的作业数量决定,提高了内存的利用率。
- 主存经过多次的分配与回收后,会产生许多小的分区无法分配,这种内存碎片叫做外零头(也叫外碎片,对应于固定分区),会造成内存空间的浪费。
- “碎片”或“零头”:是指内存中容量太小、无法利用的小分区。可分为两种:内部碎片:在一个分区内部出现的碎片(即被浪费的空间),如固定分区法会产生内部碎片。外部碎片:在所有分区之外的碎片,是一些无法使用小分区。
2.分页存储管理
-
连续分配存储管理方式产生的问题:
- 要求连续的存储区
- 碎片问题
-
离散分配,允许将作业离散放到多个不相邻接的分区中。
- 分页式存储管理:离散分配的基本单位是页
- 分段式存储管理:离散分配的基本单位是段
- 段页式存储管理:离散分配的基本单位是段、页
2-1基本原理
- 空间划分:将一个用户作业的地址空间(逻辑空间)划分成若干个大小相等的区域,称为页或页面,各页从0开始编号。内存空间也分成若干个与页大小相等的区域,称为块(物理块)或页框(frame),同样从0开始编号。
- 内存分配:在为作业分配内存时是以块为单位,将作业中的一个页装到内存中的一个块内,每个页在内存中占用连续的地址空间(一个内存块),而不同的若干页则可以装入到内存中不相邻的内存块中,但最后一页可能会装不满一块,从而出现页内碎片。
- 已知逻辑地址求页号和页内地址给定一个逻辑地址空间中的地址为A,页面的大小为L,则页号P和页内地址d(从0开始编号)可按下式求得:其中,INT是整除函数,mod是取余函数。例:系统的页面大小为1KB,设A=2170B,则由上式可以求得P=2,d=122。
- 内存分配原则:以块为单位、每个页装入 一个内存块、内存块可以不连续(也可以连续)
2-2空间分配与回收
2-2-1数据结构
- 页表:为了便于在内存找到进程的每个页面所对应的内存块,分页系统中为每个进程配置一张页表,进程逻辑地址空间中的每一页,在页表中都对应有一个页表项。
页表存放在内存中,属于进程的现场信息。
用途:记录进程的内存分配情况;实现进程运行时的动态重定位。
访问指令或数据需访问内存2次(第一次访问内存中的页表,第二次访问内存中的指令或数据)。
系统同时增加页表寄存器,记录当前执行进程对应的页表的起始地址及长度。
- 内存块表:整个系统有一个内存块表。每个内存块在内存块表中占一项,表明该块当前空闲还是已分出去了。
① 空闲表法:系统为内存所有空闲区建立一张空闲表,每个表项对应一个空闲区,空闲表中包含序号、空闲区的第一块号、空闲块的块数等信息。空闲表法是基于连续分配的。
序号 起始块号 块数
1 25 8
2 106 39
3 … …
② 空闲链法:将所有空闲区拉成一条空闲链,根据空闲链所有的基本元素不同,可以分成空闲块链和空闲区链。• 空闲块链是将所有空闲分区,以块为单位拉成一条链,当为作业分配存储空间时,系统从链首开始,依次摘下适当数目的空闲块进行分配;当回收空间时,系统将回收的块依次加入到空闲块链的末尾。
• 空闲区链是将所有空闲区拉成一条链。每个空闲区除含有用于指示下一个空闲区的指针外,还有本区大小(块数)的信息。
③ 位示图法:利用二进制的一位来表示内存中一个块的使用情况,所有的块都有与之对应的一个二进制位。当其值为0时,表示对应的块空闲,当其值为1时,表示对应的块已经分配。
- 请求表:整个系统有一个请求表,描述系统内各个进程页表的位置和大小,用于地址转换,也可以结合到各进程的PCB里。
2-2-2页的共享与保护
- 页的共享:在不同进程的页表中,各自的页表项如果指向同一内存块,就可以实现页的共享。
- 页的保护:除了内存管理中的保护(0/1表示块的使用状态)、地址转换中的保护(越界保护),还可以在页表的表项中设置存取控制字段,进行存取控制保护。当存取控制字段是1位时,可规定块中的内容是允许读/写,还是只读。当为2位时,则可规定为读/写、只读和只执行等存取方式。
2-2-3页面大小问题
若页面较小:
减少页内碎片和总的内存碎片,有利于提高内存利用率。
每个进程页面数增多,使页表长度增加,占用内存较大。
页面换进换出速度将降低。
若页面较大:每个进程页面数减少,页表长度减少,占用内存较小。
页面换进换出速度将提高。
增加页内碎片,不利于提高内存利用率。
因此,页面的大小应选择适中,应是2的幂,通常为512B — 8KB。
2-2-4分页存储管理的改进——快表结构
- 分页地址变换机构存在的问题:地址变换速度低(需要两次访问内存),第一次访问内存中的页表,从中找到指定页的物理块号,再将块号与页内地址(等于块内地址)计算,形成物理地址。第二次访问内存,是从第一次所得物理地址中获得所需数据(或向此地址中写入数据)。采用这种方式将使计算机的处理速度降低近1/2。
- 快表概念:为了提高地址变换速度,增设一个具有并行查询能力的特殊高速缓冲寄存器(高速缓冲存储器(Cache)其原始意义是指存取速度比一般随机存取记忆体(RAM)来得快的一种RAM,一般而言它不像系统主记忆体那样使用DRAM技术,而使用昂贵但较快速的SRAM技术高速缓存),又称为“联想寄存器(存储器)”或称为“快表”。通常在快表中存放正在运行作业当前访问的那些页表项,以加速地址变换过程,主存中的页表有时也称为慢表。
- 引入快表以后的地址变换过程是:在CPU给出有效地址(逻辑地址/相对地址)后,由地址变换机构自动分为页号P和页内地址W两部分。将页号送入高速缓冲寄存器,并将此页号与快表中的所有页号进行比较,若其中有与此相匹配的页号,便直接从快表中读出该页号所对应的物理块号,与页内地址计算形成物理地址,并送到地址寄存器中。如果在快表中未找到对应的页表项,则再访问内存中的页表,把从页表项中读出的物理块号,与页内地址计算形成物理地址,并送往地址寄存器;同时修改快表,将此页表项存入快表中。但如果联想存储器已满,则OS必须找到一个老的且已被认为不再需要的页表项,将它换出。用物理地址访问内存。
- 快表的性能:由于成本的关系,快表不可能很大,通常只存放16–512个页表项,对中小型作业已有可能把全部页表项存放在快表中,但对于大型作业,则只能将其一部分页表项放入其中。由于对程序和数据的访问往往带有局限性,因此,据统计,从快表中能找到所需页表项的机率可达90%以上。这样,由于增加了地址变换机构而造成的速度损失,可减少到10%以下,达到了可接受的程度。
3.分段存储管理
分段存储管理方式的引入是为了满足用户的要求:
- 方便编程:通常一个作业是由多个程序段和数据段组成的,一般情况下,用户希望按逻辑关系对作业分段,并能根据名字来访问程序段和数据段。
- 信息共享:共享是以信息的逻辑单位为基础的。页是存储信息的物理单位,段却是信息的逻辑单位。页式管理中地址空间是一维的,主程序,子程序都顺序排列,共享公用子程序比较困难,一个共享过程可能需要几十个页面。
- 信息保护:页式管理中,一个页面中可能装有2个不同的子程序段的指令代码,不能通过页面共享实现共享一个逻辑上完整的子程序或数据块。段式管理中,可以以信息的逻辑单位进行保护。
- 动态增长:实际应用中,某些段(数据段)会不断增长,前面的存储管理方法均难以实现。
- 动态链接:动态链接在程序运行时才把主程序和要用到的目标程序(程序段)链接起来。
3-1基本原理
- 空间划分:将用户作业的逻辑地址空间划分成若干个大小不等的段(由用户根据逻辑信息的相对完整来划分)。各段有段名(常用段号代替),各段的首地址都为0。
- 内存分配:以段为单位装入内存,每段占用一段连续的内存空间,大小由对应段的大小决定,段和段之间不连续。内存空间的分配与回收实际上是基于可变分区管理,只是分配和回收的单位是段,而不再是整个作业。
3-1-1地址结构
逻辑地址要用两个成分来表示:段号s和段内地址d
进程的逻辑地址空间是二维的
3-2空间分配与回收
3-2-1数据结构
- 段表:为了便于在内存中找到作业进程的每个段,系统为每个作业进程建立一个段映射表,简称“段表”,记录了作业进程的每个段与内存位置的对应关系,每个段在段表中占有一项,段表项中包含段号、段长和段的起始地址(又称“基址”)等。访问数据/指令需访问内存两次 (第一次访问内存中的段表,第二次访问内存中的指令或数据)。系统还要建立一个段表地址寄存器。记录当前正在执行进程的段表信息,包括有两部分:① 段表在内存的起始地址 ② 段表的长度。
- 请求表:整个系统有一个请求表,描述系统内各个进程段表的位置和大小,用于地址转换也可以结合到各进程的PCB里。
- 空闲分区表:用来登记系统中的空闲分区(分区号、分区起始地址、分区大小及状态)。
3-2-2主存分配与回收
内存空间的分配与回收是基于可变分区管理,以作业的段为单位,按照某种分配算法,从空闲分区表/链中找到符合段所需大小的分区,一个段一个段,最终完成整个作业的内存空间分配。
- 事先规定size是不再切割的剩余分区的大小。
- 设作业其中一段大小为u.size,空闲分区的大小为m.size。
- 若 m.size - u.size ≤ size,将整个分区分配给该段,否则,从该分区中按段的大小划分出一块内存空间分配出去,余下的部分仍留在空闲分区表/链中,同时修改作业的段表。
- 该作业所有的段都装入内存,则整个作业完成内存分配。
3-2-3分配算法(查找合适的空闲分区)
分配算法与可变分区一样:
- 首次适应算法
- 邻近适应算法
- 最佳适应算法
- 最坏适应算法
3-2-4内存回收
进程结束后,按照段表查找每段在内存的起始地址和大小,然后按段一个一个回收其占用的内存,同时修改空闲分区表,把进程所有段回收,则完成整个进程所占内存空间的回收。
- 回收分区上邻接一个空闲分区
- 回收分区下邻接一个空闲分区
- 回收分区上下都邻接空闲分区
- 回收分区不邻接任何空闲分区
3-3地址转换与内存保护
3-3-1地址转换与地址保护
- 地址变换与地址保护借助段表和段表寄存器来完成,段表驻留内存。为了完成地址变换和保护,系统中设置一个段表寄存器。每个进程对应一段表,信息放在PCB中,执行时将其装入段表寄存器。
- 地址变换过程:系统将逻辑地址中的段号S与段表长度TL进行比较。若S>TL,表示段号太大,是访问越界,产生越界中断信号。若未越界,则根据段表的起始地址和该段段号,计算出对应段表项位置(内存地址),从内存中读出该段在内存的始址。接着检查段内地址d,是否超过该段的段长SL。若超过,即d>SL,同样发出越界中断信号。若未越界,则将该段的基址与段内地址d相加,即可得到要访问指令或数据的内存物理地址。
3-3-2段的共享与保护
- 段的共享:共享是在段一级实现的,任何共享信息可以单独成为一段。可重入代码(Reentrant Code)又称为“纯代码”,是一种允许多个进程同时访问的代码。为使各个进程所执行的代码完全相同,绝对不允许可重入代码在执行中有任何改变。因此,可重入代码是一种不允许任何进程对它进行修改的代码。
- 段的保护:段的保护措施包括:
① 存取控制
② 段表本身可起保护作用
③ 环保护机构:环保护机构是一种功能较完善的保护机制。在该机制中规定:低编号的环具有高优先权。OS核心处于0环内;某些重要的实用程序和操作系统服务占居中间环;而一般的应用程序则被安排在外环上。
3-4分页与分段存储管理的主要区别
- 页是信息的物理单位;段是信息的逻辑单位
- 页的大小是由操作系统确定的;段的长度因段而异,由编程长度而定
- 分页的进程地址空间是一维的;分段的进程地址空间是二维的
- 分页系统很难实现过程和数据的分离;分段系统却可以很容易实现这些功能
- 分页是面向操作系统的,核心是为了提高内存利用率;分段是面向程序开发的,核心是为了方便程序员编程
4.段页式存储管理
4-1基本原理
段页式存储管理是分段和分页原理的结合,即先将用户程序分成若干个段(段式),并为每一个段赋一个段名,再把每个段分成若干个页(页式)。其地址结构由段号、段内页号、及页内位移三部分所组成。系统中设段表和页表,均存放于内存中。读一字节的指令或数据须访问内存三次。为提高执行速度可增设高速缓冲寄存器。每个进程一张段表,每个段一张页表。段表含段号、页表始址和页表长度。页表含页号和块号。
4-2内存管理要求
等分内存,内存分成与页大小相等的块,使用位示图管理内存。内存分配是以页为单位装入内存的块内。
4-3地址转换与保护
- 从PCB中取出段表始址和段表长度,装入段表寄存器。
- 将段号与段表长度进行比较,若段号大于或等于段表长度,产生越界中断。
- 利用段表始址与段号得到该段表项在段表中的位置。取出该段的页表始址和页表长度。
- 将页号与页表长度进行比较,若页号大于或等于页表长度,产生越界中断。
- 利用页表始址与页号得到该页表项在页表中的位置。
- 取出该页的物理块号,与页内地址拼接得到实际的物理地址。