问题

  1. 什么是用户态和内核态
  2. 什么是中断,为什么要使用中断
  3. 用户态切换到内核态开销很大,这个开销具体指的是什么?
  4. 线程切换,进程切换,CPU工作模式切换,哪个开销更大一些?

什么是用户态和内核态

很久以前,操作系统只是为单一用户和单一任务服务的,这时候就没有所谓的用户态和内核态的区分。那时候的CPU, 硬件系统也就没有所谓的用户态和内核态的支持能力。

用户态和内核态是因为有多用户,多任务的需求,然后操作系统和CPU硬件厂商进行配合之后,产生的一个解决多用户多任务需求的方案。这个方案的核心之一,就是“限制”。

通过硬件手段(也只有硬件手段才能做到),限制某些代码,使其无法控制整个物理硬件,进而使不同用户,不同任务的代码,没有权限修改整个物理硬件,进而保护操作系统的核心底层代码和其他用户的数据不被无意或者有意地被破坏和修改。

CPU有ring0到ring5的特权等级, 而操作系统的用户态和内核态对应了ring3和ring0。所以我们可以看到,正是因为CPU分了不同的工作模式,然后操作系统在这些工作模式之上封装了所谓的用户态和内核态。

既然是故意的限制,操作也就留有合法的通道,让操作系统可以从用户态陷入内核态:

  • x86 CPU给出的切换入口是int汇编指令。x86分为五个模式,有0环和3环的概念
  • arm CPU给出的切换限制的入口是int汇编指令。arm分为7个模式,没有0环和3环的概念
  • mips CPU给出的切换限制的入口是teqi汇编指令,一个叫用户模式一个叫特权模式

中断机制

在早期的计算机,多个程序只能串行执行,系统资源利用低。为了解决上面的问题,人们发明了操作系统,引入了中断机制,实现了多道程序的并发执行,提高了系统资源的利用率。中断是多程序并发执行的前提条件。举个简单的例子:

  1. 以两个进程并发运行为例,进程1在用户态运行了一段时间后,CPU会接收到计时部件(操作系统内核的时钟管理部件)发出的中断信号,表示进程1已经用完了一个时间片,CPU会切换到核心态。把CPU的使用权限交还给操作系统,操作系统知道进程1的时间片用完,就需要切换进程。在完成切换进程的一系列工作后,操作系统又会将CPU的使用权交还给用户进程。
  2. 接着进程2拿到CPU执行权就会在用户态下执行,进程执行一段时间后,进程2发出系统调用(内中断信号),请求输出(write),主动要求操作系统接入工作,CPU会立即切换到核心态,把CPU的使用权交换给操作系统。操作系统内核接管进程2系统调用请求,调用IO设备开始输出工作,然后操作系统交还CPU执行权,IO设备这时候也会并行执行。因为进程2需要等待IO操作完成,所以其阻塞了。这时候进程1会拿到CPU的执行权开始运行。当执行一段时间之后,IO操作完成,IO设备向CPU发送一个中断信息。此时CPU由用户态转换为内核态,对刚才的中断信号处理。所以操作系统再次交还CPU执行权,让进程2再次运行(操作系统会优先让发生IO阻塞的进程先运行?)。

从上面的过程可以看出:

  • 当中断发生,CPU立即进入核心态
  • 当中断发生后,当前运行的进程暂停运行,并由操作系统内核对中断进行处理
  • 对于不同的中断信号,会进行不同的处理

发生中断就意味着需要操作系统介入,开展管理工作。由于操作系统的管理工作(如进程切换,分配IO设备)需要使用特权指令,因此CPU要从用户态转换为和核心态。中断可以使CPU从用户态转换为核心态,是操作系统获得计算机的控制权。因此,有了中断,才能实现多任务的并发执行。

用户态到内核态的转换就是通过中断机制实现的,而且中断是唯一途径。核心态到用户态的切换通过执行一个特权指令,将程序状态字(PSW)标志位设置为用户态。

所以中断可以分为两大类型:

  • 内中断:内中断的信号来源于CPU内部,与当前执行的指令有关,如整数除0
  • 外中断:外中断的信号来源于CPU外部,与当前执行的指令无关,如用户强制结束一个进程, IO设备完成操作发生的中断信号

中断处理过程:

  1. 执行每个指令后,CPU都要检查当前是否有外部的中断信号
  2. 如果检测到外部中断信号,则需要保护被中断进程的CPU环境(如程序状态字PSW, 程序计数器,各种通用寄存器等)
  3. 根据中断信号类型转入相应的中断处理程序
  4. 恢复进程的CPU环境并退出中断,返回原进程继续往下执行

    1. ![image.png](https://cdn.nlark.com/yuque/0/2021/png/2332713/1622293340434-e62d62f6-fa84-4632-ba67-badecd118407.png#clientId=uee3da8d4-0869-4&from=paste&height=234&id=u30894102&margin=%5Bobject%20Object%5D&name=image.png&originHeight=259&originWidth=554&originalType=binary&ratio=1&size=81192&status=done&style=none&taskId=u843285a1-e918-4503-9da5-9082cf10be7&width=500)

    参考

    用户态和内核态
    操作系统中断