news 2026/3/1 6:59:51

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
41、Linux 网络编程并发模型总结(select / epoll / fork / pthread)

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

一、实验环境与基础说明

1. 实验环境

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

2. TCP 基本通信流程

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

服务器端
socket → bind → listen → accept → recv/send → close
客户端
socket → connect → send/recv → close

二、select 并发服务器模型

1. 核心思想

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

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


2. 实现要点

  • 使用fd_set保存监听的 fd

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

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

    • listfd:处理新连接(accept)
    • connfd:处理客户端数据
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 工作流程

epoll_create → epoll_ctl(add) → epoll_wait → 处理事件
epoll_add_fd(epfd,listfd);epoll_wait(epfd,events,MAX_EVENTS,-1);

3. 特点分析

✅ 优点:

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

❌ 缺点:

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

📌适用场景
高并发服务器(Web 服务器、即时通信)


四、fork 多进程服务器模型

1. 核心思想

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

pid_tpid=fork();if(pid==0){// 子进程处理客户端}

2. 特点分析

✅ 优点:

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

❌ 缺点:

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

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


五、pthread 多线程服务器模型

1. 核心思想

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

pthread_create(&tid,NULL,thread_func,&conn);

2. 同步问题

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

sem_init(&sem_cli,0,0);sem_wait(&sem_cli);

3. 特点分析

✅ 优点:

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

❌ 缺点:

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

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


六、四种模型对比总结

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

七、实验心得总结

  • select → epoll是 I/O 多路复用的进阶路径
  • fork → pthread是并发执行模型的两种典型方案
  • 高并发场景下,epoll + 线程池 / 协程是主流方案
  • 实际工程中常常是多种模型组合使用
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/28 13:38:45

PyTorch镜像适合做自然语言处理吗?NLP案例演示

PyTorch镜像在自然语言处理中的实战价值:从环境配置到模型部署的全链路解析 在当前深度学习工程实践中,一个常见的困境是:算法团队花费数天时间才把环境搭好,结果发现“代码跑通了,但GPU没用上”。尤其在自然语言处理…

作者头像 李华
网站建设 2026/3/1 17:48:08

图解说明温度传感器信号输出方式(模拟/I2C/单总线)

三种温度传感器输出方式怎么选?模拟、I2C、单总线实战全解析你有没有遇到过这样的问题:在做一个温控系统时,面对琳琅满目的温度传感器,不知道该选哪一种?是用最便宜的LM35直接接ADC,还是上DS18B20搞分布式测…

作者头像 李华
网站建设 2026/2/28 17:59:21

PyTorch-CUDA-v2.8镜像SSH连接教程:远程开发全流程解析

PyTorch-CUDA-v2.8 镜像与 SSH 远程开发实战指南 在深度学习项目日益复杂、模型规模不断膨胀的今天,本地笔记本上跑不动一个简单训练任务早已不是新鲜事。你有没有经历过这样的场景:好不容易写完代码,一运行发现 torch.cuda.is_available() 返…

作者头像 李华
网站建设 2026/2/25 21:48:57

乐迪信息:振动、跑偏、撕裂识别:AI摄像机在线监测煤矿皮带故障

皮带在长期、高负荷的运转过程中,容易出现振动异常、皮带跑偏、纵向撕裂等典型故障。这些故障若不能被及时发现和处理,轻则导致停机停产,重则可能引发重大的安全生产事故。传统的监测方式主要依赖人工巡检与基础传感器,存在发现滞…

作者头像 李华
网站建设 2026/2/28 18:51:54

图解说明蜂鸣器驱动电路连接方式与原理

蜂鸣器驱动电路设计全解析:从原理到实战你有没有遇到过这样的情况?写好代码,烧录进单片机,按下按键想听个“滴”声提示,结果蜂鸣器不响、MCU死机,甚至芯片发热发烫……最后查了半天才发现——原来是驱动电路…

作者头像 李华
网站建设 2026/3/1 1:27:37

基于Matlab Simulink与Simscape的纯电动汽车动力、经济性及续航里程仿真模型探究

纯电动汽车仿真、纯电动公交、纯电动客车、纯电动汽车动力性仿真、经济性仿真、续航里程仿真。 模型包括电机、电池、车辆模型。 有两种模型2选1: 1 完全用matlab simulink搭建的模型。 2用simscape搭建的车辆模型。纯电动公交车的仿真模型对于研发来说就是一把瑞士…

作者头像 李华