首页 > 解决方案 > 在同步方法中进行 I/O 操作时,它是否总是产生一个新线程?

问题描述

下面的read声称,当我们在方法 A 中时,例如,我们将流读取到其末尾,读取操作将生成一个 I/O 线程,而主线程将等待该线程完成。

真的是这样吗?为什么主线程不做所有这些工作,而不是等待其他事情来做呢?这不就是“没有线程”的主要思想吗?

标签: c#.netmultithreadingiosynchronous

解决方案


由于 .NET 异步 I/O 最初是在 Windows 操作系统环境中出现的,因此给定的考虑基于基于 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 完成处理(但不早于完成发生)。


推荐阅读