Linux系统的中断、系统调用和调度概述【转】

简介:

最近学习Linux操作系统,关于中断系统调用和进程的级别总是感觉有些模糊的地方,特在此做个小结,整理下思路。

所谓的中断就是在计算机执行程序的过程中,由于出现了某些特殊事情,使得CPU暂停对程序的执行,转而去执行处理这一事件的程序。等这些特殊事情处理完之后再回去执行之前的程序。中断一般分为三类:1、由计算机硬件异常或故障引起的中断,称为内部异常中断;2、由程序中执行了引起中断的指令而造成的中断,称为软中断(这也是和我们将要说明的系统调用相关的中断);3、由外部设备请求引起的中断,称为外部中断。简单来说,对中断的理解就是对一些特殊事情的处理。

与中断紧密相连的一个概念就是中断处理程序了。当中断发生的时候,系统需要去对中断进行处理,对这些中断的处理是由操作系统内核中的特定函数进行的,这些处理中断的特定的函数就是我们所说的中断处理程序了。

另一个与中断紧密相连的概念就是中断的优先级。中断的优先级说明的是当一个中断正在被处理的时候,处理器能接受的中断的级别。中断的优先级也表明了中断需要被处理的紧急程度。每个中断都有一个对应的优先级,当处理器在处理某一中断的时候,只有比这个中断优先级高的中断可以被处理器接受并且被处理。优先级比这个当前正在被处理的中断优先级要低的中断将会被忽略。

典型的中断级如下所示

当发生软件中断时,其他所有的中断都可能发生并被处理;但当发生磁盘中断时,就只有时钟中断和机器错误中断能被处理了。

在讲系统调用之前,先说下进程的执行在系统上的两个级别:用户级和核心级,也称为用户态和系统态(user mode  and kernel mode)。程序的执行一般是在用户态下执行的,但当程序需要使用操作系统提供的服务时,比如说打开某一设备、创建文件、读写文件等,就需要向操作系统发出调用服务的请求,这就是系统调用。Linux系统有专门的函数库来提供这些请求操作系统服务的入口,这个函数库中包含了操作系统说提供的对外服务的接口。当进程发出系统调用之后,它所处的运行状态就会由用户态变成核心态。但这个时候,进程本身其实并没有做什么事情,这个时候是由内核在做相应的操作,去完成进程所提出的这些请求。

系统调用和中断的关系就在于,当进程发出系统调用申请的时候,会产生一个软件中断。产生这个软件中断以后,系统会去对这个软中断进行处理,这个时候进程就处于核心态了。

那么用户态和核心态之间的区别是什么呢?(以下区别摘至《UNIX操作系统设计》)

1、用户态的进程能存取它们自己的指令和数据,但不能存取内核指令和数据(或其他进程的指令和数据)。然而,核心态下的进程能够存取内核和用户地址

2、某些机器指令是特权指令,在用户态下执行特权指令会引起错误

对此要理解的一个是,在系统中内核并不是作为一个与用户进程平行的估计的进程的集合,内核是为用户进程运行的。

如何去理解上面所说的区别,特别是区别1呢?真正理解这点,需要对进程在内存中的表示有个大致的理解。

每个程序需要被装入(全部或部分)装入内存后才能开始运行,在32位机器中,每个进程都有4G的虚拟地址空间。但是对这4G的空间并不是全部都可以被进程使用的,在Linux中,对这4G的空间的大致划分如下

因此,从原则上来说,在进程中用户能使用的虚拟地址空间是只有3G的。正常情况下,用户程序在用户态运行的时候,只能访问在这3G范围内的地址(当然也不是所有地址都能访问)。当进程由于系统调用而进入核心态时,这时系统内核会执行相应的操作,它能访问自己1G的地址空间,同时也能访问3G的用户地址空间。而用户进程的指令的数据是存在与那3G的地址空间中的。当然还有进程的栈等部分。

细分来说的话,一个进程在内存中一般包含以下部分,数据段、指令段、运行时堆、栈等。示意图如下

内核自己的栈这在最上层的1G的地址空间内,这是只能由内核访问的部分。

 

在说进程调度之前,首先整理下进程可能的各种状态。首先我们知道进程的运行状态是分为核心态和用户态。其他的进程状态包括如下

进程未被执行,但出于就绪状态,只要内核调度它,即可执行

进程正在睡眠中并且存在主存中

进程处于就绪状态,但处在二级存储器中

进程在睡眠中,且在二级存储器中

进程执行完核心态的操作,正要返回用户态时,内核做了进程调度,切换了上下文

进程刚被创建

进程调用了exit,处于僵死状态

进程之间的状态转换示意图如下,箭头指明了转换的方向

进程的各种状态的转换比较复杂,这里主要关注进程的两个运行状态、睡眠以及从就绪到运行的转换

