风流不在谈锋胜,袖手无言味最长。这篇文章主要讲述CSAPP第七章概念相关的知识,希望能为你提供帮助。
CSAPP第九章概念1.虚拟地址数=2^(虚拟地址位数)
最大可能的虚拟空间=虚拟地址数-1
2.
文章图片
使用虚拟寻址,CPU需要将虚拟地址转换成物理地址,这样才能访问真实的物理内存
concepts:1)VM on disk,PM (DRAM cache)
2)page--cache blocks
文章图片
3.page tables :an array of PTEs(page table entry) that map VP to PP
虚拟内存空间被组织为一个存放在硬盘上的M个连续的字节大小的单元组成的数组,每个字节都有一个唯一的虚拟地址
页数=虚拟地址数/页大小,每个页都需要一个PTE
操作系统通过将虚拟内存分割为大小固定的块来作为硬盘和内存之间的传输单位,这个块被称为虚拟页(Virtual Page, VP),每个虚拟页的大小为
P=2^p
字节。物理内存也会按照这种方法分割为物理页(Physical Page, PP),大小也为P
字节。CPU在获得虚拟地址之后,需要通过MMU将虚拟地址翻译为物理地址。而在翻译的过程中还需要借助页表
文章图片
VP1,VP2,VP7,VP4被缓存到物理内存中(cached),VP3,VP6已被分配但尚未缓存到物理内存(uncached),VP0和VP5尚未分配(unallocated)
4.page hit
文章图片
MMU根据虚拟地址在页表中寻址到PTE4,有效位为1,说明已经缓存到物理内存中,根据页表映射关系,指向PP1
5.page fault
虚拟页没有缓存在物理内存中
page fault execute page fault handler in kernel
page fault handler 选一个victim 在下述例子中选的是存放在PP3的VP4
如果牺牲页已被修改过,内核会先将它复制回硬盘(采用写回机制而不是直写也是为了尽量减少对硬盘的访问次数)
Kernel从disk复制VP3到PP3,更新PTE3
page fault handler 返回,重新执行导致缺页的命令
KEY POINT:demand paging
wait until the miss to copy the page to DRAM
In a system that uses demand paging, the operating system copies a disk page into physical memory only if an attempt is made to access it and that page is not already in memory (i.e., if a page fault occurs). It follows that a process begins execution with none of its pages in physical memory, and many page faults will occur until most of a process\'s working set of pages are located in physical memory.
文章图片
文章图片
文章图片
6.局部性
根据空间局部性原则(一个被访问过的内存地址以及其周边的内存地址都会有很大几率被再次访问)与时间局部性原则(一个被访问过的内存地址在之后会有很大几率被再次访问),只要将工作集缓存在物理内存中,接下来的地址翻译请求很大几率都在其中,从而减少了额外的硬盘流量。
if(working set size< main memory size) after cold miss good performance for one process
if(working set size> main memory size)thrashing thrashing occurs when a computer\'s virtual memory resources are overused, leading to a constant state of paging and page faults, inhibiting most application-level processing.
Main memory refers to physical memory that is internal to the computer.
7.保护
由于CPU每次进行地址翻译的时候都需要经过PTE,所以如果想控制内存系统的访问,可以在PTE上添加一些额外的许可位(例如读写权限READ WRITE、内核权限SUP 等),这样只要有指令违反了这些许可条件,CPU就会触发一个一般保护故障,将控制权传递给内核中的异常处理程序。一般这种异常被称为段错误(Segmentation Fault)
运行在用户模式下的进程只允许访问那些SUP为0的页面
8.地址翻译
1)concepts
VA组成部分
VPN:virtual page number
VPO:virtual page offset
TLBI:TLB index
TLBT:TLB tag
PA组成部分
PPO:physical page offset(same as VPO)
PPN:physical page number
CO:cache offset
CI:cache index
CT:cache tag
2)MAP V-> P并空集
V virtual address space
P physical address space
文章图片
n位VA由p位VPO和n-p位VPN组成
m位PA由p位PPO和m-p位PPN组成
有效位为0,报page fault
PTBR指向当前页表
MMU根据VPN选择对应的PTB
将PTE的PPN和VPO一拼,就是PA
3)page hit
【CSAPP第七章概念】
文章图片
page fault
文章图片
一般最糟糕的情况是(除缺页,缺页要访问磁盘),MMU需要访问内存取到相应的PTE。
一般如果凑巧的话,MMU在L1cache就找到了想要的PTE,这样时间消耗会比访问内存小很多(如果L1cache没找到会继续找L2cache,这里忽略多级缓冲区细节)
页表被缓存在内存中,尽管相对硬盘,内存速度已经很快,但和CPU速度还有差距。
为防止每次地址翻译都去访问内存,采用TLB与cache来缓存PTE.
4)TLB(快表):contains complete page table entries for small number of pages
快表看作页表的缓存
文章图片
文章图片
TLB未命中时,就必须到高速缓存/内存中取PTE,新取出的PTE会放入TLB(若TLB已满,会替换一个已有的PTE)
9.多级页表
使用层次结构的页表
文章图片
多级页表地址翻译,假设k级页表,虚拟地址被分割成k个VPN和1个VPO
每个VPN i 都是第i级页表的索引
为了构造物理地址,MMU需访问k个PTE,才能拿到想要的PPN
文章图片
blog 图片及文字部分来自https://sylvanassun.github.io/2017/10/29/2017-10-29-virtual_memory/
地址翻译习题解析
1.根据页的大小确定VPO
2.根据TLB 的组数确定TLBI
VPN除TLBI的剩下的位为TLBT
3.PPO直接抄VPO
4.1)根据TLBI确定TLB中找哪一组
再看是否有TAG相符的,且有效位为1的,若有直接返回对应的PPN与VPO直接组成物理地址
若没有,再用VPN查页表看有没有,若有TLB命中,但不是缺页,返回PPN,同上
若无则返回缺页
2)PA再按CT,CI,CO分
根据缓存的块offset确定CO,根据缓存的组数确定CI,剩余位为CT
再按CI看指向哪一组,有效位是否为1,若为1,再看CT是否符合,符合再看CO,注意offset是从0开始的
若有不符合(如有效位为1或CT不符合)则缓存不命中
valid为0 有两种情况 一种unallocated 一种uncached
valid 用来标记数据是否被放入缓存中
TLB也可看成一个PTE数组来理解
推荐阅读
- Android OKHttp 可能你从来没用过的拦截器 实用推荐
- 数据库操作(Python如何更新MySQL())
- Python如何读取mysql(答案都在这里了)
- Python MySQL如何进行事务操作()
- Python MySQL插入操作如何实现()
- Python-MySQL环境设置详解
- Python MySQL如何创建表()
- Python MySQL数据库连接如何操作()
- Python如何创建新数据库()