一次由缺页中断引发的旅程

综述

首先,啥是页,这是针对内存来说的,现代操作系统将内存分成许许多多的(逻辑上),一页的大小默认是4KB(Linux)。操作系统在运行程序时,不会一次性将程序所需的页都加载到内存中(没有这个必要)。
所以当操作系统运行程序所要用到页没有加载到物理内存时,就会触发一个来自CPU的缺页错误,操作系统捕捉到这个错误,然后将对应的页加载到物理内存中。

上面的概述涉及到几个概念:页、物理内存、中断。

页和段

除了将内存划分成页之外,其实还可以划分成段,一段内存就存放程序所需要的全部数据和指令。这种情况下是不会产生缺少数据或者指令的情况的。不过却会引发一个新的问题:内存碎片和内存不足。如下图所示:

当然也有办法解决,就是内存交换,将python程序占用的256M先写到硬盘上,再从硬盘上读回内存,不过是从接着已占用的512M写。这样我们就可以空间连续的256M来加载新的程序X了。看来很完美,不需要页的
出场了,实际上大家都知道,硬盘的访问速度相比内存来说,慢了可是几个数量级。频繁的读写磁盘,性能肯定上不去的,所以才有页的出现。

异常和中断

程序不仅简单的执行指令,更多的还需要和外部的输入输出打交道。另一方面,程序在运行过程中,还会遇到各种上异常情况,比如除0,位溢出,甚至我们自己也可以让程序招聘异常

异常,其实是一个硬件和软件组合在一起的处理过程,异常的前半生:发生和捕捉,是在硬件层面完成的。但后半
生,也就是异常的处理,其实是由软件来完成的

计算机会为每一种可能的异常,分配一个异常代码。异常发生时,通常是CPU检测到一个特殊的信号。这些信号,一般就叫作发生了一个事件(Event)。拿到异常代码后,CPU会触发异常处理流程。异常的处理还会涉及上下文切换。

异常分类

  • 中断
    程序执行到一半,被打断了,一般是异步的。
  • 陷阱
    程序员“故意”主动触发的异常。当程序指令执行到这个位置时,就掉到这个陷阱当中。然后,对应的异常处理程序就会处理这个“陷阱”当中的猎物。如果time指令,应用程序通过系统调用读取文件,创建进程。
  • 故障
    它和陷阱的区别在于,故障通常不是刻意触发的。如果除0、加法溢出。故障和中断、陷阱还有一个重要区别是,故障在异常处理完成之后,仍然回来处理当前的指令,而不是去执行下一条指令。
  • 中止
    没有异常处理程序能够处理当前的异常时,程序中止退出当前的执行

物理内存和虚拟内存

猜你喜欢

转载自www.cnblogs.com/yeni/p/11712590.html