1.内存空间的分配与回收方式
连续分配:为用户进程分配的必须是一个连续的内存空间。
非连续分配:为用户进程分配的可以是一些分散的内存空间。
2.重要概念
(1)页:进程中的块称为页或页面;
将进程的逻辑地址空间也分为与页框大小相等的一个个部分,每个部分 称为一个“页” 或“页面” 。 每个页面也有一个编号,即“页号” , 页号也是从0 开始。
(2)页框:内存中的块称为页框。
将内存空间分为一个个大小相等的分区(比如:每个分区4KB),每个分区就是一个“页框” (页框=页帧=内存块=物理块=物理页面)。每个页框有一个编号,即“页框号”(页框号=页帧号=内存块号=物理块号=物理页号),页框号从0开始。
(3)页表:为了能知道进程的每个页面在内存中存放的位置, 操作系统要为每个进程建立一张页表。
注: 页表通常存在PCB(进程控制块) 中。
(4)页表项
- 一个进程对应一张页表;
- 进程中的每个页面对应一个页表项;
- 每个页表项由“页号”和“块号“组成;
- 页表记录进程页面和实际存放的内存块之间的映射关系;
- 每个页表向项的长度是相同的;
3.页表项的长度计算
假设某系统物理内存大小为 4GB, 页面大小为 4KB, 则
每个页表项至少应该为多少字节?
页块的计算
内存块大小=页面大小=4KB= 212B
4GB 的内存总共会被分为 232 / 212 = 220个内存块
内存块号的范围应该是 0 ~220 -1
内存块号至少要用 20 bit 来表示
至少要用3B(3个字节)来表示块号(3*8=24bit)
页号的计算:因为页表项连续存放, 因此页号可以是隐含的, 不占存储空间(类比数组)。
综上:每个页表项占3B,即3个字节。
4.地址转换(逻辑地址—>物理地址)
1.因为操作系统在内存中给进程分配的空间是不连续的,因此我们需要将进程地址空间拆分,即分页,但进程的地址空间分页后,操作系统是怎样实现从逻辑地址到物理地址的转换的?
虽然进程的各个页面是分散的,但是每个页面内部却是连续存放的。 因此我们需要知道页号和在该页内的的页内偏移量。
如果要访问逻辑地址 A, 则
①确定逻辑地址A 对应的“页号” P
②找到P号页面在内存中的起始地址(需要查页表)
③确定逻辑地址A 的“页内偏移量
逻辑地址A 对应的物理地址 = P号页面在内存中的起始地址+页内偏移量W
2.确定一个逻辑地址对应的页号、页内偏移量。
假设:在某计算机系统中, 页面大小是50B。 某进程逻辑地址空间大小为200B, 则逻辑地址 110 对应的页号、 页内偏移量是多少?
页号 = 逻辑地址 / 页面长度(取整数部分)
= 110 / 50 = 2
页内偏移量 = 逻辑地址 % 页面长度(取余数部分)
= 110 % 50 = 10
逻辑地址可以拆分成页号、页内偏移量
通过查找页表,可知页面在内存中的起始地址。
物理地址(内存中的地址) = 页面在内存中的起始地址 + 页内偏移量