600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > IO多路复用技术(epoll)

IO多路复用技术(epoll)

时间:2023-12-19 23:37:12

相关推荐

IO多路复用技术(epoll)

IO多路复用技术

讲解 epoll 技术前,我们先了解一下什么是IO 多路复用技术。

假设现在有一个服务器程序调用 accept 函数成功与客户端建立了连接,那么通过 accept 函数返回的通讯套接字,服务器就可以调用 write 往客户端写数据,也可以调用 read 读取从客户端发送过来的数据,这种单个线程去监听单个 IO 的读写情况我们就称为单路 IO 技术

#include <sys/types.h>#include <sys/socket.h>#include <string.h>#include <netinet/in.h>#include <arpa/inet.h>#include <unistd.h>#include <stdio.h>#define SERVER_PORT 8080int main(){int listen_fd = socket(AF_INET,SOCK_STREAM,0);int conn_fd = 0;char data[] = "Hello World!";struct sockaddr_in server_addr;memset(&server_addr,0,sizeof(server_addr));server_addr.sin_family = AF_INET;server_addr.sin_addr.s_addr = htonl(INADDR_ANY);server_addr.sin_port = htons(SERVER_PORT);bind(listen_fd,(struct sockaddr *)&server_addr,sizeof(server_addr));listen(listen_fd,32);while(1){conn_fd = accept(listen_fd,(struct sockaddr *)NULL,NULL);write(conn_fd,data,strlen(data));close(conn_fd);}close(listen_fd);return 0;}

那么什么是IO 多路复用技术呢?假设我们现在的主线程同时监听着多个 IO(可以理解为同时监听着很多个通讯套接字),当某个通讯套接字发来数据的时候,操作系统告诉我们哪个通讯套接字有数据发送过来,当可以往某个通讯套接字发送数据时,操作系统告诉我们哪个通讯套接字可以写数据。这种可以监视多个 IO 描述符的读写就绪情况,并且这些 IO 操作都可以在一个线程内并发执行就叫做多路 IO 复用,这里的复用是指复用同一个线程。

epoll 简介

了解了 IO 多路复用技术后,我们就来讲一下什么是 epoll。epoll 是一种典型的 IO 多路复用技术,epoll 最大的特点是支持高并发。传统 IO 多路复用技术 select、poll 由于操作系统的一些限制,在并发量上千级别的时候性能就会明显下降。

epoll 和 kqueue(freebsd)都是支持高并发的 IO 多路复用技术。epoll 是 Linux 内核 2.6 版本才引入的,更早的内核版本是不支持epoll 技术的。使用 epoll 技术,单独一台机器能支持少则数万多则数十万百万并发连接。高并发总是伴随着一定的系统资源消耗,比如需要内存去保存这个连接,因此并发量也总是有限的。

假如现在 epoll 有十万个连接,同一时刻有几十个客户端发送数据,epoll 只会检查这几十个客户端发送的数据,如果使用 poll 或者 select,它们会检查所有的连接是否有发送数据,就是挨个连接询问是否有发数据过来,相比之下 epoll 的性能优势显而易见。

很多服务器使用多进程或者多线程去支持高并发,但是创建进程或者线程切换都是比较消耗资源的,epoll 采用事件驱动机制,在单独的进程/线程中运行去收集、处理事件,没有创建进程或者线程切换的开销,因此更加高效。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。