IO模型与并发服务器
阻塞IO用户层charbuf[1024];recv(fd,buf,sizeof(0),0);//程序卡在这里等待数据内核1.检查socket接收缓冲区是否有数据2.若无数据将进程状态设为TASK_INTERRUPTIBLE(可中断睡眠)进程从CPU运行队列移出触发调度器切换其他进程运行3.数据到达网卡触发硬件中断→内核将数据拷贝到接收缓冲区唤醒进程(状态改为TASK_RUNNING)重新加入运行队列非阻塞IO用户层函数原型int fcntl(int fd, int cmd, .../* arg */);fcntl(fd,F_SETFL,O_NONBLOCK);//设置非阻塞标志while(1){intnrecv(fd,buf,sizeof(buf),0);if(n0)break;//数据就绪if(errno!EAGAIN)exit(1);//错误处理usleep(1000);//避免CPU占满}内核1.检查接收缓冲区无论是否就绪都立即返回结果2.无数据时返回EAGAIN错误码进程继续执行(不进入睡眠)IO多路复用IO多路复用是一种单线程或单进程管理多个描述符(如套接字)的技术核心是通过系统调用监视多个IO操作的状态当某个IO操作就绪(可读、可写或发生异常)时通知应用程序进行处理为什么需要多路复用1.提高并发性能2.非阻塞IO协作3.高效管理大量连接select函数头文件#includesys/socket.h#includesys/types.h函数原型intselect(intnfds,fd_set*readfds,fd_set*writefds,fd_set*exceptfds,structtimeval*timeout);参数nfds要监视的最大的文件描述符1readfds要监视的读文件描述符集合如果不关心可以传NULLwritefds要监视的写文件描述符集合如果不关心可以传NULLexceptfds要监视的异常文件描述符集合如果不关心可以传NULLtimeout超过时间如果是NULL表示永久阻塞 返回值成功返回就绪的文件描述符的个数失败返回-1(并重置错误码)poll函数头文件#includesys/socket.h#includesys/types.h函数原型intpoll(structpollfd*fds,nfds_tnfds,inttimeout);参数fds一个指向pollfd结构体数组的指针它描述了要监视的文件描述符及其事件 nfdsfds数组中有效描述符元素的数量 timeout是等待时间单位为毫秒 返回值成功返回结构体中revents域不为0的的文件描述符的个数 如果在超时前没有任何事件发生poll()返回0失败返回-1(并重置错误码)服务器模型服务器模型有两种循环服务器、并发服务器循环服务器循环服务器在同一时刻只能响应一个客户端的请求并发服务器并发服务器在同一时刻可以响应多个客户端的请求TCP服务器默认的就是一个循环服务器因为有两个阻塞的函数accept和reve之间互相影响UDP服务器默认的就是一个并发服务器因为只有一个阻塞的函数recvfrom多线程并发服务器实现原理主线程负责接听新连接(accept)子线程每个线程处理一个连接的读写recv()/send()流程多进程并发服务器实现原理fork()模型1.主进程监听连接子进程处理请求2.父子进程完全独立崩溃互不影响预fork()优化1.启动时预先创建多个子进程(类似Apache)2.通过共享监听Socket(SO_REUSEPORT)实现负载均衡主进程1.创建监听Socket→bind()→listen()2.while(1){accept()接收新连接→fork()创建子进程处理连接}子进程1.close()关闭监听Socket(继承自父进程)2.recv()/send()处理客户端请求3.exit()退出IO多路复用并发服务器主线程1.创建监听Socket→bind()→listen()2.初始化fd_set集合将监听Socket加入集合3.while(1){select()监听所有fd→返回就绪的fd数量for(每个就绪的fd){if(是监听Socket)→accept()新连接并加入fd_setelse→recv()/send()处理数据}}pollfd结构体struct pollfd{int fd; //文件描述符short events; //等待的事件short revents; //实际发生的事件};事件常值说明**读事件**POLLIN普通或优先带数据可读POLLPRI高优先级数据可读**写事件**POLLOUT普通或优先带数据可写POLLWRNORM高优先级数据可写**错误事件**POLLERR发生错误POLLHUP发生挂起POLLNVAL描述不是打开的文件简述五种IO模型并说明是同步操作还是异步操作阻塞式I/O是最流行的I/O模型默认的情况下所有套接字都是阻塞的非阻塞式I/O设置成非阻塞是通知进程当所请求的I/O操作非得把本进程置于休眠状态才能完成时则不要置于休眠状态而是返回一个错误I/O多路复用同时阻塞监听多个I/O操作任意一个或多个触发后都会继续执行信号驱动式I/O内核在描述符就绪时会发送SIGIO信号通知异步I/O给内核传递描述符缓冲区指针、缓冲区大小和文件偏移并告知内核在操作完成后如何通知我们同步I/O操作指导致阻塞进程直到I/O操作完成的操作异步I/O操作不会导致请求阻塞。上述五种除了异步I/O外的其他四种都是同步I/O简述三种IO多路复用方法以及各自的特点select(最古老) 时间复杂度O(n) 触发水平触发模式 LT机制通过一个固定大小的位掩码(位图)来监控文件描述符集合每次调用需将集合从用户态全量拷贝到内核态内核暴力遍历所有fd检查状态。特点select支持的文件描述符最多是1024随fd增多性能线性下降每次遍历后需要重置集合。poll(对select的改进) 时间复杂度O(n) 触发水平触发模式 LT机制采用动态数组struct pollfd同样需全量拷贝和内核遍历特点无最大连接数限制但高并发下性能仍随fd数量线性下降用户态和内核态拷贝开销依然存在epoll(Linux高性能方案) 时间复杂度O(1) 触发水平/边沿触发模式 LT/ET机制内核维护红黑树管理fd通过回调机制(事件就绪时主动加入就绪链表 )调用epoll_wait仅返回就绪fd且采用内存映射(mmap)减少拷贝。特点水平触发(LT默认)和边沿触发(ET)两种模式海量连接下性能稳定(仅活跃连接数相关)是Nginx,Redis等高性能服务器的首选水平触发(LT,Level-Triggered)定义当文件描述符(fd)处于就绪状态(比如接收缓冲区有数据可读)时内核就会一直返回该fd直到你不再满足就绪条件(比如把数据读完)特点通知特点只要缓冲区还有数据epoll_wait每次都会返回该FD重复提醒找到你处理完。编程难度简单。允许每次只读一部分不用担心漏数据适合传统阻塞编程。性能开销频繁就绪时可能多次唤醒进程但内核遍历成本可控。适用场景通用型大多数业务服务器首选(如Redis)默认模式稳妥可靠。边沿触发(ET,Edge-Triggered)定义仅当fd的状态发生变化(从不可读变为可读或从不可写变为可写)的那一瞬间内核才返回该fd。此后即使缓冲区仍有数据只要状态不再变化内核也不再通知。特点通知特点仅当fd状态发生变化的瞬间(如无数据→有数据)通知一次之后即使有残留数据也不再提醒。编程难度苛刻。必须用非阻塞fdwhile循环读至EAGAIN否则残留数据会静默丢失导致响应超时。性能开销极高。大幅减少无效唤醒次数高并发下CPU和吞吐量表现最优(Nginx的看家本领)适用场景极致性能场景需处理海量连接且对延迟敏感(如游戏网关、高频交易)

