基本分页存储管理的概念
支持多道程序的两种连续分配方式的问题:
固定分区分配:缺少灵活性,会产生大量的内部碎片,内存的利用率低。
动态分区分配:会产生很多外部碎片,虽然可以用紧凑技术来处理,但是紧凑的时间代价很高。
连续分配和非连续分配的区别:
1、连续分配指的是为用户进程分配的必须是一个连续的内存空间
2、非连续分配指的是为用户进程分配的可以是一些分散的内存空间。
固定分区分配改造为非连续分配版本
内存的分区:
将内存的空间分为一个个大小相等的分区,每个分区就是一个页框。每个页框都有一个编号,即页框号,页框号从0开始。
用户进程的分区
将用户进程的地址空间也分为与页框大小相等的一个个区域,称为“页”或者“页面”。每一个页面也有一个编号,即页号,页号也是从0开始。进程的最后一个页面,可能没有一个页框那么大。因此,页框不能太大,否则可能产生过大的内部碎片。
操作系统的空间分配
页面被离散的分配到内存的页框之中,如何实现地址转换?(逻辑地址向物理地址的转换)
动态重定位:需要一个重定位寄存器,寄存器里存储着起始位置,cpu通过内存单元的相对起始位置的偏移量加上起始地址就可以算出内存单元的物理地址。
分页如何实现地址转换?
将用户进程进行分页操作,每个页面的大小为50B
用户进程被分成四个页面,其中第四个页面没有填满,有内存碎片
页面被离散的放入内存之中,与内存的页框一一对应。
Cpu执行指令1,需要访问逻辑地址为80的内存单元,如何转换为物理地址?
分析:80属于50~99之间,也就是属于1号页,页面虽然被离散的分在了内存之中,但就一号页而言,整个页面里的内存是连续,如上图,一号页被存放在了物理地址为450~499的内存之中。所以我们只需要知道一号页在内存中的物理起始地址,便可以通过逻辑地址的偏移量加上物理地址的起始地址,算出相应的物理地址。
如此题中,物理地址的起始地址是450,逻辑地址为80的偏移量为80-50 = 30;那么逻辑地址为80的物理地址即是450+30=480.
根据上面的题目,我们可以得出 物理地址 = 页面始址(物理内存中该页的起始地址) + 页内偏移量(逻辑地址相对该页的偏移量)
计算方法:
页号 = 逻辑地址 / 页面长度(页面的大小)。
页内偏移量 = 逻辑地址 % 页面长度
如果采用二进制表示法,计算会变得简单
如00000000000000000001 000000000001
页面的大小为12位,也就后面12位表示页内的偏移量,前面的二十位表示页号。有此例可知页号为1,那么如果我们知道了页号的物理起始地址为X,那么该内存单元的物理地址即为X+1;
也就是说,如果我们知道了页内偏移量,在知道这个页在物理内存当中的起始地址,也就可以算出该内存块的物理地址,那如何知道内存的起始地址呢?
页表:
页表有两个部分组成,一是页号(页号与用户进程中的页号对应),二是块号。
前面我们提到,内存被分成固定大小的页框(也叫物理块)。那么我们知道了整个内存的起始地址Y,再用L(页框的固定大小)*M(物理块号)+Y就可以求出该内存块的物理地址。
基本地址变换机构
基本分页存储管理的概念
步骤
1、根据逻辑地址求出页号、页内偏移量(上面的那两个公式)
(M代表页表有多少个页表项,但页表项是从0开始计数的,所以最大的页号是M-1)的关系(A<M是合法的,其他越界)。
3、计算页号P对应的页表项地址
页表项地址 = 页表起始地址F+页号P*页表项长度。取出该表项的内容即为内存块号b
(我明白了,对于我们而言,觉得页表是可见可拿的,但是对于计算机而言,页表也是存放在内存之中的,我想要获取b,就必须去内存之中找到页表的位置,然后取出b。这也就解释了页号是隐含的问题,即页表之中不需要存页号,我只需要根据我的页号,计算出该页号在页表中的物理地址,就可以访存,拿出物理块号。总有种套娃的感觉......)
(别看说的这么麻烦,真算数的时候,忽略了查找b的过程,所以很简单,基本上会忽略第三步)
小试牛刀
1、算出页号、页内偏移量
P = A/L = 2;
W = A%L = 2500 % 1024 = 452。
2、越界没法判断,内存块号要知道整个的物理内存的大小,然后用物理内存的大小/页面大小求出有多少个内存块,然后判断是否越界。肯定不会越界,越界了咋算呢?
3、根据公式 E = b*l+W,算出E
E = 8 * 1024 + 452 = 8644。