# 1. 存储问题描述

小程序没有数据库,但我们需要实现离线存储。LocalStorage存放大的连续数据时,读写极慢。于是我们选择了离散存储方式,解决性能问题。

# 1.1 基本存储分配方式

存储器的分配方式包括连续存储和离散存储。

连续存储包括单一连续、固定分配、动态分配、可重定位分配-紧凑功能。

离散存储包括页式、段式、段页式

# 1.2 连续存储

连续存储管理是把内存中用户区作为一个连续区域或者若干个连续区域进行管理

# 1.2.1 单一连续存储

操作系统占用一部分内存空间,剩下作为一个连续区分配给一个作业使用。

缺点

  • CPU利用率比较低
  • 内存得不到充分利用
  • 外围设备利用率不高

# 1.2.2 固定分配存储

把用户区分为若干个连续区域,每一个区域称为一个分区,分区的大小和个数都固定不变,每个分区只能装入一个作业,不允许一个作业跨分区存储。

地址转换和存储保护

  • 地址转换:逻辑地址+分区的下限地址=物理地址
  • 存储保护:判断 - 下限地址≤物理地址≤上限地址

空间利用率

  • 内存碎片产生原因:为作业分配一个不小于作业地址空间的分区,产生了一部分空闲区域

改进:

  • 根据经常出现的作业的大小和频率划分分区
  • 按分区大小排列
  • 按作业对内存空间需求量排成多个作业队列,每个作业队列只能装入对应的分区中,不同分区可以同时装入作业,作业不能装入其他作业队列对应的分区只能装入自己对应的分区

# 1.2.3 动态分配存储

在作业装入内存时,根据作业需要的地址空间的大小和当时的内存使用情况决定是否为该作业分配一个分区,分区的大小和个数随着装入内存作业的装入与撤离而发生变化

  • “最先适应”分配算法
    • 顺序查找空闲分区表
    • 缺点:经过若干次作业的装入和撤离后,可能会产生碎片(把较大的内存空间分配成若干个小的不连续的空闲分区,不能满足再次分配的需要),降低空间利用率
  • “最优适应”分配算法
    • 选择一个满足作业地址空间要求的最小空闲分区
    • 空闲分区按其长度以递增顺序登记在空闲分区表中
    • 缺点:每次分配后分割的剩余空间总是最小的,形成的碎片非常零散,难以再次分配,从而影响内存空间的利用率
  • “最坏适应”算法(与最优适应算法相反)
    • 每次总选择满足作业要求的最大空闲分区进行分割
    • 对中小型作业是有利的
    • 空闲分区按其长度以递减顺序登记在空间分区表中

# 1.2.4 可重定位分配-紧凑功能

程序中必要部分的代码和数据常驻内存,不常用的在其他程序模块中,平时存放在外存(覆盖文件),需要用到的时候才装入内存,不存在调用关系的模块不必同时装入到内存,可以相互覆盖,即不同时用的模块可共用一个分区

# 覆盖
  • 覆盖:可以相互覆盖的程序段

  • 覆盖区:可共享的内存区

  • 优点:打破了一个作业全部信息装入内存后才能运行的限制,解决了小内存大作业的矛盾

  • 缺点:必须划分程序模块和确定程序模块之间的覆盖关系,增加编程的复杂度

  • 从外存装入覆盖文件,是以时间延长来换取空间节省

# 交换

交换技术:把内存中暂时不能运行的进程或暂时不适用的程序和数据换出到外存,把已具备运行条件的进程或进程所需要的程序和数据换入内存

# 覆盖和交换的区别
  • 交换技术是在进程或作业之间进行
  • 覆盖技术是在同一个作业或进程内进行

参考来源

# 1.3 离散存储

在连续分配方式中,内存分配之后会产生大量的“碎片”,虽然在可重定位分区分配方式中引入了“紧凑”的思想,但是会花费很多开销。 如果可以将一个进程离散的装入到许多不同的分区中,就没有那些麻烦了,于是离散分配方式的思想就产生了。

# 1.3.1 分页存储管理

离散分配方式的基本单位是页,就称为分页存储管理方式。

分页存储方式引出了三个概念,一个叫页面(在页表中对应页号),一个叫物理块(在页表中对应块号),一个叫页表。

  • 页面:指的是将程序按逻辑地址空间分成若干个页,每个页的大小是相同的,给他们编号得到页号。
  • 物理块:指的是将程序的实际物理地址空间分成若干个块,给他们编号得到块号。
  • 页表:系统为每一个进程建立了一张页面和物理块的映射表。

通过将逻辑地址和物理地址分开划分,然后设置映射建立联系的方式,我们可以实现程序在内存上的离散存储。

劣势在于,页面固定的情况下,总会出现程序填不满完整的一个页面的情况,那样也会出现“碎片”现象,我们称之为“页内碎片”,同时,增加映射关系也会增加我们的访问成本。

drawing

# 1.3.2 分段存储管理方式

为什么要引入分段存储管理方式,毕竟分页管理已经可以做到将数据离散存放。引入分段存储管理的原因,一方面是将程序分成若干个程序段后,可以使程序更直观;另一方面,分段实现和满足了信息共享,信息保护,信息动态增长等需要。简单来说就是方便编程。

段存储管理方式中,作业的地址空间被划分为若干个段,每个段定义了一组逻辑信息。系统为每一个分段分配一个连续的分区。同时引入段表的概念,段表表示了逻辑段和物理地址的映射。

# 1.3.3 段页式存储管理方式

段页式存储管理其实就是把分段和分页原理结合,即先将用户程序分成若干个段,然后再将每个段分为若干个页,并为每一个段赋予一个段名。