【存储管理】页面的换入

在i386CPU中将一个线性地址映射成物理地址的过程中,如果该地址的映射已经建立,但是发现相应页面表项或目录项中的P(Present)标志位为0,表示相应的物理页面不在内存,从而无法完成本次访问;此时CPU的MMU硬件会分为页面映射失败,产生Page Fault;


(1)在handle_pte_fault中用pte_present()来检查表项中的P标志位,查看物理页面是否在内存中,不在时,然后使用pte_none()检查表项是否为空,空时用do_no_page()建立映射,与越界访问情景类似,非空时采用do_swap_page();


(2)其实在do_swap_page()中:所谓不在内存中只是逻辑意义上的,是对CPU的页面映射硬件而言,实际页面很可能在不活跃页面队列中,甚至在活跃页面队列中;缺页异常时,首先调用lookup_swap_cache()看内存页面是否在置换队列swapper_space中,在的话,直接找到;若没有找到,说明以前的虚存页面已经释放了,现在的内容在盘上了,通过read_swap_cache()来分配一个内存页面,并且从盘上将内容读进来;


(3)在read_swap_cache()中先调用swapin_readahead()是因为“预读”机制,从磁盘读时,要经过磁盘的寻道使磁头定位,然后再读,这样耗费的时间比较多,于是索性多度几个页面,成为一个页面的cluster集群,这些页面放入到活跃队列或swapper_space队列中,确实不需要时,我们有kswapd何kreclaimd来回收;在read_swap_cache中只需要从活跃队列中读就可以了;但是预读可能因为当时系统当时分配不到这么多的内存页面而失败,那么就要真读一次;swapin_readahead()读失败,该线程自愿礼让,两个都可以失败。


(4)当wait为1时,read_swap_cache()其实是同步读入的,两次调用lookup_swap_cache(),第一次时,可能前面swapin_readahead()已经把页面读入到swapper_space队列中了,第二次是因为调度的原因,同一个页面在内存中有两个副本(别的进程读进来的);如果确实需要从交换设备读入,那么使用add_to_swap_cache()将新分配的物理页面挂入到swapper_space队列中以及active_list中;


(5)注意盘上页面的共享计数问题,如果从交换设备中换入了页面,共享计数不变,否则从缓冲队列中找到了页面,则共享计数减1,那是因为在页面换出的时候try_to_swap_out()在断开页面映射时,使用swap_duolicate()递增了盘上页面的共享计数,现在恢复递减,二者是相互对应的;


(6)在swapin_readahead()中循环的调用read_swap_cache_async()分配和读入若干页面,因此从其返回时,每一个页面的使用计数都是2,但是循环马上会通过page_cache_release()递减这个计数,因为预读过来的页面没有被进程使用,因为在active_list中,它们的使用计数是1,它们以后会被进程认领,或被refill_inactive_scan()移入不活跃队列中(使用计数为1)。


(7)区间的可写标志VM_WRITE和页面的可写标志_PAGE_RW是不同的,VM_WRITE相关静态,_PAGE_RW更为动态,当一个物理页面可写时,当VM_WRITE为1,_PAGE_RW才可能为1。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【实验目的】 1. 通过编写和调试存储管理的模拟程序以加深对存储管理方案的理解; 2. 熟悉虚存管理的各种页面淘汰算法; 3. 通过编写和调试地址转换过程的模拟程序以加强对地址转换过程的了解。 【实验准备】 1.虚拟存储器的管理方式  段式管理  页式管理  段页式管理 2.页面置换算法  先进先出置换算法  最近最久未使用置换算法  Clock置换算法  其他置换算法 【实验内容】 1. 实验题目 设计一个请求页式存储管理方案。并编写模拟程序实现之。产生一个需要访问的指令地址流。它是一系列需要访问的指令的地址。为不失一般性,你可以适当地(用人工指定地方法或用随机数产生器)生成这个序列,使得 50%的指令是顺序执行的。25%的指令均匀地散布在前地址部分,25%的地址是均匀地散布在后地址部分。为简单起见。页面淘汰算法采用 FIFO页面淘汰算法,并且在淘汰一页时,只将该页在页表中抹去。而不再判断它是否被改写过,也不将它写回到辅存。 2. 具体做法 产生一个需要访问的指令地址流;指令合适的页面尺寸(例如以 1K或2K为1页);指定内存页表的最大长度,并对页表进行初始化;每访问一个地址时,首先要计算该地址所在的页的页号,然后查页表,判断该页是否在主存——如果该页已在主存,则打印页表情况;如果该页不在主存且页表未满,则调入一页并打印页表情况;如果该页不足主存且页表已满,则按 FIFO页面淘汰算法淘汰一页后调入所需的页,打印页表情况;逐个地址访问,直到所有地址访问完毕。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值