IO多路复用的概念
IO多路复用其实一听感觉很高大上,但是如果细细的拆分以下,
IO:网络IO,操作系统层面指数据在内核态和用户态之间的读写操作。
多路:多个客户端连接(连接就是套接字描述符,即Socket)
复用:用一个或多个连接处理
其实就是用一个服务端连接进行处理多客户端的请求。实际就是一个服务端进程处理多个套接字描述符,实现返回有select、poll、epoll。
那么什么是文件描述符呢?
说白了就是非负整数,当打开或者创建一个文件描述符时返回一个数值。
整个流程是什么样的?
当用户有请求进来之后,会将用户socket文件描述符注册进入epoll,然后epoll监听哪些socket有消息到达。可以避免Redis主线程来回进行切换或者被阻塞。通过一个主线程来控制请求数据量的转发。
为什么这样的方式吞吐量比较高呢,其实如果是来一个请求创建一个线程,那么太耗费资源,但是如果一个线程轮询处理,那么可能会被阻塞导致吞吐量较低。
通信方式
同步:调用者需要等待下游系统的结果,线程一直会在等待中。比如订单系统调用支付系统,需要支付系统返回结果才可以进行后续的订单状态修改。处理时间比较快的系统推荐使用。
异步:调用者接受到被调用者的相应,就处理别的事情,一般需要被调用者通过回调函数或者异步MQ的返回方式将结果写回,这种方式对于处理比较耗时的系统来说,一般采用异步方式。
阻塞:调用方会被阻塞,一直什么不干。
非阻塞:调用方不会阻塞,先返回做别的事情。
同步异步:在于被调用方返回消息的通知方式上
阻塞非阻塞:在于调用方等待时候的行为
五种网络编程的IO模型
Blocking IO: 阻塞IO
NoneBlocking IO : 非阻塞IO
IO multiplexing : IO多路复用
singal driven Io 信用驱动IO
saynchronuns 异步IO