# 异步I/O模型 异步I/O模型是我个人觉得所有程序员都必需要学习的一门技术或是编程方法,这其中的设计模式或是解决方法可以借鉴到分布式架构上来。再说一遍,学习这些模型,是非常非常重要的,你千万要认真学习。 史蒂文斯(Stevens)在《[UNIX网络编程](https://book.douban.com/subject/4859464/)》一书6.2 I/O Models中介绍了五种I/O模型。 - 阻塞I/O - 非阻塞I/O - I/O的多路复用(select和poll) - 信号驱动的I/O(SIGIO) - 异步I/O(POSIX的aio_functions) 然后,在前面我们也阅读过了 - [C10K Problem](https://en.wikipedia.org/wiki/C10k_problem) 。相信你对I/O模型也有了一定的了解。 这里,我们需要更为深入地学习I/O模型,尤其是其中的异步I/O模型。 首先,我们看一篇和Java相关的I/O模型的文章来复习一下之前的内容。[Thousands of Threads and Blocking I/O: The Old Way to Write Java Servers Is New Again (and Way Better)](https://www.slideshare.net/e456/tyma-paulmultithreaded1) ,这个PPT中不仅回顾和比较了各种I/O模型,而且还有各种比较细节的方案和说明,是一篇非常不错的文章。 然后,你可以看一篇Java相关的PPT - 道格·莱亚(Doug Lea)的 [Scalable IO in Java](http://gee.cs.oswego.edu/dl/cpjslides/nio.pdf),这样你会对一些概念有个了解。 接下来,我们需要了解一下各种异步I/O的实现和设计方式。
  • [IBM - Boost application performance using asynchronous I/O](https://developer.ibm.com/technologies/linux/articles/l-async/) ,这是一篇关于AIO的文章。
  • [Lazy Asynchronous I/O For Event-Driven Servers](https://www.usenix.org/legacy/event/usenix04/tech/general/full_papers/elmeleegy/elmeleegy_html/html.html) ,这篇文章也很不错。
  • 另外,异步I/O模型中的 [Windows I/O Completion Ports](https://docs.microsoft.com/en-us/windows/desktop/FileIO/i-o-completion-ports) ,你也需要了解一下。如果MSDN上的这个手册不容易读,你可以看看这篇文章 [Inside I/O Completion Ports](http://sysinternals.d4rk4.ru/Information/IoCompletionPorts.html)。另外,关于Windows,[Windows Internals](https://book.douban.com/subject/6935552/) 这本书你可以仔细读一下,非常不错的。其中有一节I/O Processing也是很不错的,这里我给一个网上免费的链接[I/O Processing](https://flylib.com/books/en/4.491.1.85/1/) 你可以看看Windows是怎么玩的。
  • 接下来是Libevent。你可以看一下其主要维护人员尼克·马修森(Nick Mathewson)写的 [Libevent 2.0 book](http://www.wangafu.net/~nickm/libevent-book/)。还有一本国人写的电子书 《[Libevent深入浅出](https://aceld.gitbooks.io/libevent/content/)》。
  • 再接下来是 Libuv。你可以看一下其官网的 [Libuv Design Overview](http://docs.libuv.org/en/v1.x/design.html) 了解一下。
  • 我简单总结一下,基本上来说,异步I/O模型的发展技术是: select -> poll -> epoll -> aio -> libevent -> libuv。Unix/Linux用了好几十年走过这些技术的变迁,然而,都不如Windows I/O Completion Port 设计得好(免责声明:这个观点纯属个人观点。相信你仔细研究这些I/O模型后,你会有自己的判断)。 看过这些各种异步I/O模式的实现以后,相信你会看到一个编程模式——Reactor模式。下面是这个模式的相关文章(读这三篇就够了)。 - [Understanding Reactor Pattern: Thread-Based and Event-Driven](https://dzone.com/articles/understanding-reactor-pattern-thread-based-and-eve) - [Reactor Pattern](https://www.dre.vanderbilt.edu/~schmidt/PDF/Reactor2-93.pdf) - [The reactor pattern and non-blocking IO](https://www.celum.com/en/blog/technology/the-reactor-pattern-and-non-blocking-io) 然后是几篇有意思的延伸阅读文章。
  • [The Secret To 10 Million Concurrent Connections -The Kernel Is The Problem, Not The Solution](http://highscalability.com/blog/2013/5/13/the-secret-to-10-million-concurrent-connections-the-kernel-i.html) - C10M问题来了……
  • 还有几篇可能有争议的文章,让你从不同的角度思考。