操作系统(3)-进程管理-受限直接执行

本文详细解释了CPU虚拟化中的受限直接执行原理,涉及受限制的操作、系统调用、在进程间切换的协作与非协作方式,以及上下文切换的机制。重点阐述了操作系统如何通过控制权管理和时钟中断来确保安全的进程管理。
摘要由CSDN通过智能技术生成


🚀前言

为了虚拟化CPU,操作系统需要以某种方式让许多任务共享物理CPU,让它们看起来像是同时运行。基本思想很简单:运行一个进程一段时间,然后运行另一个进程,如此轮换。通过以这种方式时分共享(time sharing)CPU,就实现了虚拟化。
然而,在构建这样的虚拟化机制时存在一些挑战。第一个是性能:如何在不增加系统开销的情况下实现虚拟化?第二个是控制权:如何有效地运行进程,同时保留对CPU 的控制?控制权对于操作系统尤为重要,因为操作系统负责资源管理。如果没有控制权,一个进程可以简单地无限制运行并接管机器,或访问没有权限的信息。

🚀受限直接执行

操作系统通过受限直接执行的方式来高效地使用CPU,并保持对CPU的控制权。直接执行指直接在CPU上运行程序。直接执行的明显优势是快速。该程序直接在硬件CPU 上运行,因此执行速度与预期的一样快。受限直接执行指在直接执行的基础上对应用程序加以限制。

🚀受限制的操作

受限制的操作指某些操作对应用程序来说是受限制的,在获得允许的情况下可以进行操作,但又不能让进程完全控制系统。
处理器通过提供不同的执行模式来协助操作系统对一个应用程序可以执行的指令以及它可以访问的地址空间范围进行限制。
内核模式(kernel mode)下,操作系统可以访问机器的全部资源,包括可以执行指令集中的任何指令,和可以访问系统中的任何内存位置。还提供了陷入(trap)内核和从陷阱返回(return-from-trap)到用户模式程序的特别说明,以及一些指令,让操作系统告诉硬件陷阱表(trap table)在内存中的位置。
用户模式(user mode)下,应用程序不允许执行特权指令,比如停止处理器、改变执行模式,或者发起一个I/O操作。也不允许用户模式中的进程直接引用地址空间中内核区内的代码和数据。任何这样的尝试都会导致致命的保护故障。反之,用户程序必须通过系统调用接口间接地访问内核代码和数据。

通过系统调用,允许内核小心地向用户程序暴露某些关键功能。要执行系统调用,程序必须执行特殊的陷阱(trap)指令。该指令同时跳入内核并将特权级别提升到内核模式。一旦进入内核,系统就可以执行任何需要的特权操作(如果允许),从而为调用进程执行所需的工作。完成后,操作系统调用一个特殊的从陷阱返回(return-from-trap)指令,如你期望的那样,该指令返回到发起调用的用户程序中,同时将特权级别降低,回到用户模式。

运行应用程序代码的进程初始时是在用户模式中的。进程从用户模式变为内核模式的唯一方法是通过诸如中断,故障或者陷人系统调用这样的异常。当异常发生时,控制传递到异常处理程序,处理器将模式从用户模式变为内核模式。处理程序运行在内核模中,当它返回到应用程序代码时,处理器就把模式从内核模式改回到用户模式。
切换过程运行全流程

🚀在进程之间切换

操作系统决定停止一个进程并开始另一个进程,有两种方式:

🚁协作方式:等待系统调用

在协作调度系统中,OS 通过等待系统调用,或某种非法操作发生,从而重新获得CPU 的控制权。
一个友好的进程通过进行系统调用,将CPU 的控制权转移给操作系统,例如打开文件并随后读取文件,或者向另一台机器发送消息或创建新进程。像这样的系统通常包括一个显式的yield 系统调用,它什么都不干,只是将控制权交给操作系统,以便系统可以运行其他进程。
如果应用程序执行了某些非法操作,也会将控制转移给操作系统。例如,如果应用程序以0 为除数,或者尝试访问应该无法访问的内存,就会陷入(trap)操作系统。操作系统将再次控制CPU(并可能终止违规进程)。

🚁非协作方式:操作系统进行控制

在前面提到的写作方式中,如果某个进程(无论是恶意的还是充满缺陷的)进入无限循环,并且从不进行系统调用,就无法将控制权交还给操作系统,那么操作系统无法做任何事情。
为了在进程不协作时,操作系统能够重新获得CPU的控制权,操作系统和硬件通过时钟中断(timer interrupt)的方式来达到其目的。时钟设备可以编程为每隔几毫秒产生一次中断。产生中断时,当前正在运行的进程停止,操作系统中预先配置的中断处理程序(interrupt handler)会运行。此时,操作系统重新获得CPU 的控制权,因此可以做它想做的事:停止当前进程,并启动另一个进程。

🚁上下文切换

内核为每个进程维持一个上下文(context).上下文就是内核重新启动一个被抢占的进程所需的状态。它由一些对象的值组成,这些对象包括通用目的寄存器,浮点寄存器,程序计数器,用户栈,状态寄存器,内核栈和各种内核数据结构,比如描述地址空间的页表,包含有关当前进程信息的进程表,以及包含进程已打开文件的信息的文件表。
在进程执行的某些时刻,内核可以决定抢占当前进程,并重新开始一个先前被抢占了的进程。这种决策就叫做调度(scheduling),是由内核中称为调度器(scheduler)的代码处理的。当内核选择一个新的进程运行时,我们说内核调度了这个进程。在内核调度了一个新的进程运行后,它就抢占当前进程,并使用一种称为上下文切换的机制来将控制转移到新的进程,上下文切换1)保存当前进程的上下文,2)恢复某个先前被抢占的进程被保存的上下文,3)将控制传递给这个新恢复的进程。

当内核代表用户执行系统调用时,可能会发生上下文切换。如果系统调用因为等待某个事件发生而阻塞,那么内核可以让当前进程休眠,切换到另一个进程。比如,如果一个read系统调用需要访问做盘,内核可以选择执行上下文切换,运行另外一个进程,而不是等待数据从磁盘到达。另一个示例是sleep系统调用,它显式地请求让调用进程休眠。一般而言,即使系统调用没有阻塞,内核也可以决定执行上下文切换,而不是将控制返回给调用进程。
中断也可能引发上下文切换。比如,所有的系统都有某种产生周期性定时器中断的机制,通常为每1毫秒或每10毫秒。每次发生定时器中断时,内核就能判定当前进程已经运行了足够长的时间,并切换到一个新的进程。

image.png

🚀小结

CPU 虚拟化的关键底层机制,将其统称为受限直接执行(limited direct execution)。基本思路很简单:就让你想运行的程序在CPU 上运行,但首先确保设置好硬件,以便在没有操作系统帮助的情况下限制进程可以执行的操作。
操作系统首先(在启动时)设置陷阱处理程序并启动时钟中断,然后仅在受限模式下运行进程,以此为CPU 提供最基本的防护。这样做,操作系统能确信进程可以高效运行,只在执行特权操作,或者当它们独占CPU 时间过长并因此需要切换时,才需要操作系统干预。

参考资料:

  • [1]《操作系统导论》
  • [2]《现代操作系统》
  • [3]《系统架构设计师教程》
  • [4]《计算机操作系统》
  • [5]《深入理解计算机系统》

系列文章连接:
操作系统(1)-操作系统概述
操作系统(2)-进程管理-进程基本概念
操作系统(3)-进程管理-受限直接执行
操作系统(4)-进程管理-进程间通信

  • 29
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值