操作系统学习笔记 1.3 操作系统的运行环境
前言
参考王道书。
后续会进一步整理,包括添加笔记内容,标明参考资料。
更新中。。。
目录
一、操作系统的运行机制
预备知识:什么是指令
问题:“指令”和我们平时所说的“代码”有什么区别?
简单来说, “指令”就是处理器(CPU)能识别、执行的最基本命令一条高级语言的代码翻译过来可能会对应多条指令
新的问题:
- 有的指令“人畜无害”。比如:加、减、乘、除这些普通的运算指令。
- 有的指令有很高的权限。比如:内存清零指令。
- 如果用户程序可以使用这个指令,就意味着一个用户可以将其他用户的内存数据随意清零,这样做显然是很危险的。
1、两种指令
特权指令
-
指计算机中不允许用户直接使用的指令
-
如内存清零指令,I/O 指令,置中断指令,存取用于内存保护的寄存器、送程序状态字到程序状态字寄存器等的指令。
非特权指令
- 如普通的运算指令
问题: CPU如何判断当前是否可以执行特权指令?
2、两种处理器状态
用户态(目态)
- 此时CPU只能执行非特权指令
核心态(管态)
- 特权指令、非特权指令都可执行
PSW
用程序状态字寄存器(PSW)中的某标志位来标识当前处理器处于什么状态。
- 如0为用户态,1为核心态
两种状态转换
- 用户态→核心态是通过中断实现的。并且中断是唯一途径。
- 核心态→用户态的切换是通过执行一个特权指令,将程序状态字(PSW)的标志位设置为用户态
两种程序
内核程序
操作系统的内核程序是系统的管理者,既可以执行特权指令,也可以执行非特权指令,运行在核心态。
内核是计算机上配置的底层软件,是操作系统最基本、最核心的部分。
实现操作系统内核功能的那些程序就是内核程序。
(普通)应用程序
为了保证系统能安全运行,普通应用程序只能执行非特权指令,运行在用户态。
3、操作系统的内核
问题:操作系统中的哪些功能应该由内核程序实现呢?
时钟管理
-
实现计时功能
-
在计算机的各种部件中,时钟是最关键的设备。
-
时钟的第一功能是计时
-
通过时钟中断的管理,可以实现进程的切换。
例如,在分时操作系统中采用时间片轮转调度,在实时系统中按截止时间控制运行,在批处理系统中通过时钟管理来衡量一个作业的运行程度等。
中断机制
引入中断技术的初衷是提高多道程序运行环境中CPU的利用率,(主要是针对外部设备)。后来逐步得到发展,形成了多种类型,成为操作系统各项操作的基础。
-
如,键盘或鼠标信息的输入、进程的管理和调度、系统功能的调用、设备驱动、文件访问等。
-
中断机制中,只有一小部分功能属于内核,它们负责保护和恢复中断现场的信息,转移控制权到相关的处理程序。这样可以减少中断的处理时间,提高系统的并行处理能力。
原语
- 是一种特殊的程序。
- 是最接近硬件的部分。
- 这种程序的运行具有原子性。不能被中断。
系统控制的数据结构及处理
对系统资源进行管理。
有的操作系统不把这部分功能归,为“内核功能"。也就是说,不同的操作系统,对内核功能的划分可能并不一样。
- 进程管理
- 存储器管理
- 设备管理
二、中断和异常的概念
在操作系统中引入核心态和用户态这两种工作状态后,就需要考虑这两种状态之间如何切换 。
操作系统内核工作在核心态,而用户程序工作在用户态。系统不允许用户程序实现核心态的功能,而它们又必须使用这些功能 。 因此,需要在核心态建立一些 “门”,以便实现从用户态进入核心态 。
在实际操作系统中,CPU 运行上层程序时唯一能进入这些 “门”的途径就是通过中断或异常。
发生中断或异常时,运行用户态的 CPU 会主即进入核心态,这是通过硬件实现的(PSW)。
中断是操作系统中非常重要的一个概念。原因是,操作系统的发展过程大体上就是一个想方设法不断提高资源利用率的过程,而提高资源利用率就需要在程序并未使用某种资源时,把它对那种资源的占有权释放,而这一行为就需要通过中断实现。
中断机制的诞生
早期的计算机:各程序只能串行执行,系统资源利用率低。
为了提高系统资源利用率,人们发明了操作系统(作为计算机的管理者),引入中断机制,实现了多道程序并发执行。
中断的概念和作用
由于操作系统的管理工作(比如进程切换、分配 I/O 设备等)需要使用特权指令,因此CPU要从用户态转为核心态。
- 当中断发生时,CPU立即进入核心态
- 当中断发生后,当前运行的进程暂停运行,并由操作系统内核对中断进行处理
- 对于不同的中断信号,会进行不同的处理
-
本质:发生中断就意味着需要操作系统介入,开展管理工作
-
中断可以使CPU从用户态切换为核心态,使操作系统获得计算机的控制权。
-
有了中断,才能实现多道程序并发执行。
广义中断
- 内中断(异常 / 例外 / 陷入)
- 自愿中断–指令中断
- 强迫中断
- 硬件故障
- 软件中断
- 外中断(中断)
- 外设请求
- 人工干预
异常(内中断)
-
信号的来源:CPU内部
-
与当前执行的指令有关
异常(Exception)也称内中断、例外或陷入(trap),指源自CPU执行指令内部的事件,如程序的非法操作码、地址越界、算术溢出、虚存系统的缺页及专门的陷入指令等引起的事件。对异常的处理一般要依赖于当前程序的运行现场,而且异常不能被屏蔽,一旦出现应立即处理。
自愿中断–指令中断
如系统调用时使用的访管指令(又叫陷入指令、trap指令)
强迫中断
- 硬件故障:如缺页
- 软件中断:如整数除0
中断(外中断)
-
狭义的中断
-
信号的来源:CPU外部
-
与当前执行的指令无关
中断(Interruption)也称外中断,指来自CPU执行指令以外的事件的发生
例:
- 设备发出的I/O结束中断,表示设备输入/输出处理已经完成,希望处理机能够向设备发下一个输入/输出请求,同时让完成输入/输出后的程序继续运行。
- 时钟中断,表示一个固定的时间片已到,让处理机处理计时、启动定时运行的任务等。
这一类中断通常是与当前指令执行无关的事件,即它们与当前处理机运行的程序无关。
外设请求
如:I/O 操作完成发出的断信号
人工干预
如:用户强行终止个进程
(外)中断处理的过程
- 执行完每个指令之后, CPU都要检查当前是否有外部中断信号
- 如果检测到外部中断信号,则需要保护被中断进程的CPU环境(如程序状态字PSW、程序计数器PC、各种通用寄存器)
- 根据中断信号类型转入相应的中断处理程序
- 恢复原进程的CPU环境并退出中断,返回原进程继续往下执行
- 关中断
CPU响应中断后,首先要保护程序的现场状态,在保护现场的过程中, CPU不应响应更高级中断源的中断请求。 - 保存断点
为保证中断服务程序执行完毕后能正确地返回到原来的程序,必须将原来的程序的断点(即程序计数器PC)保存起来。 - 引出中断服务程序
其实质是取出中断服务程序的入口地址送入程序计数器PC。 - 保存现场和屏蔽字
进入中断服务程序后,首先要保存现场,现场信息一般是指程序状态字寄存器PSWR和某些通用寄存器的内容。 - 开中断
允许更高级中断请求得到响应。 - 执行中断服务程序
这是中断请求的目的。 - 关中断
保证在恢复现场和屏蔽字时不被中断。 - 恢复现场和屏蔽字
将现场和屏蔽字恢复到原来的状态。 - 开中断、中断返回
中断服务程序 的 最后 一条指令通常是一条中断返回指令,使其返回到原程序的断点处,以便继续执行原程序 。
- 其中,1~3步是在 CPU 进入中断周期后, 由硬件自动(中断隐指令)完成的;4~9步由中断服务程序完成。
- 恢复现场是指在中断返回前,必须将寄存器的内容恢复到中断处理前的状态,这部分工作由中断服务程序完成 。
- 中断返回由中断服务程序的最后一条中断返回指令完成。
三、系统调用
系统调用概念
知识点回顾
操作系统作为用户和计算机硬件之间的接口,需要向上提供一些简单易用的服务。主要包括命令接口和程序接口。其中,程序接口由一组系统调用组成。
应用程序通过系统调用请求操作系统的服务。系统中的各种共享资源都由操作系统统一掌管,因此在用户程序中,凡是与资源有关的操作(如存储分配、I/O操作、文件管理等) ,都必须通过系统调用的方式向操作系统提出服务请求,由操作系统代为完成。这样可以保证系统的稳定性和安全性,防止用户进行非法操作。
系统调用分类
按功能分类:
- 设备管理
- 文件管理
- 进程控制
- 进程通信
- 内存管理
设备管理
完成设备的 请求、释放、启动 等功能
文件管理
完成文件的 读、写、创建、删除 等功能
进程控制
完成进程的 创建、撤销、阻塞、唤醒 等功能
进程通信
完成进程之间的 消息传递、信号传递 等功能
内存管理
完成内存的 分配、回收 等功能
系统调用执行过程
传递系统调用参数
→执行陷入指令(此时处于用户态)
→ 执行系统调用相应服务程序(此时处于核心态)
→ 返回用户程序
注意:
- 陷入指令是在用户态执行的,执行陷入指令之后立即引发一个内中断,从而CPU进入核心态
- 发出系统调用请求是在用户态,而对系统调用的相应处理在核心态下进行
- 陷入指令是唯一一个只能在用户态执行,而不可在核心态执行的指令
系统调用与库函数的区别
层次 | 作用 |
---|---|
普通应用程序 | 可直接进行系统调用,也可使用库函数。有的库函数涉及系统调用,有的不涉及。 |
编程语言 | 向上提供库函数。有时会将系统调用封装成库函数,以隐藏系统调用的一些细节,使上层进行系统调用更加方便。 |
操作系统 | 向上提供系统调用。 |
裸机 |
- 不涉及系统调用的库函数:如“取绝对值”的函数
- 涉及系统调用的库函数:如“创建一个新文件”的函数
习题
1、下列关于操作系统的说法中 ,错误的是( )。
Ⅰ. 在通用操作系统管理下的计算机上运行程序,需要向操作系统预定运行时间
Ⅱ. 在通用操作系统管理下的计算机上运行程序,需要确定起始地址,并从这个地址开始执行
Ⅲ. 操作系统需要提供高级程序设计语言的编译器
Ⅳ. 管理计算机系统资源是操作系统关心的主要问题
A. Ⅰ、 Ⅲ
B. Ⅱ 、Ⅲ
C. Ⅰ、Ⅱ、Ⅲ、Ⅳ
D. 以上答案都正确
答案:A
解析:
Ⅰ:通用操作系统使用时间片轮转调度算法,用户运行程序并不需要预先预定运行时间,因此Ⅰ项错误;Ⅱ:操作系统执行程序时,必须从起始地址开始执行,因此Ⅱ项正确;Ⅲ :编译器是操作系统的上层软件,不是操作系统需要提供的功能,因此Ⅲ项错误; IV:操作系统是计算机资源的管理者, 管理计算机系统资源是操作系统关心的主要问题,因此 IV 项正确 。 综合分析,Ⅰ和Ⅲ是错误选项,因此选 A 。
2、下列关于操作系统的说法中 ,错误的是( )。
Ⅰ. 批处理的主要缺点是需要大量内存
Ⅱ. 当计算机提供了核心态和用户态时,输入/输出指令必须在核心态下执行
Ⅲ. 操作系统中采用多道程序设计技术的最主要原因是为了提高 CPU 和外部设备的可靠性
Ⅳ. 操作系统中,通道技术是一种硬件技术
A. Ⅰ、 Ⅲ
B. Ⅱ 、Ⅲ
C. Ⅰ、Ⅱ、Ⅲ、Ⅳ
D. 以上答案都正确
答案:A
解析:
Ⅰ错误:批处理的主要缺点是缺少交互性。批处理系统的主要缺点是常考点,读者对此要非常敏感。Ⅱ正确:输入/输出指令需要中断操作,中断必须在核心态下执行。Ⅲ错误:多道性是为了提高系统利用率和吞吐量而提出的。Ⅳ正确:I/O 通道实际上是一种特殊的处理器,它具有执行 I/O 指令的能力,并通过执行通道程序来控制 I/O 操作。综上分析,Ⅱ、Ⅳ正确 。
3、( )是操作系统必须提供的功能 。
A. 图形用户界面(GUI)
B. 为进程提供系统调用命令
C. 中断处理
D. 编译源程序
答案:A
解析:
中断是操作系统必须提供的功能,因为计算机的各种错误都需要中断处理,核心态与用户态切换也需要中断处理。
4、在中断发生后,进入中断处理的程序属于( )。
A. 用户程序
B. 可能是应用程序,也可能是操作系统程序
C. 操作系统程序
D. 既不是应用程序,又不是操作系统程序
答案:C
解析:
进入中断处理的程序在核心态执行,是操作系统程序。
5、计算机区分核心态和用户态指令后,从核心态到用户态的转换是由操作系统程序执行后完成的,而用户态到核心态的转换则是由( )完成的 。
A. 硬件 B. 核心态程序
C. 用户程序 D. 中断处理程序
答案:A
解析:
计算机通过硬件中断机制完成由用户态到核心态的转换 。B 显然不正确,核心态程序只有在操作系统进入核心态后才可以执行。D 中的中断处理程序一般也在核心态执行,因此无法完成“转换成核心态”这一任务。若由用户程序将操作系统由用户态转换到核心态,则用户程序中就可使用核心态指令,这就会威胁到计算机的安全,所以 C 不正确 。
计算机通过硬件完成操作系统由用户态到核心态的转换,这是通过中断机制来实现的。发生中断事件时(有可能是用户程序发出的系统调用),触发中断,硬件中断机制将计算机状态置为核心态。
6、下列选项中,在用户态执行的是( )。
A. 命令解释程序 B. 缺页处理程序
C. 进程调度程序 D. 时钟中断处理程序
答案:A
解析:
缺页处理和时钟中断都属于中断,在核心态执行;进程调度是操作系统内核进程,无须用户干预,在核心态执行;命令解释程序属于命令接口,是 4 个选项中唯一能面对用户的,它在用户态执行。
7、在操作系统中,只能在核心态下执行的指令是( )。
A. 读时钟 B. 取数
C. 广义指令 D. 寄存器清零
答案:C
解析:
广义指令即系统调用命令,它必然工作在核心态,所以答案为 C。要注意区分“调用”和“执行”, 广义指令的调用可能发生在用户态,调用广义指令的那条指令不一定是特权指令,但广义指令存在于核心态中,所以执行一定在核心态。
8、下列选项中,必须在核心态下执行的指令是( ) 。
A. 从内存中取数 B. 将运算结果装入内存
C. 算术运算 D. 输入/输出
答案:D
解析:
输入/输出指令涉及中断操作,而中断处理是由系统内核负责的,工作在核心态 。而 A、B、C 选项均可通过使用汇编语言编程来实现,因此它们可在用户态下执行。
可用“水杯”例子思考如何排除 A 、B 、C。操作系统管理内存时, 管理的是内存中的数据放在哪里、哪里可以放数据、哪里不可以放数据(内存保护)、哪里空闲等问题,而内存中的数据是什么、怎么读和写,都不是核心态关心的。就好像操作系统管理的是杯子摆在哪里、哪些杯子中的水可以喝、哪些杯子中的水不能喝,而杯子中是水还是饮料、你是拿起杯子喝还是把吸管插进去吸,都不是操作系统关心的问题。“杯子”的例子可以帮助我们准确理解操作系统的任务,后续很多问题采用这个例子进行对比,就会十分清晰。