多级页表与快表
![](https://i-blog.csdnimg.cn/blog_migrate/7fdfbed3c7d46642d76b81702f2cdd75.png)
2^20是地址映射的个数,即1MB,假设每一个映射需要4个字节,那么每个页表就是4MB
每个进程都需要自己的页表,所以10个进程页表就需要40MB
实际上大部分逻辑地址根本用不到
这部分终于搞懂每个数字表达什么了,感谢老师TAT
尝试一,只存放用到的页
用到的页才有页表项
但是页表中的页号不连续,所以需要比较查找折半,log(2^20)= 20,二分查找的前提是排序好的
速度会慢
尝试二,多级页表
页目录表+页表
![](https://i-blog.csdnimg.cn/blog_migrate/54db5260be29b125f3cbad7813f67a48.png)
时间换空间,空间换时间捏
快表
![](https://i-blog.csdnimg.cn/blog_migrate/5e2e5490b0f3163760e3c8a961062940.png)
缓存,硬件设计可以直接根据页号找到,找到了有效的地址就叫做TLB命中
未找到就是TLB未命中,接下来就老老实实查找
![](https://i-blog.csdnimg.cn/blog_migrate/3430adf01a70cdfbb74354a9fe769e45.png)
程序的地址访问具有局部性,空间局部性
段页结合的实际内存管理 虚拟内存
段页同时存在:段面向用户 页面向硬件
![](https://i-blog.csdnimg.cn/blog_migrate/c89409d21dfdad75566912a2ab172e95.png)
重定位
![](https://i-blog.csdnimg.cn/blog_migrate/b8ba7568400cb4f21fdf617dadc90702.png)
分配段,建立段表;分配页,建立页表
![](https://i-blog.csdnimg.cn/blog_migrate/6c1053989415bbda194b10a639ff7be8.png)
过程:现在虚拟内存中割出一段空间,假装放进去(记好段表),在物理内存中找到地方,建立页表,用重定位具体的使用内存
![](https://i-blog.csdnimg.cn/blog_migrate/aeafb42f3f49ee85e023c04fddb06b73.png)
fork函数
请求调页与内存换入
用换入换出实现大内存 请求的时候才换入然后建立映射
![](https://i-blog.csdnimg.cn/blog_migrate/59d6542862043c4a372a81b5135fedb7.png)
请求调页
发生缺页时引发中断,页错误处理程序将缺页换入,中断结束(重新执行缺页的那一页的请求)
![](https://i-blog.csdnimg.cn/blog_migrate/0a269757ca3bf53fad66e83e03a7b9fe.png)
内存换出
FIFO页面置换 先入先出
MIN算法
选最远将使用的页淘汰,是最优方案(在可预见的未来中最迟需要用到的)
![](https://i-blog.csdnimg.cn/blog_migrate/ca99517dd8ba90b10e13bc2f05df8dfd.png)
LRU算法:
选最近最长一段时间没有使用的页淘汰(最近使用次数最少)
![](https://i-blog.csdnimg.cn/blog_migrate/2f18ede8c6e6e2fa376b21d71ba1abb5.png)
LRU准确实现 用时间戳
![](https://i-blog.csdnimg.cn/blog_migrate/713dda14b2291d49eb2db34d8f03357b.png)
每次选择数字最小的那个淘汰
模拟起来很简单,但是实际放进操作系统中很难(每次地址访问都需要修改时间戳,需要维护一个全局时钟,需要找到最小值.....实现代价太大)
LRU准确实现 用页码栈
![](https://i-blog.csdnimg.cn/blog_migrate/00d46735217a78f5a456cf3285dcf975.png)
LRU近似实现-将时间计数变为是和否
将最近最少使用近似为最近是否使用
![](https://i-blog.csdnimg.cn/blog_migrate/7c0843a98af53d0e79341e000ec9aaa2.png)
当缺页很少时
所有能指到的数字几乎都是1,没有0 .当发生缺页时,指针会转一圈将所有1换成0,然后将第一个被换成0的页牺牲,然后指向第二个页。等下一次发生缺页时又会转一整圈。这时,LRU就会退化为FIFO算法
原因:记录了太长的历史信息
方法:定时清楚R位 再定义一个扫描指针
clock算法
![](https://i-blog.csdnimg.cn/blog_migrate/57e4bd4cf730b6559926bfadd9d37d7a.png)
给进程分配多少页框(帧fream)
![](https://i-blog.csdnimg.cn/blog_migrate/68f249b5d1c4ee8649e2c5a1075d1d07.png)
分配多少页合适? 分配的页数应该可以容纳一个局部
但是局部不好求 有很多求局部(工作集)的算法