导航:首页 > 操作系统 > linux中断优先级

linux中断优先级

发布时间:2022-08-30 20:08:19

linux的进程优先级 NI 和 PR 有什么区别

用top -u 命令查看进程以及PID。命令如下:
$ top -u

PID — 进程id
USER — 进程所有者
PR — 进程优先级
NI — nice值。负值表示高优先级,正值表示低优先级
VIRT — 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
RES — 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
SHR — 共享内存大小,单位kb
S — 进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程
%CPU — 上次更新到现在的CPU时间占用百分比
%MEM — 进程使用的物理内存百分比
TIME+ — 进程使用的CPU时间总计,单位1/100秒
COMMAND — 进程名称(命令名/命令行)

② linux 用户进程 可以抢占内核进程吗

1.2.1 调度过程中关闭内核抢占
我们在上一篇linux内核主调度器schele(文章链接, CSDN, Github)中在分析主调度器的时候, 我们会发现内核在进行调度之前都会通过preempt_disable关闭内核抢占, 而在完成调度工作后, 又会重新开启内核抢占
参见主调度器函数schele
do {
preempt_disable(); /* 关闭内核抢占 */
__schele(false); /* 完成调度 */
sched_preempt_enable_no_resched(); /* 开启内核抢占 */

} while (need_resched()); /* 如果该进程被其他进程设置了TIF_NEED_RESCHED标志,则函数重新执行进行调度 */123456123456

这个很容易理解, 我们在内核完成调度器过程中, 这时候如果发生了内核抢占, 我们的调度会被中断, 而调度却还没有完成, 这样会丢失我们调度的信息.
1.2.2 调度完成检查need_resched看是否需要重新调度
而同样我们可以看到, 在调度完成后, 内核会去判断need_resched条件, 如果这个时候为真, 内核会重新进程一次调度.
这个的原因, 我们在前一篇博客中, 也已经说的很明白了,
内核在thread_info的flag中设置了一个标识来标志进程是否需要重新调度, 即重新调度need_resched标识TIF_NEED_RESCHED, 内核在即将返回用户空间时会检查标识TIF_NEED_RESCHED标志进程是否需要重新调度,如果设置了,就会发生调度, 这被称为用户抢占
2 非抢占式和可抢占式内核
为了简化问题,我使用嵌入式实时系统uC/OS作为例子
首先要指出的是,uC/OS只有内核态,没有用户态,这和Linux不一样
多任务系统中, 内核负责管理各个任务, 或者说为每个任务分配CPU时间, 并且负责任务之间的通讯.
内核提供的基本服务是任务切换. 调度(Scheler),英文还有一词叫dispatcher, 也是调度的意思.
这是内核的主要职责之一, 就是要决定该轮到哪个任务运行了. 多数实时内核是基于优先级调度法的, 每个任务根据其重要程度的不同被赋予一定的优先级. 基于优先级的调度法指,CPU总是让处在就绪态的优先级最高的任务先运行. 然而, 究竟何时让高优先级任务掌握CPU的使用权, 有两种不同的情况, 这要看用的是什么类型的内核, 是不可剥夺型的还是可剥夺型内核
2.1 非抢占式内核
非抢占式内核是由任务主动放弃CPU的使用权
非抢占式调度法也称作合作型多任务, 各个任务彼此合作共享一个CPU. 异步事件还是由中断服务来处理. 中断服务可以使一个高优先级的任务由挂起状态变为就绪状态.
但中断服务以后控制权还是回到原来被中断了的那个任务, 直到该任务主动放弃CPU的使用权时,那个高优先级的任务才能获得CPU的使用权。非抢占式内核如下图所示.

