操作系统:为什么一个页表项通常占用1Byte,1字节呢?页表项≠逻辑地址!常见OS内存管理误区辨析(计算机组成原理)
2^32,每个信息分配一个空间/可能性——幂
32位/8=4Byte,存信息——除法
地址&数据块:https://blog.csdn.net/bkdly9/article/details/107297461
原理复习(必看!!!):
eg:一条页表项32位
数值范围:0~2^32
存储32位需要占用空间:4Byte 00000000 00000000 00000000 00000000
eg2:一个300M的进程进入内存,4KB一块,一级页表需要( )连续的块,二级页表需要( )离散的块
由于页表本身能就存到内存中,问的是存这么多页表项,页表本身占内存的多少个块
一级页表75个连续块:\(\frac{300×2^{10}KB}{4KB}\)$=300*2^8=内存中约75K块 $,75K个页表项占用\(75000×4Byte/4KB=300KB/4KB=75\)块
二级页表76个都离散块: 一级页表1块;二级页表都离散存储,每一个二级页表只存一条页表项,占用25个二级页表,占25块;
号:value
项: index
页框号 ≠ 页号
页表项 ≠ 逻辑地址
页表项大小 ≠ 页内偏移
20+12=32 | 默认值 | 有关 | 公式 | 计算 |
---|---|---|---|---|
内存分块数 | 2\(^{32}\) | 逻辑32位 | 总内存÷编址方式 | 4GB÷1Byte(按字节编址) |
页号MAX+1 | 2\(^{12}\) | 12位 | 总内存÷每块页面大小 | 页表项个数 |
每块页面大小 | 4KB | 12位 | 页内偏移量×编址方式 | 2\(^{12}\)×1Byte |
每条页表项大小 | 4Byte | 逻辑32位 | 内存分块数位数占用 |
32bit |
一张页表最大占用 | 4MB | 20位 | 页号MAX+1 ×每条页表项大小 |
$ {2^{20}}×4 $Byte |
每个页表项大小,仅与分多少个物理块号有关,即使只用到1.5Byte(12位),一条也得占用4Byte。(可能是4Byte对齐,查找更快)
ps1:程序分页以申请内存,内存分块以方便管理
ps2:框内是内存内容print(a)
,框外是内存地址print(&a)
,写成数组形式:
逻辑地址[变量名]={页号,页内偏移}
页表[页号]=物理块号
内存[块号]=页面内容
问题启发
一开始是做题的时候,为什么不是2^12 bit,而是2^12Byte
某计算机主存按节址,逻地址和物理地址都是 32位页表项大小为 4B。请回答下列问题。
1 若使用一级页表的分页存储管理方式,逻辑地址结构为:
页号(20位) | 页内偏移量(12位)
则页的大小是多少字节?页表最大占用多少字节?
(这就是某些题目)csdn答案:https://blog.csdn.net/syh666233/article/details/109295815
哈希+反置页表
分页、分段的区别
大小 | 决定 | 目的 | 若字段W溢出 | 结构 | |
---|---|---|---|---|---|
物理页 | 固定 | 系统 | 提高内存利用率 | 自动加入到页号 | 连续,仅页内地址偏移 |
逻辑段 | 可变 | 用户编程 | 易实现多进程的段共享/段保护 | 越界中断 | 离散,段号+段内地址偏移 |
分段管理实验源代码
记忆:单位转换(有时候以为是2\(^8\))
2\(^3\)=8bit=1Byte
2\(^{10}\)=1024B=1kB