操作系统——运行机制和体系结构、中断和异常、系统调用


前言

本文的主要内容仍然是操作系统的一些基础内容,包括操作系统的运行机制和体系结构、中断和异常以及系统调用,重点理解核心态和用户态的适用情况、内外中断的区别以及系统调用和库函数的区别。


一、操作系统的运行机制和体系结构

操作系统的运行机制和体系结构的大框架如下图所示。
请添加图片描述

1、运行机制

代码会被翻译为一系列的机器指令,而这些指令就是处理器能够识别和执行的最基本的命令。
指令分为特权指令和非特权指令,特权指令不允许普通用户使用,比如内存清理指令等高权限指令;非特权指令就是简单的指令,比如加减乘除等运算指令。
那么CPU如何判断是否执行特权指令呢?处理器用程序状态字寄存器(PSW)中的某个标志位来标识当前处理器处于什么状态,这两种状态分别为用户态(也称为目态)和核心态(也称为管态),例如用0标志用户态,用1标志核心态。
当处理器的状态为用户态时,CPU只能执行非特权指令,当处理器的状态为核心态时,CPU不仅可以执行非特权指令,还可以执行特权指令。需要注意的是,陷入指令是唯一一个只能在用户态下执行,而不能在核心态下执行的指令。
正是由于这两种状态的存在,就出现了两种程序,分别是内核程序应用程序
操作系统的内核程序是系统的管理者,既可以执行特权指令,也可以执行非特权指令,其运行在核心态;为了保证系统能够安全的运行,普通应用程序只能执行非特权指令,其运行在用户态。

2、操作系统内核

计算机系统的层次结构如下图所示。
请添加图片描述
由上图可知,操作系统这一层还可细分为内核层和非内核层,各层具体包括的功能在图中也已清楚地展示了。
内核是计算机上配置的底层软件,是操作系统最基本、最核心的部分。实现操作系统内核功能的程序就是内核程序。
操作系统内核各功能的解释如下图所示。
请添加图片描述

3、操作系统的体系结构

如果内核中只包含一些必不可少的功能,即时钟管理、中断处理以及原语等,则该内核称为微内核;如果在此基础上还包含进程管理、存储器管理、设备管理等功能,则该内核称为大内核
微内核和大内核的优缺点如下图所示。
在这里插入图片描述
可以看到,由于大内核包含的功能多,因此其结构比较混乱,是难以维护的,但是其性能是比较高的;相反,微内核所包含的功能较少,因此其结构清晰且方便维护,但缺点是需要在核心态和用户态之间频繁的切换,性能较低。


二、中断和异常

中断和异常这部分会介绍中断机制的诞生、中断的概念和作用、中断的分类以及外中断的处理过程。
在这里插入图片描述

1、中断的诞生、概念及作用

早期的计算机中,各个程序只能串行的执行,程序移入内存之后开始运行,然后等待I/O设备输出,输出结果后该程序才能从内存移除,然后接着移入下一道程序。这种方式下系统资源利用率很低。
为了解决这一问题,操作系统就应运而生了,在其中引入中断机制,实现了多道程序并发执行。
发生中断就意味着需要操作系统介入,从而开展管理工作。操作系统的管理工作有诸如进程的切换、分配I/O设备等,它们的执行需要使用特权指令,因此CPU要从用户态转为核心态。
CPU从用户态切换为核心态是通过中断实现的,并且中断是唯一途径。
核心态到用户态的切换是通过执行一个特权指令,即将程序状态字(PSW)的标志位设置为用户态。
切换到核心态之后,操作系统获得了计算机的控制权,所以说有了中断,才能实现多道程序的并发执行。
当中断发生时,CPU立即进入核心态;中断发生后,当前运行的进程暂停运行,并由操作系统内核对中断进行处理。

2、中断的分类

中断的分类如下图所示,中断分为内中断和外中断,其中内中断又称为异常。
在这里插入图片描述
区分内外中断看信号的来源是来自CPU内部还是外部。如果来自CPU内部,则是内中断,它与当前执行的指令有关;如果来自CPU外部,则是外中断,它与当前执行的指令无关。
中断的另一种分类方式如下图所示。
在这里插入图片描述

3、外中断的处理过程

外中断的处理过程如下:
1、有一系列的指令,CPU执行完每个指令后都要检查当前是否有外部中断信号;
2、如果检测到外部中断信号,则需要保护被中断进程的CPU环境,比如程序状态字PSW、程序计数器PC以及各种通用寄存器等;
3、根据中断信号的类型转入相应的中断处理程序;
4、恢复原进程的CPU环境并退出中断,返回原进程继续执行。
接下来对中断和异常这部分做一个总结,如下图所示。
请添加图片描述


三、系统调用

1、系统调用的概念和作用

在上一节 操作系统——概念、功能、特征及发展分类 中提到过,程序接口由一组系统调用组成。
系统调用是操作系统提供给应用程序(编程人员)使用的接口,可以理解为一种可供应用程序调用的特殊函数,应用程序可以发出系统调用请求来获得操作系统的服务。
应用程序通过系统调用请求操作系统的服务,系统中的各种共享资源都由操作系统统一管理,因此在用户程序请求中,凡是与资源有关的操作(如存储分配、I/O操作、文件管理、设备管理等),都必须通过系统调用的方式向操作系统提出服务请求,由操作系统代为完成,这样可以保证系统的稳定性和安全性,防止用户进行非法操作。
下图是系统调用按功能分类后的结果,各功能的具体作用也罗列了出来。
在这里插入图片描述
系统调用的相关处理涉及到对系统资源和进程的管理,这些功能需要执行一些特权指令才能完成,因此系统调用的相关处理需要在核心态下进行。

2、系统调用与库函数的区别

系统调用与库函数的区别如下图所示。
在这里插入图片描述
不涉及系统调用的库函数:如取绝对值等简单运算,这个时候在用户态下就可以完成;涉及系统调用的库函数:如创建一个新文件等,此时就需要在核心态下完成了。
系统调用是操作系统向上层提供的接口,有的库函数是对系统调用的进一步封装,当今编写的应用程序大多是通过高级语言提供的库函数,然后通过这些库函数间接地进行系统调用。

3、系统调用的背后过程

系统调用的背后过程如下图所示,它会把高级语言编译为汇编语言,然后进行一系列的指令操作,通过int(interrupt,中断)指令从用户态切换为核心态执行系统调用。
在这里插入图片描述
大体的流程为:传递系统调用参数——>执行陷入(int)指令(用户态下)——>执行系统调用相应服务程序(核心态下)——>返回用户程序
需要注意的是:
1、陷入(int)指令是在用户态执行的,执行陷入指令之后立即引发一个内中断,CPU进入核心态;
2、发出系统调用请求是在用户态,而对系统调用的相应处理在核心态下进行;
3、陷入指令是唯一一个只能在用户态下执行,而不能在核心态下执行的指令。
接下来对系统调用这部分做一个简单的总结,如下图所示。
请添加图片描述


总结

以上就是操作系统——运行机制和体系结构、中断和异常、系统调用的所有内容了,这些是操作系统中比较基础的内容,重点理解本文中核心态和用户态的适用情况、内外中断的区别以及系统调用和库函数的区别!
参考视频:
操作系统的运行机制和体系结构
中断和异常
系统调用

猜你喜欢

转载自blog.csdn.net/weixin_42570192/article/details/125833021