《操作系统导论》第一部分 CPU虚拟化 P2 限制进程,进程间切换机制

C3 机制:受限直接执行

为了虚拟化CPU,操作系统需要以某种方式让许多任务共享物理CPU,让它们看起来是同时运行一样,其基本思想就是时分共享CPU

但构建这样的虚拟化时存在一些挑战:
1,性能,如何在不增加系统开销的情况下实现虚拟化?
2,控制权,如何有效地运行进程,同时保留对CPU的控制权?控制权对操作系统尤为重要,没有控制权,一个进程可以简单地无限制运行并接管机器,或访问没有权限的信息

3.1 受限直接执行

为了使得程序尽可能快的执行,操作系统开发人员想出了一种技术,即受限的直接执行

先了解直接执行:只需要直接在CPU上运行程序即可,当OS希望启动程序运行时,它会在进程列表中为其创建一个进程条目,并分配一些内存,将程序从磁盘中加载到内存中,找到main()跳转到那里并执行开始运行用户的代码,运行完后返回内核

在这里插入图片描述
但是使用这种简单的方法会出现两个问题:
1,如果只运行一个程序,操作系统怎么确保程序不做任何我们不希望它做的事(访问它没有权限的信息),同时高效运行它?
2,当正在运行一个进程时,怎么让它停下来并切换到别的进程,实现时分共享

所以需要对进程加上限制,如果运行程序没有限制,那么操作系统无法控制任何事,因此就变成了一个单纯运行代码的环境

3.2 受限制的操作

直接执行的明显优势是快速,该程序直接在CPU上运行,因此执行速度和预期是一样快的,但是如果进程希望执行某种受限制操作(发出I/O,申请内存),该怎么办?

我们不能让所有的进程都做它们想做的事,如果让所有的进程都能随意的做受限制的操作,那么所有的保护都会失效

(1) 用户模式和内核模式

用户模式 user mode:在用户模式下运行的代码会受到限制,如用户模式下,进程不能发出I/O,这样会引发异常,可能导致操作系统终止该进程

内核模式 kernel mode:操作系统就在内核模式下运行,在此模式下,运行的代码可以做它想做的所有事,包括特权操作,发出I/O和执行所有类型的受限制操作

(2) 陷入内核 trap,退出内核 return-from-trap

如果用户希望执行某些特权操作(发出I/O),此时在用户模式下是无法实现的,所以现代操作系统为它们提供了系统调用,它允许内核向用户暴露某些关键功能,如访问文件系统,创建和销毁进程,与其它进程通信

要执行系统调用,程序必须执行trap 陷阱指令,该指令跳入内核并将特权级别提升到内核模式,一旦进入内核,系统就可以指向所需的特权操作,完成后,操作系统调用return-from-trap返回到用户程序中,并将特权级别降低到用户模式

(3) 从内核中正确返回

执行trap时,硬件需要存储足够的调用者的寄存器,以便return-from-trap时正确返回。如在x86上,处理器会将程序计数器,标志寄存器和一些其它的寄存器送入每个进程的内核栈中,return-from-trap进入用户模式后,从栈中弹出这些值,正确的恢复程序进入内核前的样子

(4) 陷阱表 trap table

当程序trap后,它如何知道在内核模式下运行哪些代码?显然,发起调用时不能指定要跳转的地址,这样会让程序跳转到内核中的任意位置

内核通过在启动时设置陷阱表 trap table来实现trap进入内核时执行什么代码,当机器刚启动时,操作系统在内核模式下运行,会根据需要自由地配置机器硬件,操作系统做地第一件事就是告诉硬件在发生中断时要运行什么代码

(5) 受限直接运行协议

每个进程都有一个内核栈,在进入内核和离开内核时,寄存器分别被保存和恢复

在这里插入图片描述
受限直接运行有两个阶段:
1,系统引导时:内核初始化陷阱表,CPU记住陷阱表的位置以供使用
2,运行进程时:在执行进程前,操作系统为进程初始化了一些内容,接着转入用户模式运行程序

通过让进程在用户模式和内核模式间切换,就完成了保护操作系统的控制权,且限制进程的运行,让它不能做不应该做的事

3.3 在进程间切换

操作系统决定停止一个进程并开始另一个进程,看起来很简单,但却十分棘手,当一个进程正在CPU上运行时,这就意味着操作系统没有运行,因为CPU是一份的,操作系统也是一段程序,如果操作系统没有运行,它怎么能切换进程,因此需要操作系统重获CPU控制权

(1) 协作方式:等待系统调用

早期的处理手段是操作系统相信系统中的进程会合理执行,进程通过显示的yield系统调用,什么都不干并将CPU控制权转交给操作系统,以便操作系统可以运行其它进程

如果应用程序执行了某些非法操作,也会将CPU控制权转交给操作系统,在协作方式中OS通过等待系统调用,或非法操作,从而获得CPU的控制权,这是一种存在缺陷的方式,如果某个进程进入无限循环,且从不进行系统调用,也没什么非法操作,那么现在就只能关机

(2) 非协作方式:操作系统进行控制

在不通过协作的方式让操作系统获得CPU控制权,可以使用时钟中断时钟设备可以编程为每隔几毫秒产生一次中断,产生中断时,当前运行的程序停止,此时操作系统重获CPU控制权

在发生中断时,要为正在运行的程序保存它当前的状态,以便return-from-trap后能正确恢复程序

现在就可以通过时钟中断的方式不断的让操作系统重获CPU控制权

(3) 保存和恢复上下文

操作系统通过时钟中断重新获得了CPU的控制权,那么它需要决定:是继续运行当前的进程,还是切换其它进程,这个决定是由调度程序做出的,它是操作系统的一部分,这里先说明如何切换进程

如果决定切换进程,OS就会执行一些底层代码,即上下文切换:操作系统为当前正执行的进程保存它寄存器的值,并为即将执行的进程恢复寄存器的值,这样操作系统可以确保从内核模式返回时,去执行另一个进程而不是之前运行的进程

下面是进程A,B间切换的一张表,操作系统决定从当前正在运行的进程A切换到进程B,它调用switch(),该系统调用会保存当前运行进程的寄存器的值(保存到A的进程结构),将B的进程结构恢复到寄存器,从内核模式退出到用户模式,进入B进程执行代码
在这里插入图片描述

3.4 担心并发吗

在系统调用时发生时钟中断会发生什么?处理一个中断时发生另一个中断会发生什么?

这些会在并发中了解,操作系统可能简单地决定在中断处理期间禁止中断,不会讲其它中断交给CPU,操作系统还有许多加锁方案 locking,以保护内部数据结构地并发访问,使得多个活动可以同时在内核中进行,适用于多处理器

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值