- IO分类
- IO/NIO基本知识汇总
- select epoll
- BIO,NIO,reactor主从模型
IO分类
- BIO
同步阻塞IO,服务器实现模式为一个连接一个线程。试用于连接数少,带宽要求高时.同步是一种消息通信机制,阻塞非阻塞是一种程序在等待调用结果的一种状态。 - NIO
同步非阻塞,一个线程对应多个连接,一个请求对应一个线程。当连接数多而且短时,比如聊天室,可以用这个。
- AIO
异步非阻塞,适用于连接数多而且长的情况.服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理。
不需要过多的Selector对注册的通道进行轮询即可实现异步读写,从而简化了NIO的编程模型。
在此种模式下,用户进程只需要发起一个IO操作然后立即返回,等IO操作真正的完成以后,应用程序会得到IO操作完成的通知,此时用户进程只需要对数据进行处理就好了,不需要进行实际的IO读写操作,因为真正的IO读取或者写入操作已经由内核完成了。
IO/NIO基本知识汇总
IO是面向流的,也就是说一次只能取出一个,NIO是面向缓冲区的,能移动缓冲区取数据。
聊天服务器,用NIO来实现这个服务器是有优势的,这个聊天室中thread是通过一个selectors连接多个channel。要使用Selector的话,我们必须把Channel注册到Selector上,然后就可以调用Selector的select()方法。这个方法会进入阻塞,直到有一个channel的状态符合条件。当方法返回后,线程可以处理这些事件。
而每个链接的占用较大带宽,每次都要发送大量数据IO有优势:
select epoll
在IO多路复用的情况下,对于高并发的请求中但是活跃比较少的IO,linux的epoll有比较高的性能,因为他是从那些IO中把活跃IO拿到一个队列里去,这样遍历队列里面的元素就可,毕竟这里面的IO都是主动调用,被唤醒的都是,所以是活跃IO。 而select是采用轮询方式去查看整个IO的。
还有阻塞IO,非阻塞IO 大部分时间都是不可读的,要花很大时间进行不断重复的read系统调用,异步IO 一个符号还好,多个就不合适了
BIO,NIO,reactor主从模型
NIO
BIO
reactor主从模型,也是netty默认的模型