CategoryResourceRepost/极客时间专栏/左耳听风/程序员练级攻略/78 | 程序员练级攻略:异步I|O模型和Lock-Free编程.md
louzefeng d3828a7aee mod
2024-07-11 05:50:32 +00:00

17 KiB
Raw Blame History

异步I/O模型

异步I/O模型是我个人觉得所有程序员都必需要学习的一门技术或是编程方法这其中的设计模式或是解决方法可以借鉴到分布式架构上来。再说一遍学习这些模型是非常非常重要的你千万要认真学习。

史蒂文斯Stevens在《UNIX网络编程》一书6.2 I/O Models中介绍了五种I/O模型。

  • 阻塞I/O
  • 非阻塞I/O
  • I/O的多路复用select和poll
  • 信号驱动的I/OSIGIO
  • 异步I/OPOSIX的aio_functions

然后,在前面我们也阅读过了 - 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) 这个PPT中不仅回顾和比较了各种I/O模型而且还有各种比较细节的方案和说明是一篇非常不错的文章。

然后你可以看一篇Java相关的PPT - 道格·莱亚Doug LeaScalable IO in Java,这样你会对一些概念有个了解。

接下来我们需要了解一下各种异步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模式。下面是这个模式的相关文章读这三篇就够了

    然后是几篇有意思的延伸阅读文章。

  • [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问题来了……
  • 还有几篇可能有争议的文章,让你从不同的角度思考。