一文彻底搞懂I/O多路复用及其技术

本文详细介绍了I/O模型,包括同步阻塞、同步非阻塞、IO多路复用以及异步非阻塞IO。重点讲述了IO多路复用的原理和应用场景,如select、poll和epoll,并指出epoll在性能和灵活性上的优势。同时,讨论了同步与异步、阻塞与非阻塞的区别,帮助读者全面理解网络编程中的I/O模型选择。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

​ 高性能是每个程序员的追求,无论写一行代码还是做一个系统,都希望能够达到高性能的效果。高性能架构设计主要集中在两方面:

  • 尽量提升单服务器的性能,将单服务器的性能发挥到极致
  • 如果单服务器无法支撑性能,设计服务器集群方案

​ 单服务器高性能的关键之一就是服务器采取的网络编程模型。服务器如何管理连接,如何处理请求等。这两个设计点最终都和操作系统的I/O模型及进程模型相关。

  • I/O模型:阻塞、非阻塞、同步、异步
  • 进程模型:单进程、多进程、多线程。

​ 我们所说的I/O模型是指网络I/O模型,就是服务端如何管理连接,如何请求连接的措施,是用一个进程管理一个连接(PPC),还是一个线程管理一个连接(TPC),亦或者一个进程管理多个连接(Reactor)。

​ 因此IO多路复用中多路就是多个TCP连接(或多个Channel),复用就是指复用一个或少量线程,理解起来就是多个网路IO复用一个或少量线程来处理这些连接。

常见I/O模型

  • 同步阻塞IO(Blocking IO):即传统IO模型
  • 同步非阻塞IO(Non-blocking IO):默认常见的socket都是阻塞的,非阻塞IO要求socket被设置成NONBLOCK
  • IO多路复用(IO Multiplexing):即经典的Reactor设计模式,也被称为异步阻塞IO,Java中的selector和linux中的epoll都是这种模型
  • 异步IO(Asychronous IO):即Proactor设计模式,也被称为异步非阻塞IO

​ 同步和异步的概念描述的是用户线程与内核的交互方式,这里所说的用户进程/线程和内核是以传输层为分割线的,传输层以上是指用户进程,传输层以下(包括传输层)是指内核(处理所有通信细节,发送数据,等待确认,给无序到达的数据排序等,这四层是操作系统内核的一部分)。同步是指用户线程发起IO请求后需要等待或者轮询内核IO操作,完成后才能继续执行。异步是指用户线程发起IO请求后仍继续执行,当内核IO操作完成后回通知用户线程,或者调用用户线程注册的回调函数。

​ 阻塞和非阻塞的概念描述的是用户线程调用内核IO操作的方式,阻塞时指IO操作需要彻底完成后才能返回用户空间,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值