多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

计算机 I/O 操作是否占用 CPU、占用多少

计算机 I/O 操作是否占用 CPU、占用多少 目录1、四种 I/O 模型 CPU 开销对比① 阻塞 IOBIO② 非阻塞 IO③ IO 多路复用 select/poll/epoll④ 异步 IO AIOlibaio/io_uring2、开销拆分一次磁盘 / 网络 I/O 完整 CPU 消耗3、那占多少 CPU没有固定百分比看场景4、面试高频坑点简单记忆核心结论I/O 一定会占用 CPU但不同 I/O 模型 CPU 开销天差地别真正读写硬件数据传输阶段可以不占 CPU但是 I/O 的发起、收尾、中断处理、数据拷贝都要消耗 CPU。1、四种 I/O 模型 CPU 开销对比① 阻塞 IOBIOread ()/write () 系统调用线程挂起等待硬件完成 IO等待数据阶段线程阻塞休眠不消耗 CPU数据拷贝阶段内核→用户空间CPU 参与内存拷贝占用 CPUCPU 占用低大部分时间线程休眠但线程资源开销大。② 非阻塞 IOwhile 循环轮询调用 read没数据立刻返回用户态不停循环询问内核等待数据阶段用户态循环轮询CPU 满负载消耗空转数据拷贝阶段CPU 拷贝内存数据CPU 占用很高CPU 大部分时间在做无效轮询。③ IO 多路复用 select/poll/epoll单个线程管理大量 fdselect/poll用户态把 fd 集合拷贝内核内核遍历扫描全部 fd有事件返回用户态用户程序遍历 fd 找就绪事件。CPU 开销中等fd 数量越大扫描开销越高。epoll事件回调不需要遍历全部 fd就绪事件直接返回。等待阶段线程阻塞休眠不耗 CPU就绪事件处理、数据拷贝消耗 CPU。CPU 占用很低高并发场景首选。④ 异步 IO AIOlibaio/io_uring完全异步提交 IO 任务给内核内核完成后通知程序发起 IO 请求CPU 少量开销提交任务给内核硬件 DMA 传输数据完全不占用 CPUDMA 控制器接管总线搬运数据IO 完成产生中断CPU 处理中断、回调通知应用程序少量 CPU 开销CPU 占用最低硬件 DMA 负责搬运CPU 只负责提交任务和收尾中断。⚠️重点DMA磁盘、网卡都带有 DMA 控制器硬件和内核缓冲区之间的数据搬运不需要 CPU 参与但是「内核缓冲区 ↔ 用户缓冲区」内存拷贝必须 CPU 完成。2、开销拆分一次磁盘 / 网络 I/O 完整 CPU 消耗发起系统调用 read/writeCPU 切换用户态→内核态上下文切换消耗少量 CPU硬件执行 IODMA 搬运硬件数据到内核缓冲区CPU 可以去干别的事0 占用IO 完成硬件触发中断CPU 暂停当前任务执行中断处理程序少量 CPU 开销内核缓冲区拷贝到用户进程内存内存拷贝CPU 占用这一块是主要 CPU 消耗系统调用返回内核态切回用户态上下文切换所以I/O 慢不是因为 CPU 忙而是硬件速度慢CPU 大部分时间在等待硬件完成动作。3、那占多少 CPU没有固定百分比看场景BIO 单线程读文件CPU 通常1%‑5%绝大部分时间在等待磁盘只有拷贝数据时跑 CPU。非阻塞轮询 while (!read ())CPU 直接拉满接近100%全部 CPU 耗在空转轮询。epoll 高并发网络服务如 NginxCPU 主要消耗在协议解析、业务逻辑、内存拷贝单纯等待 IO 事件几乎不耗 CPU。io_uring 异步磁盘 IOCPU 开销最小适合大规模文件读写。4、面试高频坑点❌错误IO 操作完全不占用 CPU ✅正确硬件 DMA 传输不占 CPU系统调用、上下文切换、中断处理、内核用户内存拷贝都要 CPU。❌错误阻塞 IO 会占用 CPU 等待磁盘 ✅正确阻塞时线程被调度出去休眠CPU 运行其他线程等待阶段 CPU 开销几乎为 0。零拷贝技术mmap、sendfile的意义就是减少「内核缓冲区→用户缓冲区」的 CPU 内存拷贝降低 CPU 占用提升 IO 性能。sendfile直接内核内部拷贝跳过用户空间减少 CPU 拷贝开销。简单记忆等待硬件可以不耗 CPU系统调用、中断、内存拷贝一定耗 CPU轮询模型会疯狂浪费 CPU。
返回列表