相关新闻

C++实现通胀挂钩债券交换测试:量化金融建模与实战

C++实现通胀挂钩债券交换测试:量化金融建模与实战

1. 项目概述:从量化视角看债券交换最近在整理一些过往的量化策略研究笔记,翻到了一个挺有意思的实践项目:用C实现一个针对通胀挂钩债券(CPI-Linked Bond)的交换(Swap)测试实例。这个项目源于几年…

2026/7/23 9:35:37 阅读更多 →
Modbus协议详解与工业自动化应用实战

Modbus协议详解与工业自动化应用实战

1. Modbus协议入门:电气工程师的必修课 第一次接触Modbus时,我正面对着一台死活不通讯的变频器。屏幕上闪烁的"通讯超时"让我意识到,这个看似简单的协议背后藏着不少门道。Modbus作为工业自动化领域最常用的通讯协议之一&#xff0…

2026/7/23 9:34:37 阅读更多 →
Remix IDE入门:10分钟掌握智能合约开发全流程

Remix IDE入门:10分钟掌握智能合约开发全流程

1. Remix IDE快速入门:智能合约开发全流程解析 作为以太坊智能合约开发的瑞士军刀,Remix IDE让开发者能在浏览器中完成从编写到部署的全流程。这个基于Web的集成开发环境特别适合快速验证想法和教学演示,今天我们就用10分钟走通智能合约的完整…

