缺页中断_缺页中断次数怎么算 - CSDN
精华内容
参与话题
  • 一、什么是缺页中断? 进程线性地址空间里的页面不必常驻内存,在执行一条指令时,如果发现他要访问的页没有在内存中(即存在位为0),那么停止该指令的执行,并产生一个页不存在的异常,对应的故障处理程序可通过...

    一、什么是缺页中断?

    进程线性地址空间里的页面不必常驻内存,在执行一条指令时,如果发现他要访问的页没有在内存中(即存在位为0),那么停止该指令的执行,并产生一个页不存在的异常,对应的故障处理程序可通过从外存加载该页的方法来排除故障,之后,原先引起的异常的指令就可以继续执行,而不再产生异常。

    二、页面调度算法

    将新页面调入内存时,如果内存中所有的物理页都已经分配出去,就按照某种策略来废弃整个页面,将其所占据的物理页释放出来;

    三、查看进程发生缺页中断的次数

    ps -o majflt,minflt -C program查看

    majflt和minflt表示一个进程自启动以来所发生的缺页中断的次数;

    四、产生缺页中断的几种情况

    1、当内存管理单元(MMU)中确实没有创建虚拟物理页映射关系,并且在该虚拟地址之后再没有当前进程的线性区(vma)的时候,可以肯定这是一个编码错误,这将杀掉该进程;

    2、当MMU中确实没有创建虚拟页物理页映射关系,并且在该虚拟地址之后存在当前进程的线性区vma的时候,这很可能是缺页中断,并且可能是栈溢出导致的缺页中断;

    3、当使用malloc/mmap等希望访问物理空间的库函数/系统调用后,由于linux并未真正给新创建的vma映射物理页,此时若先进行写操作,将和2产生缺页中断的情况一样;若先进行读操作虽然也会产生缺页异常,将被映射给默认的零页,等再进行写操作时,仍会产生缺页中断,这次必须分配1物理页了,进入写时复制的流程;

    4、当使用fork等系统调用创建子进程时,子进程不论有无自己的vma,它的vma都有对于物理页的映射,但它们共同映射的这些物理页属性为只读,即linux并未给子进程真正分配物理页,当父子进程任何一方要写相应物理页时,导致缺页中断的写时复制;

    五、缺页中断的处理

    缺页中断处理函数为arch/arm/mm/fault.c文件中的do_page_fault函数

    1、当前执行流程在内核态时

    (1)通过mm是否存在判断是否是内核线程,对于内核线程,进程描述符的mm总为NULL,一旦成立,说明是在内核态中发生的异常,跳到no_context

                         if (in_atomic() || !mm)

                                   goto no_context;

    如果当前执行流程在内核态,不论是在临界区还是内核进程本身(内核的mm为NULL),说明在内核态出了问题,跳到标号no_context进入内核态异常处理,由函数_do_kernel_fault完成;

    (2)

     

    这个函数首先尽可能的设法解决这个异常,通过查找异常表中和目前的异常对应的解决办法并调用执行;如果无法通过异常表解决,那么内核就要在打印其页表等内容后退出;

     

    (2)用户进程的缺页中断

    对于用户空间的缺页中断,则会调用函数_do_page_fault.

    首先从CPU的控制寄存器CR2中读出出错的地址address,然后调用find_vma(),在进程的虚拟地址空间中找出结束地址大于address的第一个区间,如果找不到的话,则说明中断是由地址越界引起的,转到bad_area执行相关错误处理;

    确定并非地址越界后,控制转向标号good_area。在这里,代码首先对页面进行例行权限检查,比如当前的操作是否违反该页面的Read,Write,Exec权限等。如果通过检查,则进入虚拟管理例程handle_mm_fault().否则,将与地址越界一样,转到bad_area继续处理。

    handle_mm_fault()用于实现页面分配与交换,它分为两个步骤:首先,如果页表不存在或被交换出,则要首先分配页面给页表;然后才真正实施页面的分配,并在页表上做记录。具体如何分配这个页框是通过调用handle_pte_fault()完成的。

    handle_pte_fault()函数根据页表项pte所描述的物理页框是否在物理内存中,分为两大类:

    (1)请求调页:被访问的页框不在主存中,那么此时必须分配一个页框,分为线性映射、非线性映射、swap情况下映射

    (2)写实复制:被访问的页存在,但是该页是只读的,内核需要对该页进行写操作,此时内核将这个已存在的只读页中的数据复制到一个新的页框中

    handle_pte_fault()调用pte_non()检查表项是否为空,即全为0;如果为空就说明映射尚未建立,此时调用do_no_page()来建立内存页面与交换文件的映射;反之,如果表项非空,说明页面已经映射,只要调用do_swap_page()将其换入内存即可;

    参考博客:https://blog.csdn.net/u010246947/article/details/10431149

                        http://www.360doc.com/content/11/0721/17/6580811_135034260.shtml

    展开全文
  • 缺页中断

    2016-04-01 18:40:57
    什么是缺页中断:  进程线性地址空间里的页面不必常驻内存,在执行一条指令时,如果发现他要访问的页没有在内存中(存在位为0),那么停止该指令的执行,并产生一个页不存在异常,对应的故障处理程序可通过从外存...

    什么是缺页中断:

           进程线性地址空间里的页面不必常驻内存,在执行一条指令时,如果发现他要访问的页没有在内存中(存在位为0),那么停止该指令的执行,并产生一个页不存在异常,对应的故障处理程序可通过从外存加载加载该页到内存的方法来排除故障,之后,原先引起的异常的指令就可以继续执行,而不再产生异常。

    页面调度算法:

           页式虚拟存储器实现的一个难点是设计页面调度(置换)算法,即将新页面调入内存时,如果内存中所有的物理页都已经分配出去,就要按某种策略来废弃某个页面,将其所占据的物理页释放出来,好的算法,让缺页率降低。常见的有先进先出调度算法,最近最少调度算法,最近最不常用调度算法。

    缺页中断的计算:

             作业本身的程序编制方法。程序编制的方法不同,对缺页中断的次数有很大影响。

    例如:有一个程序要将128×128的数组置初值“0”。现假定分给这个程序的主存块数只有一块,页面的尺寸为每页128个字,数组中的元素每一行存放在一页中,开始时第一页在主存。若程序如下编制:

        Var A: array[1..128] of array [1..128] of

    integer;

     

    for j := 1 to 128

     

    do for i := 1 to128

     

    do A[i][j]:=0

    则每执行一次A[i][j] :=0就要产生一次缺页中断,于是总共要产生(128×128-1)次缺页中断。

    如果重新编制这个程序如下:

        Var A: array[1..128] of

    array[1..128] of

    integer;

     

    for i := 1 to128

     

    do for j := 1 to128

     

    do A[i][j] := 0

    那么总共只产生(128-1)次缺页中断。

    显然,虚拟存储器的效率与程序的局部化程度密切相关。程序的局部化有两种:时间局部化和空间局部化。

    展开全文
  • 操作系统之缺页中断

    千次阅读 2018-10-03 18:28:47
    用最近最少用(LRU)页面调度算法处理缺页中断 1.实验目的 加深对于存储管理的了解,掌握虚拟存储器的实验原理;观察和了解重要的页面置换算法的置换过程. 2.实验原理及相关提示 在分页式虚拟存储系统中,当硬件发出...

    用最近最少用(LRU)页面调度算法处理缺页中断

    1.实验目的
    加深对于存储管理的了解,掌握虚拟存储器的实验原理;观察和了解重要的页面置换算法的置换过程.
    2.实验原理及相关提示
    在分页式虚拟存储系统中,当硬件发出”缺页中断”后,引出操作系统来处理这个中断事件。如果主存中已经没有空闲块,则可用LRU页面调度算法把该作业中最先进入主存的一页调出,存放到磁盘上,然后再把当前要访问的页装入该块。调出和装入后都要修改页表中对应页的标志。
    3.实验内容
    利用最近最少用置换算法(LRU),将页面依次调入主存,并算出缺页中断次数及缺页中断率。
    4.实验步骤
    1.分析设计思路:考虑用队列来存储调入主存中的页面号,设置全局变量count来记录缺页中断次数,队列的总长度即为分配的主存的块数,若队列未满则将页面调入,若队列满了,则判断要调入的页面是否已在主存中,若在则记录其下标,将下标后的元素依次往前移,若不在,则将队首元素出队,依次将后面的元素往前移,最后将页面插入在队尾。
    2.概要分析:定义队列的结构体,定义数据类型,写出调入主存后的页面展示函数void display(),写出判断队列是否为空即是判断主存中是否有页面存在的判空函数int empty()
    3.流程图:
    在这里插入图片描述
    5.程序中使用的数据结构及符号说明。
    typedef int datatype; //定义数据类型
    typedef struct{ //定义队列的结构体 存储调入主存中的页面号
    int count=0;//设置全局变量count来记录缺页中断次数
    void init(sequence_queue *sq){ //初始化队列
    void insert(sequence_queue *sq,datatype x,int block) //调入主存的页面
    int flag=0; //flag用于判定要调入的页面是否已经在主存中
    int empty(sequence_queue sq) //判断队列中是否为空 主存中是否有调入的页面
    void display(sequence_queue sq) //展示调入页面
    int main() //主函数实现
    6.源代码
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    7.运行截图
    在这里插入图片描述

    在这里插入图片描述

    用先进先出(FIFO)页面调度算法处理缺页中断

    1.实验目的
    理解连续存储管理方式的原理和分类,理解离散存储管理方式的原理和分类,理解虚拟存储器的原理和分类,掌握动态分区分配的常用算法,掌握页式虚拟管理中常用页面置换算法。了解内存分页策略,掌握一般常用的调度算法。学会各种存储分配算法的实现,了解页面大小和内存实际容量对命中率的影响。
    2.实验原理及其相关提示
    在分页式虚拟存储系统中,当硬件发出”缺页中断”后,引出操作系统来处理这个中断事件。如果主存中已经没有空闲块,则可用FIFO页面调度算法把该作业中最先进入主存的一页调出,存放到磁盘上,然后再把当前要访问的页装入该块。调出和装入后都要修改页表中对应页的标志。

    3.实验内容
    随机一访问串和驻留集的大小,通过模拟程序显示淘汰的页号并统计命中率。

    4.实验步骤
    1.分析设计思路:该算法总是淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面予以淘汰。该算法实现简单,只需把一个进程已调入内存的页面,按照先后次序连接成一个队列,并设置一个替换指针,使它总是指向最老的页面。
    2.概要分析:定义存储的结构体,定义相关的数据类型,分析需要初始化队列函数,入队列函数,删除队头元素string DeQueue(LinkQueue & Q),计算队列长度函数,检测页面是否驻留在页面中的函数ool FindQueue(LinkQueue &Q,string e),FIFO函数,主函数实现。
    3.流程图:

    在这里插入图片描述

    5.程序中使用的数据结构及符号说明
    typedef struct QNode // 定义结点,
    string data; //数据域,
    struct QNode *next; //指针域,
    typedef struct //定义队列的头,
    QueueNode front; //队列头指针,
    QueueNode rear; //队列尾指针,
    void InitQueue(LinkQueue &Q) //初始化队列,
    void EnQueue(LinkQueue & Q,string e){ //将e插入队列队尾
    string DeQueue(LinkQueue & Q) //删除队头元素
    int QueueLength(LinkQueue &Q) //计算队列长度函数,返回队列长度
    bool FindQueue(LinkQueue &Q,string e) //遍历队列,看e是否在驻留集队列中,在则返回true
    void FIFO(string pageFrame[], int pageCount, int waitSpace) //FIFO

    6.源代码

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

    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    7.运行截图:

    在这里插入图片描述

    展开全文
  • 虚拟内存缺页中断

    千次阅读 2018-09-30 10:59:00
    虚拟内存缺页中断在做了09年408的一道关于求虚存访存时间的os题,发现了一些问题:跟书上讲的流程不太一样。具体在,缺页中断流程和求EAT的部分。思考后,发现课本上的地址转换有点问题。

    虚拟内存缺页中断

      在做了09年408的一道关于求虚存访存时间的os题,发现了一些问题:跟书上讲的流程不太一样。具体在,缺页中断流程和求EAT的部分。思考后,发现课本上的地址转换有点问题。
      ps:刚发现这问题,有人来问题,立马无私的讲给她。无奈这是个傻子,找到证据后发给她图,居然看不出来问题!看不出来!看不出来!
    
    • 缺页中断
      缺页中断不同与一般中断,表现在:
      1.缺页中断在指令执行期间触发中断,中断处理完成后,将重启该命令
      2.缺页中断将会发生多次,这与机器的指令和数据分布有关,如跨页指令和数据。

    • 地址转化
      1.当发生缺页中断时,系统进行中断处理(有空闲块,调入页面;无空闲根据置换算法,替换一个出去)。
      至于快表(TLB)的更新,一般认为也由os在中断处理中完成。09年408OS那道题目就假设中断处理包括TCB也更新.
      2.完成中断处理后,重启该命令
      3.该命令让将进行地址转换,先检索TLB,命中,获得物理块,直接运算得出物理地址。

    • 第四版OS
      1.请求页式管理,地址转换流程错误。
      这个流程在中断处理结束修改完快表,直接完成了地址转换。有悖于上述缺页中断的处理方式。该书第三版的流程图,则是中断处理之后,重新启动流程。
      error_4

      2.求EAT部分,中断处理后,应是指令重启访问快表的时间,而不是修改快表的时间。

    • 第三版OS地址转换流程图
      这里的流程是在中断处理完成后重新启动命令的,符合缺页中断的处理流程。私以为在配置快表的请求页式存储管理中缺页中断后的快表修改也应由中断处理完成,09年408 os题便是假设中断处理后,快表也修改了。
      right_3

    • 注意
      区别页式管理和请求页式管理,前者是普通的页式管理(实存),后者是加了缺页中断的虚拟存储管理。

    • 教材

      • 计算机操作系统(第三版 西安电子科技大学出版社)汤小丹 梁红兵 哲凤屏 汤子瀛
      • 计算机操作系统(第四版 西安电子科技大学出版社)汤小丹 梁红兵 哲凤屏 汤子瀛
    展开全文
  • 缺页中断处理过程

    千次阅读 2018-11-15 11:24:54
    缺页中断处理过程
  • 缺页中断处理过程详解

    千次阅读 2012-03-06 12:03:52
    当进程执行过程中发生缺页中断时,需要进行页面换入,步骤如下: 首先硬件会陷入内核,在堆栈中保存程序计数器。大多数机器将当前指令的各种状态信息保存在CPU中特殊的寄存器中。 启动一个汇编代码例程保存通用...
  • 缺页中断处理算法

    千次阅读 2018-01-22 10:42:33
    缺页中断:在请求分页系统中,可以通过查询页表中的状态位来确定所要访问的页面是否存在于内存中。每当所要访问的页面不在内存是,会产生一次缺页中断,此时操作系统会根据页表中的外存地址在外存中找到所缺的一页,...
  • 几种缺页中断算法(FIFO,LRU与LFU)的实现过程

    万次阅读 多人点赞 2016-10-13 22:36:30
    几种缺页中断算法(FIFO,LRU与LFU)的实现过程 2015-09-05 20:34:02 分类: LINUX  最近在做笔试题,其中虚拟存储管理中几种缺页中断算法经常考到,虽然这类题可说非常简单,但概念上却容易混淆...
  • 缺页中断和一般中断的区别 1.在指令的执行期间产生和处理缺页中断。通常,CPU是在指令执行完毕后检查是否有中断请求到达,若有,便响应。而缺页中断是在一条指令的执行期间发现要访问的指令和数据不在内存时产生和...
  • 缺页中断与一般中断的主要区别

    千次阅读 2019-11-10 15:13:51
    缺页中断是一种特殊的中断,它与一般的中断的区别是: (1)在指令执行期间产生和处理中断信号,CPU通常在一条指令执行完后检查是否有中断请求,而缺页中断是在指令执行时间,发现所要访问的指令或数据不在内存时...
  • LRU和FIFO算法计算“缺页中断O(∩_∩)O啊2010-04-07 00:33今天做完了软件设计师的操作系统部分,,,用了几个钟( ⊙ o ⊙ )啊!,有个问题还没有解决... 虚拟存储管理系统,置换算法产生的缺页次数...就是这题 啊,...
  • 内存常识之缺页中断

    万次阅读 2013-06-03 09:18:05
    什么是缺页中断:  进程线性地址空间里的页面不必常驻内存,在执行一条指令时,如果发现他要访问的页没有在内存中(存在位为0),那么停止该指令的执行,并产生一个页不存在异常,对应的故障处理程序可通过从外存...
  • 缺页中断——FIFO、LRU、OPT这三种置换算法

    万次阅读 多人点赞 2016-07-31 14:27:31
    FIFO、LRU、OPT这三种置换算法的缺页次数2缺页中断 在请求分页系统中,可以通过查询页表中的状态位类确定所要访问的页面是否存在于内存中。每当所要访问的压面不在内存时,会产生一次缺页中断,此时操作系统会根据...
  • 对于设有块表的系统,发生缺页中断,调入新的页面到主存后,系统是更新页表还是块表?为什么?
  • 个人认为应该是选二,局部性是指: 1、程序顺序执行 2、程序跳转不会太远 3、程序存在许多循环 4、对计多数据结构(如数组)的处理局限于小范围 5、程序部分内容互斥(如出错处理程序往往执行不到,可放外存) ...
  • 软考——内存管理之页面调度与缺页计算

    千次阅读 热门讨论 2014-04-22 20:44:00
    一、何为缺页?  说白点:缺页定义为所有内存块最初都是空的,所以第一次用到的页面都产生一次缺页,也就是内存中不存在的话,就会产生缺页。明白了这个之后,对于缺页计算问题就好说了。 二、先进先出的缺页计算...
  • 缺页率的计算方法

    万次阅读 2016-07-18 16:07:43
    缺页率 = (页面置换次数+分配给该进程的物理块数)/要访问的页面总数 注意: 1、要访问的页面总数:不是数值最大,而是看要访问的总次数,例如某程序访问以下页面0、1、4、2、0、2、6、5、1、2、3、2、1、2、6、2、...
  • 缺页中断与页面置换算法

    千次阅读 2017-09-09 21:41:24
    1 缺页中断:  进程线性地址空间里的页面不必常驻内存,在执行一条指令时,如果发现他要访问的页没有在内存中(存在位为0),那么停止该指令的执行,并产生一个页不存在异常,对应的故障处理程序可通过从外存加载...
  • 虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续的可用的内存 (一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片, 还有部分...缺页中断一个页(Page)是一个固定容量的内
  • 如何减少缺页异常

    千次阅读 2014-09-07 15:09:44
    如何减少换页错误?() 1. 进程倾向于占用CPU 2. 访问局部性(localilty of reference)满足进程要求... 换页错误,一般称为缺页异常。每个进程都有一段自己的独立的虚拟内存空间(在32位的linux系统中为3G),但
1 2 3 4 5 ... 20
收藏数 13,935
精华内容 5,574
关键字:

缺页中断