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 + 线程池 / 协程 是主流方案
  • 实际工程中常常是 多种模型组合使用
相关推荐
chlk1235 小时前
Linux文件权限完全图解:读懂 ls -l 和 chmod 755 背后的秘密
linux·操作系统
舒一笑5 小时前
Ubuntu系统安装CodeX出现问题
linux·后端
改一下配置文件6 小时前
Ubuntu24.04安装NVIDIA驱动完整指南(含Secure Boot解决方案)
linux
Gorway6 小时前
解析残差网络 (ResNet)
算法
拖拉斯旋风7 小时前
LeetCode 经典算法题解析:优先队列与广度优先搜索的巧妙应用
算法
Wect7 小时前
LeetCode 207. 课程表:两种解法(BFS+DFS)详细解析
前端·算法·typescript
深紫色的三北六号16 小时前
Linux 服务器磁盘扩容与目录迁移:rsync + bind mount 实现服务无感迁移(无需修改配置)
linux·扩容·服务迁移
SudosuBash19 小时前
[CS:APP 3e] 关于对 第 12 章 读/写者的一点思考和题解 (作业 12.19,12.20,12.21)
linux·并发·操作系统(os)
灵感__idea20 小时前
Hello 算法:众里寻她千“百度”
前端·javascript·算法
哈基咪怎么可能是AI1 天前
为什么我就想要「线性历史 + Signed Commits」GitHub 却把我当猴耍 🤬🎙️
linux·github