当轮询比中断更好?

时间:2013-05-24 16:29:49

标签: io operating-system interrupt polling

我正在看这张照片: enter image description here

并且有2个问题: 1.为了使轮询参考中断,磁盘应该快多少?

我认为这是因为ISR和进程跳转(当使用中断时) - 例如,使用快速SSD时轮询会更好,其中轮询比中断(ISR +调度程序)花费的时间更少。我错了吗?

并且第二个问题是:如果我的第一个问题中的磁盘比SSD慢,但仍然很快 - 是否有理由更喜欢轮询?

我想知道我是否有很多I / O的事实 - 读取请求对于更喜欢轮询是一个很好的理由。

谢谢!

1 个答案:

答案 0 :(得分:4)

你可以想象一种情况,运行中断处理程序(使缓存无效,设置中断堆栈运行)的开销可能比实际执行读取或写入要慢,在这种情况下我猜测轮询会更快。

然而,与磁盘相比,SSD速度较快,但仍比内存慢得多。 SSD仍需要几十微秒到几毫秒来完成每个I / O,而执行中断设置和拆卸则使用所有内存中操作,并且可能需要最多100-1000个周期(~100ns到1us)。

使用中断而不是轮询的主要好处是使用中断的“禁用”效果要低得多,因为您没有必要安排I / O线程连续轮询更多数据,而没有可用的。它具有立即处理I / O的额外好处,因此如果用户键入一个键,则在调度I / O线程时屏幕上出现字母之前不会有暂停。将这些问题结合起来很麻烦 - 在您的I / O线程中插入任意停顿使得轮询的资源消耗更少,代价是响应时间更慢。这些可能是没有人在内核I / O设计中使用轮询的主要原因。

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