1.Java中的几种IO模型

     BIO 同步阻塞       可靠性差,吞吐量低。JDK 1.4之前的唯一选择

     NIO 同步非阻塞   吞吐量较高。适用于连接多,多路复用机制(Selecter)

     AIO 异步非阻塞   比NIO多了服务端结果异步事件通知     吞吐量非常高。适用于连接比较多,连接时间也比较长。

同步和异步:针对请求    阻塞及非阻塞:针对客户端

在一个网络请求中,客户端会发送一个请求到服务端。  

1.客户端发送请求后,就一直等待服务端响应。 客户端:阻塞 请求同步

2.客户端发了请求之后,就去干别的事情了。 然后是不是的检查服务端是否给了响应。 客户端:非阻塞 请求:同步

3.换成异步请求之后,客户端发了请求之后,等着服务端返回响应。 客户端:阻塞   请求:异步

4.客户端发了请求之后,去处理其他事情了。等服务端有了响应之后,再来处理业务逻辑。 客户端:非阻塞  异步

2.NIO的核心

Channel  Buffer  Selector   

channle是一个流,每个channel对应一个buffer的缓冲区。channel注册到Selector上

selector会根据Channel上发生的读写事件,将请求交友某个空闲的线程处理。

buffer和channel都是可读写的 

3.select,poll,epoll的区别

NIO中selector多路复用的三种实现机制,是Linux操作系统提供。

用户空间和内核空间: 操作系统为了保护系统安全,将内核划分为两个部分,一个是用户空间(用户态)和内核空间(内核态)。 其中用户空间不能直接访问底层的硬件设备(硬盘,声卡,显卡等),必须通过内核空间才能

文件描述符 File Descriptor(FD):  一个抽象概念,形式上是一个数值,实际是一个索引。指向内核中为每个进程维护进程所打开的文件的记录。当程序打开或者创建一个文件时,内核会向进程返回一个FD。比如一个channel的IO通道就是一个FD。

Select机制:会维护一个FD的集合fd_set。将fd_set从用户空间复制到内核空间,激活Socket。所有的FD从用户空间复制到内核空间的消耗比较大, x64系统限制2048个。

poll机制: 和select机制差不多。把fd_set结构进行优化,用poll_fd结构来替代set_df,通过链表实现。fd集合的大小就突破了操作系统的限制。

epoll:linux2.6才出现。  EventPoll   epoll不在扫描所有的FD,只将用户关心的FD的事件存放到内核的一个事件表中。减少用户空间和内核空间的拷贝的数据。

03-27 21:24
查看更多