非抢占式内核的优点有
中断响应快(与抢占式内核比较);
允许使用不可重入函数;
几乎不需要使用信号量保护共享数据, 运行的任务占有CPU,不必担心被别的任务抢占。这不是绝对的,在打印机的使用上,仍需要满足互斥条件。
非抢占式内核的缺点有
任务响应时间慢。高优先级的任务已经进入就绪态,但还不能运行,要等到当前运行着的任务释放CPU
非抢占式内核的任务级响应时间是不确定的,不知道什么时候最高优先级的任务才能拿到CPU的控制权,完全取决于应用程序什么时候释放CPU
2.2 抢占式内核
使用抢占式内核可以保证系统响应时间. 最高优先级的任务一旦就绪, 总能得到CPU的使用权。当一个运行着的任务使一个比它优先级高的任务进入了就绪态, 当前任务的CPU使用权就会被剥夺,或者说被挂起了,那个高优先级的任务立刻得到了CPU的控制权。如果是中断服务子程序使一个高优先级的任务进入就绪态,中断完成时,中断了的任务被挂起,优先级高的那个任务开始运行。
抢占式内核如下图所示

抢占式内核的优点有
使用抢占式内核,最高优先级的任务什么时候可以执行,可以得到CPU的使用权是可知的。使用抢占式内核使得任务级响应时间得以最优化。
抢占式内核的缺点有:
不能直接使用不可重入型函数。调用不可重入函数时,要满足互斥条件,这点可以使用互斥型信号量来实现。如果调用不可重入型函数时,低优先级的任务CPU的使用权被高优先级任务剥夺,不可重入型函数中的数据有可能被破坏。
3 linux用户抢占
3.1 linux用户抢占
当内核即将返回用户空间时, 内核会检查need_resched是否设置, 如果设置, 则调用schele(),此时,发生用户抢占.
3.2 need_resched标识
内核如何检查一个进程是否需要被调度呢?
内核在即将返回用户空间时检查进程是否需要重新调度,如果设置了,就会发生调度, 这被称为用户抢占, 因此内核在thread_info的flag中设置了一个标识来标志进程是否需要重新调度, 即重新调度need_resched标识TIF_NEED_RESCHED
并提供了一些设置可检测的函数

函数
描述
定义

set_tsk_need_resched 设置指定进程中的need_resched标志 include/linux/sched.h, L2920
clear_tsk_need_resched 清除指定进程中的need_resched标志 include/linux/sched.h, L2926
test_tsk_need_resched 检查指定进程need_resched标志 include/linux/sched.h, L2931
而我们内核中调度时常用的need_resched()函数检查进程是否需要被重新调度其实就是通过test_tsk_need_resched实现的, 其定义如下所示
// http://lxr.free-electrons.com/source/include/linux/sched.h?v=4.6#L3093
static __always_inline bool need_resched(void)
{
return unlikely(tif_need_resched());
}

// http://lxr.free-electrons.com/source/include/linux/thread_info.h?v=4.6#L106
#define tif_need_resched() test_thread_flag(TIF_NEED_RESCHED)1234567812345678