2026/7/23 9:34:37 阅读更多 →

最新新闻

云原生架构:未来已来,你来不来?

云原生架构:未来已来,你来不来?

629 | 云原生架构:未来已来,你来不来? 想象你是个开餐厅的老板。 传统模式: 自己买地、盖房、装修 自己雇厨师、服务员、保安 自己买厨具、冰箱、灶台 什么都得自己管 云原生模式: 直接租个商铺入驻 厨具设备都是现成的 服务员按需雇佣 按营业额付租金 云原生,就是软件…

2026/7/23 13:02:19 阅读更多 →
考试精华:系统架构设计师易混淆概念辨析

考试精华:系统架构设计师易混淆概念辨析

630 | 考试精华:系统架构设计师易混淆概念辨析 📚 考试中经常出现的易混淆概念,帮你厘清区别,避开陷阱。 一、架构风格 vs 架构模式 1.1 架构风格 定义:架构风格是高层级的结构模式,描述系统的整体组织方式。 常见架构风格: ├── 客户端-服务器(C/S) ├── 分层…

2026/7/23 13:02:19 阅读更多 →
中小企业落地ERP难在哪?从业务规则配置角度拆解真实困境

中小企业落地ERP难在哪?从业务规则配置角度拆解真实困境

ERP作为一套集成企业核心业务流程的系统,本质上是通过一个统一平台将销售、采购、库存、财务等模块的数据与流程串联起来,让信息在部门之间顺畅流转。它的价值在于将分散的业务环节形成闭环,帮助企业从“人治”走向“机制化运营”。但在实际操…

2026/7/23 13:02:19 阅读更多 →
从零开始构建你的RAG项目第二弹:API 调用大模型问答

从零开始构建你的RAG项目第二弹:API 调用大模型问答

一、为什么选择 API 调用 轻量:无需本地部署 GPU,只需一行请求即可调用大模型。 灵活:支持多种模型(qwen-turbo / qwen-plus / qwen-max),可按需切换。 兼容:DashScope 提供了 OpenAI API 兼容模…

2026/7/23 13:02:19 阅读更多 →
AI答辩助手:毕业季论文格式与答辩模拟全攻略

AI答辩助手:毕业季论文格式与答辩模拟全攻略

1. 答辩工具革命:AI如何改变毕业季体验又到一年毕业季,办公室里堆满论文的导师们开始频繁收到学生的预约邮件。去年这个时候,我作为答辩秘书见证了传统答辩方式的三大痛点:学生熬夜改格式导致现场状态萎靡、评委反复核对参考文献消…

2026/7/23 13:02:19 阅读更多 →
摄像头频繁重启、关键录像凭空消失?一份企业监控运维排障 + 改造全流程手册!

摄像头频繁重启、关键录像凭空消失?一份企业监控运维排障 + 改造全流程手册!

近期承接大量上海写字楼、工厂、产业园区监控运维工单,现场复盘发现:80%以上企业监控系统均存在隐性故障,典型问题包括画面模糊看不清、关键时段录像缺失、摄像头随机掉线重启等。这类故障无前端弹窗、无后台告警,设备看似正常运行…

2026/7/23 13:01:19 阅读更多 →

日新闻

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

更多请点击: https://intelliparadigm.com 第一章:从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表) 当AI副业主理人不再仅满足于单次服务交付,而是主动构建可复用、可裂变、可…

2026/7/23 0:00:25 阅读更多 →
AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

更多请点击: https://codechina.net 第一章:AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析 在对2,346篇跨行业AI生成文案的A/B测试数据进行聚类分析后,我们发现&#xff1…

2026/7/23 0:01:26 阅读更多 →
Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具 【免费下载链接】chitchatter Secure peer-to-peer chat that is serverless, decentralized, and ephemeral 项目地址: https://gitcode.com/gh_mirrors/ch/chitchatter Chitchatter是一款革命性的安…

2026/7/23 0:01:26 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/22 8:58:19 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/22 19:43:43 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/22 12:54:44 阅读更多 →

月新闻