📄 一句话概括
实时处理的意思是规定时间内必须响应;而计算机里的【时间】本身,就是靠定时器中断滴答出来的。
📝 本节和前面几节的关系
11.3 讲了中断是什么,这一节讲它最常用的一种:给整台机器定节拍。
一、实时不是快,是准时
很多人把实时理解成【很快】——不对。 实时的意思是:在规定的时间内必须给出响应,晚一秒都不行,早了也没意义。 所以硬实时系统第一目标是【一定按时】,为此宁可牺牲平均速度。 机械臂、刹车控制、心电图仪器——这些场合晚一点就是事故。
二、计算机的时间是怎么来的
计算机里的【时间】不是凭空知道的——它靠一种中断滴答出来:定时器中断。 每隔固定时间(比如几毫秒),定时器拉起一次中断,操作系统借机更新时钟。 但它更重要的用途是:给操作系统一个抢回控制权的机会。 时间片到了就切换下一个程序——这就是【看似同时运行多个程序】的底层机制。 另外,各种超时、动画、心跳,也都靠这个统一节拍。
三、实测这个节拍准不准
用 Python 模拟【每 5 毫秒必须做一次】,看看实际抖动有多大。 平均间隔能压到 5 毫秒,但每一拍都会有一点偏差——这就是抖动。 普通操作系统是软实时:这点偏差无所谓,因为它要照顾的是【总体吞吐】。 换成硬实时系统,偏差就得压到微秒级——代价是别的事情都要让路。
四、中断还有优先级
设备那么多,同时来中断怎么办?所以中断分优先级。 鼠标键盘优先——人的操作等不起,卡一下立刻被察觉。 磁盘拷贝垫底——它慢一点没人看得出来。 所以中断优先级表,本质上是一张【谁更等不起】的排序表。
五、动手 Demo:通过中断实现实时处理
实时处理的意思是规定时间内必须响应,而计算机的时间本身靠定时器中断滴答出来。 实测一下这个节拍的抖动有多大。
import time
n, interval = 20, 0.005
stamps, t0 = [], time.perf_counter()
for i in range(n):
target = t0 + (i + 1) * interval
while time.perf_counter() < target:
pass
stamps.append(time.perf_counter() - t0)
errs = [abs(stamps[i] - (i + 1) * interval) for i in range(n)]
print("平均间隔", stamps[-1] / n * 1000, "毫秒")
print("最大偏差", max(errs) * 1000, "毫秒")
实跑输出:
--------------------------------------------------------------------
通过中断实现实时处理
--------------------------------------------------------------------
**实时处理的意思是:规定时间内必须响应。**
计算机里的【时间】本身就是靠一种中断滴答出来的——**定时器中断。**
它的作用不止报时:
**给操作系统一个抢回控制权的机会。**
**时间片到了就换下一个程序**——这就是【看似同时运行】的底层机制。
**给各种超时、动画、心跳提供统一的节拍。**
实测一下这个节拍准不准——用 Python 模拟【每 5 毫秒必须做一次】:
计划间隔 5.0 毫秒
实测平均间隔 5.000 毫秒
最大偏差(抖动) 0.013 毫秒
总耗时 100.0 毫秒
**平均间隔很准,但每一拍都有一点偏差**——实测最大 0.013 毫秒,这就是抖动。
在普通系统上(软实时)这点偏差无所谓;**但机械臂、刹车控制这类场景就不行。**
所以有【硬实时】系统:**它的第一目标不是快,而是【一定按时】。**
中断还有优先级——**鼠标键盘优先、磁盘拷贝垫底**,
因为人的操作等不起,而磁盘慢一点没人察觉。
实测:平均间隔稳稳是 5 毫秒,但每一拍都有一点偏差——这就是抖动。 普通系统是软实时(这点偏差无所谓);硬实时系统要求偏差压到微秒级。
30 秒实验
- 把间隔改成 1 毫秒再跑一次,看偏差是变大还是变小。
- 想一想:为什么游戏里【掉帧】比【画质差】更让人难受。
常见误区
- 以为实时就是快。它的意思是【一定按时】。
- 以为定时中断只用来报时。它更是操作系统抢回控制权的机会。
自测三问(点开对答案)
1. 实时处理的准确含义是什么? —— 在规定时间内必须给出响应,重点是准时而不是快。 2. 定时器中断有什么用? —— 提供统一节拍:更新时间、让操作系统抢回控制权做任务切换、支撑超时与心跳。 3. 软实时和硬实时的差别在哪? —— 软实时容忍少量抖动、优先总体吞吐;硬实时要求偏差极小,宁可牺牲平均性能。- ☐ 下一节(11.5 能够快速传输大量数据的DMA)
相关笔记
- 外部设备的中断请求 — 中断的来龙去脉
- 能够快速传输大量数据的DMA — 数据一多,中断也不够用了
- 决定程序流程的程序计数器 — 时间片切换到底切了什么
- 🔵 计算机基础 · 索引 — 硬件底层的入门课
- ⚙️ 程序是怎样跑起来的 · 索引