3.3 用户抢占的发生时机(什么时候需要重新调度need_resched)
一般来说,用户抢占发生几下情况:
从系统调用返回用户空间;
从中断(异常)处理程序返回用户空间
从这里我们可以看到, 用户抢占是发生在用户空间的抢占现象.
更详细的触发条件如下所示, 其实不外乎就是前面所说的两种情况: 从系统调用或者中断返回用户空间
时钟中断处理例程检查当前任务的时间片,当任务的时间片消耗完时,scheler_tick()函数就会设置need_resched标志;
信号量、等到队列、completion等机制唤醒时都是基于waitqueue的,而waitqueue的唤醒函数为default_wake_function,其调用try_to_wake_up将被唤醒的任务更改为就绪状态并设置need_resched标志。
设置用户进程的nice值时,可能会使高优先级的任务进入就绪状态;
改变任务的优先级时,可能会使高优先级的任务进入就绪状态;
新建一个任务时,可能会使高优先级的任务进入就绪状态;
对CPU(SMP)进行负载均衡时,当前任务可能需要放到另外一个CPU上运行
4 linux内核抢占
4.1 内核抢占的概念
对比用户抢占, 顾名思义, 内核抢占就是指一个在内核态运行的进程, 可能在执行内核函数期间被另一个进程取代.
4.2 为什么linux需要内核抢占
linux系统中, 进程在系统调用后返回用户态之前, 或者是内核中某些特定的点上, 都会调用调度器. 这确保除了一些明确指定的情况之外, 内核是无法中断的, 这不同于用户进程.
如果内核处于相对耗时的操作中, 比如文件系统或者内存管理相关的任务, 这种行为可能会带来问题. 这种情况下, 内核代替特定的进程执行相当长的时间, 而其他进程无法执行, 无法调度, 这就造成了系统的延迟增加, 用户体验到”缓慢”的响应. 比如如果多媒体应用长时间无法得到CPU, 则可能发生视频和音频漏失现象.
编译内核时如果启用了对内核抢占的支持, 则可以解决这些问题. 如果高优先级进程有事情需要完成, 那么在启用了内核抢占的情况下, 不仅用户空间应用程序可以被中断, 内核也可以被中断,
linux内核抢占是在Linux2.5.4版本发布时加入的, 尽管使内核可抢占需要的改动特别少, 但是该机制不像抢占用户空间进程那样容易实现. 如果内核无法一次性完成某些操作(例如, 对数据结构的操作), 那么可能出现静态条件而使得系统不一致.
内核抢占和用户层进程被其他进程抢占是两个不同的概念, 内核抢占主要是从实时系统中引入的, 在非实时系统中的确也能提高系统的响应速度, 但也不是在所有情况下都是最优的,因为抢占也需要调度和同步开销,在某些情况下甚至要关闭内核抢占, 比如前面我们将主调度器的时候, linux内核在完成调度的过程中是关闭了内核抢占的.
内核不能再任意点被中断, 幸运的是, 大多数不能中断的点已经被SMP实现标识出来了. 并且在实现内核抢占时可以重用这些信息. 如果内核可以被抢占, 那么单处理器系统也会像是一个SMP系统
4.3 内核抢占的发生时机
要满足什么条件,kernel才可以抢占一个任务的内核态呢?
没持有锁。锁是用于保护临界区的,不能被抢占。
Kernel code可重入(reentrant)。因为kernel是SMP-safe的,所以满足可重入性。
内核抢占发生的时机,一般发生在:
当从中断处理程序正在执行,且返回内核空间之前。当一个中断处理例程退出,在返回到内核态时(kernel-space)。这是隐式的调用schele()函数,当前任务没有主动放弃CPU使用权,而是被剥夺了CPU使用权。
当内核代码再一次具有可抢占性的时候,如解锁(spin_unlock_bh)及使能软中断(local_bh_enable)等, 此时当kernel code从不可抢占状态变为可抢占状态时(preemptible again)。也就是preempt_count从正整数变为0时。这也是隐式的调用schele()函数
如果内核中的任务显式的调用schele(), 任务主动放弃CPU使用权
如果内核中的任务阻塞(这同样也会导致调用schele()), 导致需要调用schele()函数。任务主动放弃CPU使用权
内核抢占,并不是在任何一个地方都可以发生,以下情况不能发生
内核正进行中断处理。在Linux内核中进程不能抢占中断(中断只能被其他中断中止、抢占,进程不能中止、抢占中断),在中断例程中不允许进行进程调度。进程调度函数schele()会对此作出判断,如果是在中断中调用,会打印出错信息。
内核正在进行中断上下文的Bottom Half(中断下半部,即软中断)处理。硬件中断返回前会执行软中断,此时仍然处于中断上下文中。如果此时正在执行其它软中断,则不再执行该软中断。
内核的代码段正持有spinlock自旋锁、writelock/readlock读写锁等锁,处干这些锁的保护状态中。内核中的这些锁是为了在SMP系统中短时间内保证不同CPU上运行的进程并发执行的正确性。当持有这些锁时,内核不应该被抢占。
内核正在执行调度程序Scheler。抢占的原因就是为了进行新的调度,没有理由将调度程序抢占掉再运行调度程序。
内核正在对每个CPU“私有”的数据结构操作(Per-CPU date structures)。在SMP中,对于per-CPU数据结构未用spinlocks保护,因为这些数据结构隐含地被保护了(不同的CPU有不一样的per-CPU数据,其他CPU上运行的进程不会用到另一个CPU的per-CPU数据)。但是如果允许抢占,但一个进程被抢占后重新调度,有可能调度到其他的CPU上去,这时定义的Per-CPU变量就会有问题,这时应禁抢占。

