1. 程序查询方式:最朴素的“盯梢”法
想象一下,你是一个快递驿站的管理员,你的工作就是不断去门口看看有没有快递车来。来了,你就去卸货;没来,你就继续看。这就是程序查询方式,也叫程序轮询,是CPU管理I/O设备最原始、最直接的方法。CPU就像一个不知疲倦的“监工”,主动地、周期性地去检查每个I/O接口的状态寄存器,看看设备是不是准备好了数据(输入)或者是不是空闲可以接收数据(输出)。如果没准备好,CPU就继续查,直到设备就绪为止。这个方法听起来很笨,对吧?但在一些极其简单或者对实时性要求非常高的嵌入式系统里,它反而因为简单可控而存在。
我刚开始接触这个概念时,总觉得CPU这样太“浪费”了,啥也不干就光在那儿查。后来在做一个单片机读取温度传感器的小项目时,我才真正理解了它的应用场景。那个传感器数据变化很慢,几秒才更新一次,而且我的单片机就只干这一件事。如果用复杂的中断,反而增加了程序结构的复杂度,而用一个简单的while循环去查询传感器状态寄存器,代码清晰又可靠。所以,技术没有绝对的好坏,只有合不合适。
那么,这种“盯梢”法到底会消耗多少CPU精力呢?这取决于三个核心因素,我把它叫做“程序查询三要素”:I/O设备的数据速率、缓冲区的大小,以及CPU执行一次查询操作所需的时间开销。我们得把这几个数算清楚,才能知道这套方案到底靠不靠谱。
1.1 核心三要素与计算逻辑
第一个要素,I/O设备的数据速率。比如你的键盘,可能每秒最多输入100个字符;或者你的网络接口卡,速率可能是100MB/s。这个速率决定了数据产生的“水流”有多快。
第二个要素,I/O接口缓冲区的大小。这个缓冲区是硬件上的一个小存储区,用来临时存放I/O设备送来的数据,解决设备慢、CPU快的速度矛盾。注意单位,可能是字节(B)也可能是字(Word,比如4字节)。它就像一个接水的小杯子。
第三个要素,CPU查询一次的时间开销。CPU执行一次状态查询的指令序列需要多少时间。这通常可以用执行的指令条数乘以每条指令的平均时钟周期(CPI)来估算。
计算逻辑是这样的:用 数据速率 ÷ 缓冲区大小,就能得到CPU最低的查询频率。为什么是最低?因为如果查询得比这个频率还慢,缓冲区满了,新来的数据就会把旧数据冲掉,导致丢失。例如,设备以2MB/s的速度向一个4字节的缓冲区写数据,那么一秒内,这个缓冲区会被写满 2MB / 4B = 500,000 次。这意味着CPU至少每 1秒 / 500,000 = 2微秒 就要来查询并取走一次数据,否则就丢数据。
知道了查询频率,再乘以单次查询时间开销,就能算出CPU花在查询这件事上的总时间。最后,用这个总时间除以CPU的总时间(比如1秒),就得到了CPU时间占比。这个比例直接告诉你,CPU为了伺候这个I/O设备,要付出多少“注意力”。
1.2 实战例题拆解与避坑指南
我们来看一道经典的408真题风格例题,把理论套进去算一算。
题目:某计算机采用程序查询方式控制I/O设备A的数据输入。已知设备A的数据传输速率为2MB/s,I/O接口中的数据缓冲寄存器为32位(4字节)。CPU每次查询需至少执行10条指令,平均CPI为4,CPU主频为500MHz。求CPU用于设备A输入/输出的时间占CPU总时间的百分比。
咱们一步步来算,这里有几个坑点,新手特别容易栽进去。
第一步:计算最低查询频率。 设备速率是2MB/s,缓冲区是4B。注意单位统一,2MB/s = 2 × 1024 × 1024 B/s ≈ 2,097,152 B/s(严格计算时用这个),但很多题目为计算方便,直接用2,000,000 B/s。这里我们按真题常见简化处理,用2MB/s = 2,000,000 B/s。 那么,查询频率 f = 2,000,000 B/s ÷ 4 B/次 = 500,000 次/秒。也就是说,CPU一秒钟要查50万次。
第二步:计算单次查询的时钟周期数。 每次查询执行10条指令,CPI=4,所以单次查询的时钟周期数 = 10 × 4 = 40个时钟周期。
第三步:计算一秒内查询花费的总时钟周期数。 总时钟周期数 = 查询频率 × 单次周期数 = 500,000 次/秒 × 40 周期/次


1100

被折叠的 条评论
为什么被折叠?



