TCP并发模型 || select || poll || epoll

TCP并发模型:

1.TCP多线程模型:

缺点:

1.创建线程会带来资源开销,能够实现的并发量比较有限

2.IO模型:

1.阻塞IO:

没有数据到来时,可以让任务挂起,节省CPU资源开销,提高系统效率

2.非阻塞IO:

程序未接收到数据时一直执行,效率很低

3.异步IO

只能绑定一个文件描述符用来读取数据

4.多路复用IO

select //监听集合

1.select监听的集合中的文件描述符有上限限制

2.select有内核层向用户层数据空间拷贝的过程,占用系统资源开销

3.select必须轮询检测产生事件的文件描述符

4.select只能工作在水平触发模式(低速模式),无法工作在边沿触发(高速模式)

poll //监听数组

1.poll有内核层向用户层数据空间拷贝的过程,占用系统资源开销

2.poll必须轮询检测产生事件的文件描述符

3.poll只能工作在水平触发模式(低速模式),无法工作在边沿触发(高速模式)

epoll //监听内核空间中的一个事件表

epoll_create

epoll_ctl

epoll_wait
函数接口:

1.select

int select(int nfds, fd_set *readfds, fd_set *writefds,

fd_set *exceptfds, struct timeval *timeout);

功能:

select监听文件描述符集合中是否有文件描述编程ready状态

功能:

nfds:最大文件描述符的值+1

readfds:读文件描述符集合

writefds:写文件描述符集合

exceptfds:其余文件描述符集合

timeout:等待的时长

NULL 一直等待

返回值:

成功返回文件描述符集合中的文件描述符个数

失败返回-1

void FD_CLR(int fd, fd_set *set);

功能:

将文件描述符fd从集合中清除

int FD_ISSET(int fd, fd_set *set);

功能:

判断文件描述符fd是否仍在集合中

void FD_SET(int fd, fd_set *set);

功能:

将文件描述符fd加入到集合中

void FD_ZERO(fd_set *set);

功能:

将文件描述符集合清0
2.poll

int poll(struct pollfd *fds, nfds_t nfds, int timeout);

功能:

监听文件描述符集合是否有事件发生

参数:

fds:监听文件描述符集合数组空间首地址

nfds:监听文件描述符集合元素个数

timeout:等待的时间(-1 一直等待)

返回值:

成功返回产生事件的文件描述符个数

失败返回-1

struct pollfd {

int fd; /* file descriptor */

short events; /* requested events */

short revents; /* returned events */

};

fd:监听的文件描述符

events:要监听的事件 POLLIN:是否可读 POLLOUT:是否可写

revents:实际产生的事件
3.epoll

int epoll_create(int size);

功能:

创建一张内核事件表

参数:

size:事件的个数

返回值:

成功返回文件描述符

失败返回-1

epoll_ctl

int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);

功能:

维护epoll时间表

参数:

epfd:事件表的文件描述符

op:

EPOLL_CTL_ADD 添加事件

EPOLL_CTL_MOD 修改事件

EPOLL_CTL_DEL 删除事件

fd:

操作的文件描述符

event:

事件对应的事件

typedef union epoll_data {

void *ptr;

int fd;

uint32_t u32;

uint64_t u64;

} epoll_data_t;

struct epoll_event {

uint32_t events; /* Epoll events */

epoll_data_t data; /* User data variable */

};

返回值:

成功返回0

失败返回-1

epoll_wait

int epoll_wait(int epfd, struct epoll_event *events,

int maxevents, int timeout);

功能:

监听事件表中的事件

参数:

epfd:文件描述符

events:存放实际产生事件的数组空间首地址

maxevents:最多存放事件的个数

timeout:设定监听的时间(超过该时间则不再监听)

-1 一直监听直到有事件发生

返回值:

成功返回产生事件的文件描述符个数

失败返回-1

如果时间达到仍没有事件发生返回0

相关推荐
代码哈士奇12 分钟前
使用仓颉开发一个简单的http服务
网络·网络协议·http·仓颉
Jayyih16 分钟前
OSI七层模型和TCP/IP四层模型
网络·tcp/ip·php
云心雨禅18 分钟前
DNS工作原理:从域名到IP
运维·前端·网络协议·tcp/ip·github
lzc_a19 分钟前
Android Studio模拟器无法联网(能打开IP网页,但不能打开域名,DNS解析错误)问题2025年10月22日
服务器·android studio·安卓
静听山水27 分钟前
SQLite
数据库·sqlite
chilavert31844 分钟前
技术演进中的开发沉思-146 java-servlet:Servlet 在云原生时代的适配”
服务器·servlet·云原生
一匹电信狗1 小时前
【C++】手搓AVL树
服务器·c++·算法·leetcode·小程序·stl·visual studio
C嘎嘎嵌入式开发1 小时前
(22)100天python从入门到拿捏《【网络爬虫】网络基础与HTTP协议》
网络·爬虫·python
小安运维日记1 小时前
RHCA - DO374 | Day01:使用红帽Ansible自动化平台开发剧本
运维·服务器·云原生·自动化·云计算·ansible
草明1 小时前
clickhouse 检查是否有删除语句在执行
数据库·clickhouse