一、IO了解
1、五大IO模型
(1)阻塞IO
阻塞IO是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。
(2)非阻塞IO
非阻塞I0是指在不能立刻得到结果之前,该调用不会阻塞当前线程。
(3)IO多路复用
I0多路复用(I0 Multiplexing)是指单个进程/线程就可以同时处理多个IO请求。
他有三种处理方式
select处理方式:连接数少且活跃数量多的时候性能好
优势:基于POSIX(可移植操作系统接口(Portable Operating System Interface of UNIX,缩写为 POSIX ))的标准,有比较好的跨平台性。
缺点:
(1)最大连接数有上限,1024(可以修改,但意义不大)。
(2)每次调用select的时候,都需要把需要监控的文件描述符的集合从用户空间拷贝到内核空间,当文件描述符很多的时候开销会很大。
(3)每次有活跃的描述符的时候,会遍历所有的文件描述符。
poll处理方式:与select很相似,只是底层数据结构不同,也是连接数少且活跃数量多的时候性能好
优势:最大连接数无上限
epoll处理方式:
epoll_create:创建epoll,然后epoll创建红黑树和双向链表。
epoll_ctl:把文件描述符添加到红黑树中。
epoll_wait:调用时,检测链表(就绪的)有没有数据。
三种方式性能比较:
(4)信号驱动IO模型:
(5)异步IO:
2、传统的IO模型
优点:模型简单,可维护性高,适用于连接数小的情况。
缺点:当连接数大的情况下,线程占用资源将会过大,上下文切换时候开销很大,尤其当服务器网络不好时候,会大幅度降低服务器吞吐量。
解决:线程池,IO复用模型
3、NIOReactor模型
三大组件:Reactor、acceptor、handler
(1)单Reactor单线程
缺点:一个线程处理很多资源,造成资源的极大浪费。
(2)单Reactor多线程
缺点:
多线程之间数据的共享与访问就变得复杂。
Reactor承担所有事件的监听与响应,有可能会有性能问题
(3)主从Reactor多线程
主的Reactor直接收acceptor的请求,acceptor在建立handler包括后续的事情都交给子的Reactor,netty和nginx都是基于这个模型。