epoll
基于异步及非阻塞的事件驱动模型,可以说是 Nginx 得以获得高并发、高性能的关键因素。这一点上和 Netty 类似,底层都是使用的 BSD kqueue、Linux epoll 及 Solaris event ports。 (1)进程之间不共享资源,不需要加锁,减少了使用锁对性能造成的影响,同时降低编程的复杂度,降低开发成本
main 函数的过程就是首先创建一个监听套接字,然后用一个 for 循环不断的从监听套接字上 Accept 新的连接,最后调用 echoFunc 函数在建立的连接上干活。关键代码是: 每收到一个新的连接,就创建一个“线程”去服务这个连接,因此所有的业务逻辑都可以同步、顺序的编写到echoFunc 函数中,再也不用去关心网络 IO 是否会阻塞的问题。不管业务多复杂,Go 语言的并发服务器的编程模型都是长这个样子
I/O多路复用这个概念被提出来以后, select是第一个实现 (1983 左右在BSD里面实现)。其函数原型如下: 该函数第一个参数表明我们要监听的文件描述符的最大值,中间的三个参数?readfds writefds exceptfds指向描述符集最后一个参数是超时时间。 它所需要的fd_set类型其实是一个__FD_SETSIZE长度bit的数组
中文资料: NIO的类库和API繁杂,学习成本高,你需要熟练掌握 Selector、ServerSocketChannel、SocketChannel、ByteBuffer 等。 需要熟悉Java多线程编程。这是因为NIO编程涉及到Reactor模式,你必须对多线程和网络编程非常熟悉,才能写出高质量的 NIO 程序
其应用程序使用的 Web 框架看起来有些像 web.py 或者 Google 的 webapp, 不过为了能有效利用非阻塞式服务器环境,这个 Web 框架还包含了一些相关的有用工具 和优化。 Tornado 就是我们在 FriendFeed 的 Web 服务器及其常用工具的开源版本。Tornado 和现在的主流 Web 服务器框架(包括大多数 Python 的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快
IO 多路复用是通过一种机制,同时监视多个文件描述符,一旦某个文件描述符就绪(比如读就绪或写就绪),会通知应用程序进行相应的处理。 select、poll、epoll 本质上都是同步 IO,它们都需要在事件就绪后,由应用程序自己进行读写。而异步 IO 不需要应用程序自己进行读写,异步 IO 实现负责把数据从内核拷贝到用户空间