嵌入式学习37-TCP并发模型

TCP并发模型:

1.TCP多线程模型:

缺点:

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

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 只能工作在水平触发模式(低速模式) 与select相同 无法工作在边沿触发(高速模式)

3.函数接口:

1.select

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

fd_set *exceptfds, struct timeval *timeout);

功能:

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

select 监听 文件描述符集合 中**,若有状态 , 将没有ready状态的T除 若无状态,将阻塞继续等待** 参数:

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 : 等待的时间**(非0)** (-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

相关推荐
昔时扬尘处4 分钟前
【C2000系列DSP的不掉电升级】C2000 不掉电升级(LFU)方案详解(含流程、代码与官方方案适配)
网络·dsp·c2000·德州仪器·实时控制mcu·lfu不掉电升级·后台升级
map_vis_3d7 分钟前
JSAPIThree LODModel 性能优化学习笔记:细节层次模型加载
笔记·学习·3d
MarkHD40 分钟前
智能体在车联网中的应用:第9天 核心工具链与仿真世界:SUMO交通仿真入门——从安装到构建你的第一个虚拟十字路口
学习
lxh011344 分钟前
2025/12/18 学习总结
学习
ZHHHHHJ661 小时前
LL层-PAST
运维·服务器·网络
老蒋新思维1 小时前
创客匠人启示:破解知识交付的“认知摩擦”——IP、AI与数据的三角解耦模型
大数据·人工智能·网络协议·tcp/ip·重构·创客匠人·知识变现
百***07451 小时前
GPT-5.2 极速接入指南:流程详解与主流模型对比
网络·人工智能·gpt
im_AMBER1 小时前
数据结构 13 图 | 哈希表 | 树
数据结构·笔记·学习·算法·散列表
wdfk_prog2 小时前
[Linux]学习笔记系列 -- [fs][drop_caches]
linux·笔记·学习
黑客思维者2 小时前
机器学习006:监督学习【回归算法】(概论)--教AI从历史中预测未来
人工智能·学习·机器学习·监督学习·回归算法