Io 什么时候轮询比中断好?

Io 什么时候轮询比中断好?,io,operating-system,interrupt,polling,Io,Operating System,Interrupt,Polling,我在看这张照片: 有两个问题: 1.为了通过中断引用轮询,磁盘应该快多少 我认为,由于ISR和进程跳跃(使用中断时)——例如,在使用快速SSD时轮询会更好,其中轮询比中断(ISR+调度程序)花费的时间更少。我弄错了吗 第二个问题是:如果我的磁盘比第一个问题中的SSD慢,但仍然很快,那么有什么理由更喜欢轮询吗 我想知道我会有很多I/O读取请求这一事实是否足以让我更喜欢轮询 谢谢 您可以想象这样一种情况:运行中断处理程序的开销(使缓存失效,设置要运行的中断堆栈)可能比实际执行读或写操作慢,在这种情

我在看这张照片:

有两个问题: 1.为了通过中断引用轮询,磁盘应该快多少

我认为,由于ISR和进程跳跃(使用中断时)——例如,在使用快速SSD时轮询会更好,其中轮询比中断(ISR+调度程序)花费的时间更少。我弄错了吗

第二个问题是:如果我的磁盘比第一个问题中的SSD慢,但仍然很快,那么有什么理由更喜欢轮询吗

我想知道我会有很多I/O读取请求这一事实是否足以让我更喜欢轮询


谢谢

您可以想象这样一种情况:运行中断处理程序的开销(使缓存失效,设置要运行的中断堆栈)可能比实际执行读或写操作慢,在这种情况下,我想轮询会更快

然而,SSD比磁盘快,但仍然比内存慢得多。SSD完成每个I/O仍然需要几十微秒到毫秒的时间,而中断设置和拆卸使用所有内存操作,可能需要最多100-1000个周期(约100ns到1us)

使用中断而不是轮询的主要好处是,使用中断的“禁用”效果要低得多,因为您不必安排I/O线程在没有可用数据时连续轮询更多数据。它还有一个额外的好处,即可以立即处理I/O,因此,如果用户键入一个键,则在计划I/O线程时,在字母出现在屏幕上之前不会出现暂停。将这些问题结合在一起会造成混乱——在I/O线程中插入任意暂停会降低轮询的资源密集度,同时会降低响应时间。这可能是没有人在内核I/O设计中使用轮询的主要原因


从用户进程的角度来看(使用软件中断系统,如Unix信号),这两种方法都有意义,因为轮询通常意味着阻塞系统调用,如
read()
select()
,而不是(比如)检查布尔内存映射变量或像轮询的内核版本一样发出设备指令。让系统调用在操作系统中为我们完成这项工作可以提高性能,因为与任何其他系统调用相比,userland线程不会通过使用信号使其缓存或多或少失效。然而,这是非常依赖操作系统的,因此分析是确定哪个代码路径更快的最佳选择。

我只能说一般情况,但现在大多数设备不会产生那么多中断,它们会排队等待来自驱动程序的请求,自己执行大部分逻辑,并仅在一个或多个请求完成时生成中断。除非你说的是嵌入式系统,否则轮询很少有意义。如果回答了你的问题,别忘了接受我的回答!谢谢。虽然不是完全错误,但我想更新这个(在获得7年以上的经验后:-P)。中断的主要延迟问题是线程跳数,这通常会在IO路径中增加数十微秒。因此,如果您使用的SSD的读取延迟低至20us,写入延迟低至150us,那么如果您只执行一次线程跳跃,则可能会导致读取延迟增加2倍,写入延迟减少15%。还有一些更新、更快的设备,如3dXpoint,其延迟甚至更低。因此,实际上,现在几乎所有低延迟块存储产品都在一定时间内使用轮询。此外,许多产品使用固定的用户空间线程来执行IO,以避免内核和用户空间之间的上下文切换(并避免必须在内核中构建所有内容)。