当轮询比中断更好时?

4
我看了这张图片: enter image description here 对此我有两个问题: 1. 一个磁盘需要快多少才能使用轮询,而不是中断?
我认为由于中断服务程序(ISR)和进程跳转(当使用中断时),例如使用快速的SSD,轮询的时间比中断(ISR + scheduler)时间更短,因此轮询会更好。我错了吗?
2. 如果我的磁盘比第一个问题中的SSD慢,但仍然很快,是否有理由选择轮询?
我想知道我将有大量I/O读取请求是否足够好的理由选择轮询。
谢谢!

我只能说一般情况,但现在大多数设备不会产生太多的中断,它们会将驱动程序的请求排队,自己完成大部分逻辑,并仅在一个或多个请求完成时生成中断。除非你在谈论嵌入式系统,否则很少有必要进行轮询。 - Joachim Isaksson
如果我的回答解决了你的问题,请不要忘记接受它!谢谢。 - Dan
1个回答

6
你可以想象一种情况,运行中断处理程序的开销(使缓存失效,设置中断堆栈以进行运行)可能比实际读写更慢,在这种情况下,轮询可能更快。
然而,与磁盘相比,固态硬盘速度很快,但仍然比内存慢得多。SSD每个I/O完成需要花费几十微秒到毫秒的时间,而中断设置和撤销使用所有内存操作,最多可能需要100-1000个周期(约100ns至1us)。
使用中断而不是轮询的主要好处是,“禁用”使用中断的效果要小得多,因为您不必调度I/O线程以持续轮询是否有更多数据可用。它还有一个额外的好处,即I/O立即处理,因此如果用户键入一个键,字母出现在屏幕上之前不会出现暂停,而I/O线程正在被调度。将这些问题结合起来会很混乱-在I/O线程中插入任意延迟会使轮询资源密集程度较低,代价是响应时间更慢。这可能是没有人在内核I/O设计中使用轮询的主要原因。
从用户进程的角度(使用Unix信号等软件中断系统),无论哪种方式都有意义,因为轮询通常意味着阻塞系统调用,例如read()或select(),而不是(例如)检查布尔型内存映射变量或发出设备指令,类似于内核版本的轮询。在操作系统中使用系统调用来完成这项工作对性能有益,因为与使用任何其他系统调用相比,用户空间线程不会因使用信号而使其缓存失效更多或更少。然而,这非常依赖于操作系统,因此最好进行分析以确定哪个代码路径更快。

2
虽然不完全正确,但我想在这里更新一下(在获得了7年以上的经验后:-P)。中断的主要延迟问题是线程跳转,这通常会在IO路径中增加数十微秒。因此,如果您使用的是读取延迟低至20us和写入延迟低至150us的SSD,则可能会在读取上承受2倍的延迟/写入上15%的惩罚,假设您只进行一次线程跳转。还有一些更新更快的设备,如3dXpoint,其延迟甚至更低。因此,实际上几乎所有低延迟块存储产品这些天都在某些时候使用轮询。 - Dan
2
此外,许多人使用固定的用户空间线程来执行IO操作,以避免内核和用户空间之间的上下文切换(并避免必须在内核中构建所有内容)。 - Dan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接