从示意图中可以看出,当发生中断或者系统调用时,进程由用户态转成核心态。但进程在核心态运行时,是不能被抢占的,因此只有当进程由核心态进入睡眠状态时,或者进程处于用户态时,内核才允许做进程调度,切换上下文。而处于就绪状态的进程当被内核调度开始运行的时候,首先是进入核心态的。

那么为什么,进程在核心态运行的时候,不允许做进程调度呢?因为在核心态运行的时候,需要访问一些全局核心数据结构中的信息。如果运行在核心态时的进程调度,那么会改变内核运行时的进程上下文,而这些不同的进程上下文对同一个核心数据可能会有不同的操作要求,这样将有可能会破坏全局核心数据结构中的信息。为了保证内核核心数据的一致性,当进程处于核心态时,是不允许进行上下文切换的。

这就涉及到另一个问题,中断是在任何时刻都能发生的,并且对中断的处理也可能影响内核数据的一致性。那么,但进程在核心态运行时,对于发生中断的情况又如何保证内核数据的一致性呢?解决的方法大致分为两类,一种是简单地在核心态时,禁止所有的中断,但这样会降低对中断的响应速度;另一种方法是设立临界区,找出操作语句中可能会导致内核数据不一致的地方,然后将这部分设为临界区。但CPU执行临界区代码时,把CPU的执行级别提高,这样就可以屏蔽掉很多的中断,从而保证数据的一致性了。一般,为了保证系统的性能,临界区都很小,并且不会经常出现。
















本文转自张昺华-sky博客园博客,原文链接:http://www.cnblogs.com/sky-heaven/p/5746732.html,如需转载请自行联系原作者


目录
打赏
0
0
0
0
64
分享
相关文章
Linux系统中的cd命令:目录切换技巧
踏过千山,越过万水,人生就是一场不断前行的旅程,总充满了未知与挑战。然而,“cd”命令如同你的旅伴,会带你穿梭在如棋盘一般的文件系统中,探索每一处未知。希望你能从“cd”命令中找到乐趣,像是掌控了一种络新妙的魔法,去向未知进发,开始你的探索之旅。
83 24
|
3天前
|
Linux系统下快速批量创建和删除文件的方法
总的来说,使用shell脚本来批量处理文件是一种非常强大的工具,只要你愿意花时间学习和实践,你会发现它能大大提高你的工作效率。
40 19
Linux系统之su命令的基本使用
Linux系统之su命令的基本使用
60 2
Linux系统之su命令的基本使用
在Ubuntu Linux系统下如何搭建并安装EDK2
以上就是在Ubuntu Linux系统下搭建并安装EDK2的过程。这个过程可能会有些复杂,但只要按照步骤一步步来,应该不会有太大问题。如果在过程中遇到任何问题,都可以在网上找到相应的解决方案。希望这个指南能对你有所帮助!
46 17
|
27天前
|
Linux系统资源管理:多角度查看内存使用情况。
要知道,透过内存管理的窗口,我们可以洞察到Linux系统运行的真实身姿,如同解剖学家透过微观镜,洞察生命的奥秘。记住,不要惧怕那些高深的命令和参数,他们只是你掌握系统"魔法棒"的钥匙,熟练掌握后,你就可以骄傲地说:Linux,我来了!
113 27
|
1月前
|
Linux系统ext4磁盘扩容实践指南
这个过程就像是给你的房子建一个新的储物间。你需要先找到空地(创建新的分区),然后建造储物间(格式化为ext4文件系统),最后将储物间添加到你的房子中(将新的分区添加到文件系统中)。完成这些步骤后,你就有了一个更大的储物空间。
133 10
|
1月前
|
微服务2——MongoDB单机部署4——Linux系统中的安装启动和连接
本节主要介绍了在Linux系统中安装、启动和连接MongoDB的详细步骤。首先从官网下载MongoDB压缩包并解压至指定目录,接着创建数据和日志存储目录,并配置`mongod.conf`文件以设定日志路径、数据存储路径及绑定IP等参数。之后通过配置文件启动MongoDB服务,并使用`mongo`命令或Compass工具进行连接测试。此外,还提供了防火墙配置建议以及服务停止的两种方法:快速关闭(直接杀死进程)和标准关闭(通过客户端命令安全关闭)。最后补充了数据损坏时的修复操作,确保数据库的稳定运行。
82 0
|
24天前
|
linux命令详细说明以及案例
本文介绍了常用的 Linux 命令及其详细说明和示例,包括:`ls`(列出目录内容)、`cd`(更改目录)、`rm` 和 `mv`(删除与移动文件)、`grep`(搜索文本)、`cat`(显示文件内容)以及 `chmod`(更改文件权限)。每个命令均配有功能描述、选项说明及实际案例,帮助用户更好地掌握 Linux 命令的使用方法。
134 56
|
2天前
|
Linux命令的基本格式解析
总的来说,Linux命令的基本格式就像一个食谱,它可以指导你如何使用你的计算机。通过学习和实践,你可以成为一个真正的“计算机厨师”,创造出各种“美味”的命令。
34 15
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等