- 主存:保存进程运行时的程序和数据
- 寄存器:速度最快,价格昂贵容量不大,一般以字为单位,只要存放指令一次操作的数据就够了 。
- 高速缓存:总之:速度快、存放部分内存数据、硬件自动处理
- 磁盘缓存:内存的一部分,将频繁使用的一部分磁盘数据信息预读入在磁盘缓存,减少磁盘读写时间
动态分区分配:
- 首次适应算法FF
- 优点:优先利用内存低址部分,保留了高地址部分的大空闲区;
- 缺点:但低址部分不断划分,会产生较多小碎片;而且每次查找从低址部分开始,会逐渐增加查找开销 - 循环首次适应算法
- 优点:空闲分区分布均匀,减少查找开销
- 缺点:缺乏大的空闲分区 - 最佳适应算法
- 缺点:每次找到最合适大小的分区割下的空闲区也总是最小,会产生许多难以利用的小空闲区(外碎片) - 最差适应算法
- 快速适应算法
动态重定位分区分配:
用户程序在内存中移动,将空闲空间紧凑起来提高空间利用率。但必然需要地址变化,增加“重定位”工作。
离散分配内存:
作业规定大小划分成小份;内存也按同样大小划分成小份
作业的任一小份可分散放入内存任意未使用的小份
分页方式下,内存的使用率高,浪费少。但不是绝对没有碎片(进程的最后一页不总是能占满一个物理块)
分页、分段
内存划分成多个小单元,每个单元K大小,称(物理)块。
作业也按K单位大小划分成片,称为页面。
【 物理划分块的大小 = 逻辑划分的页的大小 】
页面大小要适中:
- ⊙太大,(最后一页)内碎片增大,类似连续分配的问题。
- ⊙太小的话,页面碎片总空间虽然小,提高了利用率,但每个进程的页面数量较多,页表过长,反而又增加了空间使用
例:
例题:
某系统采用页式存储管理方式,物理内存空间1M,页面大小2K,若逻辑空间32页,计算:
1)逻辑地址格式
页号 | 页内地址 |
---|---|
15 - 11 | 10 - 0 |
2)不考虑权限等问题,进程的页表有多少项(即页表记录条数)?每项多少位?
- 32页所以有32项 1M/2K=9位
3)物理空间减一半,页表有什么变化?
- 项数还是32,但物理块数变了,块号编号位数减1
· 地址变换机构
具体实现地址映射 —— 地址变换机构。
围绕页表进行工作,那么页表数据放在哪?
- 寄存器。一个进程有n个页,页表就需要记录n项数据,需要n个寄存器。不现实。
- 内存。只设置一个页表寄存器PTR(page table register)记录页表在内存中的首地址和页表长度,运行时快速定位页表。
地址变换的过程
分页系统中,进程创建,放入内存,构建页表,在PCB中记录页表存放在内存的首地址及页表长度。
- 运行某进程A时,将A进程PCB中的页表信息写入PTR中;
- 每执行一条指令时,根据分页计算原理,得到指令页号X和内部偏移量Y;
- CPU高速访问PTR找到页表在哪里;
- 为防止错误检索,增加预先的判断:
- 计算得到的页号是否大于页表长度(即页表项数)
- 一个5页的进程,页面编号0-4,若地址计算出的页号不在该范围,一定产生了越界错误。 - 查页表数据,得到X实际对应存放的物理块,完成地址映射计算,最终在内存找到该指令。
访问内存的有效时间
进程发出逻辑地址的访问请求,经过地址变换,到内存中找到对应的实际物理地址单元并取出数据,所需花费的总时间,称为内存的有效访问时间EAT(effective access time)
- 设访问一次内存时间为t,则基本分页机制下EAT=2t,why?
- CPU操作一条指令需访问内存两次:
- 访问内存中的页表(以计算指令所在的实际物理地址)
- 访问指令内存地址
- CPU操作一条指令需访问内存两次:
针对访问速度问题 —— 引入块表
块表里存放着:正在执行进程的页表的数据项
快表的寄存器单元数量是有限的,不能装下一个进程的所有页表项。虽不能完全避免两次访问内存,但如果命中率a高还是能大幅度提高速度
- 设一次查找访问快表时间为 t’ , 那:
- EAT= at’ + (1-a)(t’+t) + t = 2t + t’ - ta
针对大页表占用内存问题 —— 两级、多级页表、反置页表
① 两级页表:
- 将页表分页,并离散地将页表的各个页面分别存放在不同的物理块中
- 为离散分配的页表再建立一张页表,称为“外层页表”,其每个表项记录了页表页面所在的物理块号
格式:
外页号 | 页在外页内的偏移 | 页内地址(偏移量) |
---|
分段存储管理
从提高内存利用率角度;
- 固定分区 → 动态分区 → 分页
从满足并方便用户(程序员)和使用上的要求角度:
- 分段存储管理:作业分成若干段,各段可离散放入内存,段内仍连续存放
段的特点
- 每段有自己的名字(一般用段号做名),都从0编址,可分别编写和编译。装入内存时,每段赋予各段一个段号。
- 每段占据一块连续的内存。(即有离散的分段,又有连续的内存使用)
- 各段大小不等
段的地址结构: 段号 + 段内地址
段表: 记录每段实际存放的物理地址
》段表与地址变换机构
段是连续存放在内存中。段表中针对每个“段编号”记录:“内存首地址”和“段长”
同样有两次内存访问问题
解决方法:设置联想寄存器,用于保存最近常用的段表项
★★★ 分页与分段的主要区别 ★★★
- 需求: 分页是出于系统管理的需要,是一种信息的物理划分单位,分段是出于用户应用的需要,是一种逻辑单位,通常包含一组意义相对完整的信息。
- 一条指令或一个操作数可能会跨越两个页的分界处,而不会跨越两个段的分界处。 - 大小: 页大小是系统固定的,而段大小则通常不固定。分段没有内碎片,但连续存放段产生外碎片,可以通过内存紧缩来消除。相对而言分页空间利用率高。
- 逻辑地址:
- 分页是一维的,各个模块在链接时必须组织成同一个地址空间;
- 分段是二维的,各个模块在链接时可以每个段组织成一个地址空间。 - 其他: 通常段比页大,因而段表比页表短,可以缩短查找时间,提高访问速度。分段模式下,还可针对不同类型采取不同的保护;按段为单位来进行共享
分段系统的突出优点: 易于实现共享、易于实现保护
分页容易造成共享和非共享数据共处一页,不方便设置权限
可重入代码:(又称为纯代码,允许多个进程同时访问的代码、不允许任何进程对它进行修改)
可共享的代码必须是可重入的
段页式存储管理
① 基本原理
- 将用户程序分成若干段,并为每个段赋予一个段名。
- 把每个段分成若干页
- 地址结构包括段号、段内页号和页内地址三部分
段号(S) | 段内页号(P) | 页内地址(W) |
---|
② 地址变换过程
- 三次访问内存
- 可借助高速缓冲弥补不足