进一步学习操作系统 - 哈工大李治军老师 - 学习笔记 L22L23L24L25

L22 多级页表与快表

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

总结

32位地址,最大内存为232 = 4G
页面尺寸为4K,则最多有4G / 4K = 220个页面
页表就有220个页表项,需要4M内存
这里好像是涉及了虚拟内存,即每个进程都有4G的虚拟内存,所以一个进程的页表占4M内存,10个进程就需要40M内存,100个进程就需要400M内存

这样占用内存太多了,所以要想办法减少页表占用的内存空间。

很自然就想到:只有用到的逻辑页才有页表项
但是页表中的页号不连续的话,查找用的时间就会很长,页号连续可以直接用偏移地址,会很快,所以页号必须连续

用书的章目录和节目录类比,可以采用多级页表的形式
图中12M是指 该二级页表对应的进程占用12M内存(是一个进程!不是进程对应的页表项)
图中16K是指 页目录表4K + 3 * 页表4K(页目录表里画了三个篮筐!)

在这里插入图片描述
多级页表提高了空间效率,但是增加了访存次数。
快表TLB是一组相联快速寄存器,提高时间效率。

L23 段页结合的实际内存管理

将程序先分段放入虚拟内存,再分页放到实际内存
段、页同时存在:段面向用户 / 页面向硬件
在这里插入图片描述
在这里插入图片描述
内存管理核心就是内存分配,所以从程序放入内存、使用内存开始

在这里插入图片描述
1.分配段
2.建段表
3.分配页
4.建页表
5.进程带动内存使用的图谱
·从进程fork中的内存分配开始 - 1234
1.分配虚存、2.建段表
在这里插入图片描述
3.分配内存、4.建页表
在这里插入图片描述
在这里插入图片描述

from_dir = (unsigned long *) (from>>20) &0xffC);
from是32位虚拟地址,10位页目录号+10位页号+12位Offset
(from>>20) &0xffC = (from>>20) &111111111100 = (from>>22) *4
from_dir 是指向该页表项的指针
to_ dir = (unsigned long *) ( (to>>20) &0xffc) ;同上
for(; size–>0; from_dir++, to_dir++){
用循环将父进程一个页目录项下的所有页表项(一个页目录对应 1024 个页)拷贝到子进程对应的那个页目录项下面
·from page_ table= (0xfffff000&*from dir) ;
得到父进程页目录项指向的 1024 个页表项的起始地址
·to page_ table=get_ free_ page() ;
申请一个新的页
·*to_dir= ( (unsigned 1ong) to_ page_ table) | 7 ;
把新页的地址赋给to_dir
…下面的for…
}
在这里插入图片描述
for(;nr–>0;from_page_table++,to_page_table++){
该循环用来完成页表项内容的复制
this_page = *from_page_table;
得到父进程虚拟页对应的物理页框号
this_page &=~2; //设置为只读
由于现在父子进程使用了同样的物理页框,所以这个物理页框要变成只读,因为如果父子进程都可以写,那么两个进程在并发执行时就会互相影响而导致错误。
*to_page_table = this_page;
将父进程虚拟页对应的物理页框号 写到 子进程的页表项中就完成了复制

mem_map[this_page]++;}
两个进程使用同一个物理页框,物理页框的计数值应该增加,这样防止在父子进程中的一个进程释放内存时将这
个物理页框释放掉

5.使用内存
在这里插入图片描述
若要往 子进程复制的物理页框中写内容,因为fork() 时将这个页框设置为只读,现在要写,就会出现内存读写异常的中断,中断处理的结果是新分配一个页给子进程

L24 内存换入-请求调页

基于局部性原理,在程序装入时,可以将程序中很快会用到的部分装入内存,暂时用不到的部分留在外存,就可以让程序开始执行。在程序执行过程中,当所访问的信息不在内存时,由操作系统负责将所需信息从外存调入内存,然后继续执行程序。若内存空间不够,由操作系统负责将内存中暂时用不到的信息换出到外存。

在操作系统的管理下,在用户看来似乎有一个比实际内存大得多的内存,这就是虚拟内存
32位系统的虚拟内存大小为4G
虚拟内存映射到物理内存,对用户透明。

在这里插入图片描述
在这里插入图片描述
trap_init()系统初始化时,设置14 号中断为缺页中断
set_gate()修改idt中断向量表

void do_no_page(unsigned long error_code, unsigned long address)
{
·address &= 0xfffff000;//算出虚拟页号

·page = get_free_page();//获得空闲物理内存页框
·bread_page(page, current->executable->i_dev, nr);//启动磁盘读写来读取虚拟页面的内容
·put_page(page, address);//填写页表项,完成映射
}

L25 内存换出

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

刚刚换出的页面马上又要换入内存,刚刚换入的页面马上又要换出外存,这种频繁的页面调度行为称为抖动,或颠簸
产生抖动的主要原因是进程频繁访问的页面数目高于可用的物理块数(分配给进程的物理块不够)
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tfnmdmx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值