③ Linux的进程优先级NI和PR有什么区别

nice(NI)和priority(PR),并不是同一个概念。
NICE值应该是熟悉Linux/UNIX的人很了解的概念了,它是反应一个进程“优先级”状态的值,其取值范围是-20至19,一共40个级别。这个值越小,表示进程”优先级”越高,而值越大“优先级”越低。nice值虽然不是priority,但是它确实可以影响进程的优先级。一般会把nice值叫做静态优先级,这也基本符合nice值的特点,就是当nice值设定好了之后,除非我们用renice去改它,否则它是不变的。
实用priority值表示PRI和PR值,或者叫动态优先级。priority的值在之前内核的O1调度器上表现是会变化的,所以也叫做动态优先级。在内核中,进程优先级的取值范围是通过一个宏定义的,这个宏的名称是MAX_PRIO,它的值为140。
而这个值又是由另外两个值相加组成的,一个是代表nice值取值范围的NICE_WIDTH宏,另一个是代表实时进程(realtime)优先级范围的MAX_RT_PRIO宏。
说白了就是,Linux实际上实现了140个优先级范围,取值范围是从0-139,这个值越小,优先级越高。nice值的-20到19,映射到实际的优先级范围是100-139。

④ Pc/xt能向cpu发出中断请求信号的是

计算机通常有很多输入输出设备,当这些设备需要服务时就向处理器提出要求,处理器在收到要求后就为这些设备提供服务。
当设备向处理器提出服务要求时,处理器会在执行完当前一条指令后相应设备要求,转向并执行相应的服务程序(中断服务程序ISR),在执行完毕后,处理器回返回到执行ISR之前的程序继续执行,这种处理方式即为中断方法,设备提出的请求称为中断请求(IRQ)。
在微处理器中,由可编程控制器(Programmable Interrupt Controller,PIC)负责管理系统中的中断请求。它通过连接到设备的中断请求引脚来接受设备发车的中断请求,当设备需要服务时,就激活中断请求引脚信号,PIC检测到信号后即向CPU发出中断信号。此时有三种情况:
1)PIC仅仅接收到1个中断请求信号,而此时CPU没有执行中断请求,那么PIC就直接向CPU发出中断信号。
2)PIC同时收到多个中断请求信号,而此时CPU没有执行中断请求,那么PIC比较中断请求信号中的优先级,选择优先级最高的向CPU发出中断信号。
3)PIC收到多个中断请求信号,此时CPU正在执行中断服务程序,那么PIC选出的最高优先级的中断请求信号然后再与正在执行的中断服务进行比较,基于比较结果来决定是否向CPU立刻发送中断信号。
但PIC向CPU的INT引脚发送中断信号时,CPU会立刻停下来并询问PIC要执行哪个中断服务请求。PIC则通过向数据总线发送与中断请求对应的中断号告知CPU执行哪个中断服务程序。CPU通过在数据总线读取的中断号,查询中断向量表,取得相应的中断服务程序的地址并开始执行中断服务程序,执行完毕后,处理器就接着执行被中断的程序。
上面所述是描述的I/O设备的中断处理过程,属于硬件中断的范畴,但是中断并非只有硬件,也可用于软件,通过使用int指令并使用其操作数指明中断号,就可以让CPU执行相应的ISR。

