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 + 线程池 / 协程 是主流方案
  • 实际工程中常常是 多种模型组合使用
相关推荐
?re?ta?rd?ed?几秒前
linux中的调度策略
linux·运维·服务器
摇滚侠2 分钟前
HTTP 404 - No response body available
网络·网络协议·http
深圳市九鼎创展科技2 分钟前
瑞芯微 RK3399 开发板 X3399 评测:高性能 ARM 平台的多面手
linux·arm开发·人工智能·单片机·嵌入式硬件·边缘计算
Σίσυφος19002 分钟前
PCL法向量估计 之 RANSAC 平面估计法向量
算法·机器学习·平面
全栈工程师修炼指南6 分钟前
Nginx | stream content 阶段:TCP 协议四层反向代理浅析与实践
运维·网络·网络协议·tcp/ip·nginx
xhbaitxl8 分钟前
算法学习day39-动态规划
学习·算法·动态规划
I_LPL9 分钟前
day23 代码随想录算法训练营 回溯专题2
算法·hot100·回溯算法·求职面试
智者知已应修善业10 分钟前
【洛谷P9975奶牛被病毒传染最少数量推导,导出多样例】2025-2-26
c语言·c++·经验分享·笔记·算法·推荐算法
hweiyu0012 分钟前
Linux 命令:tr
linux·运维·服务器
Trouvaille ~15 分钟前
【Linux】应用层协议设计实战(一):自定义协议与网络计算器
linux·运维·服务器·网络·c++·http·应用层协议