1,、连续分配方式
为一个用户程序分配一个连续的内存空间
(1)单一连续分配
内存分为系统区和用户区两部分:
系统区:仅提供给OS使用,通常放在内存低址部分
用户区:除系统区以外的全部内存空间,提供给用户使用
优点:易于管理。
缺点:对要求内存空间少的程序,造成内存浪费;程序全部装入,很少使用的程序部分也占用内存。
(2)固定分区分配
把内存分为一些大小相等或不等的分区(partition),每个应用进程占用一个分区。操作系统占用其中一个分区。
支持多个程序并发执行,适用于多道程序系统和分时系统
划分为几个分区,便只允许几道作业并发
固定分配的不足:
内碎片(一个分区内的剩余空间)造成浪费
分区总数固定,限制并发执行的程序数目
(3)动态分区分配
分区的大小不固定:在装入程序时根据进程实际需要,动态分配内存空间,即——需要多少划分多少。
优点:并发进程数没有固定数的限制,不产生内碎片。
缺点:有外碎片(分区间无法利用的空间)
*分区分配算法:
①首次适应算法FF(first-fit)
空闲分区排序:以地址递增的次序链接。
检索:分配内存时,从链首开始顺序查找直至找到一个大小能满足要求的空闲分区;
分配:从该分区中划出一块作业要求大小的内存空间分配给请求者,余下的空闲分区大小改变仍留在空闲链中。
若从头到尾检索不到满足要求的分区则分配失败
优点:优先利用内存低址部分,保留了高地址部分的大空闲区;
缺点:但低址部分不断划分,会产生较多小碎片;而且每次查找从低址部分开始,会逐渐增加查找开销
②循环首次适应算法(next-fit)
空闲分区排序:按地址
检索:从上次找到的空闲分区的下一个空闲分区开始查找,直到找到一个能满足要求的空闲分区。为实现算法,需要:
设置一个起始查寻指针
采用循环查找方式
分配:分出需要的大小
优点:空闲分区分布均匀,减少查找开销
缺点:缺乏大的空闲分区
③最佳适应算法(best-fit)
总是把能满足要求、又是最小的空闲分区分配给作业,避免“大材小用”。
空闲分区排序:所有空闲分区按容量从小到大排序成空闲分区表或链。
检索:从表或链的头开始,找到的第一个满足的就分配
分配:分出需要的大小
缺点:每次找到最合适大小的分区割下的空闲区也总是最小,会产生许多难以利用的小空闲区(外碎片)
④最差适应算法/最坏匹配法(worst-fit):基本不留下小空闲分区,但会出现缺乏较大的空闲分区的情况。
⑤快速适应算法
根据进程常用空间大小进行划分,相同大小的串成一个链,需管理多个各种不同大小的分区的链表。进程需要时,从最接近大小需求的链中摘一个分区。类似的:伙伴算法
能快速找到合适分区,但链表信息会很多;实际上是空间换时间。
2、对换
把内存中暂时不能运行、或暂时不用的程序和数据调到外存上,以腾出足够的内存;把已具备运行条件的进程和进程所需要的程序和数据,调入内存。
按对换单位分类:
整体对换(或进程对换):以整个进程为单位(连续分配)
页面对换或分段对换:以页或段为单位(离散分配)
基本分页存储管理方式:
1、页面:内存划分成多个小单元,每个单元K大小,称(物理)块。作业也按K单位大小划分成片,称为页面。
①物理划分块的大小 = 逻辑划分的页的大小
②页面大小要适中:太大,(最后一页)内碎片增大,类似连续分配的问题;太小的话,页面碎片总空间虽然小,提高了利用率,但每个进程的页面数量较多,页表过长,反而又增加了空间使用
2、页表:为了找到被离散分配到内存中的作业,记录每个作业各页映射到哪个物理块,形成的页面映射表,简称页表
每个作业有自己的页表
页表的作用:
页号到物理块号的地址映射
要找到作业A
à关键是找到页表(PCB)
à根据页表找物理块
3、地址
连续方式下,每条指令用基地址+偏移量即可找到其物理存放的地址
分页方式:
地址映射(地址计算)
计算口诀:
页面大小决定偏移量(页内地址)的位数 n;
作业大小à页面数量
页表长度 a
页号的位数 m(或总位数-页内位数)
内存容量决定块数,块数决定编址位数,即页表项位数 b。
4、分页系统地址变换:
*访问内存的有效时间
进程发出逻辑地址的访问请求,经过地址变换,到内存中找到对应的实际物理地址单元并取出数据,所需花费的总时间,称为内存的有效访问时间EAT
EAT=2t
CPU操作一条指令需访问内存两次:
访问内存中的页表(以计算指令所在的实际物理地址)
访问指令内存地址
5、快表
基本分页机制下,一次指令需两次内存访问,处理机速度降低1/2,分页空间效率的提高以如此的速度为代价,得不偿失
改进:减少第1步访问内存的时间。增设一个具有“并行查询”能力的高速缓冲寄存器,称为“快表”,也称“联想寄存器”
快表放什么?:
正在执行进程的页表的数据项
EAT= a*t' + (1-a)(t'+t) +t= 2t +t' -t*a
6、两级页表
将页表分页,并离散地将页表的各个页面分别存放在不同的物理块中
为离散分配的页表再建立一张页表,称为“外层页表”,其每个表项记录了页表页面所在的物理块号
7、多级页表
64位操作系统下,两级仍然不足以解决页表过大问题时,可按同样道理继续分页下去形成多级页表
分段系统:
1、基本原理:
程序通过分段(segmentation)划分为多个模块,每个段定义一组逻辑信息
*段的特点:
每段有自己的名字(一般用段号做名),都从0编址,可分别编写和编译。装入内存时,每段赋予各段一个段号。
每段占据一块连续的内存。(即有离散的分段,又有连续的内存使用)
各段大小不等
*地址结构:段号 + 段内地址
2、段表与地址变换机构
3、分页和分段的主要区别
(1)需求:分页是出于系统管理的需要,是一种信息的物理划分单位,分段是出于用户应用的需要,是一种逻辑单位,通常包含一组意义相对完整的信息。
一条指令或一个操作数可能会跨越两个页的分界处,而不会跨越两个段的分界处。
(2)大小:页大小是系统固定的,而段大小则通常不固定。分段没有内碎片,但连续存放段产生外碎片,可以通过内存紧缩来消除。相对而言分页空间利用率高。
(3)逻辑地址:
分页是一维的,各个模块在链接时必须组织成同一个地址空间;
分段是二维的,各个模块在链接时可以每个段组织成一个地址空间。
(4)其他:通常段比页大,因而段表比页表短,可以缩短查找时间,提高访问速度。分段模式下,还可针对不同类型采取不同的保护;按段为单位来进行共享