非阻塞I / O真的比多线程阻塞I / O快吗?怎么样?
我在网上搜索了有关阻止I / O和非阻止I / O的一些技术细节,我发现一些人指出,非阻止I / O比阻止I / O更快。例如在本文档中。 如果我使用阻塞I / O,那么当前被阻塞的线程当然不能做任何其他事情……因为它被阻塞了。但是,一旦某个线程开始被阻塞,操作系统就可以切换到另一个线程,而不必切换回另一个线程,直到对该阻塞的线程有必要做些事情为止。因此,与基于事件的非阻塞方法相比,只要系统上还有另一个线程需要CPU并且未被阻塞,那么CPU空闲时间就不会更多了? 除了减少CPU空闲时间以外,我还看到了另一个选择,可以增加计算机在给定时间范围内可以执行的任务数量:减少切换线程带来的开销。但是如何做到这一点?开销是否足够大以显示可衡量的效果?这是关于如何描述其工作原理的想法: 要加载文件的内容,应用程序将此任务委托给基于事件的I / O框架,并传递回调函数和文件名。 事件框架委托给操作系统,该操作系统对硬盘的DMA控制器进行编程,以将文件直接写入内存 事件框架允许进一步的代码运行。 在完成磁盘到内存的复制后,DMA控制器将引起中断。 操作系统的中断处理程序将基于事件的I / O框架通知文件已完全加载到内存中。它是如何做到的?使用信号?? 事件I / O框架中当前运行的代码完成。 基于事件的I / O框架检查其队列,并查看步骤5中的操作系统消息,并执行在步骤1中获得的回调。 那是怎么回事?如果没有,它如何工作?这意味着事件系统可以工作而无需显式地触摸堆栈(例如,真正的调度程序需要在切换线程时备份堆栈并将另一个线程的堆栈复制到内存中)?这实际上节省了多少时间?还有更多吗?