操作系统核心之 内存管理

一、内存管理方式

存储(内存)管理:主要是指对内存(注:外存管理主要指设备管理)的管理,负责内存分配和回收,内存的保护和扩充。
存储管理的目的:是尽量提高内存的使用效率。

内存的分配方式有两种
1、连续的分配方式
2、离散的分配方式

二、连续分配方式

连续分配方式:指为一个用户程序分配一个连续的内存空间。
1、单一连续分配(单一连续分配是早期操作系统)
2、固定分区分配(是能满足多道程序设计的最简单的存储管理技术,允许几个作业共享主存空间,这几个作业被装入不同的分区中,每个分区可用来装入一个作业。)
3、动态分区分配
4、可重定位分区分配

3、动态分区分配

为把一个新作业装入内存,需按照一定的分配算法,从空闲分区表或空闲分区链中选出一分区分配给该作业。
常用的分配算法:
(1)首次适应算法(首次适应算法从空闲分区表的第一个表目起查找该表,把最先能够满足要求的空闲区分配给作业,这种方法目的在于减少查找时间。)
(2)循环首次适应算法(循环首次适应算法是首次适应算法的变种。循环首次适应算法(Next Fit):在分配内存空间时,不再每次从表头(链首)开始查找,而是从上次找到空闲区的下一个空闲开始查找,直到找到第一个能满足要求的空闲区为止,并从中划出一块与请求大小相等的内存空间分配给作业。该算法能使内存中的空闲区分布得较均匀。)
(3)最佳适应算法(最佳适应算法是从小到大排列,最佳适应算法是指从全部空闲区中找出能满足作业要求且大小最小的空闲分区的一种计算方法,这种方法能使碎片尽量小。)
(4)最坏适应算法(最坏适应分配算法要扫描整个空闲分区或链表,总是挑选一个最大的空闲分区分割给作业使用。)

4、可重定位分区分配

如果在系统中只有若干个小分区,即使它们的容量总和大于要装入的程序,但由于这些分区不相邻,也无法将程序装入内存。

解决方法:将内存中的所有作业进行移动,使它们全部邻接,这样把原来分散的小分区拼接成大分区,这种方法称为"拼接"或"紧凑”(紧凑操作是动态重定位)。

动态重定位的实现:在动态运行时装入的方式,将相对地址转换为物理地址的工作在程序指令真正要执行时才进行。地址转换需要重定位寄存器的支持。程序执行时访问的内存地址是相对地址重定位寄存器中的地址相加而成。

三、对换与覆盖技术

1、覆盖技术:一个作业的若干程序段或数据段的某些部分共享内存空间

2、对换技术:把内存中暂时不能运行的进程或者暂时不用的程序和数据,调到外存上,以便腾出足够的内存空间,再把已具备运行条件的进程和进程所需要的程序和数据调入内存。

注:不是同时的,兑换是调换内存和外存

对换的分类:
1、整体对换(或进程对换) :以整个进程为单位
2、页面对换或分段对换:以页或段为单位

连续分配方式会形成"碎片" (这里面碎片分为外碎片和内碎片,外碎片指没有利用的),虽然可以通过"紧凑”解决但开销大。如果允许将一个进程直接分散地装入许多不相邻的分区中,则无需"紧凑" ,由此产生离散分配方式。
分类:
1、分页存储管理方式:离散分配的基本单位是页
2、分段存储管理方式:离散分配的基本单位是段

四、基本分页存储管理方式

1、页面与页表
2、地址变换机构

1、页面

分页式存储管理的原理:将一个进程的逻辑地址空间分成若干个大小相等的片称为页面或页,并为各页加以编号,从0开始。同时把内存空间分成与页面相同大小的若千个存储块,称为块或页框。在为进程分配内存时,以块为单位将进程的若干个页分别装入到多个可以不相邻的物理块中。进程的最后一 页经常装不满块而形成"页内碎片" 。

2、地址变换

若给定一个逻辑地址空间中的地址为A页面大小为L,则页号P = INT[A/L]   页内地址d = [A] MOD L

例1:系统页面大小为1KB,设A=2170D,则P=,d= 122  

题解:2170D是十进制,2170/1KB(1024)=2...余122,P是整除,d是余数。

数值的表示:二进制,十进制,八进制,十六进制,分别在其后加上B,D,Q,H(Binary,Decimal,Q(Octal),Hexadecimal)

3、基本分页式存储管理的实现

进程的每一页离散地存储在内存的任一存储块中,为方便查找系统为每一进程建立一张页面映像表,简称页表。
页表实现了从页号物理块号的地址映射。

为了能将用户地址空间的逻辑地址变换为内存空间的物理地址,在系统中必须设置地址变换机构。地址变换机构实现从逻辑地址到物理地址的转换,由于页内地址与物理地址是一一对应的,因此,地址变换机构的任务是借助于页表,将逻辑地址中的页号转换为内存中的物理块号。

