operating system

1. 操作系统的运行机制

计算机系统中,通常 CPU 执行两种不同性质的持续:一种是操作系统内核持续;另一种是用户自编持续(即系统外层的应用程序,或简称 “应用程序”)。对操作系统而言,这两种程序的作用不同,前者的后者的管理者,因此 “管理程序” (即内核程序)要执行一些特权指令,而 “被管理程序” (即用户自编程序)处于安全考虑不能执行这些指令。所谓特权指令,是指计算机西红花不允许用户直接使用的指令。如 I/O 指令、置中断指令,存取用于内存保护的寄存器、送程序状态字到程序状态字寄存器等的指令。在具体实现上,将 CPU 的状态划分为用户态(目态)和核心态(又称管态、内核态)。可以理解为 CPU 内部有一个小开关,当小开关为 1 时,CPU 处于核心态,此时 CPU 可以执行特权指令;当小开关为 0 时,CPU 处于用户态,此时 CPU 只能执行非特权指令。用户自编程序运行在用户态,操作系统内核程序运行在核心态。

在软件工程思想和结构程序设计方法影响下诞生的现代操作系统,几乎都是层次式的结构,操作系统的各项功能分别被设置在不同的层次上。一些与硬件关联较紧密的模块,如时钟管理、中断处理、设备驱动等处于最底层。其次是运行频率较高的程序,如进程管理、存储器管理和设备管理等。这两部分内容构成了操作系统的内核。这部分内容的指令操作工作在核心态。

内核是计算机上配置的底层软件,是计算机功能的延伸。不同系统对内核的定义稍有区别,大多数操作系统内核包括四方面的内容。

1.1 时钟管理

在计算机的各种部件中,时钟是最关键的设备。时钟的第一功能是计时,操作系统需要通过时钟管理,向用户提供标准的系统时间。另外,通过时钟中断的管理,可以实现进程的切换。例如,在分时操作系统中采用时间片轮转调度,在实时系统中按截止时间控制运行,在批处理系统中通过时钟管理来衡量一个作业的运行程度等。因此,系统管理的方方面面无不依赖于时钟。

1.2 中断机制

引入中断技术的初衷是提高多道程序运行环境中 CPU 的利用率,而且主要是针对外部设备的。后来逐步得到发展,形成了多种类型,成为操作系统各项操作的基础。例如,键盘或鼠标信息的输入、进程的管理和调度、系统功能的调用、设备驱动、文件访问等,无不依赖于中断机制。可以说,现代操作系统是靠中断驱动的软件。

中断机制中,只有一小部分功能属于内核,它们负责保护和恢复中断现场的信息,转移控制权到相关的处理程序。这样可以减少中断的处理时间,提高系统的并行处理能力。

1.3 原语

按层次结构设计的操作系统,底层必然是一些可被调用的共用小程序,它们各自完成一个规定的操作。它们的特点如下:

  1. 处于操作系统的最底层,是最接近硬件的部分。
  2. 这些程序的运行具有原子性,其操作只能一气呵成(主要从系统安全性和便于管理考虑)。
  3. 这些程序的运行时间都较短,而且调用频繁。

通常把具有这些特点的程序称为原语(Atomic Operation)。定义原语的直接方法是关闭中断,让其所有动作不可分割地完成后再打开中断。

系统的设备驱动、CPU 切换、进程通信等功能中的部分操作都可定义为原语,使它们成为内核的组成部分。

1.4 系统控制的数据结构及处理

系统中用来登记状态信息的数据结构很多,如作业控制块、进程控制块(PCB)、设备控制块、各类链表、消息队列、缓冲区、空闲区登记表、内存分配表等。为了实现有效的管理,系统需要一些基本的操作,常见的操作有以下三种。

  1. 进程管理。进程状态管理、进程调度和分派、创建与撤销进程控制块等。
  2. 存储器管理。存储器的空间分配和回收、内存信息保护程序、代码对换程序等。
  3. 设备管理。缓冲区管理、设备管理和回收等。

综上,核心态指令实际上包括系统调用类指令和一些针对时钟、中断和原语的操作指令。

2. 中断和异常的概念

在操作系统中引入核心态和用户态这两种状态后,就需要考虑这两种状态之间如何切换。操作系统内核工作在核心态,而用户程序工作在用户态。系统不允许用户程序实现核心态的功能,而它们又必须使用这些功能。因此,需要在核心态建立一些 “门”,以便实现从用户态进入核心态。在实际操作系统中,CPU 运行上层程序时唯一能进入这些 “门” 的途径就是通过中断和异常。发生中断或异常时,运行用户态的 CPU 会立即进入核心态,这是通过硬件实现的(例如,用一个特殊寄存器的一位来表示 CPU 所处的工作状态,0 表示核心态,1 表示用户态。若要进入核心态,则只需将该位置 0 即可)。中断时操作系统中非常重要的一个概念,对一个运行在计算机上的实用操作系统而言,缺少了中断机制,将是不可想象的。原因是,操作系统的发展过程大体就是一个想方设法不断提高资源利用率的过程,而提高资源利用率就需要在程序并未使用某些资源时,把它对那种资源的占有权释放,而这一行为就需要通过中断实现。

