Java多线程:Linux多路复用,Java NIO与Netty简述
JVM的多路复用器实现原理 Linux 2.5以前:select/poll Linux 2.6以后: epoll Windows: Winsock的select模型(感谢评论指正,仅Java NIO.2使用了Windows IOCP,由于Netty没有采用NIO.2此处不展开) Free BSD, OS X: kqueue 下面仅讲解Linux的多路复用。 Linux中的IO Linux的IO将所有外部设备都看作文件来操作,与外部设备的操作都可以看做文件操作,其读写都使用内核提供的系统调用,内核会返回一个文件描述符(fd, file descriptor),例如socket读写使用socketfd。描述符是一个索引,指向内核中一个结构体,应用程序对文件的读写通过描述符完成。 一个基本的IO,涉及两个系统对象:调用这个IO进程的对象,系统内核,read操作发生时流程如下: 通过read系统调用向内核发起读请求。 内核向硬件发送读指令,并等待读就绪。 内核把将要读取的数据复制到描述符所指向的内核缓存区中。 将数据从内核缓存区拷贝到用户进程空间中。 Linux I/O模型简介 阻塞I/O模型:最常用,所有文件操作都是阻塞的。 非阻塞I/O模型:缓冲区无数据则返回,一般采用轮询的方式做状态检查。 I/O复用模型:详细见下 信号驱动I/O:使用信号回调应用,内核通知用户何时开启一个I/O操作