较高层次的异常控制流——上下文切换

         异常控制流发生在系统的各个层次。比如,在硬件层,硬件检测到的事件会触发控制突然转移到异常处理程序;在应用层,一个进程可以发信号到另一个进程,而接收者会将控制突然转移到它的一个信号处理程序,一个程序可以通过回避一般的栈规则并执行到其它函数中任意位置的非本地跳转来对错误做出反应。在操作系统层,内核通过上下文切换将控制从一个用户进程转移到另一个用户进程。

一、前提知识:

        当运行一个程序时,我们会有这样一个假象——我们的程序是系统中当前运行的唯一的程序,真实可能是当前系统中可能有上百个程序正在运行。这样的假象是进程为我们制造的,减少了程序编写人员的负担。所谓进程,进程是一个执行中的程序的实例。系统中的每个程序都运行在某个进程的上下文中,进程提供给应用程序关键的两个抽象:

        1、一个独立的逻辑控制流;

        2、一个私有的地址空间;

 

         为了使操作系统提供一个完美的进程抽象,处理器提供一种限制一个应用可以执行的指令以及可以访问的地址空间范围的机制,这个功能包含进程运行的两种模式:用户模式和内核模式。一个运行在内核模式下的进程可以执行指令集中的任何指令,访问系统中的任何内存位置;而运行在用户模式下的进程不允许执行特权指令,比如发起一个IO操作、也不允许直接引用地址空间中内核区的代码和数据(进程地址空间的结构如下图所示),必须通过系统调用接口间接地访问内核代码和数据。

         进程从用户模式变为内核模式的方法是通过中断、故障、或陷入系统调用这样的异常,当异常发生时,控制传递到异常处理程序,异常处理程序运行在内核模式中,当处理程序返回后,进程模式从内核模式变回内核模式。

 二、操作系统如何通过上下文的异常控制流来实现多任务并发执行

       多任务并发执行就是多个进程轮流运行。

       首先内核为每个进程维持一个上下文,上下文就是程序正确运行所需要的状态,由一些对象组成,包括寄存器、浮点寄存器、程序计数器、用户栈、状态寄存器、内核栈、和各种内核数据结构、比如描述地址空间的页表、包含有关当前进程信息的进程表,以及包含进程已打开文件的信息的文件表。

      内核可以决定抢占当前运行进程。当内核选择一个新的进程运行时,使用一种上下文切换机制来将控制转移到新的进程。首先内核会保存被抢夺的进程的上下文,恢复将要运行的进程的上下文,然后再将控制转移给新的恢复的进程。由此进程队列中的若干进程按优先级被轮流调度。

 

三、上下文切换的例子

      中断可能引发上下文切换,比如系统中有产生周期性定时器中断的机制,每次定时器中断时,内核就判定当前进程已经运行足够的时长,并切换到一个新的进程。

     内核代表用户执行系统调用时,也可能会发生上下文切换。因为当系统调用因为等待某个事件发生阻塞,那么内核可以让当前进程休眠,切换到另一个进程。假设进程A执行系统调用read访问磁盘陷入内核,内核中的现陷阱处理程序请求来自磁盘控制器的DMA传输,并且安排在读取数据完成后触发一个磁盘中断处理器。而从磁盘读取数据一般要较长的时间,这时内核可以选择执行上下文切换,运行进程B,而不是低效地等待。需要注意的一点是,在切换之前内核代表进程A在用户模式下运行指令,在切换开始的前阶段中,进程A进入内核模式下执行指令。随着切换的继续,轮到进程B在内核模式中运行了。切换结束后,进程B进入用户模式执行指令。直到磁盘发出中断信号,并且内核判断进程B已经执行足够长时间后将执行上下文切换,将控制返回给进程A read指令的下一条指令,然后进程A继续运行。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值