随想录(中断中真的不能上下文切换吗)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

记得在读书的时候,操作系统的老师就告诉我们,在cpu处理中断的时候,是不能进行上下文切换的。至于原因是什么,就说是影响中断啦、影响性能什么的。再往下深层次一点,就没有了。当然了,对老师的话,我们当然是深信不疑的。

等到后来自己port ucos2实时系统的时候发现,原来在中断返回的时候是可以进行中断上下文切换的。为什么呢?因为cpu刚刚处理了中断,而原来某个高优先级的任务可能刚刚在中断里面被唤醒,它需要理解被执行,所以在中断返回前通过必要的手段切换到这个新的实时任务运行。到了这里,我又想起了老师说过不可以在中断上下文切换的啊,为什么这里又可以了。

后来等到自己有能力阅读linux代码的时候,发现原来linux在中断返回kernel模式之前也是可以进行上下文切换的。ucos和linux都是广泛使用的代码,既然它们都在中断中进行了上下文切换,那么难到真的老师讲错了吗?

后来一天晚上,自己看书的时候,忽然顿悟了。老师说的中断里面不能上下文切换,应该是不能在中断处理到一半的时候进行上下文切换。那如果非要这么做,会带来什么后果呢?我想大约有这么几点,第一,被中断的任务会收到无端的牵连,因为如果中断不发生,它本来有机会继续运行的,现在这种切换反而会导致cpu调度的不公平,但是不会紊乱;第二,嵌套的中断也会因为cpu无端的上下文切换没有得到及时地处理,从而性能大幅度下降,某些硬件行为甚至变得不可测;第三,中断上下文切换花费时间较长,影响cpu处理其他中断,及时性有损失。

这么说来,老师没有说错,linux和ucos也没有错,这是我们自己没有找到root cause而已。这也告诉我自己,学习从来不只是获得知识而已,它还是一个思考和辨析的过程。

时间: 2024-10-04 13:16:08

随想录(中断中真的不能上下文切换吗)的相关文章

逆向思维在项目开发中真的很重要

最近一直和我的小组开发一个投资类型的网站,网站的整体已经完成得差不多了,客户今天突然提出了一个要求,希望能够在所有人退出当前聊天大厅后,后面进入的人不能够看到之前用户的聊天记录(原来是可以看到的).由于聊天室代码是别人写的,且基本算木有注释,也木有相关的文档.研究源码太耗时间了,由于聊天数据比较小,聊天室窗口是从messages表中读取的数据,所以打算当用户退出时,执行某一机制将Ajax_chat_messages表中对应聊天室的数据copy到一个新的Chat_messages表中,同时清除Aj

linux内核学习:中断中推后执行的部分

软中断-softirq 特点 相同和不同的软中断都可以在不同处理器上同时执行 一个软中断不会抢占另一个软中断 何时执行 从中断程序返回时 ksoftirqd线程中 显示调用 软中断最多有32个,一个32位的整型数据可以被用来标记刮起的软中断 使用策略 软中断应用于确实需要的场合,目前只有网络驱动和SCSI驱动中使用.另外,内核定时器和tasklet建立在软中断之上. 使用方法 注册软中断 void open_softirq(int nr, void (*action)(struct softir

转载:2410中断中SRCPND和INTPND清零的疑问

2410中断中SRCPND和INTPND清零的疑问SRCPND是中断源引脚寄存器,某个位被置1表示相应的中断被触发,但我们知道在同一时刻内系统可以触发若干个中断,只要中断被触发了,SRCPND的相应位便被置1,也就是说SRCPND在同一时刻可以有若干位同时被置1,然而INTPND则不同,他在某一时刻只能有1个位被置1,INTPND 某个位被置1(该位对应的中断在所有已触发的中断里具有最高优先级且该中断没有被屏蔽),则表示CPU即将或已经在对该位相应的中断进行处理,于是我们可以有一个总结:SRCP

中断中需要面对的问题(二)

中断中有些问题需要面对. 隔离变化 不知道您有没有意识到,中断处理前面这部分的设计是何等的简单优美.人是高度智能化的,能够对遇到的各种意外情况做有针对性的处理,计算机相比就差距甚远了,它只能根据预定的程序进行操作.对于计算机来说,硬件支持的,只能是中断这种电信号传播的方式和CPU对这种信号的接收方法,而具体如何处理这个中断,必须得靠操作系统实现.操作系统支持所有事先能够预料到的中断信号,理论上都不存在太大的挑战,但在操作系统安装到计算机设备上以后,肯定会时常有新的外围设备被加入系统,这可能会带来

Java中真的只有值传递么?

Java中真的只有值传递么? (本文非引战或diss,只是说出自己的理解,欢迎摆正心态观看或探讨) 回顾值传递和引用传递 关于Java是值传递还是引用传递,网上有不一样的说法. 1.基本类型或基本类型的包装类以及String是值传递,引用类型是引用传递.2.Java中只有值传递. 关于这个问题应该是存在争议的.根据测试出来的结果和我们自己的经验,以及口口相传或是上学时老师讲的,我们认为是第一种.但第二种说法的呼声也很高,渐渐地我们也认为第2中才是对的.那么下面我们就来分析一下这个问题. 在谈这个

STM32Cube_FW_F1_V1.0.0固件库学习(四)外部中断 中

V4.0和V3.5的中断改了挺多,找了很久...小白不容易啊... 在这个函数中有下面这么一段话,具体的配置参数就是最上面宏定义的.可以直接调用HAL_GPIO_Init解决. /*--------------------- EXTI Mode Configuration ------------------------*/ /* Configure the External Interrupt or event for the current IO */ if((GPIO_Init->Mode

抢占在中断中的判断

ret_from_intr: DISABLE_INTERRUPTS(CLBR_ANY) TRACE_IRQS_OFF LEAVE_IRQ_STACK testb $3, CS(%rsp) jz retint_kernel /* Interrupt came from user space */ GLOBAL(retint_user) mov %rsp,%rdi call prepare_exit_to_usermode TRACE_IRQS_IRETQ SWAPGS jmp restore_re

linux-2.6.26内核中ARM中断实现详解(转)

转载:http://www.cnblogs.com/leaven/archive/2010/08/06/1794293.html 更多文档参见:http://pan.baidu.com/s/1dDvJRaD 作者:刘洪涛,华清远见嵌入式学院金牌讲师,ARM ATC授权培训讲师. 看了一些网络上关于linux中断实现的文章,感觉有一些写的非常好,在这里首先感谢他们的无私付出,然后也想再补充自己对一些问题的理解.先从函数注册引出问题吧. 一.中断注册方法 在linux内核中用于申请中断的函数是req

Linux中断(interrupt)子系统之三:中断流控处理层【转】

转自:http://blog.csdn.net/droidphone/article/details/7489756 1.  中断流控层简介 早期的内核版本中,几乎所有的中断都是由__do_IRQ函数进行处理,但是,因为各种中断请求的电气特性会有所不同,又或者中断控制器的特性也不同,这会导致以下这些处理也会有所不同: 何时对中断控制器发出ack回应: mask_irq和unmask_irq的处理: 中断控制器是否需要eoi回应? 何时打开cpu的本地irq中断?以便允许irq的嵌套: 中断数据结