netty权威指南之笔记

1、Java的I/O演进之路
FD:file descriptor(fd,文件描述符),描述符就是一个数字,它指向内核中的一个结构体。
UNIX提供了5种I/O模型:
1、阻塞I/O模型: 进程阻塞与recvfrom的调用
2、非阻塞I/O模型:进程反复调用recvfrom等待返回成功指示(轮询)
3、I/O复用模型:Linux提供select/poll,阻塞在select,等待可能多个套接口中的任一个变为可读,这样select/poll帮我们侦测多个fd是否处于就绪状态。epoll基于事件驱动方式,当有fd就绪时,立即回调函数rollback。
4、信号驱动I/O模型:生成SIGIO信号,通过信号回调通知应用程序调用recvform来读取数据。
5、异步I/O:告知内核启动某个操作,并让内核在整个操作完成后通知我们。

2、I/O多路复用技术

Java NIO的核心类库Selector就是基于epoll的多路复用技术实现。

I/O多路复用技术通过把多个I/O的阻塞复用到同一个select的阻塞上,从而使得系统在单线程的情况下可以同时处理多个客户端请求。优势:系统开销小,系统不需要创建新的额外进程或者线程。
主要场景:
1、服务器需要同时处理多个处于监听状态或多个连接状态的套接字。
2、服务器需要同时处理多种网络协议的套接字。

select:做轮询和网络事件通知。单个进程打开FD限制为1024
pselect
poll
epoll:
1、支持一个进程打开的socket描述符(FD)不受限制(仅受限于操作系统的最大文件句柄数)。
例如:1G内存的机器上大约是10万个句柄左右,所支持的FD上限是操作系统的最大文件句柄数
       cat /proc/sys/fs/file-max
2、I/O效率不会随着FD数目的增加而线性下降。
   epoll只会对活跃的socket进行操作,这是epoll根据每个fd上面的callback函数实现的,只有活跃的socket才会主动的去调用callback函数,其他idle状态socket则不会。
3、使用mmap加速内核与用户空间的消息传递。(mmap将一个文件或对象映射进内存,epoll是通过内核和用户空间mmap同一块内存实现的。)


16:36 [[email protected]]$ cat /proc/sys/fs/file-max
131072


NIO编程
NIO:new I/O 或者非阻塞I/O
应用场景:高负载,高并发。

1 Buffer
ByteBuffer
2 Channel 全双工 同时支持读写操作。
网络读写:SelectableChannel,其子类:ServerSocketChannel和SocketChannel
文件操作:FileChannel
3、多路复用器Selector
Selector会不断地轮询注册在其上的Channel,如果某个Channel上面有新的TCP连接接入、读和写事件,这个Channel就处于就绪状态,会被Selector轮询出来,通过SelectionKey获取就绪Channel的集合,进行后继的I/O操作。

NIO编程优势:
1、客户端发起的连接操作时异步的,可以通过在多路复用器注册OP_CONNECT等待后继结果,不需要像之前的客户端那样被同步阻塞。
2、SocketChannel的读写操作都是异步的。
3、通过epoll实现,没有连接句柄数的限制。

JDK1.7 NIO2.0提供了AIO

AIO
通过java.util.concurrent.Future类来表示异步操作的结果;
在执行异步操作的时候传入一个java.nio.channels.

--------------------------------------------------




猜你喜欢

转载自wangqiaowqo.iteye.com/blog/2201976