中断、轮询机制、事件机制与事件循环

中断

中断是一种由硬件或软件触发的机制,当某个事件(如外设准备好数据、定时器到期)发生时,设备向CPU发送信号,CPU暂停当前执行的任务,保存现场,跳转执行对应的中断服务程序(ISR)处理该事件。处理完成后,CPU恢复之前的任务,保证及时响应外部或内部事件,提高系统响应效率和并发能力。

轮询机制

轮询是CPU主动周期性地检查设备状态或某个条件是否满足的方式,通过不断读取状态寄存器或事件标志,判断是否有需要处理的事件。虽然实现简单,但在事件发生频率较低时,CPU大量时间花费在无效检查上,浪费资源,效率较低,通常用于硬件不支持中断或简单嵌入式系统。

事件机制

事件机制是一种设计理念和体系结构,指的是系统通过捕获、传递和处理各种事件(如用户输入、网络消息、定时器触发等)来驱动程序执行。它将程序逻辑与事件源解耦,允许程序异步响应不同类型的事件。事件机制包含事件的产生、注册监听、事件传递、事件处理等环节,支持灵活的异步交互和解耦设计。

简单来说,事件机制是“把外部或内部发生的事情抽象为事件,由系统通知程序(从根本上来说,绝大多数事件的发生和通知最终都是依赖操作系统的),程序根据事件执行对应操作”的一整套方法和流程。它实现了异步、解耦的程序流程控制,底层可以基于中断、轮询或其他方式检测事件发生。

事件循环

事件循环是事件机制的一种具体实现模式,通常表现为程序中的一个持续运行的循环结构。程序在执行完当前任务后,会在事件循环中检查事件队列中是否有新的事件待处理。如果有,则取出并执行对应的处理逻辑。事件循环通常结合阻塞等待机制,当没有事件时线程会阻塞等待,避免盲目消耗CPU资源,广泛应用于GUI界面、服务器及其他异步编程环境。

方面轮询事件循环
CPU资源利用持续主动查询,CPU高占用任务执行后检查事件,空闲时阻塞等待
检测事件方式CPU不停“盯着”设备状态或队列任务完成后检查事件队列,且无事件时阻塞
响应机制无异步唤醒,依赖不断查询依赖中断和操作系统唤醒机制,异步通知
适用场景简单硬件、无中断环境异步编程环境、GUI、浏览器等

持续检测事件队列是否有新事件的实际含义(和轮询的区别)

  • “持续检测”并非CPU空转盲查,这里的“检测”指的是程序在完成当前一批任务后,主动去查看事件队列中是否有新的事件需要处理。这个动作是在程序的正常执行流程中有节奏地进行的,不是无限制、无条件地不断循环检查,而是在“任务完成点”进行的有序检查,因此不会造成CPU无谓浪费。
  • 当事件队列为空时,事件循环所在的线程通常处于阻塞状态,不占用CPU。也就是说,线程调用操作系统的阻塞接口(比如 Linux 中的 epoll_wait()、Windows 的等待函数等),这会让线程挂起,暂停执行。线程进入阻塞状态后,操作系统不会为它分配CPU时间片,CPU资源可以被其他进程或线程利用,避免了CPU空转。
  • 新事件通过中断或其他异步机制通知操作系统,操作系统再唤醒等待线程。具体来说,硬件设备在发生事件时会触发硬件中断,操作系统内核捕获中断信号,并将事件放入内核态的事件队列。随后,内核唤醒阻塞中的线程,让线程返回从事件队列读取事件并处理。这样,线程只有在有事件需要处理时才会被唤醒,保证了系统资源的高效利用。
  • 因此,这里的“检测”是一种“有条件的检查”,结合阻塞等待和异步唤醒,不是传统意义上持续不断的轮询。传统轮询是CPU不停地、无条件地检查状态,浪费大量资源;而现代事件循环依赖操作系统的阻塞机制和中断唤醒,只有在有事件发生时才进行处理,极大提高了效率和响应速度。
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