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 + 线程池 / 协程 是主流方案
  • 实际工程中常常是 多种模型组合使用
相关推荐
苦藤新鸡2 分钟前
19.旋转输出矩阵
c++·算法·leetcode·力扣
zsffuture3 分钟前
RKNN 8位量化全解析:算法差异与粒度选择实战指南
算法
玄冥剑尊3 分钟前
贪心算法深化 II
算法·贪心算法
Pluchon4 分钟前
硅基计划4.0 算法 动态规划入门
java·数据结构·算法·动态规划
玄冥剑尊5 分钟前
贪心算法深化 III
算法·贪心算法
十月南城8 分钟前
Kubernetes入门地图——核心对象、网络与存储的抽象关系与心智模型
网络·容器·kubernetes
南工孙冬梅10 分钟前
【久久派】Linux 文件系统制作配置 基于buildroot
linux
连续讨伐11 分钟前
前期小随笔
服务器·网络·nginx
txinyu的博客25 分钟前
计算机网络 IP 详解
服务器·tcp/ip·计算机网络
wen__xvn30 分钟前
算法刷题目录
算法