两片8259A芯片共可处理15级中断,从芯片的INT引脚连接到主芯片的IR2引脚上,即从芯片发出的中断信号做为主芯片IRQ2输入信号。主芯片的端口地址是0x20,从芯片的端口基地址是0xA0,IRQ9引脚的作用与PC/XT的IRQ2相同(PC/AT和PC/XT对应8086系列的不同数据总线,PC/XT是早期的型号,数据总线为8位,而PC/AT的数据总线为16位),即PC/AT机利用硬件电路把使用IRQ2的设备的IRQ2引脚重新定性到了PIC的IRQ9引脚上,并利用BIOS中的软件把IRQ9的中断int 71重新定向到IRQ2的中断 int 0x0A,这样使得使用IRQ2的PC/XT的8位设配卡在PC/AT机下仍能正常使用,做到了向下兼容。
在总线控制器的控制下,芯片有两种状态:编程状态和操作状态。编程状态是CPU通过IN和OUT指令对芯片进行初始化编程的状态,完成了初始化编程后,芯片就进入操作状态。此时芯片可随时响应外部设备提出的中断请求(IRQ0-IRQ15)。通过中断判优选择,芯片选择最高优先级的中断请求作为服务对象,通过CPU的INT引脚向CPU发出中断请求,CPU响应后,芯片从数据总线D7-D0将编程设定的对应中断请求的中断号送出,CPU接收到中断号,查找中断向量表,从而响应中断。

8086中断子系统

8086的微型机系统中采用的是8259A可编程中断控制器芯片,每个芯片可以管理8个中断源,通过多级相连,可以管理多个中断向量。PC/AT系列使用了两片上述芯片,如下图所示:

中断向量表

中断向量表有时也称为中断描述符表,它的作用就是通过中断号来确定对应中断的ISR的物理地址。8086微机支持256个中断,在实模式下,每个中断向量由4个字节组成,这四个字节指明了中断服务程序的段值和段内偏移,因此整个中断向量表的大小为256*4字节=1024字节。当8086微机启动时,ROM BIOS中的程序会在物理内存的0x0000:0x0000处初始化并设置中断向量表,各中断的默认ISR在BIOS中给出。中断向量表中的向量是按照中断号顺序排列,因此给定中断号N,对应的物理地址则为:0x0000:N*4(字节)。
BIOS的初始化操作设置了8259A芯片支持的16个硬件中断向量和BIOS提供的中断号为0x10-0x1f的中断调用功能向量等。对于实际没有使用的向量则填入临时的哑中断服务程序的地址,在系统引导加载操作系统时会根据实际需要修改某些中断向量的值。
对于Linux操作系统,在加载内核时需要用到BIOS提供的显示和磁盘读操作中断功能,在内核正常工作之前则会在setup.s程序中重新初始化8259A芯片并且在head.s程序中重新设置一张中断向量表(即中断描述符),完全抛弃了在BIOS中提供的中断服务功能。
在intel CPU运行在32位保护模式下时,需要使用中断描述符表IDT来管理中断或者异常。IDT是中断向量表的替代物,作用类似于中断向量,只不过除了含有中断服务程序ISR的地址外,还包括了有关特权级和描述符类别等信息。

Linux内核的中断处理

对linux内核来说,中断信号分为两类:硬件中断和软件中断(异常),中断用0-255之间的数字标示,其中int0-int31(0x00-0x1f)每个中断的功能由intel公司固定设定或者保留,属于软件中断(异常),这些中断是在CPU执行指令时探测到异常情况而引起的。通常还可分为故障和陷阱两类,中断int32-int255(0x20-0xff)可以由用户自己设定。
中断int32-int47对应8259A中断控制芯片发出的硬件中断请求信号IRQ0-IRQ15。
程序编程发出的系统调用中断设置为int128(0x80),系统调用中断是用户程序使用操作系统资源的唯一界面接口。
系统在初始化时,内核首先在head.s中使用一个“哑中断向量(中断描述符)”对中断描述符表中的所有的256个描述符进行默认设置。这个哑中断向量执行一个默认的“无中断”处理程序。此时发生中断而执行此程序时会显示信息:“未知中断(Unknown interrupt)”。这样使用哑中断向量的目的是为了防止出现一般保护性错误。
而对于系统中需要使用的中断则会在初始化过程中的init/main.c程序中重新设置这些中断描述符(即中断向量),让他们指向对应的实际处理程序。通常对int0-int31的初始化设置在traps.c程序中进行重新设置;系统调用中断int128的重新设置在kernel/sched.c中进行。
Linux内核设置IDT时使用了中断门和陷阱门两种描述符。区别是对标志寄存器EFLAGS中的“中断允许标志”IF的影响,中断门执行的中断会复位IF标志,可以避免其他中断干扰当前中断的处理,随后的中断结束指令iret会从堆栈上恢复IF标志的原值,而陷阱门执行的中断不会影响IF标志。

