0. 问题
Redis为何这么快?https://redis.io/topics/benchmarks
Nginx为何能够支持高并发?
使用Node.js为何可以写出高性能的Web服务?
1. I/O是什么
所谓的I/O就是计算机内存与外部设备之间拷贝数据的过程。
你的支付宝上显示账户余额的过程就是一次I/O操作,支付宝app通过网络将数据从数据库拷贝到内存里。
2. 关键概念
在介绍I/O模型前,先来解释下什么是同步?什么是异步?什么是阻塞?什么是非阻塞?
异步:应用程序不需要自己去触发数据从内核空间到用户空间的拷贝,由内核空间调用应用程序定义的回调函数来完成。
同步:应用程序主动去触发数据从内核空间到用户空间的拷贝。
阻塞:应用程序在发起I/O操作时,在没有拿到数据前,处于等待状态。
非阻塞:应用程序在发起I/O操作时,不管有没有拿到数据,都立即返回。
另一番解释。
- 同步:A调用B。B的处理是同步的,在B处理完之前他不会通知A,只有处理完之后才会明确的通知A。
- 异步:A调用B。B的处理是异步的,B在接到请求后先告诉A我已经接到请求了,然后异步去处理,处理完之后通过回调等方式再通知A。
- 阻塞:A调用B。A一直等着B的返回,只是等着,不干其他事。
- 非阻塞:A调用B。A不用一直等着B的返回,先去忙别的事情了。
同步、异步说的是被调用者B(操作内核内核)。阻塞、非阻塞说的是调用者A(应用程序中的用户线程)。
3. UNIX下的5种I/O模型
1、同步阻塞I/O
2、同步非阻塞I/O
3、I/O多路复用(系统调用select、pselect、poll、epoll、kqueue)
4、异步I/O
5、信号驱动I/O
4. Java提供的I/O
1、BIO
同步阻塞I/O
2、NIO
同步非阻塞I/O
3、NIO.2
对操作系统异步I/O的封装
5. Tomcat如何实现I/O
NioEndpoint组件如何实现非阻塞I/O?
Nio2Endpoint组件如何实现异步I/O?
AprEndpoint组件如何实现非阻塞I/O?
99. 彩蛋
单服务器高性能的关键之一就是服务器采用的并发模型,并发模型有两个关键设计点:
- 服务器如何管理连接
- 服务器如何处理请求
以上两个设计点最终都和操作系统的I/O模型及进程模型有关。
- I/O模型:同步、异步、阻塞、非阻塞
- 进程模型:单进程、单线程、多进程、多线程
Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型。
Redis是用单线程-多路复用IO模型来实现高性能的内存数据服务。
Redis采用多进程-多路复用I/O模型的。