linux高性能网络IO+Reactor模型

2021-09-25  本文已影响0人  善良的干爹

前言

网络I/O,可以理解为网络上的数据流。通常我们会基于socket与远端建立一条TCP或者UDP通道,然后进行读写。单个socket时,使用一个线程即可高效处理;然而如果是10K个socket连接,或者更多,我们如何做到高性能处理?

基本概念介绍

在零拷贝机制篇章已介绍过 用户空间和内核空间缓冲区,这里就省略了

网络IO的读写过程

linux五种网络IO模型

阻塞式I/O (blocking IO)

ssize_t recvfrom(int sockfd,void *buf,size_t len,unsigned int flags, struct sockaddr *from,socket_t *fromlen);复制代码

图片

非阻塞式I/O (nonblocking IO)

多路复用I/O (IO multiplexing)

图片

信号驱动式I/O (SIGIO)

图片

异步IO (POSIX的aio_系列函数)

图片

多路复用IO深入理解一波

select

int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);复制代码

select的缺点

epoll

int epoll_create(int size); int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event); int epoll_wait(int epfd, struct epoll_event *events,int maxevents, int timeout);复制代码

epoll的两种触发模式

epoll相比select的优点

关于epoll的IO模型是同步异步的疑问

Reactor模型

Reactor的中心思想是将所有要处理的I/O事件注册到一个中心I/O多路复用器上,同时主线程/进程阻塞在多路复用器上;一旦有I/O事件到来或是准备就绪,多路复用器返回,并将事先注册的相应I/O事件分发到对应的处理器中

相关概念介绍:

Reactor的一般流程

单线程 + Reactor

图片

多线程 + Reactor

图片

多线程 + 主从Reactor

图片

Proactor模型的一般流程

Proactor和Reactor的区别

上一篇 下一篇

猜你喜欢

热点阅读