⑤ 关于嵌入式系统线程调度与优先级的问题,wince或linux

你刚讲了线程1的优秀级高,那么中断来了之后,肯定要先处理这个线程。
系统不会强制结束当前的线程,如果这样做可能导致死机活崩溃,因为该线程可能是系统的。
正常的做法是将该线程的数据备份,处理优先级高的,之后再回来继续工作

⑥ Linux 系统中的中断是不是没有中断优先级

关于中断嵌套:在linux内核里,如果驱动在申请注册中断的时候没有特别的指定,do_irq在做中断响应的时候,是开启中断的,如果在驱动的中断处理函数正在执行的过程中,出现同一设备的中断或者不同设备的中断,这时候新的中断会被立即处理,还是被pending,等当前中断处理完成后,再做处理。在2.4和2.6内核里,关于这一块是否有什么不同。 一般申请中断的时候都允许开中断,即不使用SA_INTERRUPT标志。如果允许共享则加上 SA_SHIRQ,如果可以为内核熵池提供熵值(譬如你写的驱动是ide之类的驱动),则再加上 SA_SAMPLE_RANDOM标志。这是普通的中断请求过程。对于这种一般情况,只要发生中断,就可以抢占内核,即使内核正在执行其他中断函数。这里有两点说明:一是因为linux不支持 中断优先级,因此任何中断都可以抢占其他中断,但是同种类型的中断(即定义使用同一个 中断线的中断)不会发生抢占,他们会在执行本类型中断的时候依次被调用执行。二是所谓 只要发生中断,就可以抢占内核这句是有一定限制的,因为当中断发生的时候系统由中断门 进入时自动关中断(对于x86平台就是将eflags寄存器的if位置为0),只有当中断函数被执行 (handle_IRQ_event)的过程中开中断之后才能有抢占。 对于同种类型的中断,由于其使用同样的idt表项,通过其状态标志(IRQ_PENDING和 IRQ_INPROGRESS)可以防止同种类型的中断函数执行(注意:是防止handle_IRQ_event被重入, 而不是防止do_IRQ函数被重入),对于不同的中断,则可以自由的嵌套。因此,所谓中断嵌套, 对于不同的中断是可以自由嵌套的,而对于同种类型的中断,是不可以嵌套执行的。以下简单解释一下如何利用状态标志来防止同种类型中断的重入:当某种类型的中断第一次发生时,首先其idt表项的状态位上被赋予IRQ_PENDING标志,表示有待处理。 然后将中断处理函数action置为null,然后由于其状态没有IRQ_INPROGRESS标志(第一次),故将其状态置上IRQ_INPROGRESS并去处IRQ_PENDING标志,同时将action赋予相应的中断处理函数指针(这里是一个重点,linux很巧妙的用法,随后说明)。这样,后面就可以顺利执行handle_IRQ_event进行中断处理,当在handle_IRQ_event中开中断后,如果有同种类型的中断发生,则再次进入do_IRQ函数,然后其状态位上加上IRQ_PENDING标志,但是由于前一次中断处理中加上的IRQ_INPROGRESS没有被清除,因此这里无法清除IRQ_PENDING标志,因此action还是为null,这样就无法再次执行handle_IRQ_event函数。从而退出本次中断处理,返回上一次的中断处理函数中,即继续执行handle_IRQ_event函数。当handle_IRQ_event返回时检查IRQ_PENDING标志,发现存在这个标志,说明handle_IRQ_event执行过程中被中断过,存在未处理的同类中断,因此再次循环执行handle_IRQ_event函数。直到不存在IRQ_PENDING标志为止。2.4和2.6的差别,就我来看,主要是在2.6中一进入do_IRQ,多了一个关闭内核抢占的动作,同时在处理中多了一种对IRQ_PER_CPU类型的中断的处理,其他没有什么太大的改变。这类IRQ_PER_CPU的中断主要用在smp环境下将中断绑定在某一个指定的cpu上。例如arch/ppc/syslib/open_pic.c中的openpic_init中初始化ipi中断的时候。 其实简单的说,中断可以嵌套,但是同种类型的中断是不可以嵌套的,因为在IRQ上发生中断,在中断响应的过程中,这个IRQ是屏蔽的,也就是这个IRQ的中断是不能被发现的。 同时在内核的临界区内,中断是被禁止的 关于do_IRQ可能会丢失中断请求:do_IRQ函数是通过在执行完handle_IRQ_event函数之后判断status是否被设置了IRQ_PENDING标志来判断是否还有没有被处理的同一通道的中断请求。 但是这种方法只能判断是否有,而不能知道有多少个未处理的统一通道中断请求。也就是说,假如在第一个中断请求执行handle_IRQ_event函数的过程中来了同一通道的两个或更多中断请求,而这些中断不会再来,那么仅仅通过判断status是否设置了IRQ_PENDING标志不知道到底有多少个未处理的中断,handle_IRQ_event只会被再执行一次。这算不算是个bug呢? 不算,只要知道有中断没有处理就OK了,知道1个和知道N个,本质上都是一样的。作为外设,应当能够处理自己中断未被处理的情况。不可能丢失的,在每一个中断描述符的结构体内,都有一个链表,链表中存放着服务例程序关于中断中使用的几个重要概念和关系: 一、基本概念 1. 产生的位置 发生的时刻 时序 中断 CPU外部 随机 异步 异常 CPU正在执行的程序 一条指令终止执行后 同步 2.由中断或异常执行的代码不是一个进程,而是一个内核控制路径,代表中断发生时正在运行的进程的执行 中断处理程序与正在运行的程序无关 引起异常处理程序的进程正是异常处理程序运行时的当前进程 二、特点 (2)能以嵌套的方式执行,但是同种类型的中断不可以嵌套 (3)尽可能地限制临界区,因为在临界区中,中断被禁止 2.大部分异常发生在用户态,缺页异常是唯一发生于内核态能触发的异常 缺页异常意味着进程切换,因此中断处理程序从不执行可以导致缺页的操作 3.中断处理程序运行于内核态 中断发生于用户态时,要把进程的用户空间堆栈切换到进程的系统空间堆栈,刚切换时,内核堆栈是空的 中断发生于内核态时, 不需要堆栈空间的切换 三、分类 1.中断的分类:可屏蔽中断、不可屏蔽中断 2.异常的分类: 分类 解决异常的方法 举例 故障 那条指令会被重新执行 缺页异常处理程序 陷阱 会从下一条指令开始执行 调试程序

