41、Linux 网络编程并发模型总结(select / epoll / fork / pthread)


Linux 网络编程并发模型总结(select / epoll / fork / pthread)

一、实验环境与基础说明

1. 实验环境

  • 操作系统:Linux(Ubuntu)
  • 通信协议:TCP
  • 地址族:AF_INET
  • 端口号:50000
  • 客户端模型:阻塞式 TCP 客户端
  • 服务端模型:多种并发处理方式

2. TCP 基本通信流程

所有实验代码都遵循 TCP 通信的基本流程:

服务器端
text 复制代码
socket → bind → listen → accept → recv/send → close
客户端
text 复制代码
socket → connect → send/recv → close

二、select 并发服务器模型

1. 核心思想

select 通过一个文件描述符集合(fd_set),同时监听多个 socket,当某个 fd 就绪时再进行处理。

本质:I/O 多路复用(同步阻塞)


2. 实现要点

  • 使用 fd_set 保存监听的 fd

  • select() 阻塞等待事件发生

  • 区分监听套接字和通信套接字:

    • listfd:处理新连接(accept)
    • connfd:处理客户端数据
c 复制代码
FD_SET(listfd, &tmp_set);
select(maxfd + 1, &rd_set, NULL, NULL, NULL);

3. 特点分析

✅ 优点:

  • 跨平台(POSIX)
  • 编程模型简单
  • 适合少量并发连接

❌ 缺点:

  • 每次 select 都要遍历 fd
  • fd 数量有限(通常 1024)
  • 大量连接时性能急剧下降

📌 适用场景

教学实验、小规模并发服务器


三、epoll 并发服务器模型

1. 核心思想

epoll 是 Linux 提供的高性能 I/O 多路复用机制,采用事件驱动模型。

本质:事件通知 + 回调式处理


2. epoll 工作流程

text 复制代码
epoll_create → epoll_ctl(add) → epoll_wait → 处理事件
c 复制代码
epoll_add_fd(epfd, listfd);
epoll_wait(epfd, events, MAX_EVENTS, -1);

3. 特点分析

✅ 优点:

  • 支持大量并发连接
  • O(1) 时间复杂度
  • 不需要遍历全部 fd
  • 高性能、高扩展性

❌ 缺点:

  • 仅支持 Linux
  • 编程复杂度高于 select

📌 适用场景

高并发服务器(Web 服务器、即时通信)


四、fork 多进程服务器模型

1. 核心思想

每接入一个客户端,服务器 fork() 一个子进程专门处理该连接。

c 复制代码
pid_t pid = fork();
if (pid == 0) {
    // 子进程处理客户端
}

2. 特点分析

✅ 优点:

  • 实现简单
  • 进程隔离,稳定性好
  • 单个进程崩溃不影响其他连接

❌ 缺点:

  • 进程创建开销大
  • 上下文切换成本高
  • 不适合高并发场景

📌 适用场景

早期 Unix 服务、低并发、可靠性优先场景


五、pthread 多线程服务器模型

1. 核心思想

每个客户端连接由一个线程处理,共享进程资源。

c 复制代码
pthread_create(&tid, NULL, thread_func, &conn);

2. 同步问题

代码中使用了 信号量 sem_t,防止主线程与子线程之间的竞争:

c 复制代码
sem_init(&sem_cli, 0, 0);
sem_wait(&sem_cli);

3. 特点分析

✅ 优点:

  • 资源共享,通信效率高
  • 创建开销小于进程
  • 编程灵活

❌ 缺点:

  • 需要处理线程同步
  • 线程安全问题复杂
  • 单线程崩溃可能影响整个进程

📌 适用场景

中等并发服务器、业务逻辑复杂的应用


六、四种模型对比总结

模型 并发能力 资源开销 编程难度 适用场景
select ⭐⭐ 教学、小规模
epoll ⭐⭐⭐⭐ 高并发服务器
fork ⭐⭐ 稳定性优先
pthread 中高 ⭐⭐⭐ 通用服务器

七、实验心得总结

  • select → epoll 是 I/O 多路复用的进阶路径
  • fork → pthread 是并发执行模型的两种典型方案
  • 高并发场景下,epoll + 线程池 / 协程 是主流方案
  • 实际工程中常常是 多种模型组合使用
相关推荐
风筝在晴天搁浅几秒前
字节高频题 小于n的最大数
算法
LabVIEW开发2 分钟前
LabVIEW水力机组空蚀在线监测
算法·labview·labview知识·labview功能·labview程序
日取其半万世不竭3 分钟前
LVM 逻辑卷管理:不停机扩容磁盘的正确方式
运维·服务器
AI科技星8 分钟前
科幻艺术书本封面:《全域数学》第一部·数术本源 第三卷 代数原本(P95-141)完整五级目录【乖乖数学】
算法·机器学习·数学建模·数据挖掘·量子计算
@insist1239 分钟前
信息安全-防火墙技术演进全景:从代理NAT 到下一代及专项防火墙
网络·安全·web安全·软考·信息安全工程师·软件水平考试
风筝在晴天搁浅10 分钟前
LeetCode 92.反转链表Ⅱ
算法·leetcode·链表
优化Henry14 分钟前
TDD-LTE站点Rilink=3链路故障处理案例---BBU侧C口“有发光、无收光”的排查与恢复
运维·网络·信息与通信·tdd
浪客灿心15 分钟前
Linux网络传输层协议
linux·运维·网络
王老师青少年编程24 分钟前
csp信奥赛C++高频考点专项训练之贪心算法 --【贪心与二分判定】:数列分段 Section II
c++·算法·贪心·csp·信奥赛·二分判定·数列分段 section ii
舟遥遥娓飘飘43 分钟前
Nexus4CC 手机电脑同步claude code对话部署教程(基于linux系统)
linux·智能手机·电脑