一、内存管理的目的和功能
内存一直是计算机系统中宝贵而又紧俏的资源,内存能否被有效、合理地使用,将直接影响到操作系统的性能。此外,虽然物理内存的增长现在达到了N个GB,但比物理内存增长还快的是程序,所以无论物理内存如何增长,都赶不上程序增长的速度,所以操作系统如何有效的管理内存便显得尤为重要。
(1)内存管理的目的
内存管理的目的主要有两个:一是方便用户使用;二是提高存储器的利用率。
(2)内存管控的功能
内存管理主要有四个方面的功能:
1)内存空间的分配与回收:由操作系统完成主存储器空间的分配和管理,使程序员摆脱存储分配的麻烦,提高编程效率。
2)地址转换:在多道程序环境下,程序中的逻辑地址与内存中的物理地址不可能一致,因此存储管理必须提供地址变换功能,把逻辑地址转换成相应的物理地址
3)存储保护和存储共享:保证各道作业在各自的存储空间内运行,互不干扰;同时充分利用内存空间,共享内存中存放的信息。
4)内存空间的扩充:利用虚拟存储技术或自动覆盖技术,从逻辑上扩充内存。
二、内存管理中的基本概念
(1)逻辑地址、相对地址、虚地址
源程序经过编译处理后,源程序中的各种符号元素转换成机器指令和数据组成的目标程序,并用实际地址码替换符号地址。这种经编译后的目标代码所限定的地址域叫做该程序的地址空间。地址空间中的各个地址叫做相对地址,逻辑地址或虚地址。地址空间总是从0号单元开始编址,其他所以地址都是以0单元为起始地址顺序编码的。
(2)线性地址
线性地址是逻辑地址到物理地址变换之间的中间层。在段页式存储管理中,程序代码会产生逻辑地址,或者说是段中的偏移地址,加上相应段的基地址就生成了一个线性地址。如果启用了分页机制,那么线性地址可以再经变换以产生一个物理地址。若没有启用分页机制,那么线性地址直接就是物理地址。
(3)物理地址、绝对地址、实地址
物理地址空间是指内存中物理单元的集合,它是地址转换的最终地址,进程在运行时执行指令和访问数据最后都要通过物理地址从主存中存取。物理地址又叫绝对地址、实地址。
(4)地址重定位
当装入程序将可执行代码装入内存时,必须通过地址转换将逻辑地址转换成物理地址,这个过程称为地址重定位。即把程序相对地址空间的逻辑地址转换成存储空间的绝对地址的工作叫做地址重定位,又叫地址映射或地址变换。
地址重定位又分为两种:静态重定位和动态重定位。
1)静态重定位
在装入作业时,由装入程序把用户程序中的指令地址和数据地址全部转换成存储空间的绝对地址。这种地址转换工作是在程序执行前集中一次完成的,程序执行时就无需要再进行地址转换工作。
主要优点是无需增加硬件地址变换机构,主要缺点是要求给每个程序分配一片连续的存储空间。
2)动态重定位
动态重定位是靠硬件的地址转换机构来实现的,通常使用一个重定位寄存器。在存储管理为程序分配一个主存区域后,装入程序直接把程序和数据装入到分配的存储区中,然后把这个存储区的起始地址送入重定位寄存器中。在程序执行时,对于每一个存储器的访问,都要讲相对地址转化成主存的绝对地址。
主要优点是使用更加灵活有效,不用给程序分配一大片连续的空间,能够给用户提供一个比主存大的多的地址空间。
三、常见的内存管理技术
(1)简单存储管理
1)单一连续分配
单一连续分配是指主存中只有一个用户作业,把程序装入主存之后,占据全部存储空间和资源。
内存在此方式下分为系统区和用户区,系统区仅提供给操作系统使用,通常在低地址部分;用户区是为用户提供的、除系统区之外的内存空间。这种方式的优点是简单、无外部碎片,可以釆用覆盖技术,不需要额外的技术支持。缺点是只能用于单用户、单任务的操作系统中,有内部碎片,存储器的利用率极低。
2)分区分配
分区分配又分为:固定式分区和可变式分区。
-----------------------------
固定分区分配是将内存空间划分为若干个固定大小的区域,每个分区只装入一道作业。当有空闲分区时,便可以再从外存的后备作业队列中,选择适当大小的作业装入该分区,如此循环。
固定分区方式存在两个问题:一是程序可能太大而放不进任何一个分区中,这时用户不得不使用覆盖技术来使用内存空间;二是主存利用率低,当程序小于固定分区大小时,也占用了一个完整的内存分区空间,这样分区内部有空间浪费,这种现象称为内部碎片。
-----------------------------
可变式分区在进程装入内存时,根据进程的大小动态地建立分区,并使分区的大小正好适合进程的需要。
动态分区在开始分配时是很好的,但是之后会导致内存中出现许多小的内存块。随着时间的推移,内存中会产生越来越多的碎片,且随着进程的换入/换出,很可能会出现更多更小的内存块,内存的利用率随之下降。这些小的内存块称为外部碎片,指在所有分区外的存储空间会变成越来越多的碎片,这与固定分区中的内部碎片正好相对。
动态分区的分配策略,考虑以下几种算法:
》首次适应(First Fit)算法:空闲分区以地址递增的次序链接。分配内存时顺序查找,找到大小能满足要求的第一个空闲分区。
》最佳适应(Best Fit)算法:空闲分区按容量递增形成分区链,找到第一个能满足要求的空闲分区。
》最坏适应(Worst Fit)算法:又称最大适应(Largest Fit)算法,空闲分区以容量递减的次序链接。找到第一个能满足要求的空闲分区,也就是挑选出最大的分区。
-----------------------------》邻近适应(Next Fit)算法:又称循环首次适应算法,由首次适应算法演变而成。不同之处是分配内存时从上次查找结束的位置开始继续查找。
解决碎片的方法是采取紧凑技术,即对碎片进行拼接,但是需要消耗系统资源。
3)覆盖与交换
1.虚拟存储器
当一个作业程序的地址空间比主存可用空间大时,操作系统可将这个程序的地址空间的一部分放入主存内,其余部分放在辅存上。当访问的信息不在主存时,再由操作系统负责调入所需要的部分。这样计算机系统好像为用户提供了一个比实际主存大得多的存储空间,这样的技术叫做虚拟存储器。
实现的基础:一是需要有相当数量的外存,二是需要有一定容量的主存,三是地址变换机构。
2.覆盖
覆盖是指同一主存区可以被不同的程序段重复使用。作业在一次运行时,把那些不会同时执行的程序段共用一个主存区。相互覆盖的程序段叫做覆盖,可共享的主存区叫做覆盖区。覆盖技术的基础是提供正确的覆盖结构。
3.交换
交换就是系统根据需要把主存中暂时不允许的某个或某些作业部分或全部移到辅存,而把辅存中的某个或某些作业移到相应的主存区,并使其投入运行。
(2)页式存储管理
1)基本概念
页式存储管理将程序逻辑地址空间划分为固定大小的页(page),而物理内存划分为同样大小的页框(page frame)。为方便地址转换,页面大小应是2的整数幂。每一个作业有一个页表,用来记录各个页在内存中所对应的块(页框)。
2)地址结构
地址结构包含两部分:前一部分为页号P,后一部分为页内偏移量W。其中页号与页内偏移量所占多少位,与页面的大小和主存的最大容量有关。
每页大小为4KB,主存大学为4GB。则地址长度为32 位,其中0~11位为页内地址,即:12~31位为页号,地址空间最多允许有2^20页。
3)地址变换机制
上面介绍的地址变换过程可知,若页表全部放在内存中,则存取一个数据或一条指令至少要访问两次内存:一次是访问页表,确定所存取的数据或指令的物理地址,第二次才根据该地址存取数据或指令。显然,这种方法比通常执行指令的速度慢了一半。
为此,在地址变换机构中增设了一个具有并行查找能力的高速缓冲存储器——快表,又称联想寄存器(TLB),用来存放当前访问的若干页表项,以加速地址变换的过程。
(3)请求式分页存储管理
1)基本概念
请求分页系统建立在基本分页系统基础之上,为了支持虚拟存储器功能而增加了请求调页功能和页面置换功能。请求分页是目前最常用的一种实现虚拟存储器的方法。在请求分页系统中,只要求将当前需要的一部分页面装入内存,便可以启动作业运行。在作业执行过程中,当所要访问的页面不在内存时,再通过调页功能将其调入,同时还可以通过置换功能将暂时不用的页面换出到外存上,以便腾出内存空间。
2)扩充的页表
3)地址变换机制
4)页面置换算法
1.最佳算法(OPT算法)
用来评价其他算法,使用缺页中断率:
f = F / A(其中F为作业失败访问的次数,A为作业总的访问次数)
2.先进先出算法(FIFO算法)
淘汰在内存驻留时间最长的页面。
3.最近最久未使用淘汰算法(LRU算法)
淘汰最久没有被使用的页面。
4.最不经常使用淘汰算法(LFU算法)
淘汰一段时间内,访问次数最少的页面。
(LRU和LFU的区别:http://blog.csdn.net/guoweimelon/article/details/50855351)
(4)段式存储管理
1)基本概念
段式存储管理要求每个作业的地址空间按照程序自身的逻辑划分为若干段,每个段都有一个唯一的内部段号。
2)地址结构
逻辑地址由段号S与段内偏移量W两部分组成。
段号为16位,段内偏移量为16位,则一个作业最多可有2^16=65536个段,最大段长为64KB。
3)地址变换机制
(5)段页式存储管理
1)基本概念
在段页式存储中,每个分段又被分成若干个固定大小的页。
2)地址结构
逻辑地址由段号S、段内页号P与段内偏移量W两部分组成。
3)地址变换机制
参考资料:
http://c.biancheng.net/cpp/html/2611.html
http://blog.csdn.net/hguisu/article/details/5713164
http://www.cnblogs.com/CareySon/archive/2012/04/25/2470063.html
http://blog.csdn.net/yang_yulei/article/details/24142743
http://blog.csdn.net/leves1989/article/details/3305402
http://blog.csdn.net/yusiguyuan/article/details/9664887