Multithreading 非阻塞I/O真的比多线程阻塞I/O快吗?怎么用?
我在网上搜索了一些关于阻塞I/O和非阻塞I/O的技术细节,我发现有几个人说非阻塞I/O比阻塞I/O更快。例如,在 如果我使用阻塞I/O,那么当前被阻塞的线程当然不能做任何其他事情。。。因为它被封锁了。但是,一旦一个线程开始被阻塞,操作系统就可以切换到另一个线程,直到对被阻塞的线程做了一些事情后再切换回来。因此,只要系统上还有另一个线程需要CPU且未被阻塞,那么与基于事件的非阻塞方法相比,不应该有更多的CPU空闲时间,是吗 除了减少CPU空闲时间之外,我还看到了一个增加计算机在给定时间范围内可以执行的任务数量的选项:减少线程切换带来的开销。但如何做到这一点呢?开销是否足够大以显示可测量的效果?以下是我如何想象它工作的想法:Multithreading 非阻塞I/O真的比多线程阻塞I/O快吗?怎么用?,multithreading,io,blocking,nonblocking,Multithreading,Io,Blocking,Nonblocking,我在网上搜索了一些关于阻塞I/O和非阻塞I/O的技术细节,我发现有几个人说非阻塞I/O比阻塞I/O更快。例如,在 如果我使用阻塞I/O,那么当前被阻塞的线程当然不能做任何其他事情。。。因为它被封锁了。但是,一旦一个线程开始被阻塞,操作系统就可以切换到另一个线程,直到对被阻塞的线程做了一些事情后再切换回来。因此,只要系统上还有另一个线程需要CPU且未被阻塞,那么与基于事件的非阻塞方法相比,不应该有更多的CPU空闲时间,是吗 除了减少CPU空闲时间之外,我还看到了一个增加计算机在给定时间范围内可以执
这就是它的工作原理吗?如果没有,它是如何工作的?这意味着事件系统可以在不需要显式接触堆栈的情况下工作(例如,需要备份堆栈并在切换线程时将另一个线程的堆栈复制到内存中的实际调度程序)?这实际上节省了多少时间?还有更多吗?据我所知,改进之处在于异步I/O使用了so(我说的是MS系统,只是为了澄清一下)。通过使用异步调用,框架可以自动利用这种体系结构,这应该比标准线程机制更有效。作为个人经验,我可以说,如果您喜欢异步调用而不是阻塞线程,您会感觉应用程序更具反应性。非阻塞I/O的一种可能实现正是您所说的,使用一个后台线程池,这些线程执行阻塞I/O操作,并通过某种回调机制通知I/O发起人的线程。事实上,glibc中的模块就是这样工作的。是关于实施的一些模糊细节
虽然这是一个很好的可移植解决方案(只要有线程),但操作系统通常能够更有效地为非阻塞I/O提供服务。列出线程池之外的可能实现。非阻塞或异步I/O的最大优点是线程可以并行地继续工作。当然,您也可以使用额外的线程来实现这一点。正如您所说的最佳总体(系统)性能,我想最好使用异步I/O而不是多线程(这样可以减少线程切换) 让我们看一看网络服务器程序的可能实现,该程序将处理并行连接的1000个客户端:
每个线程都需要内存资源(还有内核内存!),这是一个缺点。每增加一个线程意味着调度器要做更多的工作
这将从系统中获取负载,因为我们的线程更少。但这也会妨碍您充分利用机器的性能,因为您可能最终会将一个处理器的性能提高到100%,而让所有其他处理器闲置
这会从系统中获取负载,因为线程较少。它可以使用所有可用的处理器。在Windows上,此方法受支持
WriteFile
,具有OVERLAPPED
结构)。仅当代码调用WaitForMultipleObjectsEx
并将bAlertable
设置为true
时,才会调用回调函数
更多关于网络的阅读:
- 在MSDN上,还将很快处理创建线程的成本
- 第节说:“虽然线程相对容易创建和使用,但操作系统分配了大量的时间和其他资源来管理它们。”
- 表示“但是,如果您为每个处理器创建一个线程,并构建应用程序维护上下文信息的请求队列,那么您的应用程序将具有更好的性能。”