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 + 线程池 / 协程 是主流方案
  • 实际工程中常常是 多种模型组合使用
相关推荐
大聪明-PLUS2 小时前
Linux 实时应用程序检查清单
linux·嵌入式·arm·smarc
Linux Huang2 小时前
spring注册组件/服务无效,问题排查
大数据·服务器·数据库·spring
鹿角片ljp2 小时前
力扣26.有序数组去重:HashSet vs 双指针法
java·算法
山上三树2 小时前
Linux动静态库与动静态链接
linux
G_H_S_3_2 小时前
【网络运维】OpenStack镜像管理:Glance篇
linux·运维·openstack
Muscleheng2 小时前
Linux安装LibreOffice
linux·运维·服务器
XFF不秃头2 小时前
力扣刷题笔记-合并区间
c++·笔记·算法·leetcode
bugtraq20212 小时前
PentestGPT的部署和使用本地大模型的调试记录
linux·服务器·python
码农爱学习2 小时前
嵌入式Linux利用core-dump文件和gdb工具分析程序崩溃问题
linux·数据库·postgresql