⑦ linux进程处于内核态会被更高优先级抢占吗

内核态抢占(Kernel
Preemption)
在2.6
kernel以前,kernelcode(中断和系统调用属于kernel
code)会一直运行,直到code被完成或者被阻塞(系统调用可以被阻塞)。在
2.6kernel里,Linuxkernel变成可抢占式。当从中断处理例程返回到内核态(kernel-space)时,kernel会检查是否可以抢占和是否需要重新调度。kernel可以在任何时间点上抢占一个任务(因为中断可以发生在任何时间点上),只要在这个时间点上kernel的状态是安全的、可重新调度的。

阅读全文

与linux中断优先级相关的资料

热点内容
记事本dos命令 浏览:272
服务器如何搭建多个节点 浏览:324
acx算法 浏览:256
幽冥诡匠漫画全集用什么app可以看 浏览:1001
租用服务器为什么越来越慢 浏览:960
算法创新就业方向 浏览:423
算法最优解作者 浏览:867
通达信红绿宝塔线指标源码 浏览:667
app是什么东西合法吗 浏览:231
怎么锁app视频教程 浏览:841
迅捷pdf注册码生成器 浏览:748
androidsdkosx 浏览:303
压缩面膜纸荧光 浏览:841
app怎么分身三个 浏览:744
电影bt下载源码 浏览:422
iwatch屏幕加密芯片 浏览:570
公安主题网站源码 浏览:986
天津市服务器供应商云服务器 浏览:115
数控车床子程序编程 浏览:112
floydwarshall算法 浏览:719