网站优化

网站优化

Products

当前位置:首页 > 网站优化 >

如何一探究竟:select、epoll等五大IO模型的前世今生?

GG网络技术分享 2026-04-17 07:04 0


展开全文存储的概念由来已久。很早之前,计算机之父--冯·诺依曼在提出计算机模型的五大部分中就提到存储器。可以说,没有存储器,计算机也是不完整的。 按照电源关断后数据是否依旧被保存,可以划分为非易失性存储器和易失性存储器两大类。以前买CPU时都说缓存,还分一级缓存和二级缓存,其实缓存就是SRAM。 太硬核了。 然后才说到内存,内存就是DRAM。当然SRAM除了在电脑里用,还在很多的电路设计里都要用到,作为地址码或临时数据存储用,所以很多代工厂都会提供SRAM给客户。

从速度上讲SRAM最快,接下来是DRAM,再到硬盘。哎,想想以前的机械硬盘,启动一个程序那叫一个慢啊!现在固态硬盘多好,起飞的感觉!不过话说回来这些底层硬件知识跟我们今天要聊的IO模型有什么关系呢?关系大了去了!主要原因是IO模型的设计很大程度上是为了更好地利用这些硬件资源,减少等待时间嘛,拜托大家...。

一文读懂五大 IO 模型的前世今生( select、epoll、epoll)

阻塞IO:老古董,但简单粗暴

拭目以待。 先说说最原始的阻塞IO吧。这玩意儿就像你排队点餐,得等到前面的人点完、做完、吃完你才能轮到你。代码实现起来特别简单:

listenfd = socket; // 打开一个网络通信套接字
bind; // 绑定
listen; // 监听
while {
  connfd = accept; // 阻塞 等待建立连接
  int n = read; // 阻塞 读数据
  doSomeThing; // 处理数据
  close; // 关闭连接
}

换言之... 看起来挺直白吧?问题也显而易见:一个线程处理一个连接,如果客户端请求很多怎么办?线程数量多了就吃内存啊!而且线程切换也浪费CPU资源。哎,想想就头大……不过话说回来这种方式实现起来最简单粗暴。

非阻塞IO:想摆脱阻塞, 后来啊更糟

为了解决阻塞的问题,出现了非阻塞IO。它的思路是:如果数据还没准备好,就别等了直接返回去忙其他的事情!但是这并不意味着性能就提升了……主要原因是你要不停地去询问内核:“数据准备好了没?准备好了没?” 如果数据还没准备好呢?继续询问……这叫“忙等待”,比阻塞还浪费CPU资源!

复盘一下。 宁宁甯啊32篇文章 · 0订阅一文读懂五大 IO 模型的前世今生

IO多路复用:救星来了!

我们一起... 这时候就需要IO多路复用了! 这玩意儿就像一个服务员一边看着多个餐桌的状态 ,只有当有客人呼叫的时候才去响应那个桌子。这样就能避免了不停地询问每个餐桌有没有人需要服务的情况啦!

select:一开始的尝试

select是最早出现的IO多路复用模型之一。它通过监听多个文件描述符的状态,来判断哪些文件描述符可以进行操作。但是它有一些缺点:,在我看来...

  • 每次调用需要在用户态和内核态之间拷贝文件描述符数组
  • 内核检测文件描述符可读还是通过遍历实现
  • 内核检测完文件描述符数组后

epoll:更高效的选择

产品名称 型号 价格 特点
服务器Dell PowerEdge R750$8000高性能计算
服务器HP ProLiant DL380 Gen10$7500稳定可靠
交换机Cisco Catalyst 9300 Series$5000企业级网络核心设备
路由器Ubiquiti EdgeRouter X$99家用/小型企业适用

kqueue: BSD 的选择

信号驱动 IO:感觉有点小众

信号驱动 IO 模型比较少见.当FD上有事件发生时会向进程发送一个信号.这个需要设置信号处理函数来处理.

这种方式依赖于信号机制.对于高并发场景来说不太适合.

异步 IO: 最复杂的方案

一下吧

👋 你好, 我是 Lorin 洛林,一位 Java 后端技术开发者!座右铭:Technol 太刺激了。 ogy has power to make world a better place.

靠谱。 🚀 我对技术的热情是我不断学习和分享的动力。我的博客是一个关于Java生态系统、后端开发和最新技术趋势的地方。


提交需求或反馈

Demand feedback