分段、分页、页表、快表学习笔记
为了解决内存碎片问题,通过将进程内存分割成不连续的片段,散布在内存的不同位置。分段认为程序由大小不同的段组成,根据段对程序进行切分,不同的段存放在内存不同位置,比如代码段、data段、堆段、栈段分别保存在内存地某一位置。分页根据进程内存长度(如4K)进行分割,将进程分割成大小相同的多个分页,分布在内存不同的位置。首先linux记录了进程的段表,内容是每一个分段的编号、起始物理地址(段基址)、段限长
原视频链接:https://www.bilibili.com/video/BV1bf4y147PZ?p=23&spm_id_from=333.1007.top_right_bar_window_history.content.click
1.分段和分页的动机
为了解决内存碎片问题,通过将进程内存分割成不连续的片段,散布在内存的不同位置。
分段认为程序由大小不同的段组成,根据段对程序进行切分,不同的段存放在内存不同位置,比如代码段、data段、堆段、栈段分别保存在内存地某一位置。
分页根据进程内存长度(如4K)进行分割,将进程分割成大小相同的多个分页,分布在内存不同的位置。
2.分段实现原理
首先linux记录了进程的段表,内容是每一个分段的编号、起始物理地址(段基址)、段限长。然后逻辑地址分成两部分,第一部分是段编号,第二部分是段内位移。地址转换的流程为:
- 根据段编号,从段表中获取段基址和段限长
- 比较段内位移和段限长的大小,如果大于段限长,则地址越限。
- 物理地址=段内位移+段基址
- 段基址和段限长记录在基址寄存器和限长寄存器中
3.分页实现原理
首先将内存分成固定大小的若干页框,进程也被分割成一个个页面,页面大小和页框的大小应该相同,这样除了最后一个页面之外,其余页面均不会产生碎片。
页号和页框号之间的映射关系表称为页表,逻辑地址由页号和页内位移组成,首先根据页号和页表,找到页框号,根据单个页框的大小×页框号,可以得到该页框的物理地址,这个地址+页内位移可以得到逻辑地址对应的物理地址。计算公式1为:
物
理
地
址
=
页
框
号
×
页
面
大
小
+
页
内
位
移
物理地址 = 页框号 × 页面大小 + 页内位移
物理地址=页框号×页面大小+页内位移
假设逻辑地址页号占m位,页内位移占n位,即逻辑地址=[m|n],页大小为2^n,页号对应页框号为x,则物理地址=[x|n],可以看出就是拿页框号替换页号,即可得到物理地址,无需进行加法计算。
4.分页和分段的区别
分段 | 分页 |
---|---|
信息的逻辑单位 | 信息的物理单位 |
段长是任意的 | 页面大小由系统确定 |
段的起始地址是主存的任一地址开始 | 页框的起始地址是页框大小的整数倍 |
(段号,段内位移)构成二维地址空间 | (页号,页内位移)构成一维地址空间 |
产生外部碎片 | 消除外部碎片,产生内部碎片 |
5.页表
页框表格式
页框表用于描述内存中哪些页框已用,哪些未用,其形式如下:
frame no. | state |
---|---|
0 | 1 |
1 | 0 |
2 | 1 |
3 | 0 |
4 | 0 |
5 | 1 |
页表格式
页表用于描述进程页表和内存页框之间的映射关系,其形式如下:
page no. | frame no. |
---|---|
0 | 5 |
1 | 0 |
2 | 2 |
页表左边的列可以省略,因为相当于是数组的下标。
页表目录格式
页表也是储存在内存中的,当页表过大,内存中没有连续的页框能记录时,需要将页表进行分割,然后离散地记录在内存中。通过页表目录,描述页表在内存中的位置。页表目录格式如下:
页表页编号 | 页框编号 |
---|---|
PPT#0 | F#7 |
PPT#1 | F#10 |
此时逻辑地址的编排为:页表页号+页号+页内位移
地址转换的步骤变成:
- 根据页表页号找到页表页
- 根据页号,在页表页中找到页框号
- 根据页框号和页内位移,得到物理地址
如果页目录过大,起始可以将目录进一步分割成多个部分。这样的页表被称为多级页表。
32位系统用的是2级页表,64位系统用的4级页表
页面大小计算
逻辑地址长度占m bit,页内位移占n bit,页号占m - n bit,则页面大小为2^n Byte。
假设页面大小是4K,理论上n = 12,m = 52;实际上64位太大,其中只有48位用来表示地址,所以m = 36。
获取系统页面大小
getconf PAGESIZE
页表特性
- 操作系统为每一个进程维护了一份页表的拷贝
- 只有正在受CPU调度的进程的页表才会被加载到CPU中
- CPU加载页表的时候是把内存中页表的地址加载进来,记录在页表专用寄存器PTBR中
- CPU切换页表的时候,只需要重新加载地址
- 页表的使用会增加进程上下文切换的开销
- CPU每次访问物理地址,都需要两次访存操作,第一次是寻找页表,第二次是访问实际的物理地址
快表-TLB
TLB(Translation Look-aside Buffer)是一种专门记录页表的硬件缓存,大小很小,查找速度很快。TLB将进程中的部分页表项记录在TLB中,因为大小很小。
CPU访问逻辑地址的时候,首先在TLB中寻找表项,如果找到就直接获取到了物理地址;如果cache miss,就经过的两次访存。所以需要将经常访问的页表项(不一定属于同一进程),存放在TLB中,这就是快表。
更多推荐
所有评论(0)