1、提出存储层次体系的主要依据是:程序访问的局部性原理
2、计算机开机后,操作系统最终被加载到:RAM
3、存储管理的目的是:方便用户和提高主存利用率
1、将用户源程序变为可在内存中执行的程序的步骤:
编译:由编译程序将用户源代码编译成若干个目标模块
链接:由链接程序将编译后形成的一组目标模块,以及它们所需要的库函数链接在一起,形成一个完整的装入模块
装入:由装入程序将装入模块装入内存,构造PCB,形成进程(使用物理地址)
在多道程序环境下,要使程序运行,必须为之先建立进程。创建进程的第一件事是将程序和数据装入内存。
2、用户程序的主要处理阶段
3、逻辑地址、物理地址和地址映射
4、重定位
1、三种方式
①绝对装入方式
1、静态链接:在程序装入内存之前,将目标模块及所需的库函数链接成一个完整的装配模块,以后不再拆开。
①静态链接是在生成可执行文件时进行的。
②事先进行链接,以后不再拆开。
2、装入时动态链接:指将用户源程序编译后所得的一组目标模块,在装入内存时,采用边装入边链接的链接方式。
①优点:
(1) 便于模块的修改和更新;
(2) 便于实现对目标模块的共享。
3、运行时动态链接:指对某些目标模块的链接,是在程序执行中需要该目标模块时,才对它进行链接。边执行边链接
①优点:
加快装入过程、节省内存空间
连续分配方式,是指为一个用户程序分配一个连续的内存空间。
1、基本原理及技术
系统提前把内存分为一些大小相等或不等的分区(partition),每个进程占用一个分区。操作系统占用其中一个分区。
①特点
适用于多道程序系统和分时系统
支持多个程序并发执行
② 问题
可能存在内碎片。
内碎片:分区之内未被利用的空间
外碎片:分区之间难以利用的空闲分区(通常是小空闲分区)。
2、划分分区的方法
①分区大小相等:只适合于多个相同程序的并发执行(处理多个类型相同的对象)。缺乏灵活性。
②分区大小不等:多个小分区、适量的中等分区、少量的大分区。根据程序的大小,分配当前空闲的、适当大小的分区。
3、优缺点
可以和覆盖、交换技术配合使用
采用的数据结构:分区表–记录分区的大小和使用情况
1、动态分区分配
在装入程序时按其初始要求分配
在其执行过程中通过系统调用进行分配或改变分区大小。
2、优缺点
3、在实现过程中涉及三个问题
①分区分配中的数据结构
空闲分区表:记录每个空闲分区的情况。每个空闲分区占一个表目,表目中包括分区序号、分区始址及分区的大小等数据项。
空闲分区链:
②分区分配算法
基于顺序搜索的分区分配算法
实现算法,需要:设置起始查寻指针,并采用循环查找方式
优点:使内存空闲分区分布均匀,减少查找的开销
缺点:缺乏发的空间分区
空闲区按大小递增排列
缺点:产生许多难以利用的小空闲区(外碎片)
空闲区按大小递减排列
不会留下太多的小空闲分区,但较大的空闲分区不被保留。
总结
首次适应算法:
将地址最小的够用的空间分配出去
下次适应算法:
从上次分配位置开始搜索
将地址最小的够用的空间分配出去
最佳适应算法:
将够用的长度最小的空间分配出去
最差适应算法:
将够用的长度最大的空间分配出去
首次适应算法 | 最简单; 地址低端会有大量碎片 |
---|---|
下次适应算法 | 碎片均匀 ;没有大的空闲块 ;常需要紧缩 |
最佳适应算法 | 最经济;很多碎片,经常紧缩 |
最差适应算法 | 碎片很少,速度最快;没有大的空闲块 |
③分区分配操作
设请求的分区大小为u.size,
表中每个空闲分区的大小表示为m.size,
若m.size- u.sizesize(最小阈值),
将整个分区分配给请求者,
否则从分区中按请求的大小划出一块内存空间分配,
余下部分留在空闲链中,将分配区首址返回给调用者。
当进程运行完毕释放内存时,系统根据回收区首址,在空闲分区链(表)中找到相应插入点;
此时可能有四种情况:
4、基于索引搜索的分区分配算法
①Buddy(伙伴的定义)
满足以下三个条件的称为伙伴:
1)两个块大小相同;
2)两个块地址连续;
3)两个块必须是同一个大块中分离出来的;
优缺点:可以很快找到空闲块;避免了外碎片问题;申请/释放可能会导致连续切块/合并,影响系统效率。
1、动态重定位的引入
解决碎片:将内存中的所有作业进行移动,使它们全部邻接,这样可把原来分散的小分区拼接成大分区,这种方法称为**“拼接”或“紧凑”**。
缺点:用户程序在内存中的地址发生变化,必须重定位。
紧缩技术
内存紧缩(compaction):将各个占用分区向内存一端移动。使各个空闲分区聚集在另一端,然后将各个空闲分区合并成为一个空闲分区。
优点:消除外碎片。
缺点:对占用分区进行内存数据搬移占用CPU时间; 重定位需要硬件支持。
紧缩时机:每个分区释放后;内存分配找不到满足条件的空闲分区时。
2、动态重定位的实现
地址变换过程是在程序执行过程期间,随着对每条指令的访问自动进行的,称为动态重定位。
3、动态重定位分区分配算法
4、可重定位分区分配方式主要特点
可以充分利用存储区中的“零头/碎片”,提高主存的利用率。
但拼接/紧缩会使系统开销加大。
5、分区的存储保护
①界限寄存器方法
上下界寄存器方法:
基址、限长寄存器方法:
②存储保护键方法
给每个分区分配一个单独的保护键,它相当于一把锁。
进入系统的每个作业赋予一个保护键,它相当于一把钥匙。
当作业运行时,检查钥匙和锁是否匹配,如果不匹配,则系统发出保护性中断信号,停止作业运行。
5、内存扩充技术
内存紧缩技术(例如:可变分区)
覆盖技术 overlaying
交换技术 swapping
虚拟存储技术 virtual memory
①解决的问题 → 程序大小超过物理内存总和
②程序执行过程中,程序的不同部分在内存中相互替代
→按照其自身的逻辑结构,使那些不会同时执行的程序段共享同一块内存区域
→要求程序各模块之间有明确的调用结构
③程序员声明覆盖结构,操作系统完成自动覆盖
1、对换的引入
**对换:**把内存中暂时不能运行的进程或者暂时不用的程序和数据,调到外存上,以便腾出足够的内存空间,再把已具备运行条件的程序和数据,调入内存。
分类:
整体对换(或进程对换):以整个进程为单位
页面对换或分段对换:以页或段为单位
2、为实现进城对换,系统必须具备的功能
进程的换出
过程:系统首先选择处于阻塞状态且优先级最低的进程作为换出进程,然后启动盘块,将该进程的程序和数据传送到磁盘的对换区。
进程的换入
系统应定时查看所有进程的状态,从中找出“就绪”状态但已换出的进程,将换出最久的进程作为换入进程,将之换入。
对换与覆盖的区别
覆盖技术:把用户作业分成若干段,使主段成为作业执行过程中经常使用的信息,其他段不同时工作。作业执行时,把主段常驻主存区,其他段轮流装入覆盖区执行之。
对换技术:让多个用户作业轮流进入主存器(转入、转出)执行。
覆盖主要在同一个作业或同一个进程内进行。
对换主要是在进程或作业之间进行。覆盖只能覆盖那些与覆盖程序段无关的程序段。
将程序的逻辑地址空间划分为固定大小的页;
物理内存划分为固定大小的块(页架);
程序加载时,分配其所需的所有页,这些页不必连续。需要CPU的硬件支持。
1、所需表目
1)页表:每个进程一个
2)总页表:系统一个
2、所需寄存器
1)页表首址寄存器:系统一个
2)页表长度寄存器:系统一个
3)块表:系统一组
3、优点:
4、缺点:
程序全部装入内存
5、页面和物理块
分页存储管理是将一个进程的逻辑地址空间分成若干个大小相等的片称为页,并为各页加以编号,从0开始。
同时把内存空间分成与页面相同大小的若干个存储块,称为块。
在为进程分配内存时,以块为单位将进程的若干个页分别装入到多个可以不相邻的物理块中。
进程的最后一页经常装不满而形成**“页内碎片”**
假定地址长度32位:
每页的大小为4KB , 即:011位为位移量(页内地址)
则:12 31位为页号,地址空间最多允许有1M页
7、页号与页内偏移的计算
若给定一个逻辑地址空间中的地址为A,页面大小为L,则:
页号: P=INT[A/L]
页内地址: d=[A] MOD L
例如:系统页面大小为1KB,设A=2170B,则:
P=2,d=122
1、基本的地址变换机构:实现从逻辑地址到物理地址的转换,其任务是借助于页表,将逻辑地址中的页号转换为内存中的物理块号。
页表可以由一组专门的寄存器来实现,一个页表项用一个寄存器。但寄存器成本高,系统页表可能很大,所以页表大多常驻内存。
在系统中只设置一个页表寄存器PTR,在其中存放页表在内存中的始址和页表的长度。
2、页表的作用
3、分页系统的地址变换机构
总结
1)地址转换步骤:
当逻辑地址为十进制时:
①求出逻辑地址的页号 = 逻辑地址 / 页面大小
②求出页内偏移量 = 逻辑地址 % 页面大小
③用页号查页表,得到块号;
④求出物理地址 = 块号 * 页面大小 + 页内偏移
当逻辑地址为十六进制/八进制/二进制时:
①把逻辑地址转为二进制;
②按页的大小分离出页号和页内偏移量( 高位部分为页号,低位部分为页内偏移量 );
③以页号查页表,得到物理地址的块号;
④将逻辑地址的页内偏移量直接复制到物理地址的块内偏移量上;
⑤把块号转为二进制,从而得出物理地址,再转回16/8进制。
4、具有快表的地址变换机构
CPU在每存取一个数据时,需要两次访问内存:
第一次:访问页表,找到指定页的物理块号,将块号与页内偏移量拼接形成物理地址。
第二次:从第一次所得地址中获得所需数据,或向此地址中写入数据。
处理速度降低
解决办法:在地址变换机构中,增设一个具有并行查寻能力的特殊高速缓冲寄存器,称为**“联想存储器”或“快表”。**
有效访问内存的时间
T=PTLB*(TTLB+TM)+ (1-PTLB )*( TTLB + 2TM )
其中,PTLB为快表的命中率,TTLB为快表的访问时间, TM为内存的访问时间
T=a*(λ+t)+ (1-a)*( λ+2t )
=aλ+at+(1-a)(λ+t)+(1-a)t
=aλ+(1-a)(λ+t)+t
其中,a为快表的命中率, λ为快表的访问时间, t为内存的访问时间
2、多级页表
64位机器(采用多级页表,将外层页表再进行分页)
3、反置页表
与传统页表相比,反置页表的优势:
4、页的共享
实现方法:被各进程共享的一段代码,由各进程相应的页表项指向相同物理块。
5、页的保护
页式存储管理系统提供了两种方式:
地址越界保护
在页表中设置保护位(定义操作权限:只读,读写,执行等)
引入分段存储管理方式,主要是为了满足用户的一系列要求:
方便编程:按逻辑关系分为若干个段,每个段从0编址,并有名字和长度,访问的逻辑地址由段名和段内偏移量决定。
信息共享:共享是以信息为逻辑单位,页是存储信息的物理单位,段却是信息的逻辑单位。
信息保护:保护也是对信息的逻辑单位进行保护的。
动态链接:动态链接以段为单位。
动态增长:实际应用中,某些段(数据段)会不断增长,前面的存储管理方法均难以实现。
空间划分:将用户作业的逻辑地址空间划分成若干个大小不等的段(由用户根据逻辑信息的相对完整来划分)。各段有段名(常用段号代替),首地址为0。
内存分配:在为作业分配内存时,以段为单位,分配一段连续的物理地址空间;段间不必连续。
1、
1)
页式管理把逻辑地址视为一维线性空间;
段式管理把逻辑地址视为二维空间。
2)
将一个用户程序的所有逻辑段从0开始编号,称为段号;
每一段内的所有单元从0开始编址,称为段内地址;
逻辑地址由段号和段内地址两部分组成。
3)
段式管理将程序的地址空间划分为若干个段(segment),程序加载时,分配其所需的所有段(内存分区),这些段不必连续;物理内存的管理采用动态分区。需要CPU的硬件支持。
4)
程序通过分段(segmentation)划分为多个模块,如代码段、数据段、共享段。
可以分别编写和编译
可以针对不同类型的段采取不同的保护
可以按段为单位来进行共享,包括通过动态链接进行代码共享
优点:
没有内碎片,外碎片可以通过内存紧缩来消除。
便于改变进程占用空间的大小。
缺点:
进程全部装入内存。
5)段表