2016-08-20 53 views
8

我想知道当没有IO线程处理异步调用的结果时会发生什么。假设你做了一个异步web请求(在服务器应用程序中,所有的异步代码都由线程池处理)。操作系统会发出信号,告诉您何时有结果,何时需要IO线程从套接字读取字节。如果没有IO线程可用,因为这些线程都在使用中(全部含义由线程池设置的最大值)会发生什么情况?有信号可以等待,直到有线程可用的队列吗?还是信号只是闻所未闻?如果后者发生,等待等待的代码会发生什么?如果没有IO线程来处理异步结果,会发生什么情况?

+0

当您要求计算机执行太多操作时会发生这种情况:它只会减慢速度。这是非常深埋,实际上不是CLR的一部分,[IHostIOCompletionManager接口](https://msdn.microsoft.com/en-us/library/ms164490(v = vs.110).aspx)可以完成工作。取决于你使用的主机。在实践中,假设SetMaxThreads()的* completionPortThreads *参数完全被忽略,同时执行的*(未等待)io完成的最大数量等于处理器内核的数量通常是安全的。 –

回答

5

除非您限制了线程池,否则它将根据需要创建新的I/O线程。信号以类似队列的结构等待,称为I/O Completion Port (IOCP),直到它被检索到;信号不会丢失。

+0

线程池具有IO(和worker)线程数的最大值。你说它会超过这个价值来处理这些信号?或者只是如果我们不是最大的一个新的线程将被创建,否则它坐落在IOCP队列中? – shortspider

+1

不,它不会超过限制,但如所暗示的那样,它将排队等待轮到它,并且如果IO线程的数量受到限制,等待时间将会延长 –

2

让我们回到更早的时候,当OS使用初步和没有的concurrency很大余地,那么,如果你打开多个应用程序,这需要IOExcel, Word, Pdf, Ppt,系统将显示为红,反应迟钝,因为它不能将它们全部处理在一起,但是如果你停止排队请求更多,并且系统不会崩溃,那么你将看到所有这些人都有机会,并且他们再次活跃起来。

这是IO requests已被排队等待处理的典型用例,它们中的任何一个都不会丢失,直到并且除非系统崩溃,由于其实现的鲁棒性,现在不会经常发生,记住蓝色死亡的屏幕,这仍然可以发生,这是IO请求丢失的唯一一点。

实际上,Windows中线程的本质就是在并发性之前引入健壮性,这样排队等待处理的东西就不会丢失。在任何时候,它都会超出限制以创建超过所需数量的线程

相关问题