温馨提示:文本由机器自动转译,部分词句存在误差,以视频为准
00:00
中断和轮询到底有什么区别?很多程序员面试都会被问到这个问题,今天我用最简单的方式给你讲明白,我也给大家准备了嵌入式自学路线、硬核实战项目、大场面试真题、简历模板等技术干货,有需要的同学66领取先说轮询,这就像你在家等快递,每隔5分钟就跑到窗口看一眼,快递到了吗?到了吗?到了吗没到,回去继续等,过5分钟再看一次,你看这个过程中你啥也干不了,就一直在那儿反复检查,这就是轮询的本质,CPU不停的去检查某个设备或者某个状态有没有变化,那中断呢?中断就像你在家该干嘛干嘛,打游戏看电影都行,等快递真到了,快递员按门铃通知你,你再去拿,这期间你完全不用管快递的事儿,该干嘛干嘛,效率高多了,对吧?咱们从代码层面来看,假设你要读取键盘输入,用轮巡的方式,代码会这么写,你得写一个死循环,不停的去检查键盘缓冲区有没有数据。比如Y要处,然后不。
01:00
断调用check keyboard的这个函数,只要没有数据,这个循环就一直转,CPU就一直在这儿空转,啥也干不了,就算你的程序还有其他重要的事情要做,对不起,得等这个检查完才行。但是用中断就不一样了,你只需要注册一个中断处理函数,告诉系统,嘿,等键盘有输入了,你叫我一声,然后你的程序该干嘛干嘛,继续执行后面的代嘛。等用户真的按键盘了,硬件会产生一个中断信号,CPU立刻暂停当前的工作,跳转到你写好的中断处理函数里,处理完这个案件事件,再回到刚才被打断的地方继续执行。整个过程行云流水,CPU的利用率高得多。那你可能要问了,既然中断这么好,为什么还要用轮询呢?这就得说到他们各自的试用场景了,轮巡其实也有它的优势,第一个就是简单,你不需要配置复杂的中断向量表,不需要考虑中断优先级,不需要担心中断嵌套的问题,写个循环检查就完事了,代码逻辑特别直观,对于一些简单的嵌入式系统,或者你就是要实时监控模。
02:00
和状态轮许反而更合适。第二个优势是实时性可控。中断虽然响应快,但它有个问题,你不知道它什么时候来,如果你的程序正在执行一段特别关键的代码,比如正在更新数据库,这时候来了一个中断,打断你可能会出问题。而轮询是你主动去查的,你可以控制在什么时候查,查的频率是多少。还有就是在高频事件的场景下,轮巡可能更合适。你想啊,如果某个事件每微秒就发生一次,那用中断的话,CPU就得每微秒响应一次中断,光是保存现场、恢复现场这些操作就够CPU喝一壶的了。这种情况下直接轮询反而开销更小。这就是为什么很多高性能网络程序会用轮巡模式。但总的来说,现代操作系统和应用程序更倾向于用中断或者事件驱动的方式,因为它能让CPU更高效的工作,降低功耗,提高系统的并发能力,你看我们写的网络程序基本都是用EPO select这些IO多路复用技术,本质上就是事件驱动,而不。
03:00
是傻傻的轮询。每个Socket最后总结一下,轮询就像你主动反复去查,简单但浪费资源,中断就像别人主动通知你,高效但复杂一些。在实际开发中,你要根据具体场景选择,对于低频事件,需要高效利用CPU的场景,用中断或事件驱动,对于简单系统高频事件或者需要精确控制检查时机的场景,用允许。明白了这个区别,你再去看操作系统的IO模型,看网络编程的各种模式,就会发现他们都是在这两种基本思想上的变化和组合。这就是计算机底层的魅力,看似复杂的技术本质都是几个简单原理的灵活运用。好了,今天的分享就到这里,如果觉得有用,记得点赞关注,咱们下期见。
我来说两句