异步 IO:下一个十亿美元的错误?

主要观点:异步 I/O(非阻塞 I/O)是一种让应用程序在不阻塞调用操作系统线程且无需创建大量线程的情况下执行多个 I/O 操作的技术,在处理大量网络流量时很有吸引力,许多语言都对其提供了支持。但并非所有 I/O 操作都能以非阻塞方式进行,如文件 I/O。不同语言处理异步 I/O 的方式不同,各有优缺点。同时提到 Tony Hoare 认为 NULL 指针是“十亿美元的错误”,并引发对异步 I/O 是否是下一个“十亿美元的错误”的思考,认为如果过去 20 年致力于提高操作系统线程的性能,可能就不需要异步 I/O 了,在一个操作系统线程性能得到大幅提升的平行宇宙中,异步 I/O 可能就不会存在或不被广泛使用。

关键信息

  • 20 世纪 90 年代末/21 世纪初出现 C10K 问题,异步 I/O 可处理大量连接而无需增加操作系统线程。
  • Go、Erlang 等语言直接支持异步 I/O,Rust 依赖第三方库。
  • Inko 语言也内置支持异步 I/O,类似 Go 和 Erlang 对用户隐藏细节。
  • 并非所有 I/O 操作可非阻塞,如文件 I/O,io_uring 是处理此类问题的一种方法但有局限性。
  • Inko 通过标准库向调度器发送信号处理可能阻塞的操作,限制并发阻塞 I/O 操作数量。
  • Tony Hoare 认为 NULL 指针是“十亿美元的错误”,引发对异步 I/O 的思考。
  • 如今 Linux 内核中创建操作系统线程需 10 - 20 微秒,上下文切换需 1 - 2 微秒,大量线程会影响性能。

重要细节

  • 以 Inko 语言中从套接字读取的代码为例展示异步 I/O 的使用方式。
  • 提及 Google 限制 io_uring 等相关内容。
  • 阐述在不同宇宙中对异步 I/O 和操作系统线程的不同处理方式及影响。
阅读 16
0 条评论