news 2026/6/25 17:46:24

TCP并发服务器和 Linux常用IO模型

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
TCP并发服务器和 Linux常用IO模型

1.TCP并发服务器

  • 单循环服务器:一次只能处理一个客户端任务的服务器。
  • 并发服务器:能够同时处理多个客户端任务的服务器。

TCP并发服务端:

  1. 多进程 安全、资源开销大、并发量小

  2. 多线程 相对进程资源开销小,相对并发量大

  3. 线程池 提前创建好大量线程管理起来,避免反复创建线程带来时间消耗 生产者--消费者 设计模式

  4. IO多路复用 文件 --->fd 对多个文件描述符的监测,复用一个进程。

2. Linux常用IO模型

1.阻塞IO

  1. 让多个IO具有先后顺序
  2. 节省CPU资源

2.非阻塞IO

  1. 搭配轮询方式实现
  2. 浪费CPU资源

3.信号驱动IO

  1. 效率高
  2. 驱动的信号个数有限,应用层无法区分多个IO事件

4. IO多路复用

在一个进程中,同时监测多个IO
1.select
  • 创建文件描述符集合
  • 添加需要监测的文件描述符到集合
  • 通知内核开始监测
  • IO事件到达时,监测返回结果
int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); 功能:通知内核监测文件描述符中的事件 参数: 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); 功能:将集合表全部清零
2.epoll
int epoll_create(int size); 功能:创建文件描述符集合 参数: size:监测的文件描述符的最大上限 返回值: 成功:返回集合代表的文件描述符 失败:-1 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:事件类型 返回值: 成功:0 失败:-1 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 */ }; int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout); 功能:通知内核开始监测文件描述符集合并等待返回监测到的事件结果 参数: epfd:文件描述符集合 events:保存到达事件的数组 maxevents:监测的事件最大个数 timeout :超时时间 -1 :不设置超时 返回值: 成功:返回到达事件的个数 失败:-1

5.总结

select
  1. select使用数组(位图)保存文件描述符集合,最多允许监测1024个文件描述符;
  2. select将集合表创建在应用层,需要应用层和内核层的反复数据拷贝;
  3. select需要遍历寻找到达的IO事件,效率低;
  4. select只能工作在水平触发模式(低速模式),不能工作在边沿触发模式(高速模式);
poll
  1. poll使用链表保存文件描述符集合,理论上没有文件描述符限制;
  2. poll将集合表创建在应用层,需要应用层和内核层的反复数据拷贝;
  3. poll需要遍历寻找到达的IO事件,效率低;
  4. poll只能工作在水平触发模式(低速模式),不能工作在边沿触发模式(高速模式);
epoll
  1. epoll使用树形结构保存文件描述符集合(红黑树);
  2. epoll将结合表直接创建在内核层,避免应用层和内核层的反复数据拷贝;
  3. epoll直接返回到达的事件,不需要应用层遍历查找;
  4. epoll可以工作在水平触发模式(低速模式),也可以工作在边沿触发模式(高速模式);
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/25 17:45:35

Python之roadlib包语法、参数和实际应用案例

Python roadlib 完整使用手册 一、roadlib 包基础概述 1. 核心定位 roadlib 是面向道路交通、轨道机务、公路测绘、行车轨迹分析的轻量级Python开源工具库,专门处理线性道路/线路几何数据、里程桩、坐标转换、线路纵断面、行车轨迹匹配、坡度曲率计算、GYK轨道数据解…

作者头像 李华
网站建设 2026/6/25 17:45:05

这次终于选对了!一键生成论文工具测评与2026最新推荐

2026年真正好用的一键生成论文工具,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。…

作者头像 李华
网站建设 2026/6/25 17:43:50

个人开发小程序和公司开发的深度评测:哪个性价比更高?

在当下的线上经营场景中,小程序已经成为商家、创业者、中小企业拓客引流的核心工具。不管是门店预约、产品销售、售后运维还是品牌曝光,一款好用的小程序,能切实提升线上转化效率。 绝大多数用户在开发小程序时,都会纠结两大主流…

作者头像 李华
网站建设 2026/6/25 17:43:49

LibreSignage:为什么这个开源数字标牌系统值得你重新发现?

LibreSignage:为什么这个开源数字标牌系统值得你重新发现? 【免费下载链接】LibreSignage A free and open source digital signage solution. 项目地址: https://gitcode.com/gh_mirrors/li/LibreSignage 在数字化信息展示需求日益增长的今天&am…

作者头像 李华
网站建设 2026/6/25 17:40:38

微信小程序毕设项目:基于 SpringBoot + 微信小程序的社区商铺智能交易管理系统设计与实现 (源码+文档,讲解、调试运行,定制等)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2026/6/25 17:40:22

Android手机搭建移动渗透测试平台:Termux运行Metasploit实战指南

1. 项目概述:为什么要在手机上做安全测试?几年前,如果有人跟我说能用手机做正经的渗透测试,我大概率会一笑置之。毕竟,安全测试工具链庞大,对系统资源要求不低,手机那点性能能干点啥&#xff1f…

作者头像 李华