4、具有快表的地址变换机构

由于页表是存放在内存中的,CPU在每存取一个数据时,需要两次访问内存:
第一次:访问页表,找到指定页的物理块号,将块号与页内偏移量拼接形成物理地址。
第二次:从第一次所得地址中获得所需数据,或向此地址中写入数据。
存储器利用率提高,处理器处理速度降低。
解决方法:在地址变换机构中,增设一个具有并行查寻能力的特殊高速缓冲寄存器,称为“联想存储器”或"快表”。

例2:设页面大小为2KB,将逻辑地址3BADH划分为页号和页内偏移量两部分。用16进制表示。

题解:H16进制,3BADH转二进制是0011 1011 1010 1101,1KB就是1024,1024就是2^10,2KB=2^11,用11位表示页内地址,前面5个就是页号,页面大小2KB,页号P = INT[A/L]   页内地址d = [A] MOD L,页面地址011 1010 1101 = 3AD,页号0011 1 = 7,所以P=07H,W=3ADH。

五、基本分段式存储管理的实现

1、段表

为使程序正常运行,须在系统中为每个进程建立一-张段映射表简称"段表”。每个段在表中占有一一个表项。
段表结构:段号;段在内存中的起始地址(基址) ;段长
段表可以存放在寄存器中,但更多的是存放在内存中。
段表用于实现从逻辑段到物理内存区的映射。

2、地址变换机构

在系统中设置段表寄存器,用于存放段表始址和段表长度,以实现从进程的逻辑地址到物理地址的变换。
当段表存放在内存中时,每访问一个数据,都需访问两次内存降低了计算机的速率。
解决方法:设置联想寄存器,用于保存最近常用的段表项。

3、分页和分段的主要区别

相似点:采用离散分配方式,通过地址映射机构实现地址变换
不同点:
(1)页是信息的物理单位,分页是为了满足系统的需要;段是信息的逻辑单位,含有意义相对完整的信息,是为了满足用户的需要。
(2)页的大小固定且由系统确定,由系统把逻辑地址分为页号和页内地址,由机器硬件实现;段的长度不固定,取决于用户程序,编译程序对源程序编译时根据信息的性质划分。
(3)分页的作业地址空间是一维的;分段的作业地址空间是二维的。

六、段页式存储管理

分段和分页存储管理方式各有优缺点。把两者结合成一种新的存储管理方式段页式存储管理方式 ,具有两者的长处。
1、基本原理
先将用户程序分成若干段,再把每个段分成若干页,并为每个段赋予一个段名。
基本段页式存储管理:把作业的所有段装入内存方可运行。
请求段页式存储管理:没必要把整个作业装入内存,可把作业的几段或几页装入内存即可运行。
段页式系统地址结构:段号;段内页号;页内地址。

在段页式系统中,为了获得一条指令或数据三需访间三次内存:
第一次:访问内存中的段表,取得页表始址
第二次:访问内存中的页表,取得该页所在的物理块号;将块号与页内地址形成物理地址
第三次:根据第二次所得的地址,取出指令或数据
缺点:访存次数增加两倍
解决方法:增设高速缓冲寄存器(在段表前加,类似于redis)

七、页面置换算法

1、最佳置换算法
2、先进先出置换算法
3、最近最久未使用(LRU)算法
最佳置换算法是一种理想化的算法,具有最好的性能,但难于实现。先进先出置换算法最直观,但可能性能最差,故应用极少。

1、最佳置换算法

其所选择的被淘汰页面,将是以后永不再用的,或许是在最长(未来)时间内不再被访问的页面。
优点:保证获得最低的缺页率
缺点:无法预知一个进程在内存的若干个页面,哪个在未来最长时间内不再被访问。算法无法实现,但可评价其他算法。

2、先进先出置换算法

算法总是淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面予以淘汰。
算法实现简单,只需把一个进程已调入内存的页面,按先后次序链接成一个队列 ,并设置一个指针(替换指针),使它总是指向最老的页面。算法与进程的实际运行规律不相适应,因为进程中的某些页面经常被访问,但先进先出置换算法不能保证这些页面不被淘汰。

Belady现象:如果对一个进程末分配它所要求的全部页面,有时就会出现分配的页面数增多但缺页率反而提高的异常现象。发生在FIF0 (先进先出)置换算法。

3、最近最久未使用(LRU)置换算法

算法根据页面调入内存后的使用情况进行决策。由于无法预测各页面将来的使用情况,只能利用“最近的过去”作为“最近的将
来”的近似,因此,LRU置换算法是选择最近最久未使用的页面予以淘汰。
该算法赋予每个页面一个访问字段,用来记录个页面自上次被访问以来所经历的时间t,当需淘汰个页面时,选择现有页面中其t值最大的,即最近最久未使用的页面予以淘汰。

猜你喜欢

转载自blog.csdn.net/FMC_WBL/article/details/108422954