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

转自:http://blog.csdn.net/yanlinwang/article/details/8169725

版权声明:本文为博主原创文章,未经博主允许不得转载。

最近学习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的执行级别提高,这样就可以屏蔽掉很多的中断,从而保证数据的一致性了。一般,为了保证系统的性能,临界区都很小,并且不会经常出现。

时间: 2024-11-11 03:05:31

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

linux系统中中断已连接的用户

1.用w命令查看当前系统登录的用户 [[email protected] ~]# w 02:48:04 up 4:35, 3 users, load average: 0.00, 0.01, 0.05 USER TTY FROM [email protected] IDLE JCPU PCPU WHAT root pts/0 192.168.1.100 02:26 4.00s 0.06s 0.02s w lxj2 pts/1 192.168.1.100 02:47 58.00s 0.00s 0.

Linux时钟和中断

转自:http://www.ibm.com/developerworks/cn/linux/1307_liuming_linuxtime1/ 无论这些硬件多么复杂,Linux 内核只需要两种功能: 一是定时触发中断的功能: 另一个是维护和读取当前时间的能力. 为了满足应用和内核自己的需求,内核时间系统必须提供以下三个基本功能: 提供系统 tick 中断(驱动调度器,实现分时) 维护系统时间 维护软件定时器

Linux 系统内存分析

1. 内存基本介绍 1.计算机基本结构: 电脑之父--冯·诺伊曼提出了计算机的五大部件:输入设备.输出设备.存储器.运算器和控制器 如图: 输入设备:键盘鼠标等 CPU:是计算机的运算核心和控制核心,让电脑的各个部件顺利工作,起到协调和控制作用. 存储器:一系列的存储设备,硬盘,内存等 输出设备:如打印机,扬声器等 2.存储器: 我们看一下系统中存储器的层次结构: 图中L0-L5分别表示系统中所有存储器的层次结构,其中包括高速缓存,主存,磁盘等. 越上层的存储器造价越高,速度也越快,也更加靠近c

linux系统下定时任务

linux系统定时任务 1.Linux系统定时任务at (1)作用:定时任务,指定一个时间执行一个任务,只能执行一次 (2)用法:at [option] TIME 选项:-V 显示版本信息: -l:列出指定队列中等待运行的作业:相当于atq -d: 删除指定的作业:相当于atrm -c:查看具体作业任务 -f/path/from/somefile:从指定的文件中读取任务 -m:当任务被完成之后,将给用户发送邮件,即使没有标准输出 注:作业执行命令的结果中的标准输出和错误以邮件通知给相关用户, a

linux中断源码分析 - 概述(一)

本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 可编程中断控制器(PIC.APIC) 为了方便说明,这里我们将PIC和APIC统称为中断控制器.中断控制器是作为中断(IRQ)和CPU核之间的一个桥梁而存在的,每个CPU内部都有一个自己的中断控制器,中断线并不是直接与CPU核相连,而是与CPU内部或外部的中断控制器相连.而为什么叫做可编程中断控制器,是因为其本身有一定的寄存器,CPU可以通过操作设置中断控制器屏蔽某个中断引脚的信号,实现硬件上的中断屏蔽.中断

再思linux内核在中断路径内不能睡眠/调度的原因(2010)【转】

转自:http://blog.csdn.net/maray/article/details/5770889 Linux内核中断路径中不能睡眠,为什么? 这里就行了很深入的讨论,值得一看:http://bbs2.chinaunix.net/viewthread.php?tid=1618430 但是,他们的讨论最后没有得出一个明确的结论.其中,cskyrain在8楼 的思考触及到了一个要点,但是没有深入展开: [c-sharp] view plain copy 1楼 发表于 2009-11-24 2

在linux系统中I/O 调度的选择 (转)

I/O 调度算法再各个进程竞争磁盘I/O的时候担当了裁判的角色.他要求请求的次序和时机做最优化的处理,以求得尽可能最好的整体I/O性能. 在linux下面列出4种调度算法 CFQ (Completely Fair Queuing 完全公平的排队)(elevator=cfq): 这是默认算法,对于通用服务器来说通常是最好的选择.它试图均匀地分布对I/O带宽的访问.在多媒体应用, 总能保证audio.video及时从磁盘读取数据.但对于其他各类应用表现也很好.每个进程一个queue,每个queue按

Linux系统运维与架构设计之Linux概述

Linux系统运维与架构设计之Linux概述 Linux系统运维与架构设计 1.1 浅谈计算机系统 1.1.1 计算机硬件系统 现代计算机是基于冯·诺依曼体系结构,由运算器.控制器.存储器.输入设备.输出设备五大部分组成,如下图所示 它们各司其职,完成了数据的计算.存储.传输任务. 下面是它们各个组件的功能介绍: CPU:也被称为中央处理器,由运算器和控制器组成,其主要作用是数据计算(从内存中获取指令并执行后将结果返回给内存或者写入到磁盘)和控制其他设备(声卡显卡,鼠标键盘)协同工作. 内存:采

Linux系统编程——进程调度浅析

概述 操作系统要实现多进程.进程调度不可缺少. 有人说,进程调度是操作系统中最为重要的一个部分.我认为这样的说法说得太绝对了一点,就像非常多人动辄就说"某某函数比某某函数效率高XX倍"一样.脱离了实际环境.这些结论是比較片面的. 而进程调度到底有多重要呢? 首先,我们须要明白一点:进程调度是对 TASK_RUNNING 状态的进程进行调度.假设进程不可运行(正在睡眠或其它),那么它跟进程调度没多大关系. 所以,假设你的系统负载很低,盼星星盼月亮才出现一个可运行状态的进程.那么进程调度也