在同步方法中执行 I/O 操作时,它是否总是产生一个新线程?
When an I/O operation is being done in a synchronous method, does it always spawn a new thread?
下面的 read 声称当我们在方法 A 中时,例如我们读取一个流直到它的末尾,读取操作将产生一个 I/O 线程,而主要线程将等待它完成。
真的是这样吗?为什么主线程不做所有这些工作,而不是等待其他事情来做呢?这不是“there is no thread”的主要思想吗?
由于 .NET 异步 I/O 最初出现在 Windows OS 环境中,因此给定的考虑基于基于 Windows 的 I/O 概念.
首先,I/O 流有两种类型:同步和异步。前者基于等待机制,这意味着在某个时刻(通常是请求命中驱动程序时)启动 I/O 操作的线程被 OS 调度程序置于等待状态并被唤醒当 I/O 操作完成时由调度程序返回。后者基于特定的通知机制,这意味着在发送 I/O 请求后,线程会继续做其他事情,并且 I/O 完成通知会根据内部线程配置分别发送给该线程或任何其他线程.
现在关于 I/O 线程 - Windows 系统中的 I/O 通知机制是通过使用所谓的 I/O 完成端口 (IOCP) 实现的。简而言之,应用程序可以创建一个完成端口(您可以将其视为一个队列),它可以与多个文件句柄相关联,并且任何线程在调用此端口上的特定 API 时都可以与完成端口相关联首次。这样,调度程序会保持完成端口和与之关联的线程之间的关联,以更有效地处理 I/O 完成。简而言之,与完成端口相关联的线程被置于等待状态,并在更新完成请求的状态时被唤醒。对于 .NET 世界,基础设施创建了此类线程池,它们被表示为 I/O 个线程。
文章中给出的示例暗示使用同步 I/O 流程,初始线程等待 I/O 操作完成。相反,从 .NET 的角度来看,异步 I/O 场景意味着使用额外的线程进行 I/O 完成处理(但不早于完成发生)。
下面的 read 声称当我们在方法 A 中时,例如我们读取一个流直到它的末尾,读取操作将产生一个 I/O 线程,而主要线程将等待它完成。
真的是这样吗?为什么主线程不做所有这些工作,而不是等待其他事情来做呢?这不是“there is no thread”的主要思想吗?
由于 .NET 异步 I/O 最初出现在 Windows OS 环境中,因此给定的考虑基于基于 Windows 的 I/O 概念.
首先,I/O 流有两种类型:同步和异步。前者基于等待机制,这意味着在某个时刻(通常是请求命中驱动程序时)启动 I/O 操作的线程被 OS 调度程序置于等待状态并被唤醒当 I/O 操作完成时由调度程序返回。后者基于特定的通知机制,这意味着在发送 I/O 请求后,线程会继续做其他事情,并且 I/O 完成通知会根据内部线程配置分别发送给该线程或任何其他线程.
现在关于 I/O 线程 - Windows 系统中的 I/O 通知机制是通过使用所谓的 I/O 完成端口 (IOCP) 实现的。简而言之,应用程序可以创建一个完成端口(您可以将其视为一个队列),它可以与多个文件句柄相关联,并且任何线程在调用此端口上的特定 API 时都可以与完成端口相关联首次。这样,调度程序会保持完成端口和与之关联的线程之间的关联,以更有效地处理 I/O 完成。简而言之,与完成端口相关联的线程被置于等待状态,并在更新完成请求的状态时被唤醒。对于 .NET 世界,基础设施创建了此类线程池,它们被表示为 I/O 个线程。
文章中给出的示例暗示使用同步 I/O 流程,初始线程等待 I/O 操作完成。相反,从 .NET 的角度来看,异步 I/O 场景意味着使用额外的线程进行 I/O 完成处理(但不早于完成发生)。