在Windows内核原理-同步IO与异步IO和《高性能网络通讯原理》两篇文章中,都出现了中断这两个字。本篇文章会对中断操作的原理进行说明。
中断指当出现需要时,CPU暂时停止当前程序的执行转而执行处理新情况的程序和执行过程。即在程序运行过程中,系统出现了一个必须由CPU立即处理的情况,此时,CPU暂时中止程序的执行转而处理这个新的情况的过程就叫做中断。
我们知道CPU是按指令顺序进行执行的,操作系统每过大约15ms会发生一次线程调度(Windows下),根据线程优先级先调度优先级高的线程。但是实际情况并没有那么简单,若我们接收到一个网络请求,如果要等当前线程执行完或15ms线程调度之后才去处理网络请求,网卡缓冲区很有可能会被占满,此时就发生了丢包。
中断分为硬件中断和软件中断。
硬件中断即为硬件发出的中断信号,如I/O中断和硬件失效中断。
软件中断即为非硬件发出的中断信号,如程序中断和时钟中断。
本篇文章还是主要解释前几篇文章提到的I/O中断进行解释说明,因此仅以I/O中断举例,但是中断的原理和流程都是相似的。
I/O中断通过中断处理器执行中断操作。当外部设备的I/O模块准备好时,它会发送给CPU一个中断信号,CPU则会“立即”做出响应,暂停当前程序的处理去服务该I/O设备的程序。
也可能不是立即,比如同时存在多个中断,则根据实际的中断算法决定,是按中断先后顺序执行中断操作,还是按中断优先级执行。 I/O中断时硬件中断,需要硬件支持来接收中断信号。
为了更好的说明中断带来的性能提升,我们先描述一下没有中断时程序如何处理I/O操作。
由此可知,有中断还是没有中断对于用户来说线程都是阻塞的,对于操作系统内核来说通过中断方式主动通知CPU的方式减少了线程轮询判断,提高了线程执行效率。
当然,为了进一步提高线程利用率,此时我们可以通过异步操作API执行I/O操作。
比如.Net4.5的async
和await
关键字,当调用异步操作后,API内部保存了相关状态机信息(回调信息),线程继续执行其他操作,当操作系统内核读取数据完成时,线程调用回调方法恢复到await
的后续操作。整个过程中线程不会因为阻塞带来导致性能损失。
当I/O设备完成一次I/O操作时,发生以下事件:
出处:https://www.cnblogs.com/Jack-Blog/p/12038716.html
作者:杰哥很忙
本文使用「CC BY 4.0」创作共享协议。欢迎转载,请在明显位置给出出处及链接。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。