中断(interruption)也称外中断,指来自 CPU 执行指令以外的事件的发生,如设备发出的 I/O 结束中断,表示设备输入/输出处理已经完成,希望处理机能够向设备发下一个输入/输出请求,同时让完成输入/输出后的程序继续执行。时钟中断,表示一个固定的时间片已到,让处理机处理计时、启动计时运行的任务等。这一类中断通常是与当前程序运行无关的事件,即它们与当前处理机运行的程序无关。

异常(Exception)也称内中断、例外或陷入(trap),指源自 CPU 执行指令时发生的事件,如程序的非法操作码、地址越界、算术溢出、虚存系统的缺页及专门的陷入指令等引起的事件。对异常的处理一般要依赖于当前程序的运行现场,而且异常不能被屏蔽,一旦出现应立即处理。

关于内中断和外中断的联系与区别如下

interruption

3. 系统调用

所谓系统调用,是指用户在程序中调用操作系统提供的一些子功能,系统调用可视为特殊的公共子程序。系统中的各种共享资源都由操作系统统一掌管,因此在用户程序中,凡是与资源有关的操作(如存储分配、进行 I/O 传输及管理文件等),都必须通过系统调用方式向操作系统提出服务请求,并由操作系统代为完成。通常,一个操作系统提供的系统调用命令有几十条乃至上百条之多。这些系统调用按功能大致可分为如下几类。

显然,系统调用相关功能涉及系统资源管理、进程管理之类的操作,对整个系统的影响非常大,因此必定需要使用某些特权指令才能完成,所以系统调用的处理需要由操作系统内核程序负责完成,要运行在核心态。用户程序可以执行陷入指令(又称访管指令或 trap 指令)来发起系统调用,请求操作系统提供服务。可以这么理解,用户程序执行 “陷入指令”,相当于把 CPU 的使用权主动交给操作系统内核程序(CPU 状态会从用户态进入核心态),之后操作系统内核程序再对系统调用请求做出相应处理。处理完成后,操作系统内核程序又会把 CPU 的使用权还给用户程序(即 CPU 状态会从核心态回到用户态)。这么设计的目的是:用户程序不能直接执行对系统影响非常大的操作,必须通过系统调用的方式请求操作系统代为执行,以便保证系统的稳定性河安全性,防止用户程序随意更改或访问重要的系统资源,影响其他进程的运行。

这样,操作系统的运行环境就可以理解为:用户通过操作系统运行上层程序(如系统提供的命令解释程序或用户自编程序),而这个上层程序的运行依赖于操作系统的底层管理程序提供服务支持,当需要管理程序服务是,系统则通过硬件中断机制进入核心态,运行管理程序;也可能是程序运行出现异常情况,被动地需要管理程序的服务,这时就通过异常处理来进入核心态。管理程序运行结束后,用户程序需要继续运行,此时通过相应的保持的程序现场退出中断处理程序或异常处理程序,返回断点处继续执行,如下

system call

在操作系统这一层面上,我们关心的是系统核心态和用户态的软件实现与切换,对于硬件层面的具体理解,可以结合 “计算机组成原理” 课程中有关中断的内容进行学习。

下面列举一些由用户态转向核心态的例子

  1. 用户程序要求操作系统地方服务,即系统调用
  2. 发生一次中断
  3. 用户程序中产生了一个错误状态
  4. 用户程序中企图执行一条特权指令
  5. 从核心态转向用户态由一条指令实现,这条指令也是特权指令,一般是中断返回指令。

注意:由用户态进入核心态,不仅状态需要切换,而且所用的堆栈也可能需要由用户堆栈切换为系统堆栈,但这个系统堆栈也是属于该进程的。

若程序的运行由用户态转到核心态,则会用到访管指令,访管指令是在用户态使用的,所以它不可能是特权指令。

4. 习题

  1. 用户程序在用户态下要使用特权指令引起的中断属于
  2. 用户态到核心态的转换由什么完成的
  3. 只能在核心态下执行的指令是什么
  4. 下列说法错误的是
    1. 内部异常的产生与当前执行指令相关
    2. 内部异常的检测由 CPU 内部逻辑实现
    3. 内部异常的相应发生在指令执行过程中
    4. 内部异常处理后返回到发生异常的指令继续执行
  5. 执行系统调用过程是
  6. 解释通道技术和中断机制

5. 习题答案

  1. 访管中断
  2. 硬件
  3. 广义指令。也就是系统调用指令,调用可发生在用户态,但是执行是发生在核心态。
  4. 选 4。2 是对的(包括控制器和运算器)。
  5. 传递系统调用参数、执行陷入(trap)指令、执行相应的服务程序、最后返回用户态。
  6. 通道技术独立于 CPU,做到了 CPU 和 I/O 操作并行工作。中断技术使得 CPU 不再需要轮询,提高利用率。