前面已经简要介绍过连续型存储管理,它的缺点是会有过多的内存碎片。
因此,我们提出离散式内存分配,它主要包括以下三种方法:
- 页式
- 段式
- 段页式
页面和物理块
首先我们必须要知道页面和物理块的相关知识。
【大白话解释】:
页面实际上就是把一个进程的逻辑地址空间分成一块一块。每一块我们称为一个页面。
物理块
物理块是对主存进行分块,大小和页面的大小是一致的。
如图:
值得注意的一点是,页面的大小是由物理块的大小决定的。物理块的大小是硬件决定的。
页式存储管理
【工作原理】:
当有一个进程需要分配内存空间时,操作系统会将该进程的逻辑地址分成若干页,页面大小和物理块一样。
然后将每一页放到物理块中,用页表记录下页号对应的物理块号。
那么根据页表来查找就可以了。
图解:
【详细原理】:
在页面和物理地址建立映射的时候,页表就被创建了。页表在内存中是连续存储的(注:页表不是离散存储)。
实际上,页表在内存中只存了物理块号,页号没必要存,用相对地址来表示就可以了。
段式存储管理
页式存储存在一定的毛病,如果页面太小,最终的页表项会很多很多;而且通过分页把一个进程各个部分分离开来,一定程度上影响了进程的逻辑性。
段式存储工作原理:
对一个进程按照逻辑划分成几个段,然后这几个段离散地存储到内存空间上,段内部是连续存储。
图解:
段表包括段长、基址。和页表一样,段表也是连续存储到内存上的,段号可以直接用逻辑地址推算出来,没有必要存到内存上。
从图上看得很明显,各个段相互之间离散开了,但是段内部都是连续存储在内存上的。
段页式存储管理
集合了上面二者的优点
简单来说,就是先对进程分段,再对各个段进行分页。 物理地址是分成一个一个物理块的,我们将最终分页的页面再一个一个地装到物理块中。
图解:
如何形象理解段页式存储呢?(看不懂直接怼我!)
我们都知道,我们的国家有划分很多的省,然后在省之下又划分了很多的市。
这里的省就和分段是一个道理,市就和分页是一个道理。
国家不能只划分城市,也不能只划分省份。
如果只划分城市的话,那么每天的天气预报就是个问题,难道要播报全国几百个城市?(分页式)
如果只划分省份的话,一点都不利于管理。(分段式)
因此,我们国家把同一个地方的人划分到一个省里面去(分段保持进程的逻辑性),同时为了便于管理,再在省中划分城市(分页,离散存储)。
关于段页式的寻址问题实际上就是一个找人的问题。
比如,张三居住于广东省广州市天河区XX路12号,我们要去找他,肯定要先去该省份(找段号)
找到他所在广东省,那么接下来要找他所处的城市(找段内页号)
找到他在广州市,但你现在还不能具体确定他的位置,还得找具体是哪一个区,哪一条路(用页内偏移算具体的物理地址)