两种高性能 I/O 设计模式(Reactor/Proactor)的比较
综述
这篇文章探讨并比较两种用于 TCP 服务器的高性能设计模式. 除了介
绍现有的解决方案, 还提出了一种更具伸缩性,只需要维护一份代码并
且跨平台的解决方案(含代码示例), 以及其在不同平台上的微调. 此文
还比较了 java,c#,c++对各自现有以及提到的解决方案的实现性能.
系统 I/O 可分为阻塞型, 非阻塞同步型以及非阻塞异步型[1,2]. 阻塞
型 I/O 意味着控制权只到调用操作结束了才会回到调用者手里.
结果调用者被阻塞了, 这段时间了做不了任何其它事情. 更郁闷的是,在
等待 IO 结果的时间里,调用者所在线程此时无法腾出手来去响应其它
的请求,这真是太浪费资源了。拿 read()操作来说吧, 调用此函数的
代码会一直僵在此处直至它所读的 socket 缓存中有数据到来.
相比之下,非阻塞同步是会立即返回控制权给调用者的。调用者不需要等等,它从
调用的函数获取两种结果:要么此次调用成功进行了;要么系统返回错误标识告诉
调用者当前资源不可用,你再等等或者再试度看吧。比如 read()操作, 如果当前
socket 无数据可读,则立即返回 EWOULBLOCK/EAGAIN,告诉调用 read()
者”数据还没准备好,你稍后再试”.
在非阻塞异步调用中,稍有不同。调用函数在立即返回时,还告诉调用者,这次请
求已经开始了。系统会使用另外的资源或者线程来完成这次调用操作,并在完成的
时候知会调用者(比如通过回调函数)。拿 Windows 的 ReadFile()或者 POSIX
的 aio_read()来说,调用它之后,函数立即返回,操作系统在后台同时开始读操
作。
在以上三种 IO 形式中,非阻塞异步是性能最高、伸缩性最好的。
这篇文章探讨不同的 I/O 利用机制并提供一种跨平台的设计模式(解决方案). 希望
此文可以给于 TCP 高性能服务器开发者一些帮助,选择最佳的设计方案。下面我
们会比较 Java, c#, C++各自对探讨方案的实现以及性能. 我们在文章的后面就不
评论0