存储管理
操作系统需完成
-
存储空间的分配
-
存储地址的变换
-
存储空间的保护
-
存储空间的扩充
概述
内存的分配与回收
内存分配是为进入系统准备运行的程序分配内存空间,内存回收是当程序运行结束后回收其所占用的内存空间
存储分配方案
-
描述存储分配到的数据结构:采用某种数据结构登记当前内存使用情况及空闲区分配情况
-
实施分配的措施:确定内存分配和回收的算法
地址变换
地址变换/地址映射:把程序中的逻辑地址转换为程序所在的实际内存地址(由内存管理模块与硬件的地址变换机构共同完成)
符号地址
高级语言程序使用的地址空间是符号名空间【符号名:变量名、函数名、语句标号等】
逻辑地址(相对地址)
编译程序将源代码中的语句逐条翻译为机器指令,为每个变量分配存储单元,并用存储单元的地址替换变量名
物理地址(绝对地址)
物理内存由一系列的内存单元组成,这些存储单元从0开始按字节编址,称为内存地址。当目标程序加载到内存中时,它所占据的实际内存空间就是它的物理存储空间,物理空间中的地址称为物理地址,或称为绝对地址
每次程序加载时所获得的实际地址空间取决于系统当时的运行状态,因而是不确定的
逻辑地址空间和物理地址空间是不同的,由于编译程序无法预知程序执行时的实际内存地址,所以目标程序中的地址都是从0开始的逻辑地址,而实际地址只有在程序加载时才能得知且物理地址空间不会是从0开始的,因为系统内存的低端地址通常被操作系统占用。
地址变换
用户编程时只能使用逻辑地址,而CPU执行指令时必须指定物理地址,因此必须在指令执行前进行地址变换
静态地址变换
程序在装入内存前一次性完成地址转换
采用静态地址变换的程序在内存中始终处于最初加载的位置,不可移动
动态地址变换
程序在装入内存时不进行地址变换,而是保持指令中的逻辑地址不变。
在程序执行过程中,每执行一条指令时,如果指令中用到了逻辑地址,地址变换机构就会自动进行地址转换,将逻辑地址变换为实际地址
内存的保护
内存保护的含义是要确保每个进程都在自己的地址空间中运行,互不干扰,尤其是不允许用户进程访问操作系统的存储区域(多进程共享程序可按不同进程的权限进行相关操作)
存储保护的目的是为了防止因为各种原因导致的程序越界和越权行为
保护措施:
-
界限保护
-
保护键
-
保护模式
内存的扩充
扩充思想:借用外存空间来扩展内存空间
扩充方法:让程序的部分代码进入内存,其余驻留在外存,在需要时再调入内存
实现:
-
覆盖技术
-
将一个程序划分为几个模块。程序的必要模块(主控或常用功能)常驻内存,其余模块共享一个或几个存储空间。它们平时驻留在外存中,在需要时才装入内存,覆盖掉某个暂时不用的模块
-
缺点:必须在编程时对程序进行模块划分,并确定程序模块之间的覆盖关系
-
-
交换技术
-
将暂时不能执行的程序换到外存中,就可以获得空闲内存空间来运行别的程序。
-
交换是以进程为单位进行的
-
优点:增加了可并发运行的程序数目,且对用户的程序结构没有要求
-
缺点:对整个进程进行的换入、换出操作往往需要花费大量的CPU时间
-
-
虚拟存储器
-
只将程序的部分代码调入内存,其余驻留在外存空间中,在需要时调入内存
-
优点:方便用户编程,存储扩充的性能也是最好的(用户完全察觉不出代码的换入和换出)
-
存储管理方案
单一连续存储管理
-
只能用于单用户、单任务的操作系统中
-
将内存分成两个分区,称为系统区和用户区
-
地址变换方式是静态地址变换
-
存储保护措施采用界限保护
-
存储扩充的手段只能采用覆盖技术
-
简单,只适用于单道程序系统
分区存储管理
将内存划分为若干个分区,操作系统占用其中一个分区,其他分区由用户程序使用,每个分区容纳一个用户程序
简单分区管理
-
分区分配策略
-
固定分区:系统把内存静态地划分为若干个固定大小的分区,分区大小是预先划分好的,通常会大于程序的实际尺寸,因此余下的空闲空间就被浪费掉了
-
可变分区:在程序调入内存时,按其实际大小动态地划分分区,避免了分区内空间的浪费
-
方法:系统设置两个表格来记录内存空间的使用情况
-
一个是已分配分区表,说明各个已用分区的分区号、起始地址和大小等。
-
另一个是空闲区表,说明内存中空闲区的分布位置和大小
-
-
-
-
分区分配的碎片问题
- 磁盘整理/内存整理
可重定位分区管理
-
存储紧缩技术
- 采用动态地址变换,使程序在内存中可以移动
-
动态地址变换过程
- 简单分区采用静态地址变换方式,程序装入内存后就不能再移动了
分区的保护和扩充
进程只能在自己的分区内活动。存储保护的方式是上下界地址保护,即进程运行时,它的空间上下界地址被加载到CPU的界限(或基址/长度)寄存器中
分区管理的特点:简单,支持多道程序,但有碎片化问题(可重定位分区管理解决)
页式存储管理(核心)
分散存储使得内存中每一个空闲的区域都可以被程序利用,这就是页式存储分配的基本思想
分页
-
分页的概念是:将程序的逻辑地址空间分成若干大小相等的片段,称为页面;同时,把内存空间也按同样大小分为若干区域,称为块,或页帧
-
经过分页后,程序的逻辑地址可看成由两部分组成,即页号+页内位移
页式分配思想
-
页式分配的思想是以页为单位为程序分配内存,每个内存块装一页。
-
一个进程的映像的各个页面可分散存放在不相邻的内存块中,用页表记录页号与内存块号之间的映射关系
-
页表是进程的一个重要资源,它记录了进程的页面与块号的对应关系
页面的分配与释放
-
位示图:
- 用一系列的二进制位来描述各个内存块的状态,每个位对应一个内存块,0表示空闲,1表示占用
-
空闲链:
- 用拉链的方式来组织空闲的内存块的。系统根据内存块表进行存储分配和释放,每次分配和释放操作后都要相应地修改此表
当进程建立时,若没有足够的空闲块,则拒绝进程装入。
页式地址的转换
页式系统采用动态地址变换方式,通过页表进行地址变换。每个进程有一个页表。在CPU中设有一个页表寄存器,用来存放正在执行的进程的页表长度和内存地址。
地址转换的过程是(分页地址转为实际的内存地址):
1. 将逻辑地址按位分成页号和页内位移两部分
2. 再以页号为索引去检索页表,得到该页号对应的物理块号
3. 将页内位移作为块内位移与块号拼接即得到实际的内存地址
页表存储在内存中。CPU为了访问一个内存单元需要两次访问内存,第一次是查页表,第二次完成对内存单元的读/写操作。
存在高速缓存中的页表称为快表,快表的访问速度比内存页表的访问速度要高得多(快表技术缩短了查询页表的时间)
页式存储的保护与扩充
-
页式存储的保护是通过控制访问地址的页号来实现的,若越界,则中断信号
-
限制对共享页面的访问操作的方法是:
- 在页表中增加一个读/写权限字段,只有当此权限与该页的设置相匹配时方可访问,否则产生读/写保护中断
-
页式存储管理的存储扩充功能是通过页式虚拟存储器来实现的(时间换空间)
页式存储优点:
1. 通过分散存储的方式,解决了内存碎片问题,有效地利用了内存,
2. 使存储空间的利用率大大地提高
页式存储仍然具有“页内碎片”的问题,即最后一页不一定正好放满,空余的部分成为了碎片
页式管理需要硬件具备页式地址变换机构
段式存储管理
段式存储分配就是为了适应用户对程序结构的需求而设计的存储管理方案【例如程序代码占据两个页号对应的地址,此时功能由于被页号大小限制而被迫成为两块,用段式存储管理可以让其功能成为一块,关系到程序设计的逻辑】
分段与分页的区别在于:
-
段是信息的逻辑单位,长度不固定,由用户进行划分;
-
页是信息的物理单位,长度固定,由系统进行划分,用户不可见。
-
页式的地址空间是一维的【指用户完全无法感知地址被分为页号和页内位移两部分,对用户完全透明】,段式的地址空间是二维的
段式分配思想
段式分配策略是以段为单位分配内存,每个段分配一个连续的分区
段表中包括段长和段起始地址等信息
段的分配和释放
段式分配对内存空间的管理类似于可重定位分区的管理方法。
当进程建立时,系统为进程的各段分配一个连续的存储区,并为它建立段表。进程结束后,系统回收段所占用的分区,并撤销段表。进程在运行过程中也可以动态地请求分配或释放某个段
段式地址变换
与页式地址变换基本一致
段式存储的共享、保护与扩充
段的共享就是内存中只保留该段的一个副本,供多个进程使用。当进程需要共享内存中的某段程序或数据时,只要在进程的段表中填入共享段的信息,并置以适当的读/写控制权,就可以访问该段了。若越界,则中断信号。
式管理的特点是便于程序模块化处理,可以充分实现分段共享和保护,但由于段需要连续存储,可能出现碎片问题。另外,段式管理需要硬件具备段式地址变换机构
段页式存储管理
段页式存储管理是页式和段式两种存储管理方案相结合的产物。
它的分配思想是段式划分,页式存储。
即把程序的各段按页式分配方式存储在内存的块中,每段一个页表。另设一个段表,指示各段的页表位置。这样就实现了程序的不连续存放。采用段页式方式时,程序的逻辑地址可以看做是由3部分组成的,即段号+页号+页内地址。
地址变换过程是:先根据段号查段表,获得该段的页表,再用页号查页表,得到实际内存块号,最后与页内地址合并即可得到实际内存地址。
特点:
-
存储利用率高
-
软硬件开销大
虚拟存储管理
虚拟存储器原理:用外存模拟内存,实现内存空间的扩充(以时间换空间,虚存容量最终要受地址寄存器位数的限制)
做法是:在外存开辟一个存储空间,称为交换区。进程启动时,只有部分程序代码进入内存,其余驻留在外存交换区中,在需要时调入内存。